Пример #1
0
            //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.");
                    }
                }
            }
Пример #2
0
            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;
    }