54 int nNumPoints =
static_cast<int>(vRawPath.size()) / 8;
57 if (vRawPath.size() <= 3)
63 std::vector<double> vX, vY;
66 vX.push_back(stWaypoint.GetUTMCoordinate().dEasting);
67 vY.push_back(stWaypoint.GetUTMCoordinate().dNorthing);
71 std::vector<double> vT(vRawPath.size());
73 for (
size_t siI = 1; siI < vRawPath.size(); siI++)
75 double dDist = std::sqrt(std::pow(vX[siI] - vX[siI - 1], 2) + std::pow(vY[siI] - vY[siI - 1], 2));
76 vT[siI] = vT[siI - 1] + dDist;
80 double dMaxT = vT.back();
87 std::vector<geoops::Waypoint> vSplinePath;
90 vSplinePath.push_back(vRawPath.front());
93 for (
int siI = 1; siI < nNumPoints - 1; siI++)
95 double dT =
static_cast<double>(siI) / (nNumPoints - 1);
99 while (siSegment < vT.size() - 1 && vT[siSegment + 1] < dT)
105 double dLocalT = (dT - vT[siSegment]) / (vT[siSegment + 1] - vT[siSegment]);
108 int nI0 = std::max(0,
static_cast<int>(siSegment) - 1);
110 int nI2 = std::min(
static_cast<int>(vRawPath.size()) - 1,
static_cast<int>(siSegment) + 1);
111 int nI3 = std::min(
static_cast<int>(vRawPath.size()) - 1,
static_cast<int>(siSegment) + 2);
114 double dT1 = dLocalT;
115 double dT2 = dT1 * dT1;
116 double dT3 = dT2 * dT1;
118 double dH00 = 2 * dT3 - 3 * dT2 + 1;
119 double dH10 = dT3 - 2 * dT2 + dT1;
120 double dH01 = -2 * dT3 + 3 * dT2;
121 double dH11 = dT3 - dT2;
123 double dX = dH00 * vX[nI1] + dH10 * (vX[nI2] - vX[nI0]) + dH01 * vX[nI2] + dH11 * (vX[nI3] - vX[nI1]);
124 double dY = dH00 * vY[nI1] + dH10 * (vY[nI2] - vY[nI0]) + dH01 * vY[nI2] + dH11 * (vY[nI3] - vY[nI1]);
127 geoops::UTMCoordinate stUTMResult(dX, dY, vRawPath[0].GetUTMCoordinate().nZone, vRawPath[0].GetUTMCoordinate().bWithinNorthernHemisphere);
132 vSplinePath.push_back(vRawPath.back());