//--------------------------------------------------------- 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() ); }
//--------------------------------------------------------- int CSG_Network::_Add_Node(CSG_PRQuadTree &Search, int Edge_ID, const TSG_Point &Node_Point, const TSG_Point &Dir_Point) { int Node_ID; double Distance; CSG_PRQuadTree_Leaf *pLeaf = Search.Get_Nearest_Leaf(Node_Point, Distance); if( !pLeaf || Distance > 0.0 )//00001 ) { Node_ID = Get_Node_Count(); m_Nodes.Inc_Array(); ((CSG_Network_Node **)m_Nodes.Get_Array())[Node_ID] = new CSG_Network_Node(Node_ID, Node_Point); Search.Add_Point(Node_Point.x, Node_Point.y, Node_ID); } else { Node_ID = (int)pLeaf->Get_Z(); } Get_Node(Node_ID).Add_Edge(Edge_ID, SG_Get_Angle_Of_Direction(Node_Point, Dir_Point)); return( Node_ID ); }
//--------------------------------------------------------- inline bool CSG_PRQuadTree::_Add_Selected(CSG_Array &Selection, CSG_PRQuadTree_Leaf *pLeaf, double Distance) const { if( Selection.Inc_Array() ) { TLeaf *pL = (TLeaf *)Selection.Get_Entry(Selection.Get_Size() - 1); pL->pLeaf = pLeaf; pL->Distance = Distance; return( true ); } return( false ); }
//--------------------------------------------------------- bool CPresence_Prediction::Get_Features(CSG_Array &Features) { CSG_Parameter_Grid_List *pNum = Parameters("FEATURES_NUM")->asGridList(); CSG_Parameter_Grid_List *pCat = Parameters("FEATURES_CAT")->asGridList(); m_Features = (TFeature *)Features.Create(sizeof(TFeature), m_nFeatures = pNum->Get_Grid_Count() + pCat->Get_Grid_Count()); for(int i=0; i<m_nFeatures; i++) { if( i < pNum->Get_Grid_Count() ) { m_Features[i].bNumeric = true; m_Features[i].pGrid = pNum->Get_Grid(i); } else { m_Features[i].bNumeric = false; m_Features[i].pGrid = pCat->Get_Grid(i - pNum->Get_Grid_Count()); } CSG_String Name(m_Features[i].pGrid->Get_Name()); strncpy(m_Features[i].Name, Name.b_str(), 255); m_Features[i].Name[255] = '\0'; } return( m_nFeatures > 0 ); }
//--------------------------------------------------------- size_t CSG_PRQuadTree::Get_Nearest_Points(CSG_Points_Z &Points, double x, double y, size_t maxPoints, double Radius, int iQuadrant) const { CSG_Array Selection; _Select_Nearest_Points(Selection, x, y, maxPoints, Radius, iQuadrant); Points.Clear(); for(size_t i=0; i<Selection.Get_Size(); i++) { CSG_PRQuadTree_Leaf *pLeaf = _Get_Selected(Selection, i)->pLeaf; Points.Add(pLeaf->Get_X(), pLeaf->Get_Y(), pLeaf->Get_Z()); } return( Points.Get_Count() ); }
//--------------------------------------------------------- void CSG_Network::_On_Construction(void) { m_Nodes.Create(sizeof(CSG_Network_Node **), 0, SG_ARRAY_GROWTH_1); m_Edges.Create(SHAPE_TYPE_Line , SG_T("EDGES")); m_Edges.Add_Field(SG_T("ID") , SG_DATATYPE_Int); m_Edges.Add_Field(SG_T("NODE_A") , SG_DATATYPE_Int); m_Edges.Add_Field(SG_T("NODE_B") , SG_DATATYPE_Int); m_Edges.Add_Field(SG_T("SHAPE_TYPE"), SG_DATATYPE_Int); m_Edges.Add_Field(SG_T("PROCESSED") , SG_DATATYPE_Int); }
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 ); }
//--------------------------------------------------------- inline bool CSG_PRQuadTree::_Set_Selected(CSG_Array &Selection, size_t i, CSG_PRQuadTree_Leaf *pLeaf, double Distance) const { TLeaf *pL = (TLeaf *)Selection.Get_Entry(i); if( pL ) { pL->pLeaf = pLeaf; pL->Distance = Distance; return( true ); } return( false ); }
//--------------------------------------------------------- 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 ); }
//--------------------------------------------------------- void CSG_PRQuadTree::_Select_Nearest_Points(CSG_Array &Selection, CSG_PRQuadTree_Item *pItem, double x, double y, double &Distance, double Radius, size_t maxPoints, int iQuadrant) const { //----------------------------------------------------- if( pItem->is_Leaf() ) { CSG_PRQuadTree_Leaf *pLeaf = (CSG_PRQuadTree_Leaf *)pItem; if( _Quadrant_Contains(x, y, iQuadrant, pLeaf->Get_Point()) == false ) { return; } double d = SG_Get_Distance(x, y, pLeaf->Get_X(), pLeaf->Get_Y(), m_bPolar); if( Radius > 0.0 && Radius < d ) { return; } //------------------------------------------------- if( Selection.Get_Size() < maxPoints ) { if( Distance < d ) { Distance = d; } _Add_Selected(Selection, pLeaf, d); } else if( d < Distance ) { size_t i; for(i=0; i<Selection.Get_Size(); i++) { if( Distance <= _Get_Selected(Selection, i)->Distance ) { _Set_Selected(Selection, i, pLeaf, d); break; } } for(i=0, Distance=d; i<maxPoints; i++) { if( Distance < _Get_Selected(Selection, i)->Distance ) { Distance = _Get_Selected(Selection, i)->Distance; } } } } //----------------------------------------------------- else // if( pItem->is_Node() ) { int i; CSG_PRQuadTree_Item *pChild; for(i=0; i<4; i++) { if( (pChild = ((CSG_PRQuadTree_Node *)pItem)->Get_Child(i)) != NULL && pChild->Contains(x, y) == true ) { _Select_Nearest_Points(Selection, pChild, x, y, Distance, Radius, maxPoints, iQuadrant); } } for(i=0; i<4; i++) { if( (pChild = ((CSG_PRQuadTree_Node *)pItem)->Get_Child(i)) != NULL && pChild->Contains(x, y) == false ) { if( _Radius_Intersects(x, y, Radius, iQuadrant, pChild) ) { if( Get_Selected_Count() < maxPoints || ( Distance > (x < pChild->Get_xCenter() ? pChild->Get_xMin() - x : x - pChild->Get_xMax()) && Distance > (y < pChild->Get_yCenter() ? pChild->Get_yMin() - y : y - pChild->Get_yMax()) ) ) { _Select_Nearest_Points(Selection, pChild, x, y, Distance, Radius, maxPoints, iQuadrant); } } } } } }