From e5c985c060d44bec0504471d353374ec450247fe Mon Sep 17 00:00:00 2001 From: That_One_Nerd Date: Tue, 2 Apr 2024 09:37:45 -0400 Subject: [PATCH] Improved conversions. You choose whether to remove the original. --- ...tionConvertible.cs => IConvertEquation.cs} | 4 ++- Base/Abstract/IConvertSlopeField.cs | 10 +++++++ Base/Forms/GraphForm.Designer.cs | 26 ++++++++++++------- Base/Forms/GraphForm.cs | 21 ++++++++++++--- Base/Graphables/Equation.cs | 16 +++++++++--- Base/Graphables/EquationDifference.cs | 4 ++- Base/Graphables/TangentLine.cs | 4 ++- 7 files changed, 66 insertions(+), 19 deletions(-) rename Base/Abstract/{IEquationConvertible.cs => IConvertEquation.cs} (52%) create mode 100644 Base/Abstract/IConvertSlopeField.cs diff --git a/Base/Abstract/IEquationConvertible.cs b/Base/Abstract/IConvertEquation.cs similarity index 52% rename from Base/Abstract/IEquationConvertible.cs rename to Base/Abstract/IConvertEquation.cs index 11bcfc5..da4f11a 100644 --- a/Base/Abstract/IEquationConvertible.cs +++ b/Base/Abstract/IConvertEquation.cs @@ -2,7 +2,9 @@ namespace Graphing.Abstract; -public interface IEquationConvertible +public interface IConvertEquation { + public bool UngraphWhenConvertedToEquation { get; } + public Equation ToEquation(); } diff --git a/Base/Abstract/IConvertSlopeField.cs b/Base/Abstract/IConvertSlopeField.cs new file mode 100644 index 0000000..2c3982a --- /dev/null +++ b/Base/Abstract/IConvertSlopeField.cs @@ -0,0 +1,10 @@ +using Graphing.Graphables; + +namespace Graphing.Abstract; + +public interface IConvertSlopeField +{ + public bool UngraphWhenConvertedToSlopeField { get; } + + public SlopeField ToSlopeField(int detail); +} diff --git a/Base/Forms/GraphForm.Designer.cs b/Base/Forms/GraphForm.Designer.cs index 6ad42fb..722588b 100644 --- a/Base/Forms/GraphForm.Designer.cs +++ b/Base/Forms/GraphForm.Designer.cs @@ -44,12 +44,13 @@ namespace Graphing.Forms MenuOperations = new ToolStripMenuItem(); MenuOperationsDerivative = new ToolStripMenuItem(); MenuOperationsIntegral = new ToolStripMenuItem(); + MenuOperationsTranslate = new ToolStripMenuItem(); MenuConvert = new ToolStripMenuItem(); MenuConvertEquation = new ToolStripMenuItem(); MenuMisc = new ToolStripMenuItem(); MenuMiscCaches = new ToolStripMenuItem(); MiscMenuPreload = new ToolStripMenuItem(); - MenuOperationsTranslate = new ToolStripMenuItem(); + MenuConvertSlopeField = new ToolStripMenuItem(); GraphMenu.SuspendLayout(); SuspendLayout(); // @@ -121,13 +122,13 @@ namespace Graphing.Forms // MenuElementsColors // MenuElementsColors.Name = "MenuElementsColors"; - MenuElementsColors.Size = new Size(359, 44); + MenuElementsColors.Size = new Size(233, 44); MenuElementsColors.Text = "Colors"; // // MenuElementsRemove // MenuElementsRemove.Name = "MenuElementsRemove"; - MenuElementsRemove.Size = new Size(359, 44); + MenuElementsRemove.Size = new Size(233, 44); MenuElementsRemove.Text = "Remove"; // // MenuOperations @@ -149,9 +150,15 @@ namespace Graphing.Forms MenuOperationsIntegral.Size = new Size(360, 44); MenuOperationsIntegral.Text = "Compute Integral"; // + // MenuOperationsTranslate + // + MenuOperationsTranslate.Name = "MenuOperationsTranslate"; + MenuOperationsTranslate.Size = new Size(360, 44); + MenuOperationsTranslate.Text = "Translate"; + // // MenuConvert // - MenuConvert.DropDownItems.AddRange(new ToolStripItem[] { MenuConvertEquation }); + MenuConvert.DropDownItems.AddRange(new ToolStripItem[] { MenuConvertEquation, MenuConvertSlopeField }); MenuConvert.Name = "MenuConvert"; MenuConvert.Size = new Size(118, 38); MenuConvert.Text = "Convert"; @@ -159,7 +166,7 @@ namespace Graphing.Forms // MenuConvertEquation // MenuConvertEquation.Name = "MenuConvertEquation"; - MenuConvertEquation.Size = new Size(273, 44); + MenuConvertEquation.Size = new Size(359, 44); MenuConvertEquation.Text = "To Equation"; // // MenuMisc @@ -183,11 +190,11 @@ namespace Graphing.Forms MiscMenuPreload.Text = "Preload Cache"; MiscMenuPreload.Click += MiscMenuPreload_Click; // - // MenuOperationsTranslate + // MenuConvertSlopeField // - MenuOperationsTranslate.Name = "MenuOperationsTranslate"; - MenuOperationsTranslate.Size = new Size(360, 44); - MenuOperationsTranslate.Text = "Translate"; + MenuConvertSlopeField.Name = "MenuConvertSlopeField"; + MenuConvertSlopeField.Size = new Size(359, 44); + MenuConvertSlopeField.Text = "To Slope Field"; // // GraphForm // @@ -226,5 +233,6 @@ namespace Graphing.Forms private ToolStripMenuItem MenuElementsColors; private ToolStripMenuItem MenuElementsRemove; private ToolStripMenuItem MenuOperationsTranslate; + private ToolStripMenuItem MenuConvertSlopeField; } } \ No newline at end of file diff --git a/Base/Forms/GraphForm.cs b/Base/Forms/GraphForm.cs index c6227f5..c4bd78d 100644 --- a/Base/Forms/GraphForm.cs +++ b/Base/Forms/GraphForm.cs @@ -369,6 +369,7 @@ public partial class GraphForm : Form MenuOperationsDerivative.DropDownItems.Clear(); MenuOperationsIntegral.DropDownItems.Clear(); MenuConvertEquation.DropDownItems.Clear(); + MenuConvertSlopeField.DropDownItems.Clear(); MenuOperationsTranslate.DropDownItems.Clear(); foreach (Graphable able in ables) @@ -409,7 +410,7 @@ public partial class GraphForm : Form integralItem.Click += (o, e) => Graph(integrable.Integrate()); MenuOperationsIntegral.DropDownItems.Add(integralItem); } - if (able is IEquationConvertible equConvert) + if (able is IConvertEquation equConvert) { ToolStripMenuItem equItem = new() { @@ -418,11 +419,25 @@ public partial class GraphForm : Form }; equItem.Click += (o, e) => { - Ungraph(able); + if (equConvert.UngraphWhenConvertedToEquation) Ungraph(able); Graph(equConvert.ToEquation()); }; MenuConvertEquation.DropDownItems.Add(equItem); } + if (able is IConvertSlopeField sfConvert) + { + ToolStripMenuItem sfItem = new() + { + ForeColor = able.Color, + Text = able.Name + }; + sfItem.Click += (o, e) => + { + if (sfConvert.UngraphWhenConvertedToSlopeField) Ungraph(able); + Graph(sfConvert.ToSlopeField(2)); + }; + MenuConvertSlopeField.DropDownItems.Add(sfItem); + } if (able is ITranslatable translatable) { ToolStripMenuItem transItem = new() @@ -538,8 +553,6 @@ public partial class GraphForm : Form Version curVersion = Version.Parse(Assembly.GetAssembly(typeof(GraphForm))!.FullName!.Split(',')[1].Trim()[8..^2]); Version newVersion = Version.Parse(latest["tag_name"]!.GetValue()); - curVersion = Version.Parse("1.0.0"); - if (newVersion > curVersion) { // Updates are required. diff --git a/Base/Graphables/Equation.cs b/Base/Graphables/Equation.cs index ef9c514..cf0d6aa 100644 --- a/Base/Graphables/Equation.cs +++ b/Base/Graphables/Equation.cs @@ -6,10 +6,12 @@ using System.Collections.Generic; namespace Graphing.Graphables; -public class Equation : Graphable, IIntegrable, IDerivable, ITranslatableXY +public class Equation : Graphable, IIntegrable, IDerivable, ITranslatableXY, IConvertSlopeField { private static int equationNum; + public bool UngraphWhenConvertedToSlopeField => false; + public double OffsetX { get; set; } public double OffsetY { get; set; } @@ -60,15 +62,23 @@ public class Equation : Graphable, IIntegrable, IDerivable, ITranslatableXY return lines; } - public Graphable Derive() => new Equation(x => + protected double DerivativeAtPoint(double x) { const double step = 1e-3; return (equ(x + step) - equ(x)) / step; - }); + } + + public Graphable Derive() => new Equation(DerivativeAtPoint); public Graphable Integrate() => new IntegralEquation(this); public EquationDelegate GetDelegate() => equ; + public SlopeField ToSlopeField(int detail) => new(detail, (x, y) => DerivativeAtPoint(x)) + { + Color = Color, + Name = $"Slope Field of {Name}" + }; + public override void EraseCache() => cache.Clear(); protected double GetFromCache(double x, double epsilon) { diff --git a/Base/Graphables/EquationDifference.cs b/Base/Graphables/EquationDifference.cs index 2f07d99..bdd341c 100644 --- a/Base/Graphables/EquationDifference.cs +++ b/Base/Graphables/EquationDifference.cs @@ -5,8 +5,10 @@ using System.Collections.Generic; namespace Graphing.Graphables; -public class EquationDifference : Graphable, ITranslatableX, IEquationConvertible +public class EquationDifference : Graphable, ITranslatableX, IConvertEquation { + public bool UngraphWhenConvertedToEquation => true; + public double Position { get => _position; diff --git a/Base/Graphables/TangentLine.cs b/Base/Graphables/TangentLine.cs index 5cc2da5..ab19db4 100644 --- a/Base/Graphables/TangentLine.cs +++ b/Base/Graphables/TangentLine.cs @@ -6,8 +6,10 @@ using System.Collections.Generic; namespace Graphing.Graphables; -public class TangentLine : Graphable, IEquationConvertible, ITranslatableX +public class TangentLine : Graphable, IConvertEquation, ITranslatableX { + public bool UngraphWhenConvertedToEquation => true; + public double Position { get => _position;