Ejemplo n.º 1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="p0"></param>
 /// <param name="p1"></param>
 protected virtual void Init(ICoordinate p0, ICoordinate p1)
 {
     this.p0  = p0;
     this.p1  = p1;
     dx       = p1.X - p0.X;
     dy       = p1.Y - p0.Y;
     quadrant = QuadrantOp.Quadrant(dx, dy);
     Assert.IsTrue(!(dx == 0 && dy == 0), "EdgeEnd with identical endpoints found");
 }
Ejemplo n.º 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>
 /// <param name="p0"></param>
 /// <param name="p1"></param>
 /// <param name="ep0"></param>
 /// <param name="ep1"></param>
 private bool MatchInSameDirection(ICoordinate p0, ICoordinate p1, ICoordinate ep0, ICoordinate ep1)
 {
     if (!p0.Equals(ep0))
     {
         return(false);
     }
     if (CGAlgorithms.ComputeOrientation(p0, p1, ep1) == CGAlgorithms.Collinear &&
         QuadrantOp.Quadrant(p0, p1) == QuadrantOp.Quadrant(ep0, ep1))
     {
         return(true);
     }
     return(false);
 }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public virtual DirectedEdge GetRightmostEdge()
        {
            IList edges = 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 (QuadrantOp.IsNorthern(quad0) && QuadrantOp.IsNorthern(quad1))
            {
                return(de0);
            }
            else if (!QuadrantOp.IsNorthern(quad0) && !QuadrantOp.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);
                }
            }
            Assert.ShouldNeverReachHere("found two horizontal edges incident on node");
            return(null);
        }