Example #1
0
        /// <summary>
        /// Computes the distance from the point to the segment. The return
        /// value is in units of sqrt(lat^2 + long^2) in WGS84 coordinates.
        /// </summary>
        /// <returns>The distance to the point in units of sqrt(lat^2 + long^2).</returns>
        /// <param name="point">Point on Earth.</param>
        public double DistanceToPoint(GeoCoordinates point)
        {
            Vector2 p1 = Endpoint1.ToVector2();
            Vector2 p2 = Endpoint2.ToVector2();

            if (CrossesMeridianRightOfP1)
            {
                p2 += new Vector2(360, 0);

                Vector2 pointRepr1 = point.ToVector2();
                Vector2 pointRepr2 = pointRepr1 + new Vector2(360, 0);

                double dist1 = Geometry2d.PointToSegmentDistance(p1, p2, pointRepr1);
                double dist2 = Geometry2d.PointToSegmentDistance(p1, p2, pointRepr2);

                return(Math.Min(dist1, dist2));
            }
            else if (CrossesMeridianLeftOfP1)
            {
                p2 -= new Vector2(360, 0);

                Vector2 pointRepr1 = point.ToVector2();
                Vector2 pointRepr2 = pointRepr1 - new Vector2(360, 0);

                double dist1 = Geometry2d.PointToSegmentDistance(p1, p2, pointRepr1);
                double dist2 = Geometry2d.PointToSegmentDistance(p1, p2, pointRepr2);

                return(Math.Min(dist1, dist2));
            }
            else
            {
                return(Geometry2d.PointToSegmentDistance(p1, p2, point.ToVector2()));
            }
        }