/// <summary> /// ''' Calculates the angle between the two directions starting from the position /// ''' and ending in the start and end point of the stretch. /// ''' </summary> /// ''' <param name="at">The <see cref="Position">position</see> to get the angle for.</param> /// ''' <returns>The angle between the two directions starting from the position /// ''' and ending in the start and end point of the stretch.</returns> /// ''' <remarks></remarks> public static Angle MinAngle(this Stretch me, Position at) { var a1 = Stretch.Between(at, me.From).Direction; var a2 = Stretch.Between(at, me.To).Direction; return(a1.Min(a2)); }
public void JsonSerializationAndDeserializationWorks() { var target = Stretch.Between(Position.FromDegrees(58.1, 11.9), Position.FromDegrees(59.1, 12.9)); var actual = SerializationTester <Stretch> .JsonSerializeAndDeserialize(target); Assert.AreEqual(target, actual); }
public void Operators() { Assert.IsTrue(Stretch.Between(TestData.Stockholm, TestData.Wellington) == Stretch.Between(TestData.Stockholm, TestData.Wellington)); Assert.IsFalse(Stretch.Between(TestData.Stockholm, TestData.Wellington) == Stretch.Between(TestData.Hövik, TestData.Höviksnäs)); Assert.IsFalse(Stretch.Between(TestData.Stockholm, TestData.Wellington) != Stretch.Between(TestData.Stockholm, TestData.Wellington)); Assert.IsTrue(Stretch.Between(TestData.Stockholm, TestData.Wellington) != Stretch.Between(TestData.Hövik, TestData.Höviksnäs)); }
public void CreateWithDistanceCalculator() { var target = Stretch.Between(TestData.Hövik, TestData.Höviksnäs, new HaversineDistanceCalculator()); Assert.AreEqual(TestData.Hövik, target.From); Assert.AreEqual(TestData.Höviksnäs, target.To); }
public void IsInverse() { var target = Stretch.Between(TestData.Hövik, TestData.Höviksnäs); var actual = target.Inverse; Assert.AreEqual(target.To, actual.From); Assert.AreEqual(target.From, actual.To); }
public void OnTrackDistance() { var s = Stretch.Between(TestData.Hövik, TestData.Höviksnäs); Assert.AreEqual(Distance.FromMeters(62.640), s.OnTrackDistance(Position.FromDegrees(58.033668, 11.743887))); Assert.AreEqual(Distance.FromMeters(311.088), s.OnTrackDistance(Position.FromDegrees(58.033296, 11.750197))); Assert.AreEqual(Distance.FromMeters(598.805), s.OnTrackDistance(Position.FromDegrees(58.032905, 11.755030))); }
public void CrossTrackDistance() { var s = Stretch.Between(TestData.Hövik, TestData.Höviksnäs); Assert.AreEqual(Distance.FromMeters(20.950), s.CrossTrackDistance(Position.FromDegrees(58.033668, 11.743887))); Assert.AreEqual(Distance.FromMeters(15.855), s.CrossTrackDistance(Position.FromDegrees(58.033296, 11.750197))); Assert.AreEqual(Distance.FromMeters(23.632), s.CrossTrackDistance(Position.FromDegrees(58.032905, 11.755030))); }
/// <summary> /// ''' The along-track distance, calculated from the start point to the closest point on the path to the given point. /// ''' </summary> /// ''' <param name="at">The <see cref="Position">position</see> to caclulate the on track distance for.</param> /// ''' <returns>The on track distance from the start of the stretch.</returns> /// ''' <remarks></remarks> public static Distance OnTrackDistance(this Stretch me, Position at) { const double r = EarthMeanRadiusMeters / 1000; var s = Stretch.Between(me.From, at); var d13 = s.Distance.Meters; var dXt = me.CrossTrackDistance(at).Meters; var d = Acos(Cos(d13 / r) / Cos(dXt / r)) * r; return(Distance.FromMeters(Abs(d))); }
public void LongStretchHaveCorrectProperties() { var target = Stretch.Between(TestData.Stockholm, TestData.Wellington); Assert.AreEqual(17445.0, target.Distance.Kilometers, 0.1); Assert.AreEqual(127.296, target.Direction.Degrees, 0.001); Assert.AreEqual(48.853, target.InitialBearing.Degrees, 0.001); Assert.AreEqual(149.276, target.FinalBearing.Degrees, 0.001); Assert.IsFalse(target.IsEastWestLine); }
public void ShortStretchHaveCorrectProperties() { var target = Stretch.Between(TestData.Hövik, TestData.Höviksnäs); Assert.AreEqual(0.5620, target.Distance.Kilometers, 0.001); Assert.AreEqual(97.137, target.Direction.Degrees, 0.001); Assert.AreEqual(97.133, target.InitialBearing.Degrees, 0.001); Assert.AreEqual(97.141, target.FinalBearing.Degrees, 0.001); //Assert.IsFalse(target.IsEastWestLine); }
/// <summary> /// The distance of a point from a great-circle path (sometimes called cross track error). /// </summary> /// <param name="at"></param> /// <returns></returns> public static Distance CrossTrackDistance(this Stretch me, Position at) { const double R = EarthMeanRadiusMeters; var s = Stretch.Between(me.From, at); var δ13 = s.Distance.Meters; var θ13 = s.InitialBearing.Radians; var θ12 = me.InitialBearing.Radians; var d = Asin(Sin(δ13 / R) * Sin(θ13 - θ12)) * R; return(Distance.FromMeters(Abs(d))); }
public static IEnumerable <Stretch> EnclosingSides(this Position[] positions) => positions.Select((v, i) => Stretch.Between(v, positions[i > positions.Length - 1 ? 0 : i]));
public void MinAngle() { var s = Stretch.Between(TestData.Hövik, TestData.Höviksnäs); Assert.AreEqual(Angle.FromDegrees(173.471107), s.MinAngle(Position.FromDegrees(58.033296, 11.750197))); }
public void EqualsIsCorrect() { Assert.AreEqual(Stretch.Between(TestData.Stockholm, TestData.Wellington), Stretch.Between(TestData.Stockholm, TestData.Wellington)); Assert.AreNotEqual(Stretch.Between(TestData.Stockholm, TestData.Wellington), Stretch.Between(TestData.Hövik, TestData.Höviksnäs)); Assert.AreNotEqual(Stretch.Between(TestData.Stockholm, TestData.Wellington), new object()); }
public void IsZero() { Assert.IsTrue(Stretch.Between(TestData.Hövik, TestData.Hövik).IsZero); }
public void IsEastWestLine() { var target = Stretch.Between(Position.FromDegrees(50, -4), Position.FromDegrees(50, 87)); Assert.IsTrue(target.IsEastWestLine); }