void PointGridIndex::getNearPts(GeoPoint* pt, int gridRange, vector<GeoPoint*>& dest) { dest.clear(); pair<int, int> rolCol = getRowCol(pt); int rowPt = rolCol.first; int colPt = rolCol.second; int row1 = rowPt - gridRange; int col1 = colPt - gridRange; int row2 = rowPt + gridRange; int col2 = colPt + gridRange; if (row1 < 0) row1 = 0; if (row2 >= gridHeight) row2 = gridHeight - 1; if (col1 < 0) col1 = 0; if (col2 >= gridWidth) col2 = gridWidth - 1; for (list<GeoPoint*>::iterator iter = grid[rowPt][colPt]->begin(); iter != grid[rowPt][colPt]->end(); iter++) { if ((*iter) != pt) dest.push_back((*iter)); } for (int row = row1; row <= row2; row++) { for (int col = col1; col <= col2; col++) { if (row == rowPt && col == colPt) continue; for (list<GeoPoint*>::iterator iter = grid[row][col]->begin(); iter != grid[row][col]->end(); iter++) { if ((*iter) != pt) dest.push_back((*iter)); } } } }
void PointGridIndex::getNearPts(GeoPoint* pt, double thresholdM, vector<GeoPoint*>& dest) { dest.clear(); //calculate search range int gridSearchRange = int(thresholdM / (gridSizeDeg * GeoPoint::geoScale)) + 1; pair<int, int> rowCol = getRowCol(pt); int rowPt = rowCol.first; int colPt = rowCol.second; int row1 = rowPt - gridSearchRange; int col1 = colPt - gridSearchRange; int row2 = rowPt + gridSearchRange; int col2 = colPt + gridSearchRange; if (row1 < 0) row1 = 0; if (row2 >= gridHeight) row2 = gridHeight - 1; if (col1 < 0) col1 = 0; if (col2 >= gridWidth) col2 = gridWidth - 1; for (int row = row1; row <= row2; row++) { for (int col = col1; col <= col2; col++) { for (list<GeoPoint*>::iterator iter = grid[row][col]->begin(); iter != grid[row][col]->end(); iter++) { double dist = GeoPoint::distM((*iter), pt); if (dist < thresholdM && (*iter) != pt) dest.push_back((*iter)); } } } }
void PointGridIndex::insertOnePt(GeoPoint* pt) { if (!(pt->lat > area->minLat && pt->lat < area->maxLat && pt->lon > area->minLon && pt->lon < area->maxLon)) { system("pause"); } pair<int, int> rolCol = getRowCol(pt); grid[rolCol.first][rolCol.second]->push_back(pt); }
void nodeCell::setMatrix(matrix *m){ getRowCol(); pcell=m->getCell(col,row); }