Version 1.3 is ready. #41

Merged
That-One-Nerd merged 23 commits from canary into main 2024-05-03 09:08:09 -04:00
7 changed files with 66 additions and 19 deletions
Showing only changes of commit e5c985c060 - Show all commits

View File

@ -2,7 +2,9 @@
namespace Graphing.Abstract; namespace Graphing.Abstract;
public interface IEquationConvertible public interface IConvertEquation
{ {
public bool UngraphWhenConvertedToEquation { get; }
public Equation ToEquation(); public Equation ToEquation();
} }

View File

@ -0,0 +1,10 @@
using Graphing.Graphables;
namespace Graphing.Abstract;
public interface IConvertSlopeField
{
public bool UngraphWhenConvertedToSlopeField { get; }
public SlopeField ToSlopeField(int detail);
}

View File

@ -44,12 +44,13 @@ namespace Graphing.Forms
MenuOperations = new ToolStripMenuItem(); MenuOperations = new ToolStripMenuItem();
MenuOperationsDerivative = new ToolStripMenuItem(); MenuOperationsDerivative = new ToolStripMenuItem();
MenuOperationsIntegral = new ToolStripMenuItem(); MenuOperationsIntegral = new ToolStripMenuItem();
MenuOperationsTranslate = new ToolStripMenuItem();
MenuConvert = new ToolStripMenuItem(); MenuConvert = new ToolStripMenuItem();
MenuConvertEquation = 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(); MenuConvertSlopeField = new ToolStripMenuItem();
GraphMenu.SuspendLayout(); GraphMenu.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
@ -121,13 +122,13 @@ namespace Graphing.Forms
// MenuElementsColors // MenuElementsColors
// //
MenuElementsColors.Name = "MenuElementsColors"; MenuElementsColors.Name = "MenuElementsColors";
MenuElementsColors.Size = new Size(359, 44); MenuElementsColors.Size = new Size(233, 44);
MenuElementsColors.Text = "Colors"; MenuElementsColors.Text = "Colors";
// //
// MenuElementsRemove // MenuElementsRemove
// //
MenuElementsRemove.Name = "MenuElementsRemove"; MenuElementsRemove.Name = "MenuElementsRemove";
MenuElementsRemove.Size = new Size(359, 44); MenuElementsRemove.Size = new Size(233, 44);
MenuElementsRemove.Text = "Remove"; MenuElementsRemove.Text = "Remove";
// //
// MenuOperations // MenuOperations
@ -149,9 +150,15 @@ namespace Graphing.Forms
MenuOperationsIntegral.Size = new Size(360, 44); MenuOperationsIntegral.Size = new Size(360, 44);
MenuOperationsIntegral.Text = "Compute Integral"; MenuOperationsIntegral.Text = "Compute Integral";
// //
// MenuOperationsTranslate
//
MenuOperationsTranslate.Name = "MenuOperationsTranslate";
MenuOperationsTranslate.Size = new Size(360, 44);
MenuOperationsTranslate.Text = "Translate";
//
// MenuConvert // MenuConvert
// //
MenuConvert.DropDownItems.AddRange(new ToolStripItem[] { MenuConvertEquation }); MenuConvert.DropDownItems.AddRange(new ToolStripItem[] { MenuConvertEquation, MenuConvertSlopeField });
MenuConvert.Name = "MenuConvert"; MenuConvert.Name = "MenuConvert";
MenuConvert.Size = new Size(118, 38); MenuConvert.Size = new Size(118, 38);
MenuConvert.Text = "Convert"; MenuConvert.Text = "Convert";
@ -159,7 +166,7 @@ namespace Graphing.Forms
// MenuConvertEquation // MenuConvertEquation
// //
MenuConvertEquation.Name = "MenuConvertEquation"; MenuConvertEquation.Name = "MenuConvertEquation";
MenuConvertEquation.Size = new Size(273, 44); MenuConvertEquation.Size = new Size(359, 44);
MenuConvertEquation.Text = "To Equation"; MenuConvertEquation.Text = "To Equation";
// //
// MenuMisc // MenuMisc
@ -183,11 +190,11 @@ namespace Graphing.Forms
MiscMenuPreload.Text = "Preload Cache"; MiscMenuPreload.Text = "Preload Cache";
MiscMenuPreload.Click += MiscMenuPreload_Click; MiscMenuPreload.Click += MiscMenuPreload_Click;
// //
// MenuOperationsTranslate // MenuConvertSlopeField
// //
MenuOperationsTranslate.Name = "MenuOperationsTranslate"; MenuConvertSlopeField.Name = "MenuConvertSlopeField";
MenuOperationsTranslate.Size = new Size(360, 44); MenuConvertSlopeField.Size = new Size(359, 44);
MenuOperationsTranslate.Text = "Translate"; MenuConvertSlopeField.Text = "To Slope Field";
// //
// GraphForm // GraphForm
// //
@ -226,5 +233,6 @@ namespace Graphing.Forms
private ToolStripMenuItem MenuElementsColors; private ToolStripMenuItem MenuElementsColors;
private ToolStripMenuItem MenuElementsRemove; private ToolStripMenuItem MenuElementsRemove;
private ToolStripMenuItem MenuOperationsTranslate; private ToolStripMenuItem MenuOperationsTranslate;
private ToolStripMenuItem MenuConvertSlopeField;
} }
} }

