/// <summary> /// /// </summary> /// <param name="p0"></param> /// <param name="p1"></param> protected 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"); }
/// <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 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); }