public Int32 CompareTo(CircleEvent other) { if (this.vertex.x < other.vertex.x) { return(-1); } if (this.vertex.x > other.vertex.x) { return(1); } return(0); }
void ProcessEvent(CircleEvent circleEvent) { //Debug.Log("ProcessEvent: " + circleEvent); // if event has been marked as invalid, skip if (!circleEvent.valid) { return; } // FIXME: remove vertexList.Add(circleEvent.center); // circle event is associated with arc which is disappearing from beachline // that arc has two breakpoints which are converging, so update those edges associated with // those breakpoints with event vertex. this is a vertex in the voronoi diagram circleEvent.arc.upperBreakpoint.edge.AssignVertex( circleEvent.center, circleEvent.arc.upperBreakpoint.intersectionIndex); if (circleEvent.arc.upperBreakpoint.edge.done) { AddFinishedEdge(circleEvent.arc.upperBreakpoint.edge); } circleEvent.arc.lowerBreakpoint.edge.AssignVertex( circleEvent.center, circleEvent.arc.lowerBreakpoint.intersectionIndex); if (circleEvent.arc.lowerBreakpoint.edge.done) { AddFinishedEdge(circleEvent.arc.lowerBreakpoint.edge); } // convergence of edge means that arc associated w/ circle event also converged to a point and // needs to be removed from beachline // a new edge and associated breakpoints are added instead // edge starts w/ circle event vertex var arcNode = beachline.GetNode(circleEvent.arc); var lowerNode = beachline.GetPredecessor(arcNode); var upperNode = beachline.GetSuccessor(arcNode); beachline.Delete(circleEvent.arc); // update vertex of new edge between lower/upper nodes var lowerArc = beachline.GetNodeData(lowerNode); var upperArc = beachline.GetNodeData(upperNode); lowerArc.upperBreakpoint.edge.AssignVertex(circleEvent.center, (upperArc.site.x > lowerArc.site.x) ? 1 : 0); // check for new circle events for each side of arc that has been removed CreateCircleEvent(lowerNode, circleEvent.vertex.x); CreateCircleEvent(upperNode, circleEvent.vertex.x); //beachline.Dump(); }
public Int32 CompareTo(object otherObj) { CircleEvent other = (CircleEvent)otherObj; if (this.vertex.x < other.vertex.x) { return(-1); } if (this.vertex.x > other.vertex.x) { return(1); } return(0); }
public void CreateCircleEvent(object arcNode, float directrix) { if (arcNode == null) { return; } // invalidate any circle event already associated with arc // this is cheaper than removing the entry from the Q var middleArc = beachline.GetNodeData(arcNode); if (middleArc.circleEvent != null) { middleArc.circleEvent.valid = false; middleArc.circleEvent = null; } //beachline.Dump(); var lowerNode = beachline.GetPredecessor(arcNode); var upperNode = beachline.GetSuccessor(arcNode); if (lowerNode == null || upperNode == null) { return; } var lowerArc = beachline.GetNodeData(lowerNode); var upperArc = beachline.GetNodeData(upperNode); // find determinant for three sites // order of comparison is important here, this assumes bottom to top // determinant < 0 => converging edges, consider intersection // = 0 => colinear, ignore // > 0 => diverging edges, ignore var ba = middleArc.site - lowerArc.site; var cb = upperArc.site - middleArc.site; var determinant = ba.x * cb.y - ba.y * cb.x; if (determinant >= 0) { /* * Debug.Log(String.Format( * "ignoring invalid circle event: larc: {0}\nmarc: {1}\nuarc: {2}\ndx: {3} determinant:{4}", * lowerArc, middleArc, upperArc, directrix, determinant)); */ return; } // find center of circle Vector2 center; float radius; var circleExists = Geometry.FindCircle( lowerArc.site, middleArc.site, upperArc.site, out center, out radius ); if (circleExists && (center.x + radius) > directrix) { var point = new Vector2(center.x + radius, center.y); var circleEvent = new CircleEvent(middleArc, center, point); /* * Debug.Log(String.Format( * "new circle event: larc: {0}\nmarc: {1}\nuarc: {2}\ndx: {3} determinant:{4}\ncenter: {5} point: {6}\nevent: {7}", * lowerArc, middleArc, upperArc, directrix, determinant, center, point, circleEvent)); */ middleArc.circleEvent = circleEvent; // add to event q eventQ.Insert(circleEvent); } }