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 System;
using Vim.Math3d; using Vim.Math3d;
public struct Ellipse public struct Ellipse : IEllipse
{ {
public Ellipse(double a = 1, double e = 0) 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 // TODO: this is an immutable struct, so initialise everything else
// in the constructor to avoid recalculating properties whenever // in the constructor to avoid recalculating properties whenever
// they are accessed // 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> /// <summary>
@ -29,8 +39,7 @@ public struct Ellipse
/// <summary> /// <summary>
/// Semi-minor axis /// Semi-minor axis
/// </summary> /// </summary>
public double b => SemiMinorAxis; public double b { get; }
public double SemiMinorAxis => Math.Sqrt(Apisides.max * Apisides.min);
/// <summary> /// <summary>
/// Get a position on the auxiliary circle /// Get a position on the auxiliary circle
@ -40,13 +49,10 @@ public struct Ellipse
public DVector2 GetAuxiliaryPosition2D(double t = 0) => public DVector2 GetAuxiliaryPosition2D(double t = 0) =>
new DVector2(Math.Cos(t), Math.Sin(t)) * a; 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) => public DVector2[] Foci { get; }
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); 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);
}