private void HandleSiteEvent(SiteEvent siteEvent) { EventTree.TreeNode node = _eventTree.GetClosest(this, _eventTree.GetRoot(), siteEvent); if (node == null || node is EventTree.BreakpointNode) { return; } EventTree.LeafNode closest = (EventTree.LeafNode)node; if (closest.GetDisappearEvent() != null) { _eventQueue.Delete(closest.GetDisappearEvent().GetHandle()); closest.SetDisappearEvent(null); } List <CircleEvent> circleEvents2 = _eventTree.InsertNewSiteEvent(closest, new TreeItem(siteEvent.V())); foreach (var ce in circleEvents2) { IPriorityQueueHandle <IEvent> h = null; _eventQueue.Add(ref h, ce); ce.SetHandle(h); } }
private void GetFinalNodePoint(EventTree.TreeNode node) { if (node is EventTree.LeafNode) { if (((EventTree.LeafNode)node).GetBreakpointNode() == null) { return; } Breakpoint b = ((EventTree.LeafNode)node).GetBreakpointNode().GetBreakpoint(); VectorNode n1 = b.getLeftListEvent().GetHalfEdge().GetFace(); VectorNode n2 = b.getLeftListEvent().GetHalfEdge().Twin().GetFace(); float centerx = 0.5f * (b.getLeftListEvent().GetHalfEdge().GetFace().x + b.getLeftListEvent().GetHalfEdge().Twin().GetFace().x); float centery = 0.5f * (b.getLeftListEvent().GetHalfEdge().GetFace().y + b.getLeftListEvent().GetHalfEdge().Twin().GetFace().y); if (n1.y == n2.y) { HalfEdge he = b.getLeftListEvent().GetHalfEdge(); CircleEvent ce = new CircleEvent(centerx, -_openEdgeLimit /* neg infinity */); if (he.GetTarget() == null) { he.SetTarget(ce); ce.halfEdge = he; } else { he.Twin().SetTarget(ce); ce.halfEdge = he.Twin(); } _allCircleEvents.Add(ce); } else { float grad = (n2.y - n1.y) * 1.0f / (n2.x - n1.x); float realGrad = -1.0f / grad; float constant = centery - realGrad * centerx; float bpx = b.getX() - centerx; float bpy = b.getY() - centery; //if x = bpx... float testx = centerx + 10000f; float testy = testx * realGrad + constant; CircleEvent ce; if (testx * bpx + testy * bpy > 0) { ce = new CircleEvent(testx, testy); } else { ce = new CircleEvent(centerx - 10000, (centerx - 10000) * realGrad + constant); } HalfEdge he = b.getLeftListEvent().GetHalfEdge(); if (he.GetFace() != b.getLeftListEvent().GetNode()) { he = he.Twin(); } if (he.GetTarget() == null) { he.SetTarget(ce); } else if (he.Twin().GetTarget() == null) { he.Twin().SetTarget(ce); } else { // big problem... should never happen } _allCircleEvents.Add(ce); } return; } else { Breakpoint b = ((EventTree.BreakpointNode)node).GetBreakpoint(); b.CalculateBreakpoint(_openEdgeLimit); if (node.LChild() != null) { GetFinalNodePoint(node.LChild()); } if (node.RChild() != null) { GetFinalNodePoint(node.RChild()); } } }