326 {
331
332#ifdef LWC_PARAM_ANGLE
334 CxxUtils::sincos scalpha(alpha);
335 double cos_a = scalpha.cs, sin_a = scalpha.sn;
336#else
337 double cos_a, sin_a;
338 lwc()->m_vsincos_par.eval(
P.y(), sin_a, cos_a);
339#endif
340
341 bool sqw = false;
342 if(
z >
lwc()->m_QuarterWaveLength){
344 unsigned int nhwave = (
unsigned int)(
z /
lwc()->m_HalfWaveLength + 0.5);
347 const double straight_part =
349 nhwave &= 1U;
350 if(nhwave == 0) sin_a = - sin_a;
351 const double z_prime =
z * cos_a +
x * sin_a;
352 if(z_prime > straight_part){
353 const double x_prime =
x * cos_a -
z * sin_a;
354 const double dz = straight_part - z_prime;
355 double a1 =
atan(fabs(dz / (x_prime +
lwc()->m_FanFoldRadius)));
358 result.set(x1*cos_a - z1*sin_a,
y, z1*cos_a + z1*sin_a);
360 } else if(z_prime > -straight_part){
361 result.set(-z_prime * sin_a,
y, z_prime*cos_a + zshift);
363 } else {
364 const double x_prime =
x * cos_a -
z * sin_a;
365 const double dz = straight_part + z_prime;
366 double a1 =
atan(fabs(dz / (x_prime +
lwc()->m_FanFoldRadius)));
369 result.set(x1*cos_a - z1*sin_a,
y, z1*cos_a + z1*sin_a);
371 }
372 } else {
374 }
375 } else {
377 sqw = true;
378 }
379
380
381 const double tan_beta = sin_a / (1.0 + cos_a);
383 if(
z < - local_straight_section &&
384 (
x <
lwc()->m_FanFoldRadius ||
385 x < -
lwc()->m_StraightStartSection *
z / local_straight_section / tan_beta))
386 {
388 }
389 else {
390 const double z_prime =
z * cos_a +
x * sin_a;
391 const double x_prime =
x * cos_a -
z * sin_a;
392 if(z_prime < local_straight_section) {
393 double a = fabs(
atan((local_straight_section - z_prime) / (x_prime -
lwc()->m_FanFoldRadius)));
394 result.set(
lwc()->m_FanFoldRadius * (1 -
cos(
a)),
y, local_straight_section -
lwc()->m_FanFoldRadius *
sin(
a));
395 } else {
397 if(z_prime <= straight_part) {
399 } else {
400 double a = fabs(
atan((straight_part - z_prime) / (x_prime +
lwc()->m_FanFoldRadius)) );
401 result.set(
lwc()->m_FanFoldRadius * (
cos(
a) - 1),
y, straight_part +
lwc()->m_FanFoldRadius *
sin(
a));
402 }
403 }
404 result.rotateY(asin(sin_a));
405 }
410 }