public static Vertex Intersect(HalfEdge he0, HalfEdge he1) { var e1 = he0.Edge; var e2 = he1.Edge; if (e1 == null || e2 == null) { return null; } if (e1.RightSite == e2.RightSite) { return null; } var determinant = e1.A*e2.B - e1.B*e2.A; if (-1.0e-10 < determinant && determinant < 1.0e-10) { // the edges are parallel return null; } var iX = (e1.C*e2.B - e2.C*e1.B)/determinant; var iY = (e2.C*e1.A - e1.C*e2.A)/determinant; HalfEdge he; Edge e; if (Voronoi.CompareByYThenX(e1.RightSite, e2.RightSite) < 0) { he = he0; e = e1; } else { he = he1; e = e2; } var rightOfSite = (iX >= e.RightSite.X); if ((rightOfSite && he.LeftRight == LR.Side.Left) || (!rightOfSite && he.LeftRight == LR.Side.Right)) { return null; } return Create(iX, iY); }
private int Bucket(HalfEdge he) { var theBucket = (int) ((he.YStar - _ymin)/_deltay*_hashSize); if (theBucket < 0) { theBucket = 0; } if (theBucket >= _hashSize) { theBucket = _hashSize - 1; } return theBucket; }
public void Remove(HalfEdge he) { var removalBucket = Bucket(he); if (he.Vertex != null) { var previous = _hash[removalBucket]; while (previous.NextInPriorityQueue != he) { previous = previous.NextInPriorityQueue; } previous.NextInPriorityQueue = he.NextInPriorityQueue; _count--; he.Vertex = null; he.NextInPriorityQueue = null; } }
public void Insert(HalfEdge he) { var insertBucket = Bucket(he); if (insertBucket < _minBucket) { _minBucket = insertBucket; } var previous = _hash[insertBucket]; var next = previous.NextInPriorityQueue; while ((next = previous.NextInPriorityQueue) != null && (he.YStar > next.YStar || (he.YStar == next.YStar && he.Vertex.X>next.Vertex.X))) { previous = next; } he.NextInPriorityQueue = previous.NextInPriorityQueue; previous.NextInPriorityQueue = he; _count++; }
public EdgeList(float xmin, float deltax, int sqrtNSites) { _xmin = xmin; _deltax = deltax; _hashsize = 2*sqrtNSites; _hash = new List<HalfEdge>(_hashsize); for (int i = 0; i < _hashsize; i++) { _hash.Add(null); } LeftEnd = HalfEdge.CreateDummy(); RightEnd = HalfEdge.CreateDummy(); LeftEnd.EdgeListLeftNeighbor = null; LeftEnd.EdgeListRightNeighbor = RightEnd; RightEnd.EdgeListLeftNeighbor = LeftEnd; RightEnd.EdgeListRightNeighbor = null; _hash[0] = LeftEnd; _hash[_hashsize-1] = RightEnd; }
public static HalfEdge Create(Edge edge, LR.Side lr) { var he = new HalfEdge(edge, lr); return he; }
public void Remove(HalfEdge he) { he.EdgeListLeftNeighbor.EdgeListRightNeighbor = he.EdgeListRightNeighbor; he.EdgeListRightNeighbor.EdgeListLeftNeighbor = he.EdgeListLeftNeighbor; he.Edge = Edge.DELETED; he.EdgeListLeftNeighbor = he.EdgeListRightNeighbor = null; }
public void Insert(HalfEdge lb, HalfEdge he) { he.EdgeListLeftNeighbor = lb; he.EdgeListRightNeighbor = lb.EdgeListRightNeighbor; lb.EdgeListRightNeighbor.EdgeListLeftNeighbor = he; lb.EdgeListRightNeighbor = he; }
private Site RightRegion(HalfEdge he, Site bottomMostSite) { var edge = he.Edge; if (edge == null) { return bottomMostSite; } return edge.Sites[he.LeftRight]; }