static Point secondnearstpoints(Point p, RBush <Point> pointset) { q.Clear(); var node = pointset.data; FastPriorityQueueNode pre = new FastPriorityQueueNode(); pre.Priority = float.PositiveInfinity; int pindex = 0; //int end = points.Length - 1; while (true) { if (node.leaf) { for (int i = 0; i < node.elements.Count; i++) { float d = Point.distence(p, node.elements[i]); if (d != 0) { q.Enqueue(node.elements[i], d); } } } else { for (int i = 0; i < node.children.Count; i++) { q.Enqueue(node.children[i], (float)boxDist(p, node.children[i])); } } var curr = q.Dequeue(); if (!curr.element) { node = curr as node <Point>; } else { var p2 = curr as Point; if (pindex > 0) { return(p2); } else { pindex++; } } } }
/// <summary> /// GlobalSetup /// </summary> public void GlobalSetup() { Queue = new FastPriorityQueue <FastPriorityQueueNode>(QueueSize); Nodes = new FastPriorityQueueNode[QueueSize]; RandomPriorities = new int[QueueSize]; RandomUpdatePriorities = new int[QueueSize]; Random rand = new Random(34829061); for (int i = 0; i < QueueSize; i++) { Nodes[i] = new FastPriorityQueueNode(); RandomPriorities[i] = rand.Next(16777216); // constrain to range float can hold with no rounding RandomUpdatePriorities[i] = rand.Next(16777216); // constrain to range float can hold with no rounding } }
static Point nearstpoint(Point p, RBush <Point> pointset) { q.Clear(); var node = pointset.data; FastPriorityQueueNode pre = new FastPriorityQueueNode(); pre.Priority = float.PositiveInfinity; while (true) { if (node.leaf) { for (int i = 0; i < node.elements.Count; i++) { float d = Point.distence(p, node.elements[i]); if (d != 0) { q.Enqueue(node.elements[i], d); } } } else { for (int i = 0; i < node.children.Count; i++) { q.Enqueue(node.children[i], (float)boxDist(p, node.children[i])); } } var curr = q.Dequeue(); if (!curr.element) { node = curr as node <Point>; } else { //if(constrainlist!=null&&!constrainlist.Contains(curr as Point)) return(curr as Point); } } }