Esempio n. 1
0
        ///**
        // * A value that indicates an orientation of clockwise, or a right turn.
        // */
        //public const int CLOCKWISE = -1;
        ///**
        // * A value that indicates an orientation of clockwise, or a right turn.
        // */
        //public const int RIGHT = CLOCKWISE;
        ///**
        // * A value that indicates an orientation of counterclockwise, or a left turn.
        // */
        //public const int COUNTERCLOCKWISE = 1;
        ///**
        // * A value that indicates an orientation of counterclockwise, or a left turn.
        // */
        //public const int LEFT = COUNTERCLOCKWISE;
        ///**
        // * A value that indicates an orientation of collinear, or no turn (straight).
        // */
        //public const int COLLINEAR = 0;
        ///**
        // * A value that indicates an orientation of collinear, or no turn (straight).
        // */
        //public const int STRAIGHT = COLLINEAR;


        /// <summary>
        /// Returns the orientation index of the direction of the point <paramref name="q"/> relative to
        /// a directed infinite line specified by <c>p1-&gt;p2</c>.
        /// The index indicates whether the point lies to the <see cref="OrientationIndex.Left"/>
        /// or <see cref="OrientationIndex.Right"/> of the line, or lies on it <see cref="OrientationIndex.Collinear"/>.
        /// The index also indicates the orientation of the triangle formed by the three points
        /// (<see cref="OrientationIndex.CounterClockwise"/>, <see cref="OrientationIndex.Clockwise"/>, or
        /// <see cref="OrientationIndex.Straight"/> )
        /// </summary>
        /// <param name="p1">The origin point of the line vector</param>
        /// <param name="p2">The final point of the line vector</param>
        /// <param name="q">The point to compute the direction to</param>
        /// <returns>
        /// The <see cref="OrientationIndex"/> of q in regard to the vector <c>p1-&gt;p2</c>
        /// <list type="Table">
        /// <listheader>
        /// <term>Value</term><description>Description</description>
        /// </listheader>
        /// <item>
        /// <term><see cref="OrientationIndex.Collinear"/>, <see cref="OrientationIndex.Straight"/></term>
        /// <description><paramref name="q"/> is collinear with <c>p1-&gt;p2</c></description>
        /// </item>
        /// <item>
        /// <term><see cref="OrientationIndex.Clockwise"/>, <see cref="OrientationIndex.Right"/></term>
        /// <description><paramref name="q"/> is clockwise (right) from <c>p1-&gt;p2</c></description>
        /// </item>
        /// <item>
        /// <term><see cref="OrientationIndex.CounterClockwise"/>, <see cref="OrientationIndex.Left"/></term>
        /// <description><paramref name="q"/> is counter-clockwise (left) from <c>p1-&gt;p2</c></description>
        /// </item>
        /// </list>
        /// </returns>
        public static OrientationIndex Index(Coordinate p1, Coordinate p2, Coordinate q)
        {
            /**
             * MD - 9 Aug 2010 It seems that the basic algorithm is slightly orientation
             * dependent, when computing the orientation of a point very close to a
             * line. This is possibly due to the arithmetic in the translation to the
             * origin.
             *
             * For instance, the following situation produces identical results in spite
             * of the inverse orientation of the line segment:
             *
             * Coordinate p0 = new Coordinate(219.3649559090992, 140.84159161824724);
             * Coordinate p1 = new Coordinate(168.9018919682399, -5.713787599646864);
             *
             * Coordinate p = new Coordinate(186.80814046338352, 46.28973405831556); int
             * orient = orientationIndex(p0, p1, p); int orientInv =
             * orientationIndex(p1, p0, p);
             *
             * A way to force consistent results is to normalize the orientation of the
             * vector using the following code. However, this may make the results of
             * orientationIndex inconsistent through the triangle of points, so it's not
             * clear this is an appropriate patch.
             *
             */
            var res = (OrientationIndex)CGAlgorithmsDD.OrientationIndex(p1, p2, q);

            return(res); //(Orientation)CGAlgorithmsDD.OrientationIndex(p1, p2, q);
            // testing only
            //return ShewchuksDeterminant.orientationIndex(p1, p2, q);
            // previous implementation - not quite fully robust
            //return RobustDeterminant.orientationIndex(p1, p2, q);
        }
        private void CheckDD(Coordinate p1, Coordinate p2, Coordinate q1,
                             Coordinate q2, Coordinate intPt)
        {
            Coordinate intPtDD = CGAlgorithmsDD.Intersection(p1, p2, q1, q2);
            bool       isIn    = IsInSegmentEnvelopes(intPtDD);

            Debug.WriteLine("DD in env = " + isIn + "  --------------------- " + intPtDD);
            double distance = intPt.Distance(intPtDD);

            if (distance > 0.0001)
            {
                Debug.WriteLine("Distance = " + distance);
            }
        }