Did tangent line conversion, reworked some of the UI, and started shifting.
This commit is contained in:
parent
f8c1788502
commit
24828e9922
8
Base/Abstract/IEquationConvertible.cs
Normal file
8
Base/Abstract/IEquationConvertible.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
using Graphing.Graphables;
|
||||||
|
|
||||||
|
namespace Graphing.Abstract;
|
||||||
|
|
||||||
|
public interface IEquationConvertible
|
||||||
|
{
|
||||||
|
public Equation ToEquation();
|
||||||
|
}
|
||||||
3
Base/Abstract/ITranslatable.cs
Normal file
3
Base/Abstract/ITranslatable.cs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
namespace Graphing.Abstract;
|
||||||
|
|
||||||
|
public interface ITranslatable { }
|
||||||
6
Base/Abstract/ITranslatableX.cs
Normal file
6
Base/Abstract/ITranslatableX.cs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
namespace Graphing.Abstract;
|
||||||
|
|
||||||
|
public interface ITranslatableX : ITranslatable
|
||||||
|
{
|
||||||
|
public double OffsetX { get; set; }
|
||||||
|
}
|
||||||
3
Base/Abstract/ITranslatableXY.cs
Normal file
3
Base/Abstract/ITranslatableXY.cs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
namespace Graphing.Abstract;
|
||||||
|
|
||||||
|
public interface ITranslatableXY : ITranslatableX, ITranslatableY { }
|
||||||
6
Base/Abstract/ITranslatableY.cs
Normal file
6
Base/Abstract/ITranslatableY.cs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
namespace Graphing.Abstract;
|
||||||
|
|
||||||
|
public interface ITranslatableY : ITranslatable
|
||||||
|
{
|
||||||
|
public double OffsetY { get; set; }
|
||||||
|
}
|
||||||
@ -16,6 +16,9 @@
|
|||||||
<Compile Update="Forms\SetZoomForm.cs">
|
<Compile Update="Forms\SetZoomForm.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Update="Forms\TranslateForm.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
<Compile Update="Forms\ViewCacheForm.cs">
|
<Compile Update="Forms\ViewCacheForm.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|||||||
98
Base/Forms/GraphForm.Designer.cs
generated
98
Base/Forms/GraphForm.Designer.cs
generated
@ -38,13 +38,18 @@ namespace Graphing.Forms
|
|||||||
ButtonViewportSetCenter = new ToolStripMenuItem();
|
ButtonViewportSetCenter = new ToolStripMenuItem();
|
||||||
ButtonViewportReset = new ToolStripMenuItem();
|
ButtonViewportReset = new ToolStripMenuItem();
|
||||||
ButtonViewportResetWindow = new ToolStripMenuItem();
|
ButtonViewportResetWindow = new ToolStripMenuItem();
|
||||||
MenuColors = new ToolStripMenuItem();
|
MenuElements = new ToolStripMenuItem();
|
||||||
MenuEquations = new ToolStripMenuItem();
|
MenuElementsColors = new ToolStripMenuItem();
|
||||||
MenuEquationsDerivative = new ToolStripMenuItem();
|
MenuElementsRemove = new ToolStripMenuItem();
|
||||||
MenuEquationsIntegral = new ToolStripMenuItem();
|
MenuOperations = new ToolStripMenuItem();
|
||||||
|
MenuOperationsDerivative = new ToolStripMenuItem();
|
||||||
|
MenuOperationsIntegral = new ToolStripMenuItem();
|
||||||
|
MenuConvert = new ToolStripMenuItem();
|
||||||
|
MenuConvertEquation = new ToolStripMenuItem();
|
||||||
MenuMisc = new ToolStripMenuItem();
|
MenuMisc = new ToolStripMenuItem();
|
||||||
MenuMiscCaches = new ToolStripMenuItem();
|
MenuMiscCaches = new ToolStripMenuItem();
|
||||||
MiscMenuPreload = new ToolStripMenuItem();
|
MiscMenuPreload = new ToolStripMenuItem();
|
||||||
|
MenuOperationsTranslate = new ToolStripMenuItem();
|
||||||
GraphMenu.SuspendLayout();
|
GraphMenu.SuspendLayout();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
@ -64,7 +69,7 @@ namespace Graphing.Forms
|
|||||||
// GraphMenu
|
// GraphMenu
|
||||||
//
|
//
|
||||||
GraphMenu.ImageScalingSize = new Size(32, 32);
|
GraphMenu.ImageScalingSize = new Size(32, 32);
|
||||||
GraphMenu.Items.AddRange(new ToolStripItem[] { MenuViewport, MenuColors, MenuEquations, MenuMisc });
|
GraphMenu.Items.AddRange(new ToolStripItem[] { MenuViewport, MenuElements, MenuOperations, MenuConvert, MenuMisc });
|
||||||
GraphMenu.Location = new Point(0, 0);
|
GraphMenu.Location = new Point(0, 0);
|
||||||
GraphMenu.Name = "GraphMenu";
|
GraphMenu.Name = "GraphMenu";
|
||||||
GraphMenu.Size = new Size(1449, 42);
|
GraphMenu.Size = new Size(1449, 42);
|
||||||
@ -106,30 +111,56 @@ namespace Graphing.Forms
|
|||||||
ButtonViewportResetWindow.Text = "Reset Window Size";
|
ButtonViewportResetWindow.Text = "Reset Window Size";
|
||||||
ButtonViewportResetWindow.Click += ButtonViewportResetWindow_Click;
|
ButtonViewportResetWindow.Click += ButtonViewportResetWindow_Click;
|
||||||
//
|
//
|
||||||
// MenuColors
|
// MenuElements
|
||||||
//
|
//
|
||||||
MenuColors.Name = "MenuColors";
|
MenuElements.DropDownItems.AddRange(new ToolStripItem[] { MenuElementsColors, MenuElementsRemove });
|
||||||
MenuColors.Size = new Size(101, 38);
|
MenuElements.Name = "MenuElements";
|
||||||
MenuColors.Text = "Colors";
|
MenuElements.Size = new Size(131, 38);
|
||||||
|
MenuElements.Text = "Elements";
|
||||||
//
|
//
|
||||||
// MenuEquations
|
// MenuElementsColors
|
||||||
//
|
//
|
||||||
MenuEquations.DropDownItems.AddRange(new ToolStripItem[] { MenuEquationsDerivative, MenuEquationsIntegral });
|
MenuElementsColors.Name = "MenuElementsColors";
|
||||||
MenuEquations.Name = "MenuEquations";
|
MenuElementsColors.Size = new Size(359, 44);
|
||||||
MenuEquations.Size = new Size(138, 38);
|
MenuElementsColors.Text = "Colors";
|
||||||
MenuEquations.Text = "Equations";
|
|
||||||
//
|
//
|
||||||
// MenuEquationsDerivative
|
// MenuElementsRemove
|
||||||
//
|
//
|
||||||
MenuEquationsDerivative.Name = "MenuEquationsDerivative";
|
MenuElementsRemove.Name = "MenuElementsRemove";
|
||||||
MenuEquationsDerivative.Size = new Size(360, 44);
|
MenuElementsRemove.Size = new Size(359, 44);
|
||||||
MenuEquationsDerivative.Text = "Compute Derivative";
|
MenuElementsRemove.Text = "Remove";
|
||||||
//
|
//
|
||||||
// MenuEquationsIntegral
|
// MenuOperations
|
||||||
//
|
//
|
||||||
MenuEquationsIntegral.Name = "MenuEquationsIntegral";
|
MenuOperations.DropDownItems.AddRange(new ToolStripItem[] { MenuOperationsDerivative, MenuOperationsIntegral, MenuOperationsTranslate });
|
||||||
MenuEquationsIntegral.Size = new Size(360, 44);
|
MenuOperations.Name = "MenuOperations";
|
||||||
MenuEquationsIntegral.Text = "Compute Integral";
|
MenuOperations.Size = new Size(151, 38);
|
||||||
|
MenuOperations.Text = "Operations";
|
||||||
|
//
|
||||||
|
// MenuOperationsDerivative
|
||||||
|
//
|
||||||
|
MenuOperationsDerivative.Name = "MenuOperationsDerivative";
|
||||||
|
MenuOperationsDerivative.Size = new Size(360, 44);
|
||||||
|
MenuOperationsDerivative.Text = "Compute Derivative";
|
||||||
|
//
|
||||||
|
// MenuOperationsIntegral
|
||||||
|
//
|
||||||
|
MenuOperationsIntegral.Name = "MenuOperationsIntegral";
|
||||||
|
MenuOperationsIntegral.Size = new Size(360, 44);
|
||||||
|
MenuOperationsIntegral.Text = "Compute Integral";
|
||||||
|
//
|
||||||
|
// MenuConvert
|
||||||
|
//
|
||||||
|
MenuConvert.DropDownItems.AddRange(new ToolStripItem[] { MenuConvertEquation });
|
||||||
|
MenuConvert.Name = "MenuConvert";
|
||||||
|
MenuConvert.Size = new Size(118, 38);
|
||||||
|
MenuConvert.Text = "Convert";
|
||||||
|
//
|
||||||
|
// MenuConvertEquation
|
||||||
|
//
|
||||||
|
MenuConvertEquation.Name = "MenuConvertEquation";
|
||||||
|
MenuConvertEquation.Size = new Size(273, 44);
|
||||||
|
MenuConvertEquation.Text = "To Equation";
|
||||||
//
|
//
|
||||||
// MenuMisc
|
// MenuMisc
|
||||||
//
|
//
|
||||||
@ -141,17 +172,23 @@ namespace Graphing.Forms
|
|||||||
// MenuMiscCaches
|
// MenuMiscCaches
|
||||||
//
|
//
|
||||||
MenuMiscCaches.Name = "MenuMiscCaches";
|
MenuMiscCaches.Name = "MenuMiscCaches";
|
||||||
MenuMiscCaches.Size = new Size(359, 44);
|
MenuMiscCaches.Size = new Size(299, 44);
|
||||||
MenuMiscCaches.Text = "View Caches";
|
MenuMiscCaches.Text = "View Caches";
|
||||||
MenuMiscCaches.Click += MenuMiscCaches_Click;
|
MenuMiscCaches.Click += MenuMiscCaches_Click;
|
||||||
//
|
//
|
||||||
// MiscMenuPreload
|
// MiscMenuPreload
|
||||||
//
|
//
|
||||||
MiscMenuPreload.Name = "MiscMenuPreload";
|
MiscMenuPreload.Name = "MiscMenuPreload";
|
||||||
MiscMenuPreload.Size = new Size(359, 44);
|
MiscMenuPreload.Size = new Size(299, 44);
|
||||||
MiscMenuPreload.Text = "Preload Cache";
|
MiscMenuPreload.Text = "Preload Cache";
|
||||||
MiscMenuPreload.Click += MiscMenuPreload_Click;
|
MiscMenuPreload.Click += MiscMenuPreload_Click;
|
||||||
//
|
//
|
||||||
|
// MenuOperationsTranslate
|
||||||
|
//
|
||||||
|
MenuOperationsTranslate.Name = "MenuOperationsTranslate";
|
||||||
|
MenuOperationsTranslate.Size = new Size(360, 44);
|
||||||
|
MenuOperationsTranslate.Text = "Translate";
|
||||||
|
//
|
||||||
// GraphForm
|
// GraphForm
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new SizeF(13F, 32F);
|
AutoScaleDimensions = new SizeF(13F, 32F);
|
||||||
@ -172,17 +209,22 @@ namespace Graphing.Forms
|
|||||||
|
|
||||||
private Button ResetViewportButton;
|
private Button ResetViewportButton;
|
||||||
private MenuStrip GraphMenu;
|
private MenuStrip GraphMenu;
|
||||||
private ToolStripMenuItem MenuColors;
|
|
||||||
private ToolStripMenuItem MenuViewport;
|
private ToolStripMenuItem MenuViewport;
|
||||||
private ToolStripMenuItem ButtonViewportSetZoom;
|
private ToolStripMenuItem ButtonViewportSetZoom;
|
||||||
private ToolStripMenuItem ButtonViewportSetCenter;
|
private ToolStripMenuItem ButtonViewportSetCenter;
|
||||||
private ToolStripMenuItem ButtonViewportReset;
|
private ToolStripMenuItem ButtonViewportReset;
|
||||||
private ToolStripMenuItem ButtonViewportResetWindow;
|
private ToolStripMenuItem ButtonViewportResetWindow;
|
||||||
private ToolStripMenuItem MenuEquations;
|
private ToolStripMenuItem MenuOperations;
|
||||||
private ToolStripMenuItem MenuEquationsDerivative;
|
private ToolStripMenuItem MenuOperationsDerivative;
|
||||||
private ToolStripMenuItem MenuEquationsIntegral;
|
private ToolStripMenuItem MenuOperationsIntegral;
|
||||||
private ToolStripMenuItem MenuMisc;
|
private ToolStripMenuItem MenuMisc;
|
||||||
private ToolStripMenuItem MenuMiscCaches;
|
private ToolStripMenuItem MenuMiscCaches;
|
||||||
private ToolStripMenuItem MiscMenuPreload;
|
private ToolStripMenuItem MiscMenuPreload;
|
||||||
|
private ToolStripMenuItem MenuConvert;
|
||||||
|
private ToolStripMenuItem MenuConvertEquation;
|
||||||
|
private ToolStripMenuItem MenuElements;
|
||||||
|
private ToolStripMenuItem MenuElementsColors;
|
||||||
|
private ToolStripMenuItem MenuElementsRemove;
|
||||||
|
private ToolStripMenuItem MenuOperationsTranslate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -255,9 +255,15 @@ public partial class GraphForm : Form
|
|||||||
Invalidate(false);
|
Invalidate(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Graph(params Graphable[] able)
|
public void Graph(params Graphable[] newAbles)
|
||||||
{
|
{
|
||||||
ables.AddRange(able);
|
ables.AddRange(newAbles);
|
||||||
|
RegenerateMenuItems();
|
||||||
|
Invalidate(false);
|
||||||
|
}
|
||||||
|
public void Ungraph(params Graphable[] ables)
|
||||||
|
{
|
||||||
|
this.ables.RemoveAll(x => ables.Contains(x));
|
||||||
RegenerateMenuItems();
|
RegenerateMenuItems();
|
||||||
Invalidate(false);
|
Invalidate(false);
|
||||||
}
|
}
|
||||||
@ -348,9 +354,12 @@ public partial class GraphForm : Form
|
|||||||
|
|
||||||
private void RegenerateMenuItems()
|
private void RegenerateMenuItems()
|
||||||
{
|
{
|
||||||
MenuColors.DropDownItems.Clear();
|
MenuElementsColors.DropDownItems.Clear();
|
||||||
MenuEquationsDerivative.DropDownItems.Clear();
|
MenuElementsRemove.DropDownItems.Clear();
|
||||||
MenuEquationsIntegral.DropDownItems.Clear();
|
MenuOperationsDerivative.DropDownItems.Clear();
|
||||||
|
MenuOperationsIntegral.DropDownItems.Clear();
|
||||||
|
MenuConvertEquation.DropDownItems.Clear();
|
||||||
|
MenuOperationsTranslate.DropDownItems.Clear();
|
||||||
|
|
||||||
foreach (Graphable able in ables)
|
foreach (Graphable able in ables)
|
||||||
{
|
{
|
||||||
@ -360,7 +369,15 @@ public partial class GraphForm : Form
|
|||||||
Text = able.Name
|
Text = able.Name
|
||||||
};
|
};
|
||||||
colorItem.Click += (o, e) => GraphColorPickerButton_Click(able);
|
colorItem.Click += (o, e) => GraphColorPickerButton_Click(able);
|
||||||
MenuColors.DropDownItems.Add(colorItem);
|
MenuElementsColors.DropDownItems.Add(colorItem);
|
||||||
|
|
||||||
|
ToolStripMenuItem removeItem = new()
|
||||||
|
{
|
||||||
|
ForeColor = able.Color,
|
||||||
|
Text = able.Name
|
||||||
|
};
|
||||||
|
removeItem.Click += (o, e) => Ungraph(able);
|
||||||
|
MenuElementsRemove.DropDownItems.Add(removeItem);
|
||||||
|
|
||||||
if (able is IDerivable derivable)
|
if (able is IDerivable derivable)
|
||||||
{
|
{
|
||||||
@ -370,7 +387,7 @@ public partial class GraphForm : Form
|
|||||||
Text = able.Name
|
Text = able.Name
|
||||||
};
|
};
|
||||||
derivativeItem.Click += (o, e) => Graph(derivable.Derive());
|
derivativeItem.Click += (o, e) => Graph(derivable.Derive());
|
||||||
MenuEquationsDerivative.DropDownItems.Add(derivativeItem);
|
MenuOperationsDerivative.DropDownItems.Add(derivativeItem);
|
||||||
}
|
}
|
||||||
if (able is IIntegrable integrable)
|
if (able is IIntegrable integrable)
|
||||||
{
|
{
|
||||||
@ -380,20 +397,48 @@ public partial class GraphForm : Form
|
|||||||
Text = able.Name
|
Text = able.Name
|
||||||
};
|
};
|
||||||
integralItem.Click += (o, e) => Graph(integrable.Integrate());
|
integralItem.Click += (o, e) => Graph(integrable.Integrate());
|
||||||
MenuEquationsIntegral.DropDownItems.Add(integralItem);
|
MenuOperationsIntegral.DropDownItems.Add(integralItem);
|
||||||
|
}
|
||||||
|
if (able is IEquationConvertible equConvert)
|
||||||
|
{
|
||||||
|
ToolStripMenuItem equItem = new()
|
||||||
|
{
|
||||||
|
ForeColor = able.Color,
|
||||||
|
Text = able.Name
|
||||||
|
};
|
||||||
|
equItem.Click += (o, e) =>
|
||||||
|
{
|
||||||
|
Ungraph(able);
|
||||||
|
Graph(equConvert.ToEquation());
|
||||||
|
};
|
||||||
|
MenuConvertEquation.DropDownItems.Add(equItem);
|
||||||
|
}
|
||||||
|
if (able is ITranslatable translatable)
|
||||||
|
{
|
||||||
|
ToolStripMenuItem transItem = new()
|
||||||
|
{
|
||||||
|
ForeColor = able.Color,
|
||||||
|
Text = able.Name
|
||||||
|
};
|
||||||
|
transItem.Click += (o, e) => ElementsOperationsTranslate_Click(able, translatable);
|
||||||
|
MenuOperationsTranslate.DropDownItems.Add(transItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ButtonViewportSetZoom_Click(object? sender, EventArgs e)
|
private void ButtonViewportSetZoom_Click(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
SetZoomForm picker = new(this)
|
SetZoomForm zoomer = new(this)
|
||||||
{
|
{
|
||||||
StartPosition = FormStartPosition.Manual,
|
StartPosition = FormStartPosition.Manual,
|
||||||
};
|
};
|
||||||
picker.Location = new Point(Location.X + ClientRectangle.Width + 10,
|
zoomer.Location = new Point(Location.X + ClientRectangle.Width + 10,
|
||||||
Location.Y + (ClientRectangle.Height - picker.ClientRectangle.Height) / 2);
|
Location.Y + (ClientRectangle.Height - zoomer.ClientRectangle.Height) / 2);
|
||||||
picker.ShowDialog();
|
if (zoomer.Location.X + zoomer.Width > Screen.FromControl(this).WorkingArea.Width)
|
||||||
|
{
|
||||||
|
zoomer.StartPosition = FormStartPosition.WindowsDefaultLocation;
|
||||||
|
}
|
||||||
|
zoomer.ShowDialog();
|
||||||
}
|
}
|
||||||
private void ButtonViewportSetCenter_Click(object? sender, EventArgs e)
|
private void ButtonViewportSetCenter_Click(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
@ -446,4 +491,19 @@ public partial class GraphForm : Form
|
|||||||
foreach (Graphable able in Graphables) able.Preload(xRange, yRange, step);
|
foreach (Graphable able in Graphables) able.Preload(xRange, yRange, step);
|
||||||
Invalidate(false);
|
Invalidate(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ElementsOperationsTranslate_Click(Graphable ableRaw, ITranslatable ableTrans)
|
||||||
|
{
|
||||||
|
TranslateForm shifter = new(this, ableRaw, ableTrans)
|
||||||
|
{
|
||||||
|
StartPosition = FormStartPosition.Manual,
|
||||||
|
};
|
||||||
|
shifter.Location = new Point(Location.X + ClientRectangle.Width + 10,
|
||||||
|
Location.Y + (ClientRectangle.Height - shifter.ClientRectangle.Height) / 2);
|
||||||
|
if (shifter.Location.X + shifter.Width > Screen.FromControl(this).WorkingArea.Width)
|
||||||
|
{
|
||||||
|
shifter.StartPosition = FormStartPosition.WindowsDefaultLocation;
|
||||||
|
}
|
||||||
|
shifter.ShowDialog();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
46
Base/Forms/TranslateForm.Designer.cs
generated
Normal file
46
Base/Forms/TranslateForm.Designer.cs
generated
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
namespace Graphing.Forms
|
||||||
|
{
|
||||||
|
partial class TranslateForm
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
SuspendLayout();
|
||||||
|
//
|
||||||
|
// TranslateForm
|
||||||
|
//
|
||||||
|
AutoScaleDimensions = new System.Drawing.SizeF(13F, 32F);
|
||||||
|
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
ClientSize = new System.Drawing.Size(674, 629);
|
||||||
|
FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
|
||||||
|
Name = "TranslateForm";
|
||||||
|
Text = "TranslateForm";
|
||||||
|
ResumeLayout(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
25
Base/Forms/TranslateForm.cs
Normal file
25
Base/Forms/TranslateForm.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
using Graphing.Abstract;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace Graphing.Forms;
|
||||||
|
|
||||||
|
public partial class TranslateForm : Form
|
||||||
|
{
|
||||||
|
private readonly GraphForm refForm;
|
||||||
|
|
||||||
|
// These variables both represent the same graphable.
|
||||||
|
private readonly Graphable ableRaw;
|
||||||
|
private readonly ITranslatable ableTrans;
|
||||||
|
|
||||||
|
public TranslateForm(GraphForm graph, Graphable ableRaw, ITranslatable ableTrans)
|
||||||
|
{
|
||||||
|
refForm = graph;
|
||||||
|
this.ableRaw = ableRaw;
|
||||||
|
this.ableTrans = ableTrans;
|
||||||
|
|
||||||
|
if (ableTrans is ITranslatableX transX) transX.OffsetX = 1;
|
||||||
|
if (ableTrans is ITranslatableY transY) transY.OffsetY = 1;
|
||||||
|
|
||||||
|
graph.Invalidate(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
120
Base/Forms/TranslateForm.resx
Normal file
120
Base/Forms/TranslateForm.resx
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
@ -6,13 +6,18 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace Graphing.Graphables;
|
namespace Graphing.Graphables;
|
||||||
|
|
||||||
public class Equation : Graphable, IIntegrable, IDerivable
|
public class Equation : Graphable, IIntegrable, IDerivable, ITranslatableXY
|
||||||
{
|
{
|
||||||
private static int equationNum;
|
private static int equationNum;
|
||||||
|
|
||||||
|
public double OffsetX { get; set; }
|
||||||
|
public double OffsetY { get; set; }
|
||||||
|
|
||||||
protected readonly EquationDelegate equ;
|
protected readonly EquationDelegate equ;
|
||||||
protected readonly List<Float2> cache;
|
protected readonly List<Float2> cache;
|
||||||
|
|
||||||
|
public event Action<GraphForm> OnInvalidate;
|
||||||
|
|
||||||
public Equation(EquationDelegate equ)
|
public Equation(EquationDelegate equ)
|
||||||
{
|
{
|
||||||
equationNum++;
|
equationNum++;
|
||||||
@ -20,6 +25,11 @@ public class Equation : Graphable, IIntegrable, IDerivable
|
|||||||
|
|
||||||
this.equ = equ;
|
this.equ = equ;
|
||||||
cache = [];
|
cache = [];
|
||||||
|
|
||||||
|
OffsetX = 0;
|
||||||
|
OffsetY = 0;
|
||||||
|
|
||||||
|
OnInvalidate = delegate { };
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<IGraphPart> GetItemsToRender(in GraphForm graph)
|
public override IEnumerable<IGraphPart> GetItemsToRender(in GraphForm graph)
|
||||||
@ -46,6 +56,7 @@ public class Equation : Graphable, IIntegrable, IDerivable
|
|||||||
previousX = currentX;
|
previousX = currentX;
|
||||||
previousY = currentY;
|
previousY = currentY;
|
||||||
}
|
}
|
||||||
|
OnInvalidate.Invoke(graph);
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,16 +72,18 @@ public class Equation : Graphable, IIntegrable, IDerivable
|
|||||||
public override void EraseCache() => cache.Clear();
|
public override void EraseCache() => cache.Clear();
|
||||||
protected double GetFromCache(double x, double epsilon)
|
protected double GetFromCache(double x, double epsilon)
|
||||||
{
|
{
|
||||||
(double dist, double nearest, int index) = NearestCachedPoint(x);
|
(double dist, double nearest, int index) = NearestCachedPoint(x - OffsetX);
|
||||||
if (dist < epsilon) return nearest;
|
if (dist < epsilon) return nearest + OffsetY;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
double result = equ(x);
|
double result = equ(x - OffsetX);
|
||||||
cache.Insert(index + 1, new(x, result));
|
cache.Insert(index + 1, new(x - OffsetX, result));
|
||||||
return result;
|
return result + OffsetY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double GetValueAt(double x) => GetFromCache(x, 0);
|
||||||
|
|
||||||
protected (double dist, double y, int index) NearestCachedPoint(double x)
|
protected (double dist, double y, int index) NearestCachedPoint(double x)
|
||||||
{
|
{
|
||||||
if (cache.Count == 0) return (double.PositiveInfinity, double.NaN, -1);
|
if (cache.Count == 0) return (double.PositiveInfinity, double.NaN, -1);
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
using Graphing.Forms;
|
using Graphing.Abstract;
|
||||||
|
using Graphing.Forms;
|
||||||
using Graphing.Parts;
|
using Graphing.Parts;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Graphing.Graphables;
|
namespace Graphing.Graphables;
|
||||||
|
|
||||||
public class TangentLine : Graphable
|
public class TangentLine : Graphable, IEquationConvertible, ITranslatableX
|
||||||
{
|
{
|
||||||
public double Position
|
public double Position
|
||||||
{
|
{
|
||||||
@ -18,8 +19,13 @@ public class TangentLine : Graphable
|
|||||||
}
|
}
|
||||||
private double _position; // Private because it has exactly the same functionality as `Position`.
|
private double _position; // Private because it has exactly the same functionality as `Position`.
|
||||||
|
|
||||||
|
public double OffsetX
|
||||||
|
{
|
||||||
|
get => Position;
|
||||||
|
set => Position = value;
|
||||||
|
}
|
||||||
|
|
||||||
protected readonly Equation parent;
|
protected readonly Equation parent;
|
||||||
protected readonly EquationDelegate parentEqu;
|
|
||||||
|
|
||||||
protected readonly double length;
|
protected readonly double length;
|
||||||
|
|
||||||
@ -35,10 +41,16 @@ public class TangentLine : Graphable
|
|||||||
Name = $"Tangent Line of {parent.Name}";
|
Name = $"Tangent Line of {parent.Name}";
|
||||||
|
|
||||||
slopeCache = [];
|
slopeCache = [];
|
||||||
parentEqu = parent.GetDelegate();
|
|
||||||
Position = position;
|
|
||||||
this.length = length;
|
this.length = length;
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
|
Position = position;
|
||||||
|
|
||||||
|
parent.OnInvalidate += (graph) =>
|
||||||
|
{
|
||||||
|
// I don't love this but it works.
|
||||||
|
EraseCache();
|
||||||
|
Position = _position; // Done for side effects.
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<IGraphPart> GetItemsToRender(in GraphForm graph)
|
public override IEnumerable<IGraphPart> GetItemsToRender(in GraphForm graph)
|
||||||
@ -63,8 +75,8 @@ public class TangentLine : Graphable
|
|||||||
|
|
||||||
const double step = 1e-3;
|
const double step = 1e-3;
|
||||||
|
|
||||||
double initial = parentEqu(x);
|
double initial = parent.GetValueAt(x);
|
||||||
Float2 result = new((parentEqu(x + step) - initial) / step, initial);
|
Float2 result = new((parent.GetValueAt(x + step) - initial) / step, initial);
|
||||||
slopeCache.Add(x, result);
|
slopeCache.Add(x, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -112,4 +124,14 @@ public class TangentLine : Graphable
|
|||||||
// that can be changed.
|
// that can be changed.
|
||||||
for (double x = xRange.x; x <= xRange.y; x += step) DerivativeAtPoint(x);
|
for (double x = xRange.x; x <= xRange.y; x += step) DerivativeAtPoint(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Equation ToEquation()
|
||||||
|
{
|
||||||
|
double slope = currentSlope.x, x1 = Position, y1 = currentSlope.y;
|
||||||
|
return new(x => slope * (x - x1) + y1)
|
||||||
|
{
|
||||||
|
Name = Name,
|
||||||
|
Color = Color
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
|
|||||||
-->
|
-->
|
||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<History>True|2024-03-20T12:39:01.6402921Z;True|2024-03-13T10:31:43.4569441-04:00;False|2024-03-13T10:30:01.4347009-04:00;False|2024-03-13T10:27:31.9554551-04:00;</History>
|
<History>True|2024-03-20T12:48:45.8740885Z;True|2024-03-20T08:48:35.6948867-04:00;True|2024-03-20T08:39:01.6402921-04:00;True|2024-03-13T10:31:43.4569441-04:00;False|2024-03-13T10:30:01.4347009-04:00;False|2024-03-13T10:27:31.9554551-04:00;</History>
|
||||||
<LastFailureDetails />
|
<LastFailureDetails />
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
Loading…
x
Reference in New Issue
Block a user