View File

@ -369,6 +369,7 @@ public partial class GraphForm : Form
MenuOperationsDerivative.DropDownItems.Clear(); MenuOperationsDerivative.DropDownItems.Clear();
MenuOperationsIntegral.DropDownItems.Clear(); MenuOperationsIntegral.DropDownItems.Clear();
MenuConvertEquation.DropDownItems.Clear(); MenuConvertEquation.DropDownItems.Clear();
MenuConvertSlopeField.DropDownItems.Clear();
MenuOperationsTranslate.DropDownItems.Clear(); MenuOperationsTranslate.DropDownItems.Clear();
foreach (Graphable able in ables) foreach (Graphable able in ables)
@ -409,7 +410,7 @@ public partial class GraphForm : Form
integralItem.Click += (o, e) => Graph(integrable.Integrate()); integralItem.Click += (o, e) => Graph(integrable.Integrate());
MenuOperationsIntegral.DropDownItems.Add(integralItem); MenuOperationsIntegral.DropDownItems.Add(integralItem);
} }
if (able is IEquationConvertible equConvert) if (able is IConvertEquation equConvert)
{ {
ToolStripMenuItem equItem = new() ToolStripMenuItem equItem = new()
{ {
@ -418,11 +419,25 @@ public partial class GraphForm : Form
}; };
equItem.Click += (o, e) => equItem.Click += (o, e) =>
{ {
Ungraph(able); if (equConvert.UngraphWhenConvertedToEquation) Ungraph(able);
Graph(equConvert.ToEquation()); Graph(equConvert.ToEquation());
}; };
MenuConvertEquation.DropDownItems.Add(equItem); 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) if (able is ITranslatable translatable)
{ {
ToolStripMenuItem transItem = new() 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 curVersion = Version.Parse(Assembly.GetAssembly(typeof(GraphForm))!.FullName!.Split(',')[1].Trim()[8..^2]);
Version newVersion = Version.Parse(latest["tag_name"]!.GetValue<string>()); Version newVersion = Version.Parse(latest["tag_name"]!.GetValue<string>());
curVersion = Version.Parse("1.0.0");
if (newVersion > curVersion) if (newVersion > curVersion)
{ {
// Updates are required. // Updates are required.

View File

@ -6,10 +6,12 @@ using System.Collections.Generic;
namespace Graphing.Graphables; namespace Graphing.Graphables;
public class Equation : Graphable, IIntegrable, IDerivable, ITranslatableXY public class Equation : Graphable, IIntegrable, IDerivable, ITranslatableXY, IConvertSlopeField
{ {
private static int equationNum; private static int equationNum;
public bool UngraphWhenConvertedToSlopeField => false;
public double OffsetX { get; set; } public double OffsetX { get; set; }
public double OffsetY { get; set; } public double OffsetY { get; set; }
@ -60,15 +62,23 @@ public class Equation : Graphable, IIntegrable, IDerivable, ITranslatableXY
return lines; return lines;
} }
public Graphable Derive() => new Equation(x => protected double DerivativeAtPoint(double x)
{ {
const double step = 1e-3; const double step = 1e-3;
return (equ(x + step) - equ(x)) / step; return (equ(x + step) - equ(x)) / step;
}); }
public Graphable Derive() => new Equation(DerivativeAtPoint);
public Graphable Integrate() => new IntegralEquation(this); public Graphable Integrate() => new IntegralEquation(this);
public EquationDelegate GetDelegate() => equ; 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(); public override void EraseCache() => cache.Clear();
protected double GetFromCache(double x, double epsilon) protected double GetFromCache(double x, double epsilon)
{ {

View File

@ -5,8 +5,10 @@ using System.Collections.Generic;
namespace Graphing.Graphables; namespace Graphing.Graphables;
public class EquationDifference : Graphable, ITranslatableX, IEquationConvertible public class EquationDifference : Graphable, ITranslatableX, IConvertEquation
{ {
public bool UngraphWhenConvertedToEquation => true;
public double Position public double Position
{ {
get => _position; get => _position;

View File

@ -6,8 +6,10 @@ using System.Collections.Generic;
namespace Graphing.Graphables; namespace Graphing.Graphables;
public class TangentLine : Graphable, IEquationConvertible, ITranslatableX public class TangentLine : Graphable, IConvertEquation, ITranslatableX
{ {
public bool UngraphWhenConvertedToEquation => true;
public double Position public double Position
{ {
get => _position; get => _position;