extract IEllipse and extensions

This commit is contained in:
ktyl 2022-09-07 00:41:32 +01:00
parent bc28d4d172
commit bed71f2c4c
3 changed files with 42 additions and 8 deletions

View File

@ -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)
};
}
/// <summary>
@ -29,8 +39,7 @@ public struct Ellipse
/// <summary>
/// Semi-minor axis
/// </summary>
public double b => SemiMinorAxis;
public double SemiMinorAxis => Math.Sqrt(Apisides.max * Apisides.min);
public double b { get; }
/// <summary>
/// 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);
}

View File

@ -0,0 +1,20 @@
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

@ -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);
}