diff --git a/scripts/orbits/math/Ellipse.cs b/scripts/orbits/math/Ellipse.cs index e1fff2e..22292c1 100644 --- a/scripts/orbits/math/Ellipse.cs +++ b/scripts/orbits/math/Ellipse.cs @@ -2,7 +2,7 @@ using Godot; using System; using Vim.Math3d; -public struct Ellipse +public struct Ellipse : IEllipse { public Ellipse(double a = 1, double e = 0) { @@ -12,6 +12,16 @@ public struct Ellipse // TODO: this is an immutable struct, so initialise everything else // in the constructor to avoid recalculating properties whenever // they are accessed + + Apisides = new Apisides(a, e); + b = Math.Sqrt(Apisides.max * Apisides.min); + + var d = Math.Sqrt(a * a - b * b); + Foci = new DVector2[] + { + new DVector2(-d, 0), + new DVector2(d, 0) + }; } /// @@ -29,8 +39,7 @@ public struct Ellipse /// /// Semi-minor axis /// - public double b => SemiMinorAxis; - public double SemiMinorAxis => Math.Sqrt(Apisides.max * Apisides.min); + public double b { get; } /// /// Get a position on the auxiliary circle @@ -40,13 +49,10 @@ public struct Ellipse public DVector2 GetAuxiliaryPosition2D(double t = 0) => new DVector2(Math.Cos(t), Math.Sin(t)) * a; - private Apisides Apisides => new Apisides(a, e); + private Apisides Apisides { get; } - public DVector2 GetPosition(double t) => - new DVector2(Math.Cos(t) * a, Math.Sin(t) * b); + public DVector2[] Foci { get; } - public DVector2 Focus0 => new DVector2(-GetFocusDistance(), 0); - public DVector2 Focus1 => new DVector2(GetFocusDistance(), 0); private double GetFocusDistance() => Math.Sqrt(a * a - b * b); } diff --git a/scripts/orbits/math/IEllipse.cs b/scripts/orbits/math/IEllipse.cs new file mode 100644 index 0000000..c7b3d7b --- /dev/null +++ b/scripts/orbits/math/IEllipse.cs @@ -0,0 +1,20 @@ +using Godot; +using System; +using Vim.Math3d; + +public interface IEllipse +{ + /// + /// Semi-major axis + /// + double a { get; } + double b { get; } + /// + /// Eccentricity + /// + double e { get; } + /// + /// Positions of the two foci of the ellipse + /// + DVector2[] Foci { get; } +} diff --git a/scripts/orbits/math/IEllipseExtensions.cs b/scripts/orbits/math/IEllipseExtensions.cs new file mode 100644 index 0000000..40f1137 --- /dev/null +++ b/scripts/orbits/math/IEllipseExtensions.cs @@ -0,0 +1,8 @@ +using Vim.Math3d; +using System; + +public static class IEllipseExtensions +{ + public static DVector2 GetPosition(this IEllipse e, double t) => + new DVector2(Math.Cos(t) * e.a, Math.Sin(t) * e.b); +} \ No newline at end of file