29 const double L = u.
norm();
43 const double b = -2 * u.
x * (o.
x - p0.
x) - 2 * u.
y * (o.
y - p0.
y);
49 if (nsols <= 0)
return false;
55 if (r1 < 0 && r2 < 0)
return false;
70 if (r_min > L)
return false;
85 const double center2obs_dist = (ptArcCenter - o).
norm();
86 if (std::abs(center2obs_dist - std::abs(arc_radius)) >
R)
return false;
89 const double r = arc_radius;
91 (
R *
r * 2.0 - o.
y *
r * 2.0 -
R *
R + o.
x * o.
x + o.
y * o.
y) *
92 (
R *
r * 2.0 + o.
y *
r * 2.0 +
R *
R - o.
x * o.
x - o.
y * o.
y);
93 if (discr < 0)
return false;
95 ((
R *
R) * (-1.0 / 2.0) + (o.
x * o.
x) * (1.0 / 2.0) +
96 (o.
y * o.
y) * (1.0 / 2.0) -
98 (-(
R *
R) * o.
y + (
R *
R) *
r + (o.
x * o.
x) * o.
y + (o.
x * o.
x) *
r -
99 (o.
y * o.
y) *
r + o.
y * o.
y * o.
y + o.
x * sqrt(discr)) *
101 (o.
y *
r * -2.0 + o.
x * o.
x + o.
y * o.
y +
r *
r) +
103 (-(
R *
R) * o.
y + (
R *
R) *
r + (o.
x * o.
x) * o.
y + (o.
x * o.
x) *
r -
104 (o.
y * o.
y) *
r + o.
y * o.
y * o.
y + o.
x * sqrt(discr)) *
106 (o.
y *
r * -2.0 + o.
x * o.
x + o.
y * o.
y +
r *
r)) /
108 const double sol_x1 =
109 ((
R *
R) * (-1.0 / 2.0) + (o.
x * o.
x) * (1.0 / 2.0) +
110 (o.
y * o.
y) * (1.0 / 2.0) -
112 (-(
R *
R) * o.
y + (
R *
R) *
r + (o.
x * o.
x) * o.
y + (o.
x * o.
x) *
r -
113 (o.
y * o.
y) *
r + o.
y * o.
y * o.
y - o.
x * sqrt(discr)) *
115 (o.
y *
r * -2.0 + o.
x * o.
x + o.
y * o.
y +
r *
r) +
117 (-(
R *
R) * o.
y + (
R *
R) *
r + (o.
x * o.
x) * o.
y + (o.
x * o.
x) *
r -
118 (o.
y * o.
y) *
r + o.
y * o.
y * o.
y - o.
x * sqrt(discr)) *
120 (o.
y *
r * -2.0 + o.
x * o.
x + o.
y * o.
y +
r *
r)) /
124 const double sol_y0 =
125 ((
R *
R) * o.
y * (-1.0 / 2.0) + (
R *
R) *
r * (1.0 / 2.0) +
126 (o.
x * o.
x) * o.
y * (1.0 / 2.0) + (o.
x * o.
x) *
r * (1.0 / 2.0) -
127 (o.
y * o.
y) *
r * (1.0 / 2.0) + (o.
y * o.
y * o.
y) * (1.0 / 2.0) +
128 o.
x * sqrt(discr) * (1.0 / 2.0)) /
129 (o.
y *
r * -2.0 + o.
x * o.
x + o.
y * o.
y +
r *
r);
130 const double sol_y1 =
131 ((
R *
R) * o.
y * (-1.0 / 2.0) + (
R *
R) *
r * (1.0 / 2.0) +
132 (o.
x * o.
x) * o.
y * (1.0 / 2.0) + (o.
x * o.
x) *
r * (1.0 / 2.0) -
133 (o.
y * o.
y) *
r * (1.0 / 2.0) + (o.
y * o.
y * o.
y) * (1.0 / 2.0) -
134 o.
x * sqrt(discr) * (1.0 / 2.0)) /
135 (o.
y *
r * -2.0 + o.
x * o.
x + o.
y * o.
y +
r *
r);
140 sol0.x - ptArcCenter.
x,
141 -(sol0.y - ptArcCenter.
y));
142 double th1 = atan2(sol1.
x - ptArcCenter.
x, -(sol1.
y - ptArcCenter.
y));
155 out_col_dist = std::abs(
r) *
std::min(th0, th1);
#define ASSERT_ABOVE_(__A, __B)
bool collision_free_dist_arc_circ_robot(const double arc_radius, const double robot_radius, const mrpt::math::TPoint2D &obstacle, double &out_col_dist)
Computes the collision-free distance for a forward path (+X) circular arc path segment from pose (0...
T square(const T x)
Inline function for the square of a number.
This base provides a set of functions for maths stuff.
T wrapTo2Pi(T a)
Modifies the given angle to translate it into the [0,2pi[ range.
bool collision_free_dist_segment_circ_robot(const mrpt::math::TPoint2D &p_start, const mrpt::math::TPoint2D &p_end, const double robot_radius, const mrpt::math::TPoint2D &obstacle, double &out_col_dist)
Computes the collision-free distance for a linear segment path between two points, for a circular robot, and a point obstacle (ox,oy).
double norm() const
Point norm.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
GLdouble GLdouble GLdouble r
GLubyte GLubyte GLubyte a
CONTAINER::Scalar norm(const CONTAINER &v)
int solve_poly2(double a, double b, double c, double &r1, double &r2) noexcept
Solves equation a*x^2 + b*x + c = 0.