static void CalledWhenFoundAmount(object sender, RTreeEventArgs e) { var data = e.Tag as AmountSearchData; if (data == null) { return; } Point3d found = data.Points[e.Id]; double sq_distance = data.Needle.DistanceToSquared(found); if (data.Count < data.AmountTarget || data.Max.Value > sq_distance) { if (data.Count == data.AmountTarget) { data.Remove(data.Max); data.Add(new IndexDistance(e.Id, sq_distance)); // shrink the sphere to help improve the test e.SearchSphere = new Sphere(data.Needle, Math.Sqrt(data.Max.Value) + RhinoMath.SqrtEpsilon); } else { data.Add(new IndexDistance(e.Id, sq_distance)); } } }
private static int CustomSearchCallback(int serial_number, IntPtr idA, IntPtr idB, IntPtr pContext) { Callbackholder cbh = null; for (int i = 0; i < m_callbacks.Count; i++) { Callbackholder holder = m_callbacks[i]; if (holder.SerialNumber == serial_number) { cbh = holder; break; } } int rc = 1; if (cbh != null) { RTreeEventArgs e = new RTreeEventArgs(idA, idB, pContext); e.Tag = cbh.Tag; cbh.Callback(cbh.Sender, e); if (e.Cancel) { rc = 0; } cbh.Tag = e.Tag; } return(rc); }
static void CalledWhenFoundDistance(object sender, RTreeEventArgs e) { var data = e.Tag as List <int>; if (data == null) { return; } data.Add(e.Id); }
void SearchCallback(object sender, RTreeEventArgs e) { SearchData data = e.Tag as SearchData; data.HitCount = data.HitCount + 1; Point3f vertex = data.Mesh.Vertices[e.Id]; double distance = data.Point.DistanceTo(vertex); if (data.Index == -1 || data.Distance > distance) { // shrink the sphere to help improve the test e.SearchSphere = new Sphere(data.Point, distance); data.Index = e.Id; data.Distance = distance; } }
private static int CustomSearchCallback(int serial_number, IntPtr idA, IntPtr idB, IntPtr pContext) { Callbackholder cbh = null; for (int i = 0; i < m_callbacks.Count; i++) { Callbackholder holder = m_callbacks[i]; if (holder.SerialNumber == serial_number) { cbh = holder; break; } } int rc = 1; if (cbh != null) { RTreeEventArgs e = new RTreeEventArgs(idA, idB, pContext); e.Tag = cbh.Tag; cbh.Callback(cbh.Sender, e); if (e.Cancel) rc = 0; cbh.Tag = e.Tag; } return rc; }