#include "GridSmooth.h" #include "QuadTree.h" void CGridSmooth::ExcuteSmooth(std::shared_ptr pXy, CDimension2D *pGrid,double smoothFactor) { if (smoothFactor < 1e-10) { return; } double dGridW = pGrid->xmax()- pGrid->xmin(); double dGridH = pGrid->ymax() - pGrid->ymin(); CQuadTree quadTree(pGrid->xmin() - dGridW, pGrid->ymin() - dGridH, dGridW*3.0, dGridH*3.0, 10); CPositionList elements; //获取图层元素,不包含子图层 pXy->GetElement("断层", elements, true); POSITION p = nullptr; COne *pOne = nullptr; POSITION pos = elements.GetHeadPosition(); NBase::dfPoint fptStart, fptEnd; while (pos) { p = elements.GetNext(pos); pOne = (COne *)pXy->GetAt(p); int type = pOne->GetType(); switch (type) { case DOUBLEFOX_CURVE: CCurveEx *pCurve = (CCurveEx *)pOne->GetValue(); for (int i = 0; i < pCurve->num-1; i++) { pCurve->GetPoint(i, fptStart); pCurve->GetPoint(i, fptEnd); LineSegment tmpSeg = { {fptStart.x0, fptStart.y0}, {fptEnd.x0, fptEnd.y0} }; quadTree.insert(tmpSeg); } break; } } int numx = pGrid->xnum(); int numy = pGrid->ynum(); double dZMin = pGrid->range[0] - 0.001; double dZMax = pGrid->range[1] + 0.001; for (int i = 1; i < numx - 1; i++) { double dPtX = pGrid->x(i); for (int j = 1; j < numy - 1; j++) { double dValueCur = pGrid->Value(i, j); if (dValueCur < dZMin || dValueCur > dZMax) { continue; } double dPtY = pGrid->y(j); double dSigma = 0; int nCount = 0; // Coordinates and values of neighboring points struct Neighbor { int di, dj; double x, y, value; } neighbors[8] = { { -1, -1, pGrid->x(i - 1), pGrid->y(j - 1), pGrid->Value(i - 1, j - 1) }, { 0, -1, pGrid->x(i), pGrid->y(j - 1), pGrid->Value(i, j - 1) }, { 1, -1, pGrid->x(i + 1), pGrid->y(j - 1), pGrid->Value(i + 1, j - 1) }, { -1, 0, pGrid->x(i - 1), pGrid->y(j), pGrid->Value(i - 1, j) }, { 1, 0, pGrid->x(i + 1), pGrid->y(j), pGrid->Value(i + 1, j) }, { -1, 1, pGrid->x(i - 1), pGrid->y(j + 1), pGrid->Value(i - 1, j + 1) }, { 0, 1, pGrid->x(i), pGrid->y(j + 1), pGrid->Value(i, j + 1) }, { 1, 1, pGrid->x(i + 1), pGrid->y(j + 1), pGrid->Value(i + 1, j + 1) } }; for (const auto& neighbor : neighbors) { double dValueTmp = neighbor.value; if (dValueTmp >= dZMin && dValueTmp <= dZMax) { LineSegment querySegment = { {dPtX, dPtY}, {neighbor.x, neighbor.y} }; if (!quadTree.hasIntersection(querySegment)) { dSigma += dValueTmp; nCount++; } } } if (nCount > 0) { double dAverage = dSigma / nCount; double dValueNew = (dValueCur + dAverage * smoothFactor) / (1.0 + smoothFactor); pGrid->SetValue(i, j, dValueNew); } } } }