/// <summary> /// Searches two R-trees for all pairs elements whose bounding boxes overlap. /// </summary> /// <param name="treeA">A first tree.</param> /// <param name="treeB">A second tree.</param> /// <param name="tolerance"> /// If the distance between a pair of bounding boxes is less than tolerance, /// then callback is called. /// </param> /// <param name="callback">A callback event handler.</param> /// <returns> /// true if entire tree was searched. It is possible no results were found. /// </returns> public static bool SearchOverlaps(RTree treeA, RTree treeB, double tolerance, EventHandler <RTreeEventArgs> callback) { IntPtr pConstTreeA = treeA.ConstPointer(); IntPtr pConstTreeB = treeB.ConstPointer(); if (m_callbacks == null) { m_callbacks = new List <Callbackholder>(); } Callbackholder cbh = new Callbackholder(); cbh.SerialNumber = m_next_serial_number++; cbh.Callback = callback; cbh.Sender = null; m_callbacks.Add(cbh); SearchCallback searcher = CustomSearchCallback; bool rc = UnsafeNativeMethods.ON_RTree_Search2(pConstTreeA, pConstTreeB, tolerance, cbh.SerialNumber, searcher); for (int i = 0; i < m_callbacks.Count; i++) { if (m_callbacks[i].SerialNumber == cbh.SerialNumber) { m_callbacks.RemoveAt(i); break; } } return(rc); }
/// <summary> /// Searches for items in a sphere. /// </summary> /// <param name="sphere">bounds used for searching.</param> /// <param name="callback">An event handler to be raised when items are found.</param> /// <param name="tag">State to be passed inside the <see cref="RTreeEventArgs"/> Tag property.</param> /// <returns> /// true if entire tree was searched. It is possible no results were found. /// </returns> /// <example> /// <code source='examples\vbnet\ex_closestpoint.vb' lang='vbnet'/> /// <code source='examples\cs\ex_closestpoint.cs' lang='cs'/> /// <code source='examples\py\ex_closestpoint.py' lang='py'/> /// </example> public bool Search(Sphere sphere, EventHandler <RTreeEventArgs> callback, object tag) { IntPtr pConstTree = ConstPointer(); if (m_callbacks == null) { m_callbacks = new List <Callbackholder>(); } Callbackholder cbh = new Callbackholder(); cbh.SerialNumber = m_next_serial_number++; cbh.Callback = callback; cbh.Sender = this; cbh.Tag = tag; m_callbacks.Add(cbh); SearchCallback searcher = CustomSearchCallback; bool rc = UnsafeNativeMethods.ON_RTree_SearchSphere(pConstTree, sphere.Center, sphere.Radius, cbh.SerialNumber, searcher); for (int i = 0; i < m_callbacks.Count; i++) { if (m_callbacks[i].SerialNumber == cbh.SerialNumber) { m_callbacks.RemoveAt(i); break; } } return(rc); }
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); }
/// <summary> /// Searches two R-trees for all pairs elements whose bounding boxes overlap. /// </summary> /// <param name="treeA">A first tree.</param> /// <param name="treeB">A second tree.</param> /// <param name="tolerance"> /// If the distance between a pair of bounding boxes is less than tolerance, /// then callback is called. /// </param> /// <param name="callback">A callback event handler.</param> /// <returns> /// true if entire tree was searched. It is possible no results were found. /// </returns> public static bool SearchOverlaps(RTree treeA, RTree treeB, double tolerance, EventHandler<RTreeEventArgs> callback) { IntPtr pConstTreeA = treeA.ConstPointer(); IntPtr pConstTreeB = treeB.ConstPointer(); if (m_callbacks == null) m_callbacks = new List<Callbackholder>(); Callbackholder cbh = new Callbackholder(); cbh.SerialNumber = m_next_serial_number++; cbh.Callback = callback; cbh.Sender = null; m_callbacks.Add(cbh); SearchCallback searcher = CustomSearchCallback; bool rc = UnsafeNativeMethods.ON_RTree_Search2(pConstTreeA, pConstTreeB, tolerance, cbh.SerialNumber, searcher); for (int i = 0; i < m_callbacks.Count; i++) { if (m_callbacks[i].SerialNumber == cbh.SerialNumber) { m_callbacks.RemoveAt(i); break; } } return rc; }
/// <summary> /// Searches for items in a sphere. /// </summary> /// <param name="sphere">bounds used for searching.</param> /// <param name="callback">An event handler to be raised when items are found.</param> /// <param name="tag">State to be passed inside the <see cref="RTreeEventArgs"/> Tag property.</param> /// <returns> /// true if entire tree was searched. It is possible no results were found. /// </returns> /// <example> /// <code source='examples\vbnet\ex_closestpoint.vb' lang='vbnet'/> /// <code source='examples\cs\ex_closestpoint.cs' lang='cs'/> /// <code source='examples\py\ex_closestpoint.py' lang='py'/> /// </example> public bool Search(Sphere sphere, EventHandler<RTreeEventArgs> callback, object tag) { IntPtr pConstTree = ConstPointer(); if (m_callbacks == null) m_callbacks = new List<Callbackholder>(); Callbackholder cbh = new Callbackholder(); cbh.SerialNumber = m_next_serial_number++; cbh.Callback = callback; cbh.Sender = this; cbh.Tag = tag; m_callbacks.Add(cbh); SearchCallback searcher = CustomSearchCallback; bool rc = UnsafeNativeMethods.ON_RTree_SearchSphere(pConstTree, sphere.Center, sphere.Radius, cbh.SerialNumber, searcher); for (int i = 0; i < m_callbacks.Count; i++) { if (m_callbacks[i].SerialNumber == cbh.SerialNumber) { m_callbacks.RemoveAt(i); break; } } return rc; }