Exemple #1
0
        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++;

        }
Exemple #5
0
        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;
        }
Exemple #6
0
 public static HalfEdge Create(Edge edge, LR.Side lr) {
     var he = new HalfEdge(edge, lr);
     return he;
 }
Exemple #7
0
 public void Remove(HalfEdge he) {
     he.EdgeListLeftNeighbor.EdgeListRightNeighbor = he.EdgeListRightNeighbor;
     he.EdgeListRightNeighbor.EdgeListLeftNeighbor = he.EdgeListLeftNeighbor;
     he.Edge = Edge.DELETED;
     he.EdgeListLeftNeighbor = he.EdgeListRightNeighbor = null;
 }
Exemple #8
0
 public void Insert(HalfEdge lb, HalfEdge he) {
     he.EdgeListLeftNeighbor = lb;
     he.EdgeListRightNeighbor = lb.EdgeListRightNeighbor;
     lb.EdgeListRightNeighbor.EdgeListLeftNeighbor = he;
     lb.EdgeListRightNeighbor = he;
 }
Exemple #9
0
 private Site RightRegion(HalfEdge he, Site bottomMostSite) {
     var edge = he.Edge;
     if (edge == null) {
         return bottomMostSite;
     }
     return edge.Sites[he.LeftRight];
 }