Version 1.2 is ready. #25
8
Base/Abstract/IDerivable.cs
Normal file
8
Base/Abstract/IDerivable.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
using Graphing.Graphables;
|
||||||
|
|
||||||
|
namespace Graphing.Abstract;
|
||||||
|
|
||||||
|
public interface IDerivable
|
||||||
|
{
|
||||||
|
public Equation Derive();
|
||||||
|
}
|
||||||
8
Base/Abstract/IIntegrable.cs
Normal file
8
Base/Abstract/IIntegrable.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
using Graphing.Graphables;
|
||||||
|
|
||||||
|
namespace Graphing.Abstract;
|
||||||
|
|
||||||
|
public interface IIntegrable
|
||||||
|
{
|
||||||
|
public IntegralEquation Integrate();
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
using Graphing.Graphables;
|
using Graphing.Abstract;
|
||||||
|
using Graphing.Graphables;
|
||||||
using Graphing.Parts;
|
using Graphing.Parts;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -362,22 +363,24 @@ public partial class GraphForm : Form
|
|||||||
colorItem.Click += (o, e) => GraphColorPickerButton_Click(able);
|
colorItem.Click += (o, e) => GraphColorPickerButton_Click(able);
|
||||||
MenuColors.DropDownItems.Add(colorItem);
|
MenuColors.DropDownItems.Add(colorItem);
|
||||||
|
|
||||||
if (able is Equation equ)
|
if (able is IDerivable derivable)
|
||||||
{
|
{
|
||||||
ToolStripMenuItem derivativeItem = new()
|
ToolStripMenuItem derivativeItem = new()
|
||||||
{
|
{
|
||||||
ForeColor = able.Color,
|
ForeColor = able.Color,
|
||||||
Text = able.Name
|
Text = able.Name
|
||||||
};
|
};
|
||||||
derivativeItem.Click += (o, e) => EquationComputeDerivative_Click(equ);
|
derivativeItem.Click += (o, e) => Graph(derivable.Derive());
|
||||||
MenuEquationsDerivative.DropDownItems.Add(derivativeItem);
|
MenuEquationsDerivative.DropDownItems.Add(derivativeItem);
|
||||||
|
}
|
||||||
|
if (able is IIntegrable integrable)
|
||||||
|
{
|
||||||
ToolStripMenuItem integralItem = new()
|
ToolStripMenuItem integralItem = new()
|
||||||
{
|
{
|
||||||
ForeColor = able.Color,
|
ForeColor = able.Color,
|
||||||
Text = able.Name
|
Text = able.Name
|
||||||
};
|
};
|
||||||
integralItem.Click += (o, e) => EquationComputeIntegral_Click(equ);
|
integralItem.Click += (o, e) => Graph(integrable.Integrate());
|
||||||
MenuEquationsIntegral.DropDownItems.Add(integralItem);
|
MenuEquationsIntegral.DropDownItems.Add(integralItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -409,30 +412,6 @@ public partial class GraphForm : Form
|
|||||||
Size = initialWindowSize;
|
Size = initialWindowSize;
|
||||||
WindowState = FormWindowState.Normal;
|
WindowState = FormWindowState.Normal;
|
||||||
}
|
}
|
||||||
private void EquationComputeDerivative_Click(Equation equation)
|
|
||||||
{
|
|
||||||
EquationDelegate equ = equation.GetDelegate();
|
|
||||||
string oldName = equation.Name, newName;
|
|
||||||
if (oldName.StartsWith("Derivative of ")) newName = "Second Derivative of " + oldName[14..];
|
|
||||||
else if (oldName.StartsWith("Second Derivative of ")) newName = "Third Derivative of " + oldName[21..];
|
|
||||||
else newName = "Derivative of " + oldName;
|
|
||||||
// TODO: anti-integrate (maybe).
|
|
||||||
|
|
||||||
Graph(new Equation(DerivativeAtPoint(equ))
|
|
||||||
{
|
|
||||||
Name = newName
|
|
||||||
});
|
|
||||||
|
|
||||||
static EquationDelegate DerivativeAtPoint(EquationDelegate e)
|
|
||||||
{
|
|
||||||
const double step = 1e-3;
|
|
||||||
return x => (e(x + step) - e(x)) / step;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void EquationComputeIntegral_Click(Equation equation)
|
|
||||||
{
|
|
||||||
Graph(equation.Integrate());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void MenuMiscCaches_Click(object? sender, EventArgs e)
|
private void MenuMiscCaches_Click(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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 Equation : Graphable
|
public class Equation : Graphable, IIntegrable, IDerivable
|
||||||
{
|
{
|
||||||
private static int equationNum;
|
private static int equationNum;
|
||||||
|
|
||||||
@ -48,6 +49,11 @@ public class Equation : Graphable
|
|||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Equation Derive() => new(x =>
|
||||||
|
{
|
||||||
|
const double step = 1e-3;
|
||||||
|
return (equ(x + step) - equ(x)) / step;
|
||||||
|
});
|
||||||
public IntegralEquation Integrate() => new(this);
|
public IntegralEquation Integrate() => new(this);
|
||||||
|
|
||||||
public EquationDelegate GetDelegate() => equ;
|
public EquationDelegate GetDelegate() => equ;
|
||||||
|
|||||||
@ -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 IntegralEquation : Graphable
|
public class IntegralEquation : Graphable, IIntegrable, IDerivable
|
||||||
{
|
{
|
||||||
protected readonly Equation baseEqu;
|
protected readonly Equation baseEqu;
|
||||||
protected readonly EquationDelegate baseEquDel;
|
protected readonly EquationDelegate baseEquDel;
|
||||||
@ -113,11 +114,18 @@ public class IntegralEquation : Graphable
|
|||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Equation AsEquation() => new(GetIntegralAtPoint);
|
public Equation AsEquation() => new(IntegralAtPoint)
|
||||||
|
{
|
||||||
|
Name = Name,
|
||||||
|
Color = Color
|
||||||
|
};
|
||||||
|
|
||||||
|
public Equation Derive() => (Equation)baseEqu.DeepCopy();
|
||||||
|
public IntegralEquation Integrate() => AsEquation().Integrate();
|
||||||
|
|
||||||
// Standard integral method.
|
// Standard integral method.
|
||||||
// Inefficient for successive calls.
|
// Inefficient for successive calls.
|
||||||
public double GetIntegralAtPoint(double x)
|
public double IntegralAtPoint(double x)
|
||||||
{
|
{
|
||||||
EquationDelegate equ = baseEqu.GetDelegate();
|
EquationDelegate equ = baseEqu.GetDelegate();
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,9 @@ internal static class Program
|
|||||||
// Keep in mind this uses more memory than usual and can take
|
// Keep in mind this uses more memory than usual and can take
|
||||||
// some time.
|
// some time.
|
||||||
|
|
||||||
|
// Integrating equations is now much smoother and less intensive.
|
||||||
|
// Try it out!
|
||||||
|
|
||||||
Application.Run(graph);
|
Application.Run(graph);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user