public void AddArc(Vector2 newSite) { if (root == null) { root = new VoronoiArcNode(newSite); } else { VoronoiArcNode newArc = new VoronoiArcNode(newSite); VoronoiArcNode underNew = GetParabolaUnderNew(newArc.mFocus.x); if (underNew.squeezeEvent != null) { removed.Add(underNew.squeezeEvent); underNew.squeezeEvent = null; } Vector2 startPoint = new Vector2(newSite.x, GetYCoord(underNew.mFocus, newSite.x)); VoronoiArcNode leftArc = new VoronoiArcNode(underNew.mFocus); VoronoiArcNode rightArc = new VoronoiArcNode(underNew.mFocus); VoronoiEdgeNode rightEdge = new VoronoiEdgeNode(startPoint, new Vector2(), underNew.mFocus, newSite); VoronoiEdgeNode leftEdge = new VoronoiEdgeNode(startPoint, new Vector2(), newSite, underNew.mFocus); leftEdge.pair = rightEdge; //******* //edges.Add(leftEdge); newArc.mParent = rightEdge; rightEdge.mLeft = newArc; rightEdge.mRight = rightArc; rightEdge.mParent = leftEdge; leftEdge.mLeft = leftArc; leftEdge.mRight = rightEdge; leftEdge.mParent = underNew.mParent; leftArc.mParent = leftEdge; rightArc.mParent = rightEdge; if (underNew == root) { root = leftEdge; } else if (underNew.mParent.mLeft == underNew) { underNew.mParent.mLeft = leftEdge; } else if (underNew.mParent.mRight == underNew) { underNew.mParent.mRight = leftEdge; } else { Debug.Log("Invalid Tree"); } SqueezeEvent(leftArc); SqueezeEvent(rightArc); } }
public void RemoveArc(SqueezeEvent vEvent) { VoronoiArcNode removeNode = vEvent.mArcToRemove; VoronoiEdgeNode leftEdge = VoronoiNode.GetLeftParentEdge(removeNode); VoronoiEdgeNode rightEdge = VoronoiNode.GetRightParentEdge(removeNode); VoronoiArcNode leftArc = VoronoiNode.GetLeftChildArc(leftEdge); VoronoiArcNode rightArc = VoronoiNode.GetRightChildArc(rightEdge); if (leftArc.squeezeEvent != null) { removed.Add(leftArc.squeezeEvent); leftArc.squeezeEvent = null; } if (rightArc.squeezeEvent != null) { removed.Add(rightArc.squeezeEvent); rightArc.squeezeEvent = null; } Vector2 point = new Vector2(vEvent.mIntersectionPoint.x, GetYCoord(removeNode.mFocus, vEvent.mIntersectionPoint.x)); leftEdge.mEndVertex = point; rightEdge.mEndVertex = point; VoronoiNode h; VoronoiNode tempNode = removeNode; while (tempNode != root) { tempNode = tempNode.mParent; if (tempNode == leftEdge) { h = leftEdge; } if (tempNode == rightEdge) { h = rightEdge; } } h = new VoronoiEdgeNode(point, new Vector2(), leftArc.mFocus, rightArc.mFocus); //******* //edges.Add((VoronoiEdgeNode)h); VoronoiNode removeNodeGrandparent = removeNode.mParent.mParent; if (removeNode.mParent.mLeft == removeNode) { if (removeNodeGrandparent.mLeft == removeNode.mParent) { removeNodeGrandparent.mLeft = removeNode.mParent.mRight; removeNode.mParent.mRight.mParent = removeNodeGrandparent; } if (removeNodeGrandparent.mRight == removeNode.mParent) { removeNodeGrandparent.mRight = removeNode.mParent.mRight; removeNode.mParent.mRight.mParent = removeNodeGrandparent; } } else { if (removeNodeGrandparent.mLeft == removeNode.mParent) { removeNodeGrandparent.mLeft = removeNode.mParent.mLeft; removeNode.mParent.mLeft.mParent = removeNodeGrandparent; } if (removeNodeGrandparent.mRight == removeNode.mParent) { removeNodeGrandparent.mRight = removeNode.mParent.mLeft; removeNode.mParent.mLeft.mParent = removeNodeGrandparent; } } SqueezeEvent(leftArc); SqueezeEvent(rightArc); }