Esempio n. 1
0
 //--
 void
 KDTree::VAddObjects(const std::vector<ISpatialObject*>& refObjects)
 {        
     ISpatialObject* pObjectList = NULL;
     ISpatialObject* pObjectTemp;
     
     
     std::vector<ISpatialObject*>::const_iterator iter_object;
     for(iter_object = refObjects.begin(); iter_object != refObjects.end(); iter_object++)
     {
         pObjectTemp = (*iter_object);
         
         
         pObjectTemp->VSetNext(pObjectList);
         pObjectList = pObjectTemp;
         
         
         // [rad] Store objects locally for fast update / iteration
         m_vecObjects.push_back((*iter_object));
     }
     
     
     // [rad] Pre-allocate the tree
     Preallocate(s_i32MaxDepth);
     
     
     Vector3 vec3Min(m_vec3Center.x - m_f32HalfWidth, m_vec3Center.y - m_f32HalfWidth, m_vec3Center.z - m_f32HalfWidth);
     Vector3 vec3Max(m_vec3Center.x + m_f32HalfWidth, m_vec3Center.y + m_f32HalfWidth, m_vec3Center.z + m_f32HalfWidth);
 
 
     // [rad] Based on this info, construct recursively, starting at root
     m_pRootNode->Construct(pObjectTemp, refObjects.size(), vec3Min, vec3Max);
 }
    //--
    void
    LooseOctree::VAddObjects(const std::vector<ISpatialObject*>& refObjects)
    {        
        float f32MinDiameter = 1.0e38f;
        float f32CellSize = 2.0f * m_f32HalfWidth;
        float f32Diameter;

        int i32Depth = 0;
        int i32Divisions = 1;

        std::vector<ISpatialObject*>::const_iterator iter_object;
        for(iter_object = refObjects.begin(); iter_object != refObjects.end(); iter_object++)
        {
            f32Diameter = (*iter_object)->VGetRadius();
            
            if(f32Diameter < f32MinDiameter)
            {
                // [rad] Found a smaller object, update
                f32MinDiameter = f32Diameter;
            }
        }
        
        // [rad] Make cell size 'x' times as big as the smallest diameter 
        f32MinDiameter *= s_f32MaxObjectNodeRatio;
        
        
        // [rad] Calculate depth
        f32CellSize = 2.0f * m_f32HalfWidth;
        
        while(f32MinDiameter <= f32CellSize)
        {
            // [rad] Don't make more than max depth 
            if(s_i32MaxDepth == i32Depth)
            {
                break;
            }
            
            i32Divisions *= 2;                        
            f32CellSize = 2.0f * m_f32HalfWidth / static_cast<float>(i32Divisions);        
            
            i32Depth++;
        }
        
        
        // [rad] Delete everything but the root
        m_pRootNode->Free();
        
        // [rad] Pre-allocate the tree
        Preallocate(i32Depth);


        
        // [rad] Insert elements into the tree
        for(iter_object = refObjects.begin(); iter_object != refObjects.end(); iter_object++)
        {
            m_pRootNode->AddObject((*iter_object));
            
            // [rad] Store locally in a list, for fast iteration
            m_vecObjects.push_back((*iter_object));
        }
        
        
    }