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