39 void HC_CC_Circle_Param::set_param(
double _kappa,
double _sigma,
double _radius,
double _mu,
double _sin_mu,
40 double _cos_mu,
double _delta_min)
43 kappa_inv = 1 / _kappa;
49 delta_min = _delta_min;
52 HC_CC_Circle::HC_CC_Circle(
const Configuration &_start,
bool _left,
bool _forward,
bool _regular,
75 sigma = -_param.
sigma;
88 HC_CC_Circle::HC_CC_Circle(
double _xc,
double _yc,
bool _left,
bool _forward,
bool _regular,
105 sigma = -_param.
sigma;
118 double alpha_c = this->
start.theta;
119 double alpha_q = q.
theta;
120 if ((this->left && this->forward) || (!this->left && !this->forward))
122 return twopify(alpha_q - alpha_c);
126 return twopify(alpha_c - alpha_q);
130 double HC_CC_Circle::D1(
double alpha)
const 132 double fresnel_s, fresnel_c;
133 double s =
sqrt(2 * alpha /
PI);
134 fresnel(s, fresnel_s, fresnel_c);
135 return cos(alpha) * fresnel_c +
sin(alpha) * fresnel_s;
138 double HC_CC_Circle::rs_circular_deflection(
double delta)
const 145 return (delta <=
PI) ? delta : delta -
TWO_PI;
151 fabs(fabs(this->sigma) - numeric_limits<double>::max()) <
get_epsilon());
152 double delta = this->deflection(q);
153 return fabs(this->kappa_inv * this->rs_circular_deflection(delta));
156 double HC_CC_Circle::hc_circular_deflection(
double delta)
const 158 double delta_min_twopified =
twopify(this->delta_min);
162 if (delta < delta_min_twopified)
163 return TWO_PI + delta - delta_min_twopified;
165 return delta - delta_min_twopified;
170 double delta_arc1, delta_arc2;
171 if (delta < delta_min_twopified)
173 delta_arc1 = delta - delta_min_twopified;
174 delta_arc2 = delta_arc1 +
TWO_PI;
178 delta_arc1 = delta - delta_min_twopified;
179 delta_arc2 = delta_arc1 -
TWO_PI;
181 return (fabs(delta_arc1) < fabs(delta_arc2)) ? delta_arc1 : delta_arc2;
188 double delta = this->deflection(q);
189 return fabs(this->
kappa / this->sigma) + fabs(this->kappa_inv * this->hc_circular_deflection(delta));
192 bool HC_CC_Circle::cc_elementary_sharpness(
const Configuration &q,
double delta,
double &sigma0)
const 199 sigma0 = 4 *
PI *
pow(this->D1(0.5 * delta), 2) /
pow(distance, 2);
209 double HC_CC_Circle::cc_circular_deflection(
double delta)
const 211 double two_delta_min_twopified =
twopify(2 * this->delta_min);
215 if (delta < two_delta_min_twopified)
216 return TWO_PI + delta - two_delta_min_twopified;
218 return delta - two_delta_min_twopified;
223 double delta_arc1, delta_arc2;
224 if (delta < two_delta_min_twopified)
226 delta_arc1 = delta - two_delta_min_twopified;
227 delta_arc2 = delta_arc1 +
TWO_PI;
231 delta_arc1 = delta - two_delta_min_twopified;
232 delta_arc2 = delta_arc1 -
TWO_PI;
234 return (fabs(delta_arc1) < fabs(delta_arc2)) ? delta_arc1 : delta_arc2;
241 double delta = this->deflection(q);
245 return 2 * this->radius * this->sin_mu;
248 double length_min = fabs(this->
kappa / this->sigma);
249 double length_default = 2 * length_min + fabs(this->kappa_inv * this->cc_circular_deflection(delta));
250 if (delta < 2 * this->delta_min)
253 if (this->cc_elementary_sharpness(q, delta, sigma0))
255 double length_elementary = 2 *
sqrt(delta / fabs(sigma0));
256 return (length_elementary < length_default) ? length_elementary : length_default;
260 return length_default;
266 return length_default;
270 void HC_CC_Circle::print(
bool eol)
const 272 cout <<
"HC_CC_Circle: ";
289 cout <<
", backward";
297 cout <<
", irregular";
299 cout <<
", kappa: " <<
kappa <<
", sigma: " << sigma;
300 cout <<
", centre: (" << xc <<
", " << yc <<
"), radius " << radius <<
", mu: " << mu;
double get_epsilon()
Return value of epsilon.
bool left
Turning direction: left/right.
double center_distance(const HC_CC_Circle &c1, const HC_CC_Circle &c2)
Cartesian distance between the centers of two circles.
double sin_mu
Sine and cosine of mu.
bool configuration_on_hc_cc_circle(const HC_CC_Circle &c, const Configuration &q)
Configuration on the circle?
double radius
Radius of the outer circle.
void fresnel(double s, double &S_f, double &C_f)
Fresnel integrals: S_f = int_0_s(sin(pi/2 u*u)du), C_f = int_0_s(cos(pi/2 u*u)du) approximated with C...
double twopify(double alpha)
Conversion of arbitrary angle given in [rad] to [0, 2*pi[.
TFSIMD_FORCE_INLINE tfScalar angle(const Quaternion &q1, const Quaternion &q2)
double distance(double x0, double y0, double x1, double y1)
double theta
Orientation in rad between [0, 2*pi[.
double kappa
Max. curvature, inverse of max. curvature, max. sharpness.
void global_frame_change(double x, double y, double theta, double local_x, double local_y, double *global_x, double *global_y)
Transformation of (local_x, local_y) from local coordinate system to global one.
bool forward
Driving direction: forwards/backwards.
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
double point_distance(double x1, double y1, double x2, double y2)
Cartesian distance between two points.
double mu
Angle between the initial orientation and the tangent to the circle at the initial position...
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
double delta_min
Minimal deflection.
INLINE Rall1d< T, V, S > atan2(const Rall1d< T, V, S > &y, const Rall1d< T, V, S > &x)
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
double xc
Center of the circle.
INLINE Rall1d< T, V, S > sin(const Rall1d< T, V, S > &arg)