22#include <boost/array.hpp>
24#include <boost/math/tools/rational.hpp>
48 auto normal_x = std::sin(
static_cast<float>(
tangent));
50 auto normal_y = -std::cos(
static_cast<float>(
tangent));
86 constexpr double pi_half = geom::Math::Pi<double>() / 2.0;
108 const double cos_a = std::cos(angle);
110 const double sin_a = std::sin(angle);
113 static_cast<float>(x * cos_a - y * sin_a),
114 static_cast<float>(y * cos_a + x * sin_a));
132 const double curve_dot = (curve_end - curve_start) / (
_length);
134 const double s_o = curve_start / curve_dot;
136 double s = s_o + dist;
148 odrSpiral(s_o, curve_dot, &x_o, &y_o, &t_o);
186 auto &val1 = result.second.first;
187 auto &val2 = result.second.second;
190 double rate = (val2.s - dist) / (val2.s - val1.s);
192 double u = rate * val1.u + (1.0 - rate) * val2.u;
194 double v = rate * val1.v + (1.0 - rate) * val2.v;
196 double tangent = atan((rate * val1.t + (1.0 - rate) * val2.t));
221 constexpr double interval_size = 0.3;
223 const double delta_u = interval_size;
224 double current_s = 0;
225 double current_u = 0;
233 while (current_s <
_length + delta_u) {
235 current_u += delta_u;
239 double du = current_u - last_u;
241 double dv = current_v - last_v;
243 double ds = sqrt(du * du + dv * dv);
249 RtreeValue current_val{current_u, current_v, current_s, current_t};
261 last_val = current_val;
274 auto &val1 = result.second.first;
275 auto &val2 = result.second.second;
277 double rate = (val2.s - dist) / (val2.s - val1.s);
279 double u = rate * val1.u + (1.0 - rate) * val2.u;
281 double v = rate * val1.v + (1.0 - rate) * val2.v;
283 double t_u = (rate * val1.t_u + (1.0 - rate) * val2.t_u);
285 double t_v = (rate * val1.t_v + (1.0 - rate) * val2.t_v);
287 double tangent = atan2(t_v, t_u);
312 constexpr double interval_size = 0.5;
314 size_t number_intervals =
315 std::max(
static_cast<size_t>(
_length / interval_size),
size_t(5));
316 double delta_p = 1.0 / number_intervals;
322 double current_s = 0;
334 for(
size_t i = 0; i < number_intervals; ++i) {
342 double du = current_u - last_u;
344 double dv = current_v - last_v;
346 double ds = sqrt(du * du + dv * dv);
378 last_val = current_val;
#define DEBUG_ASSERT(predicate)
value_type Evaluate(const value_type &x) const
评估 f(x) = a + bx + cx^2 + dx^3
value_type Tangent(const value_type &x) const
使用 df/dx = b + 2cx + 3dx^2 计算正切值
static T Clamp(T a, T min=T(0), T max=T(1))
boost::geometry::model::point< float, Dimension, boost::geometry::cs::cartesian > BPoint
boost::geometry::model::segment< BPoint > BSegment
void InsertElement(const BSegment &segment, const T &element_start, const T &element_end)
std::vector< TreeElement > GetNearestNeighbours(const Geometry &geometry, size_t number_neighbours=1) const
float x
定义一个名为Vector2D的公共类,用于表示二维向量。
DirectedPoint PosFromDist(double dist) const override
DirectedPoint PosFromDist(double dist) const override
DirectedPoint PosFromDist(double dist) const override
geom::CubicPolynomial _polyU
std::pair< float, float > DistanceTo(const geom::Location &) const override
geom::CubicPolynomial _polyV
geom::CubicPolynomial _poly
std::pair< float, float > DistanceTo(const geom::Location &) const override
DirectedPoint PosFromDist(double dist) const override
std::pair< float, float > DistanceTo(const geom::Location &) const override
DirectedPoint PosFromDist(double dist) const override
geom::Location _start_position
geom::Vector2D RotatebyAngle(double angle, double x, double y)
void odrSpiral(double s, double cDot, double *x, double *y, double *t)
compute the actual "standard" spiral, starting with curvature 0
void ApplyLateralOffset(float lateral_offset)