Ejemplo n.º 1
0
        public void sortIslands()
        {
            //first store the original body index, and islandId
            int numElements = m_elements.Count;

            for (int i = 0; i < numElements; i++)
            {
                m_elements[i] = new Element { m_id = find(i), m_sz = i };
                //m_elements[i].m_id = find(i);
                //m_elements[i].m_sz = i;
            }

            // Sort the vector using predicate and std::sort
            //std::sort(m_elements.begin(), m_elements.end(), btUnionFindElementSortPredicate);
            m_elements.Sort(pred);
        }
Ejemplo n.º 2
0
        public int find(int x)
        {
            //btAssert(x < m_N);
            //btAssert(x >= 0);

            while (x != m_elements[x].m_id)
            {
                //not really a reason not to use path compression, and it flattens the trees/improves find performance dramatically

#if USE_PATH_COMPRESSION
		        m_elements[x] = new Element { m_id = m_elements[m_elements[x].m_id].m_id, m_sz = m_elements[x].m_sz };
                x = m_elements[m_elements[x].m_id].m_id;
#else//
				x = m_elements[x].m_id;
#endif
                //btAssert(x < m_N);
                //btAssert(x >= 0);

            }
            return x;
        }
Ejemplo n.º 3
0
        public void unite(int p, int q)
        {
            int i = find(p), j = find(q);
            if (i == j)
                return;
#if! USE_PATH_COMPRESSION
			//weighted quick union, this keeps the 'trees' balanced, and keeps performance of unite O( log(n) )
			if (m_elements[i].m_sz < m_elements[j].m_sz)
			{ 
				m_elements[i].m_id = j; m_elements[j].m_sz += m_elements[i].m_sz; 
			}
			else 
			{ 
				m_elements[j].m_id = i; m_elements[i].m_sz += m_elements[j].m_sz; 
			}
#else
            m_elements[i] = new Element { m_id = j, m_sz = m_elements[i].m_sz };

            //m_elements[i].m_id = j;
            m_elements[j] = new Element { m_id = m_elements[j].m_id, m_sz = m_elements[j].m_sz + m_elements[i].m_sz };
            //m_elements[j].m_sz += m_elements[i].m_sz; 
#endif
        }