コード例 #1
0
        public static VNode ProcessCircleEvent(VCircleEvent e, VNode Root, VoronoiGraph VG, double ys, out VDataNode[] CircleCheckList)
        {
            VDataNode a, b, c;
             VEdgeNode eu, eo;
             b = e.NodeN;
             a = VNode.LeftDataNode(b);
             c = VNode.RightDataNode(b);
             if (a == null || b.Parent == null || c == null || !a.DataPoint.Equals(e.NodeL.DataPoint) || !c.DataPoint.Equals(e.NodeR.DataPoint))
             {
            CircleCheckList = new VDataNode[] { };
            return Root; // Abbruch da sich der Graph verändert hat
             }
             eu = (VEdgeNode)b.Parent;
             CircleCheckList = new VDataNode[] { a, c };
             //1. Create the new Vertex
             Vector VNew = new Vector(e.Center[0], e.Center[1]);
             //			VNew[0] = Fortune.ParabolicCut(a.DataPoint[0],a.DataPoint[1],c.DataPoint[0],c.DataPoint[1],ys);
             //			VNew[1] = (ys + a.DataPoint[1])/2 - 1/(2*(ys-a.DataPoint[1]))*(VNew[0]-a.DataPoint[0])*(VNew[0]-a.DataPoint[0]);
             VG.Vertizes.Add(VNew);
             //2. Find out if a or c are in a distand part of the tree (the other is then b's sibling) and assign the new vertex
             if (eu.Left == b) // c is sibling
             {
            eo = VNode.EdgeToRightDataNode(a);

            // replace eu by eu's Right
            eu.Parent.Replace(eu, eu.Right);
             }
             else // a is sibling
             {
            eo = VNode.EdgeToRightDataNode(b);

            // replace eu by eu's Left
            eu.Parent.Replace(eu, eu.Left);
             }
             eu.Edge.AddVertex(VNew);
             //			///////////////////// uncertain
             //			if(eo==eu)
             //				return Root;
             //			/////////////////////

             //complete & cleanup eo
             eo.Edge.AddVertex(VNew);
             //while(eo.Edge.VVertexB == Fortune.VVUnkown)
             //{
             //    eo.Flipped = !eo.Flipped;
             //    eo.Edge.AddVertex(Fortune.VVInfinite);
             //}
             //if(eo.Flipped)
             //{
             //    Vector T = eo.Edge.LeftData;
             //    eo.Edge.LeftData = eo.Edge.RightData;
             //    eo.Edge.RightData = T;
             //}

             //2. Replace eo by new Edge
             VoronoiEdge VE = new VoronoiEdge();
             VE.LeftData = a.DataPoint;
             VE.RightData = c.DataPoint;
             VE.AddVertex(VNew);
             VG.Edges.Add(VE);

             VEdgeNode VEN = new VEdgeNode(VE, false);
             VEN.Left = eo.Left;
             VEN.Right = eo.Right;
             if (eo.Parent == null)
            return VEN;
             eo.Parent.Replace(eo, VEN);
             return Root;
        }
コード例 #2
0
 public static VCircleEvent CircleCheckDataNode(VDataNode n, double ys)
 {
     VDataNode l = VNode.LeftDataNode(n);
      VDataNode r = VNode.RightDataNode(n);
      if (l == null || r == null || l.DataPoint == r.DataPoint || l.DataPoint == n.DataPoint || n.DataPoint == r.DataPoint)
     return null;
      if (MathTools.ccw(l.DataPoint[0], l.DataPoint[1], n.DataPoint[0], n.DataPoint[1], r.DataPoint[0], r.DataPoint[1], false) <= 0)
     return null;
      Vector Center = Fortune.CircumCircleCenter(l.DataPoint, n.DataPoint, r.DataPoint);
      VCircleEvent VC = new VCircleEvent();
      VC.NodeN = n;
      VC.NodeL = l;
      VC.NodeR = r;
      VC.Center = Center;
      VC.Valid = true;
      if (VC.Y > ys || Math.Abs(VC.Y - ys) < 1e-10)
     return VC;
      return null;
 }