/// <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)));
        }
예제 #12
0
 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);
        }