示例#1
0
 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);
 }
示例#2
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();
        }
示例#3
0
        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);
        }
示例#4
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);
            }
        }