unsigned long MeshFacetGrid::SearchNearestFromPoint (const Base::Vector3f &rclPt) const { unsigned long ulFacetInd = ULONG_MAX; float fMinDist = FLOAT_MAX; Base::BoundBox3f clBB = GetBoundBox(); if (clBB.IsInBox(rclPt) == true) { // Punkt liegt innerhalb unsigned long ulX, ulY, ulZ; Position(rclPt, ulX, ulY, ulZ); float fMinGridDist = std::min<float>(std::min<float>(_fGridLenX, _fGridLenY), _fGridLenZ); unsigned long ulDistance = 0; while (fMinDist > (fMinGridDist * float(ulDistance))) { SearchNearestFacetInHull(ulX, ulY, ulZ, ulDistance, rclPt, ulFacetInd, fMinDist); ulDistance++; } SearchNearestFacetInHull(ulX, ulY, ulZ, ulDistance, rclPt, ulFacetInd, fMinDist); } else { // Punkt ausserhalb Base::BoundBox3f::SIDE tSide = clBB.GetSideFromRay(rclPt, clBB.CalcCenter() - rclPt); switch (tSide) { case Base::BoundBox3f::RIGHT: { int nX = 0; while ((fMinDist > ((clBB.MinX - rclPt.x) + ((float)(nX) * _fGridLenX))) && ((unsigned long)(nX) < _ulCtGridsX)) { for (unsigned long i = 0; i < _ulCtGridsY; i++) { for (unsigned long j = 0; j < _ulCtGridsZ; j++) SearchNearestFacetInGrid(nX, i, j, rclPt, fMinDist, ulFacetInd); } nX++; } break; } case Base::BoundBox3f::LEFT: { int nX = _ulCtGridsX - 1; while ((fMinDist > ((rclPt.x - clBB.MinX) + (float(nX) * _fGridLenX))) && (nX >= 0)) { for (unsigned long i = 0; i < _ulCtGridsY; i++) { for (unsigned long j = 0; j < _ulCtGridsZ; j++) SearchNearestFacetInGrid(nX, i, j, rclPt, fMinDist, ulFacetInd); } nX--; } break; } case Base::BoundBox3f::TOP: { int nY = 0; while ((fMinDist > ((clBB.MinY - rclPt.y) + ((float)(nY) * _fGridLenY))) && ((unsigned long)(nY) < _ulCtGridsY)) { for (unsigned long i = 0; i < _ulCtGridsX; i++) { for (unsigned long j = 0; j < _ulCtGridsZ; j++) SearchNearestFacetInGrid(i, nY, j, rclPt, fMinDist, ulFacetInd); } nY++; } break; } case Base::BoundBox3f::BOTTOM: { int nY = _ulCtGridsY - 1; while ((fMinDist > ((rclPt.y - clBB.MinY) + (float(nY) * _fGridLenY))) && (nY >= 0)) { for (unsigned long i = 0; i < _ulCtGridsX; i++) { for (unsigned long j = 0; j < _ulCtGridsZ; j++) SearchNearestFacetInGrid(i, nY, j, rclPt, fMinDist, ulFacetInd); } nY--; } break; } case Base::BoundBox3f::BACK: { int nZ = 0; while ((fMinDist > ((clBB.MinZ - rclPt.z) + ((float)(nZ) * _fGridLenZ))) && ((unsigned long)(nZ) < _ulCtGridsZ)) { for (unsigned long i = 0; i < _ulCtGridsX; i++) { for (unsigned long j = 0; j < _ulCtGridsY; j++) SearchNearestFacetInGrid(i, j, nZ, rclPt, fMinDist, ulFacetInd); } nZ++; } break; } case Base::BoundBox3f::FRONT: { int nZ = _ulCtGridsZ - 1; while ((fMinDist > ((rclPt.z - clBB.MinZ) + ((float)(nZ) * _fGridLenZ))) && (nZ >= 0)) { for (unsigned long i = 0; i < _ulCtGridsX; i++) { for (unsigned long j = 0; j < _ulCtGridsY; j++) SearchNearestFacetInGrid(i, j, nZ, rclPt, fMinDist, ulFacetInd); } nZ--; } break; } default: break; } } return ulFacetInd; }
void MeshGrid::SearchNearestFromPoint (const Base::Vector3f &rclPt, std::set<unsigned long> &raclInd) const { raclInd.clear(); Base::BoundBox3f clBB = GetBoundBox(); if (clBB.IsInBox(rclPt) == true) { // Punkt liegt innerhalb unsigned long ulX, ulY, ulZ; Position(rclPt, ulX, ulY, ulZ); //int nX = ulX, nY = ulY, nZ = ulZ; unsigned long ulLevel = 0; while (raclInd.size() == 0) GetHull(ulX, ulY, ulZ, ulLevel++, raclInd); GetHull(ulX, ulY, ulZ, ulLevel, raclInd); } else { // Punkt ausserhalb Base::BoundBox3f::SIDE tSide = clBB.GetSideFromRay(rclPt, clBB.CalcCenter() - rclPt); switch (tSide) { case Base::BoundBox3f::RIGHT: { int nX = 0; while (raclInd.size() == 0) { for (unsigned long i = 0; i < _ulCtGridsY; i++) { for (unsigned long j = 0; j < _ulCtGridsZ; j++) raclInd.insert(_aulGrid[nX][i][j].begin(), _aulGrid[nX][i][j].end()); } nX++; } break; } case Base::BoundBox3f::LEFT: { int nX = _ulCtGridsX - 1; while (raclInd.size() == 0) { for (unsigned long i = 0; i < _ulCtGridsY; i++) { for (unsigned long j = 0; j < _ulCtGridsZ; j++) raclInd.insert(_aulGrid[nX][i][j].begin(), _aulGrid[nX][i][j].end()); } nX++; } break; } case Base::BoundBox3f::TOP: { int nY = 0; while (raclInd.size() == 0) { for (unsigned long i = 0; i < _ulCtGridsX; i++) { for (unsigned long j = 0; j < _ulCtGridsZ; j++) raclInd.insert(_aulGrid[i][nY][j].begin(), _aulGrid[i][nY][j].end()); } nY++; } break; } case Base::BoundBox3f::BOTTOM: { int nY = _ulCtGridsY - 1; while (raclInd.size() == 0) { for (unsigned long i = 0; i < _ulCtGridsX; i++) { for (unsigned long j = 0; j < _ulCtGridsZ; j++) raclInd.insert(_aulGrid[i][nY][j].begin(), _aulGrid[i][nY][j].end()); } nY--; } break; } case Base::BoundBox3f::BACK: { int nZ = 0; while (raclInd.size() == 0) { for (unsigned long i = 0; i < _ulCtGridsX; i++) { for (unsigned long j = 0; j < _ulCtGridsY; j++) raclInd.insert(_aulGrid[i][j][nZ].begin(), _aulGrid[i][j][nZ].end()); } nZ++; } break; } case Base::BoundBox3f::FRONT: { int nZ = _ulCtGridsZ - 1; while (raclInd.size() == 0) { for (unsigned long i = 0; i < _ulCtGridsX; i++) { for (unsigned long j = 0; j < _ulCtGridsY; j++) raclInd.insert(_aulGrid[i][j][nZ].begin(), _aulGrid[i][j][nZ].end()); } nZ--; } break; } default: break; } } }