diff --git a/scripts/orbits/IOrbitalElementsExtensions.cs b/scripts/orbits/IOrbitalElementsExtensions.cs
new file mode 100644
index 0000000..f8dbda1
--- /dev/null
+++ b/scripts/orbits/IOrbitalElementsExtensions.cs
@@ -0,0 +1,13 @@
+using Vim.Math3d;
+using static System.Math;
+
+public static class IOrbitalElementsExtensions
+{
+ ///
+ /// Get the Cartesian position on the orbit for a given mean anomaly.
+ ///
+ /// Mean anomaly
+ /// Position
+ public static DVector2 GetEccentricPosition2D(this OrbitalElements elements, double M) =>
+ Kepler.GetEccentricPosition2D(elements.e, elements.a, M);
+}
\ No newline at end of file
diff --git a/scripts/orbits/OrbitalElements.cs b/scripts/orbits/OrbitalElements.cs
new file mode 100644
index 0000000..c501dc8
--- /dev/null
+++ b/scripts/orbits/OrbitalElements.cs
@@ -0,0 +1,46 @@
+public struct OrbitalElements
+{
+ private Ellipse _ellipse;
+ ///
+ /// Semi-major axis in AU
+ ///
+ public double a => _ellipse.a;
+ ///
+ /// Eccentricity
+ ///
+ public double e => _ellipse.e;
+ ///
+ /// Inclination in degrees
+ ///
+ public double i { get; private set; }
+ ///
+ /// Argument of ascending node in degrees
+ ///
+ public double W { get; private set; }
+ ///
+ /// Argument of periapsis in degrees
+ ///
+ public double p { get; private set; }
+ ///
+ /// Mean anomaly at epoch
+ ///
+ public double M0 { get; private set; }
+
+ ///
+ ///
+ ///
+ /// Semi-major axis in AU
+ /// eccentricity
+ /// Inclination in degrees
+ /// Argument of ascending node in degrees
+ /// Argument of periapsis in degrees
+ /// Mean anomaly at epoch
+ 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;
+ }
+}
\ No newline at end of file