예제 #1
0
 public static VoronoiGraph ComputeVoronoiGraph(IEnumerable Datapoints)
 {
     BinaryPriorityQueue PQ = new BinaryPriorityQueue();
     Hashtable CurrentCircles = new Hashtable();
     VoronoiGraph VG = new VoronoiGraph();
     VNode RootNode = null;
     foreach(Vector V in Datapoints)
     {
         PQ.Push(new VDataEvent(V));
     }
     while(PQ.Count>0)
     {
         VEvent VE = PQ.Pop() as VEvent;
         VDataNode[] CircleCheckList;
         if(VE is VDataEvent)
         {
             RootNode = VNode.ProcessDataEvent(VE as VDataEvent,RootNode,VG,VE.Y,out CircleCheckList);
         }
         else if(VE is VCircleEvent)
         {
             CurrentCircles.Remove(((VCircleEvent)VE).NodeN);
             if(!((VCircleEvent)VE).Valid)
                 continue;
             RootNode = VNode.ProcessCircleEvent(VE as VCircleEvent,RootNode,VG,VE.Y,out CircleCheckList);
         }
         else throw new Exception("Got event of type "+VE.GetType().ToString()+"!");
         foreach(VDataNode VD in CircleCheckList)
         {
             if(CurrentCircles.ContainsKey(VD))
             {
                 ((VCircleEvent)CurrentCircles[VD]).Valid=false;
                 CurrentCircles.Remove(VD);
             }
             VCircleEvent VCE = VNode.CircleCheckDataNode(VD,VE.Y);
             if(VCE!=null)
             {
                 PQ.Push(VCE);
                 CurrentCircles[VD]=VCE;
             }
         }
         if(VE is VDataEvent)
         {
             Vector DP = ((VDataEvent)VE).DataPoint;
             foreach(VCircleEvent VCE in CurrentCircles.Values)
             {
                 if(MathTools.Dist(DP[0],DP[1],VCE.Center[0],VCE.Center[1])<VCE.Y-VCE.Center[1] && Math.Abs(MathTools.Dist(DP[0],DP[1],VCE.Center[0],VCE.Center[1])-(VCE.Y-VCE.Center[1]))>1e-10)
                     VCE.Valid = false;
             }
         }
     }
     return VG;
 }
예제 #2
0
 public static BinaryPriorityQueue ReadOnly(BinaryPriorityQueue P)
 {
     return(new BinaryPriorityQueue(ArrayList.ReadOnly(P.InnerList), P.Comparer, false));
 }
예제 #3
0
 public static BinaryPriorityQueue Syncronized(BinaryPriorityQueue P)
 {
     return(new BinaryPriorityQueue(ArrayList.Synchronized(P.InnerList), P.Comparer, false));
 }
예제 #4
0
 public static BinaryPriorityQueue Syncronized(BinaryPriorityQueue P)
 {
     return new BinaryPriorityQueue(ArrayList.Synchronized(P.InnerList),P.Comparer,false);
 }
예제 #5
0
 public static BinaryPriorityQueue ReadOnly(BinaryPriorityQueue P)
 {
     return new BinaryPriorityQueue(ArrayList.ReadOnly(P.InnerList),P.Comparer,false);
 }