Graphing/Base/Graphables/SlopeField.cs

52 lines
1.4 KiB
C#

using Graphing.Forms;
namespace Graphing.Graphables;
public class SlopeField : Graphable
{
private static int slopeFieldNum;
private readonly SlopeFieldsDelegate equ;
private readonly double detail;
public SlopeField(int detail, SlopeFieldsDelegate equ)
{
slopeFieldNum++;
Name = $"Slope Field {slopeFieldNum}";
this.equ = equ;
this.detail = detail;
}
public override IEnumerable<Line2d> GetItemsToRender(in GraphForm graph)
{
List<Line2d> lines = [];
for (double x = Math.Ceiling(graph.MinVisibleGraph.x - 1); x < graph.MaxVisibleGraph.x + 1; x += 1 / detail)
{
for (double y = Math.Ceiling(graph.MinVisibleGraph.y - 1); y < graph.MaxVisibleGraph.y + 1; y += 1 / detail)
{
double slope = equ(x, y);
lines.Add(MakeSlopeLine(new Float2(x, y), slope));
}
}
return lines;
}
private Line2d MakeSlopeLine(Float2 position, double slope)
{
double size = detail;
double dirX = size, dirY = slope * size;
double magnitude = Math.Sqrt(dirX * dirX + dirY * dirY);
dirX /= magnitude * size * 2;
dirY /= magnitude * size * 2;
return new(new(position.x + dirX, position.y + dirY), new(position.x - dirX, position.y - dirY));
}
}
public delegate double SlopeFieldsDelegate(double x, double y);