//--------------------------------------------------------- size_t CSG_PRQuadTree::_Select_Nearest_Points(CSG_Array &Selection, double x, double y, size_t maxPoints, double Radius, int iQuadrant) const { if( Selection.Get_Value_Size() != sizeof(TLeaf) ) { Selection.Create(sizeof(TLeaf), 0, SG_ARRAY_GROWTH_3); } else { Selection.Set_Array(0, false); } if( m_pRoot ) { double Distance; if( maxPoints < 1 ) { maxPoints = m_nPoints; } if( iQuadrant != 4 ) { _Select_Nearest_Points(Selection, m_pRoot, x, y, Distance = 0.0, Radius, maxPoints, iQuadrant); } else // if( iQuadrant == 4 ) // quadrant-wise search { for(iQuadrant=0; iQuadrant<4; iQuadrant++) { _Select_Nearest_Points(Selection, m_pRoot, x, y, Distance = 0.0, Radius, maxPoints, iQuadrant); } } } return( Selection.Get_Size() ); }
bool CSG_Network::Destroy(void) { for(int i=0; i<Get_Node_Count(); i++) { delete(&Get_Node(i)); } m_Nodes.Set_Array(0); m_Edges.Del_Records(); return( true ); }
//--------------------------------------------------------- bool CSG_Network::Update(void) { int iEdge; //----------------------------------------------------- for(iEdge=m_Edges.Get_Count()-1; iEdge>=0; iEdge--) { CSG_Shape *pEdge = m_Edges.Get_Shape(iEdge); if( !(((CSG_Shape_Line *)pEdge)->Get_Length() > 0.0) ) { m_Edges.Del_Shape(iEdge); } } //----------------------------------------------------- for(int i=0; i<Get_Node_Count(); i++) { delete(&Get_Node(i)); } m_Nodes.Set_Array(0); //----------------------------------------------------- CSG_PRQuadTree Search(m_Edges.Get_Extent()); for(iEdge=0; iEdge<m_Edges.Get_Count(); iEdge++) { CSG_Shape *pEdge = m_Edges.Get_Shape(iEdge); pEdge->Set_Value(0, iEdge); pEdge->Set_Value(1, _Add_Node(Search, iEdge, pEdge->Get_Point(0), pEdge->Get_Point(1) )); pEdge->Set_Value(2, _Add_Node(Search, iEdge, pEdge->Get_Point(pEdge->Get_Point_Count(0) - 1), pEdge->Get_Point(pEdge->Get_Point_Count(0) - 2) )); } //----------------------------------------------------- return( true ); }