Skip to content

Commit 2c56a55

Browse files
Add state orientation interpolation (#216)
1 parent 53e08b9 commit 2c56a55

4 files changed

Lines changed: 69 additions & 3 deletions

File tree

IO.Astrodynamics.Net/IO.Astrodynamics.CLI/IO.Astrodynamics.CLI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<FileVersion>0.0.1</FileVersion>
1010
<PackAsTool>true</PackAsTool>
1111
<ToolCommandName>astro</ToolCommandName>
12-
<Version>0.5.0-preview-8</Version>
12+
<Version>0.5.0-preview-9</Version>
1313
<Title>Astrodynamics command line interface</Title>
1414
<Authors>Sylvain Guillet</Authors>
1515
<Description>This CLI allows end user to exploit IO.Astrodynamics framework </Description>

IO.Astrodynamics.Net/IO.Astrodynamics.Tests/OrbitalParameters/StateOrientationTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,47 @@ public void AtDate()
101101
Assert.Equal(TimeSystem.Time.J2000TDB.AddSeconds(10), res.Epoch);
102102
Assert.Equal(Frames.Frame.ECLIPTIC_J2000, res.ReferenceFrame);
103103
}
104+
105+
[Fact]
106+
public void Interpolate_SameReferenceFrame_ReturnsInterpolatedState()
107+
{
108+
// Arrange
109+
var initialOrientation = new StateOrientation(new Quaternion(1, 0, 0, 0), new Vector3(10, 20, 30), TimeSystem.Time.J2000TDB, Frames.Frame.ICRF);
110+
var finalOrientation = new StateOrientation(new Quaternion(0, 1, 0, 0), new Vector3(20, 30, 40), TimeSystem.Time.J2000TDB.AddSeconds(10), Frames.Frame.ICRF);
111+
var date = TimeSystem.Time.J2000TDB.AddSeconds(5);
112+
113+
// Act
114+
var result = initialOrientation.Interpolate(finalOrientation, date);
115+
116+
// Assert
117+
Assert.Equal(new Quaternion(0.7071067811865476, 0.7071067811865476, 0, 0), result.Rotation,TestHelpers.QuaternionComparer);
118+
Assert.Equal(new Vector3(15, 25, 35), result.AngularVelocity);
119+
Assert.Equal(date, result.Epoch);
120+
Assert.Equal(Frames.Frame.ICRF, result.ReferenceFrame);
121+
}
122+
123+
[Fact]
124+
public void Interpolate_DifferentReferenceFrames_ThrowsArgumentException()
125+
{
126+
// Arrange
127+
var initialOrientation = new StateOrientation(new Quaternion(1, 0, 0, 0), new Vector3(0, 0, 0), TimeSystem.Time.J2000TDB, Frames.Frame.ICRF);
128+
var finalOrientation = new StateOrientation(new Quaternion(0, 1, 0, 0), new Vector3(0, 0, 0), TimeSystem.Time.J2000TDB.AddSeconds(10), Frames.Frame.ECLIPTIC_J2000);
129+
var date = TimeSystem.Time.J2000TDB.AddSeconds(5);
130+
131+
// Act & Assert
132+
Assert.Throws<ArgumentException>(() => initialOrientation.Interpolate(finalOrientation, date));
133+
}
134+
135+
[Fact]
136+
public void Interpolate_DateOutOfRange_ThrowsArgumentException()
137+
{
138+
// Arrange
139+
var initialOrientation = new StateOrientation(new Quaternion(1, 0, 0, 0), new Vector3(0, 0, 0), TimeSystem.Time.J2000TDB, Frames.Frame.ICRF);
140+
var finalOrientation = new StateOrientation(new Quaternion(0, 1, 0, 0), new Vector3(0, 0, 0), TimeSystem.Time.J2000TDB.AddSeconds(10), Frames.Frame.ICRF);
141+
var date = TimeSystem.Time.J2000TDB.AddSeconds(15);
142+
143+
// Act & Assert
144+
Assert.Throws<ArgumentException>(() => initialOrientation.Interpolate(finalOrientation, date));
145+
}
104146
}
105147
}

IO.Astrodynamics.Net/IO.Astrodynamics/IO.Astrodynamics.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<id>IO.Astrodynamics</id>
55
<authors>Sylvain Guillet</authors>
66
<copyright>Sylvain Guillet</copyright>
7-
<version>6.0.0-preview-8</version>
7+
<version>6.0.0-preview-9</version>
88
<title>Astrodynamics framework</title>
99
<icon>images\dragonfly-dark-trans.png</icon>
1010
<readme>docs\README.md</readme>

IO.Astrodynamics.Net/IO.Astrodynamics/OrbitalParameters/StateOrientation.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,31 @@ public StateOrientation AtDate(in Time date)
4848
{
4949
var deltaT = (date - Epoch).TotalSeconds;
5050
return new StateOrientation(
51-
(new Quaternion(AngularVelocity.Normalize(), AngularVelocity.Magnitude() * deltaT).Normalize()*Rotation.Normalize()).Normalize(), AngularVelocity, date, ReferenceFrame);
51+
(new Quaternion(AngularVelocity.Normalize(), AngularVelocity.Magnitude() * deltaT).Normalize() * Rotation.Normalize()).Normalize(), AngularVelocity, date,
52+
ReferenceFrame);
53+
}
54+
55+
/// <summary>
56+
/// Interpolates between two state orientations.
57+
/// </summary>
58+
/// <param name="other"></param>
59+
/// <param name="date"></param>
60+
/// <returns></returns>
61+
/// <exception cref="ArgumentException"></exception>
62+
public StateOrientation Interpolate(StateOrientation other, Time date)
63+
{
64+
if (ReferenceFrame != other.ReferenceFrame)
65+
{
66+
throw new ArgumentException("Cannot interpolate between two different reference frames.");
67+
}
68+
if(date < Epoch || date > other.Epoch)
69+
{
70+
throw new ArgumentException("Date is out of range.");
71+
}
72+
var ratio = (date - Epoch).TotalSeconds / (other.Epoch - Epoch).TotalSeconds;
73+
74+
return new StateOrientation(Rotation.SLERP(other.Rotation, ratio), AngularVelocity.LinearInterpolation(other.AngularVelocity, ratio),
75+
Epoch + (other.Epoch - Epoch) * ratio, ReferenceFrame);
5276
}
5377

5478
/// <summary>

0 commit comments

Comments
 (0)