//note: treepoints can be of length (tree.Count) or more public IEnumerator <int[]> GetEnumerator() { foreach (var needle in m_needlePts) { var data = new List <int>(); var sphere = new Sphere(needle, m_limitDistance); if (m_tree.Search(sphere, CalledWhenFoundDistance, data)) { var distances = new double[data.Count]; for (int i = 0; i < data.Count; i++) { distances[i] = needle.DistanceToSquared(m_oversized_tree_pts_array[data[i]]); } var array = data.ToArray(); Array.Sort(distances, array); yield return(array); } else { throw new InvalidOperationException("An error occurred when iterating tree."); } } }
public IEnumerator <int[]> GetEnumerator() { if (m_amount == 0) { yield break; } var heap = new AmountSearchData(DistanceThenIndexComparer.Instance) { Tree = m_tree, Points = m_oversized_tree_pts_array, AmountTarget = m_amount, }; int count = -1; foreach (var needle in m_needlePts) { count++; heap.Clear(); heap.Needle = needle; double min_max_dist = double.MinValue; for (int i = 0; i < m_amount; i++) { var test = needle.DistanceToSquared(m_oversized_tree_pts_array[i]); if (test > min_max_dist) { min_max_dist = test; //pick larger } } var sphere = new Sphere(needle, Math.Sqrt(min_max_dist) + RhinoMath.SqrtEpsilon); if (m_tree.Search(sphere, CalledWhenFoundAmount, heap)) { yield return(heap.Select(item => item.Key).ToArray()); } else { throw new InvalidOperationException("An error occurred when iterating tree."); } } }
public static Rhino.Commands.Result RTreeClosestPoint(RhinoDoc doc) { Rhino.DocObjects.ObjRef objref; var rc = Rhino.Input.RhinoGet.GetOneObject("select mesh", false, Rhino.DocObjects.ObjectType.Mesh, out objref); if (rc != Rhino.Commands.Result.Success) return rc; Mesh mesh = objref.Mesh(); objref.Object().Select(false); doc.Views.Redraw(); using (RTree tree = new RTree()) { for (int i = 0; i < mesh.Vertices.Count; i++) { // we can make a C++ function that just builds an rtree from the // vertices in one quick shot, but for now... tree.Insert(mesh.Vertices[i], i); } while (true) { Point3d point; rc = Rhino.Input.RhinoGet.GetPoint("test point", false, out point); if (rc != Rhino.Commands.Result.Success) break; SearchData data = new SearchData(mesh, point); // Use the first vertex in the mesh to define a start sphere double distance = point.DistanceTo(mesh.Vertices[0]); Sphere sphere = new Sphere(point, distance * 1.1); if (tree.Search(sphere, SearchCallback, data)) { doc.Objects.AddPoint(mesh.Vertices[data.Index]); doc.Views.Redraw(); RhinoApp.WriteLine("Found point in {0} tests", data.HitCount); } } } return Rhino.Commands.Result.Success; }