Compare commits

..

1 Commits

Author SHA1 Message Date
Cat Flynn 6f79458d66 WIP - RESET THIS 2022-09-05 22:14:30 +01:00
9 changed files with 74 additions and 74 deletions

View File

@ -0,0 +1,4 @@
public static class IMassiveExtensions
{
public static double U(this IMassive m) => Kepler.U(m.Mass);
}

View File

@ -2,6 +2,6 @@ using Vim.Math3d;
public interface IOrbit
{
DVector3 GetPosition(double t);
IEllipse Ellipse { get; set; }
Ellipse Ellipse { get; }
DVector3 GetPosition(float t);
}

View File

@ -1,29 +0,0 @@
using Godot;
public static class IOrbitExtensions
{
public static void Draw(this IOrbit orbit, ImmediateGeometry geo)
{
geo.Clear();
geo.Begin(Mesh.PrimitiveType.LineLoop);
geo.SetColor(new Color(1, 0, 0));
int steps = 100;
var ellipse = orbit.Ellipse;
for (int i = 0; i < steps; i++)
{
float t = i / (float)steps;
float a = t * Mathf.Tau;
var v2 = ellipse.Foci[0] + ellipse.GetPosition(a);
geo.AddVertex(new Godot.Vector3
{
x = (float)v2.X,
z = (float)v2.Y
});
}
geo.End();
}
}

View File

@ -0,0 +1,13 @@
using Vim.Math3d;
using static System.Math;
public static class IOrbitalElementsExtensions
{
/// <summary>
/// Get the Cartesian position on the orbit for a given mean anomaly.
/// </summary>
/// <param name="M">Mean anomaly</param>
/// <returns>Position</returns>
public static DVector2 GetEccentricPosition2D(this OrbitalElements elements, double M) =>
Kepler.GetEccentricPosition2D(elements.e, elements.a, M);
}

View File

@ -2,7 +2,7 @@ using Godot;
using System;
using Vim.Math3d;
public class Orbit
public class Orbit : IOrbit
{
// The position of the primary body relative to the ellipse - the
// orbit itself is presented as being centred on the primary, but

View File

@ -0,0 +1,46 @@
public struct OrbitalElements
{
private Ellipse _ellipse;
/// <summary>
/// Semi-major axis in AU
/// </summary>
public double a => _ellipse.a;
/// <summary>
/// Eccentricity
/// </summary>
public double e => _ellipse.e;
/// <summary>
/// Inclination in degrees
/// </summary>
public double i { get; private set; }
/// <summary>
/// Argument of ascending node in degrees
/// </summary>
public double W { get; private set; }
/// <summary>
/// Argument of periapsis in degrees
/// </summary>
public double p { get; private set; }
/// <summary>
/// Mean anomaly at epoch
/// </summary>
public double M0 { get; private set; }
/// <summary>
///
/// </summary>
/// <param name="a">Semi-major axis in AU</param>
/// <param name="e">eccentricity</param>
/// <param name="i">Inclination in degrees</param>
/// <param name="W">Argument of ascending node in degrees</param>
/// <param name="p">Argument of periapsis in degrees</param>
/// <param name="M0">Mean anomaly at epoch</param>
public OrbitalElements(double a, double e, double i, double W, double p, double M0)
{
_ellipse = new Ellipse(a, e);
this.i = i;
this.W = W;
this.p = p;
this.M0 = M0;
}
}

View File

@ -2,7 +2,7 @@ using Godot;
using System;
using Vim.Math3d;
public struct Ellipse : IEllipse
public struct Ellipse
{
public Ellipse(double a = 1, double e = 0)
{
@ -12,16 +12,6 @@ public struct Ellipse : IEllipse
// 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)
};
}
/// <summary>
@ -39,7 +29,8 @@ public struct Ellipse : IEllipse
/// <summary>
/// Semi-minor axis
/// </summary>
public double b { get; }
public double b => SemiMinorAxis;
public double SemiMinorAxis => Math.Sqrt(Apisides.max * Apisides.min);
/// <summary>
/// Get a position on the auxiliary circle
@ -49,10 +40,13 @@ public struct Ellipse : IEllipse
public DVector2 GetAuxiliaryPosition2D(double t = 0) =>
new DVector2(Math.Cos(t), Math.Sin(t)) * a;
private Apisides Apisides { get; }
private Apisides Apisides => new Apisides(a, e);
public DVector2[] Foci { get; }
public DVector2 GetPosition(double t) =>
new DVector2(Math.Cos(t) * a, Math.Sin(t) * b);
public DVector2 Focus0 => new DVector2(-GetFocusDistance(), 0);
public DVector2 Focus1 => new DVector2(GetFocusDistance(), 0);
private double GetFocusDistance() => Math.Sqrt(a * a - b * b);
}

View File

@ -1,20 +0,0 @@
using Godot;
using System;
using Vim.Math3d;
public interface IEllipse
{
/// <summary>
/// Semi-major axis
/// </summary>
double a { get; }
double b { get; }
/// <summary>
/// Eccentricity
/// </summary>
double e { get; }
/// <summary>
/// Positions of the two foci of the ellipse
/// </summary>
DVector2[] Foci { get; }
}

View File

@ -1,8 +0,0 @@
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);
}