Fits a B-spline to the given path using cubic interpolation.
52 {
53
54 int nNumPoints = static_cast<int>(vRawPath.size()) / 8;
55
56
57 if (vRawPath.size() <= 3)
58 {
59 return vRawPath;
60 }
61
62
63 std::vector<double> vX, vY;
65 {
66 vX.push_back(stWaypoint.GetUTMCoordinate().dEasting);
67 vY.push_back(stWaypoint.GetUTMCoordinate().dNorthing);
68 }
69
70
71 std::vector<double> vT(vRawPath.size());
72 vT[0] = 0.0;
73 for (size_t siI = 1; siI < vRawPath.size(); siI++)
74 {
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;
77 }
78
79
80 double dMaxT = vT.back();
81 for (auto& dT1 : vT)
82 {
83 dT1 /= dMaxT;
84 }
85
86
87 std::vector<geoops::Waypoint> vSplinePath;
88
89
90 vSplinePath.push_back(vRawPath.front());
91
92
93 for (int siI = 1; siI < nNumPoints - 1; siI++)
94 {
95 double dT = static_cast<double>(siI) / (nNumPoints - 1);
96
97
98 size_t siSegment = 0;
99 while (siSegment < vT.size() - 1 && vT[siSegment + 1] < dT)
100 {
101 siSegment++;
102 }
103
104
105 double dLocalT = (dT - vT[siSegment]) / (vT[siSegment + 1] - vT[siSegment]);
106
107
108 int nI0 = std::max(0, static_cast<int>(siSegment) - 1);
109 int nI1 = siSegment;
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);
112
113
114 double dT1 = dLocalT;
115 double dT2 = dT1 * dT1;
116 double dT3 = dT2 * dT1;
117
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;
122
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]);
125
126
127 geoops::UTMCoordinate stUTMResult(dX, dY, vRawPath[0].GetUTMCoordinate().nZone, vRawPath[0].GetUTMCoordinate().bWithinNorthernHemisphere);
129 }
130
131
132 vSplinePath.push_back(vRawPath.back());
133
134 return vSplinePath;
135 }
This struct stores/contains information about a UTM coordinate.
Definition GeospatialOperations.hpp:195
This struct is used by the WaypointHandler class to store location, size, and type information about ...
Definition GeospatialOperations.hpp:392