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;
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;
309 return sqrt(pow(c2.
xc - c1.
xc, 2) + pow(c2.
yc - c1.
yc, 2));