public DirectedEdge GetRightmostEdge()
        {
            IList edges = this.Edges;
            int   size  = edges.Count;

            if (size < 1)
            {
                return(null);
            }
            DirectedEdge de0 = (DirectedEdge)edges[0];

            if (size == 1)
            {
                return(de0);
            }
            DirectedEdge deLast = (DirectedEdge)edges[size - 1];

            int quad0 = de0.Quadrant;
            int quad1 = deLast.Quadrant;

            if (Quadrant.IsNorthern(quad0) && Quadrant.IsNorthern(quad1))
            {
                return(de0);
            }
            else if (!Quadrant.IsNorthern(quad0) && !Quadrant.IsNorthern(quad1))
            {
                return(deLast);
            }
            else
            {
                // edges are in different hemispheres - make sure we return one that is non-horizontal
                if (de0.Dy != 0)
                {
                    return(de0);
                }
                else if (deLast.Dy != 0)
                {
                    return(deLast);
                }
            }

            Debug.Assert(false, "Should never reach here: found two horizontal edges incident on node");

            return(null);
        }
Beispiel #2
0
        /// <summary>
        /// The coordinate pairs match if they define line segments lying in
        /// the same direction.
        /// E.g. the segments are parallel and in the same quadrant
        /// (as opposed to parallel and opposite!).
        /// </summary>
        private bool MatchInSameDirection(Coordinate p0, Coordinate p1,
                                          Coordinate ep0, Coordinate ep1)
        {
            if (!p0.Equals(ep0))
            {
                return(false);
            }

            if (CGAlgorithms.ComputeOrientation(p0, p1, ep1) ==
                OrientationType.Collinear &&
                Quadrant.GetQuadrant(p0, p1) ==
                Quadrant.GetQuadrant(ep0, ep1))
            {
                return(true);
            }

            return(false);
        }