40 const double cos_a = scalpha.
cs, sin_a = scalpha.
sn;
43 lwc()->m_vsincos_par.eval(
P.y(), sin_a, cos_a);
46 int nqwave = (
z < 0.) ? 0 : int(
z /
lwc()->m_QuarterWaveLength);
50 bool begin_qw =
false;
51 if((nqwave % 2) != 0){
62 if(nqwave != 0 && nqwave !=
lwc()->m_NumberOfHalfWaves){
65 if((nqwave % 2) == 0)
x = -
x;
72 const double z_prime =
z * cos_a +
x * sin_a;
73 const double x_prime =
x * cos_a -
z * sin_a;
75 if(z_prime > straight_part){
76 const double dz = straight_part - z_prime;
79 }
else if(z_prime > -straight_part){
82 const double dz = straight_part + z_prime;
87 if(!begin_qw) distance = -distance;
88 if((nqwave % 2) == 0) distance = -distance;
97 const double tan_beta = sin_a/(1.0 + cos_a);
99 if(
z < - local_straight_section &&
100 (
x <
lwc()->m_FanFoldRadius ||
101 x < -
lwc()->m_StraightStartSection *
z / local_straight_section / tan_beta ) )
106 const double z_prime =
z * cos_a +
x * sin_a;
107 const double x_prime =
x * cos_a -
z * sin_a;
108 if (z_prime < local_straight_section) {
109 const double dz = local_straight_section - z_prime;
114 if (z_prime <= straight_part) {
115 distance = - x_prime;
117 const double dz = straight_part - z_prime;
124 if (nqwave == 0) distance = -distance;
128 if(fabs(dd - distance) > 0.000001){
130 std::cout <<
"DTNF MISMATCH " <<
this <<
" " <<
P <<
" "
131 << dd <<
" vs " << distance << std::endl;
145#ifdef LWC_PARAM_ANGLE
148 double cos_a = scalpha.
cs, sin_a = scalpha.
sn;
151 lwc()->m_vsincos_par.eval(
P.y(), sin_a, cos_a);
155 if(
z >
lwc()->m_QuarterWaveLength){
157 unsigned int nhwave = (
unsigned int)(
z /
lwc()->m_HalfWaveLength + 0.5);
161 if(nhwave == 0) sin_a = - sin_a;
162 double z_prime =
z * cos_a +
x * sin_a;
163 const double x_prime =
z * sin_a -
x * cos_a;
164 if(z_prime > straight_part){
165 const double dz = z_prime - straight_part;
174 z_prime += straight_part;
178 const double &dz = z_prime;
196 const double tan_beta = sin_a/(1.0 + cos_a);
198 if(
z < - local_straight_section &&
199 (
x <
lwc()->m_FanFoldRadius ||
200 x < -
lwc()->m_StraightStartSection *
z / local_straight_section / tan_beta ))
205 const double z_prime =
z * cos_a +
x * sin_a;
206 const double x_prime =
x * cos_a -
z * sin_a;
207 if (z_prime < local_straight_section) {
208 const double dz = local_straight_section - z_prime;
213 const double straight_part =
215 if (z_prime <= straight_part) {
216 return sqw? x_prime: (-x_prime);
218 const double dz = straight_part - z_prime;
236#ifdef LWC_PARAM_ANGLE
239 const double cos_a = scalpha.
cs, sin_a = scalpha.
sn;
242 lwc()->m_vsincos_par.eval(
P.y(), sin_a, cos_a);
246 if(
z < 0.) nqwave = 0;
247 else nqwave = int(
z /
lwc()->m_QuarterWaveLength);
248 bool begin_qw =
false;
249 if((nqwave % 2) != 0){
254 if(nqwave != 0 && nqwave !=
lwc()->m_NumberOfHalfWaves){
256 if((nqwave % 2) == 0)
x = -
x;
261 const double z_prime =
z * cos_a +
x * sin_a;
262 const double x_prime =
x * cos_a -
z * sin_a;
264 const double dz = straight_part - z_prime;
265 if (dz > 0)
result.set(0.,
y, z_prime);
267 double a = atan(fabs(dz / (x_prime +
lwc()->m_FanFoldRadius)));
268 result.set(
lwc()->m_FanFoldRadius * (cos(
a) - 1),
y, straight_part +
lwc()->m_FanFoldRadius * sin(
a));
270 result.rotateY(asin(sin_a));
278 if(nqwave == 0)
x = -
x;
280 const double tan_beta = sin_a/(1.0+cos_a);
282 if(
z < - local_straight_section &&
283 (
x <
lwc()->m_FanFoldRadius ||
284 x < -
lwc()->m_StraightStartSection *
z / local_straight_section / tan_beta))
289 const double z_prime =
z * cos_a +
x * sin_a;
290 const double x_prime =
x * cos_a -
z * sin_a;
291 if(z_prime < local_straight_section) {
292 double a = fabs(atan((local_straight_section - z_prime) / (x_prime -
lwc()->m_FanFoldRadius)));
294 result.set(
lwc()->m_FanFoldRadius * (1 - cos(
a)),
y, local_straight_section -
lwc()->m_FanFoldRadius * sin(
a));
297 if(z_prime <= straight_part) {
300 double a = fabs(atan((straight_part - z_prime) / (x_prime +
lwc()->m_FanFoldRadius)) );
301 result.set(
lwc()->m_FanFoldRadius * (cos(
a) - 1),
y, straight_part +
lwc()->m_FanFoldRadius * sin(
a));
304 result.rotateY(asin(sin_a));
324#ifdef LWC_PARAM_ANGLE
327 double cos_a = scalpha.
cs, sin_a = scalpha.
sn;
330 lwc()->m_vsincos_par.eval(
P.y(), sin_a, cos_a);
334 if(
z >
lwc()->m_QuarterWaveLength){
336 unsigned int nhwave = (
unsigned int)(
z /
lwc()->m_HalfWaveLength + 0.5);
339 const double straight_part =
342 if(nhwave == 0) sin_a = - sin_a;
343 const double z_prime =
z * cos_a +
x * sin_a;
344 if(z_prime > straight_part){
345 const double x_prime =
x * cos_a -
z * sin_a;
346 const double dz = straight_part - z_prime;
347 double a1 = atan(fabs(dz / (x_prime +
lwc()->m_FanFoldRadius)));
350 result.set(x1*cos_a - z1*sin_a,
y, z1*cos_a + z1*sin_a);
352 }
else if(z_prime > -straight_part){
353 result.set(-z_prime * sin_a,
y, z_prime*cos_a + zshift);
356 const double x_prime =
x * cos_a -
z * sin_a;
357 const double dz = straight_part + z_prime;
358 double a1 = atan(fabs(dz / (x_prime +
lwc()->m_FanFoldRadius)));
361 result.set(x1*cos_a - z1*sin_a,
y, z1*cos_a + z1*sin_a);
373 const double tan_beta = sin_a / (1.0 + cos_a);
375 if(
z < - local_straight_section &&
376 (
x <
lwc()->m_FanFoldRadius ||
377 x < -
lwc()->m_StraightStartSection *
z / local_straight_section / tan_beta))
382 const double z_prime =
z * cos_a +
x * sin_a;
383 const double x_prime =
x * cos_a -
z * sin_a;
384 if(z_prime < local_straight_section) {
385 double a = fabs(atan((local_straight_section - z_prime) / (x_prime -
lwc()->m_FanFoldRadius)));
386 result.set(
lwc()->m_FanFoldRadius * (1 - cos(
a)),
y, local_straight_section -
lwc()->m_FanFoldRadius * sin(
a));
389 if(z_prime <= straight_part) {
392 double a = fabs(atan((straight_part - z_prime) / (x_prime +
lwc()->m_FanFoldRadius)) );
393 result.set(
lwc()->m_FanFoldRadius * (cos(
a) - 1),
y, straight_part +
lwc()->m_FanFoldRadius * sin(
a));
396 result.rotateY(asin(sin_a));
416#ifdef LWC_PARAM_ANGLE
421 const double cos_a = scalpha.
cs, sin_a = scalpha.
sn;
425 lwc()->m_vsincos_par.eval(
P.y(), sin_a, cos_a);
430 if(
z < 0.) nqwave = 0;
431 else nqwave = int(
z /
lwc()->m_QuarterWaveLength);
432 bool begin_qw =
false;
433 if((nqwave % 2) != 0){
442 if(nqwave != 0 && nqwave !=
lwc()->m_NumberOfHalfWaves){
448 if((nqwave % 2) == 0){
449 if(begin_qw) local_side = -1;
451 if(!begin_qw) local_side = -1;
456 if(dz >= rho * sin_a){
460 + sqrt(rho * rho - dz * dz);
475 const double tan_beta = sin_a/(1.0+cos_a);
476 const double min_local_fold_region = rho1i * tan_beta;
478 if(
z <= - min_local_fold_region){
483 const double max_local_fold_region = rho1 * sin_a - min_local_fold_region;
485 if(
z < max_local_fold_region){
486 z += min_local_fold_region;
487 result = rho1 - sqrt(rho1 * rho1 -
z *
z);
494 if(dz >= rho * sin_a){
498 + sqrt(rho * rho - dz * dz);