315 {
320
321#ifdef LWC_PARAM_ANGLE
323 CxxUtils::sincos scalpha(alpha);
324 double cos_a = scalpha.cs, sin_a = scalpha.sn;
325#else
326 double cos_a, sin_a;
328#endif
329
330 bool sqw = false;
331 if(
z >
lwc()->m_QuarterWaveLength){
333 unsigned int nhwave = (
unsigned int)(
z /
lwc()->m_HalfWaveLength + 0.5);
336 const double straight_part =
338 nhwave &= 1U;
339 if(nhwave == 0) sin_a = - sin_a;
340 const double z_prime =
z * cos_a +
x * sin_a;
341 if(z_prime > straight_part){
342 const double x_prime =
x * cos_a -
z * sin_a;
343 const double dz = straight_part - z_prime;
344 double a1 = std::atan(std::abs(dz / (x_prime +
lwc()->m_FanFoldRadius)));
347 result.set(x1*cos_a - z1*sin_a,
y, z1*cos_a + z1*sin_a);
349 } else if(z_prime > -straight_part){
350 result.set(-z_prime * sin_a,
y, z_prime*cos_a + zshift);
352 } else {
353 const double x_prime =
x * cos_a -
z * sin_a;
354 const double dz = straight_part + z_prime;
355 double a1 = std::atan(std::abs(dz / (x_prime +
lwc()->m_FanFoldRadius)));
358 result.set(x1*cos_a - z1*sin_a,
y, z1*cos_a + z1*sin_a);
360 }
361 } else {
363 }
364 } else {
366 sqw = true;
367 }
368
369
370 const double tan_beta = sin_a / (1.0 + cos_a);
372 if(
z < - local_straight_section &&
373 (
x <
lwc()->m_FanFoldRadius ||
374 x < -
lwc()->m_StraightStartSection *
z / local_straight_section / tan_beta))
375 {
377 }
378 else {
379 const double z_prime =
z * cos_a +
x * sin_a;
380 const double x_prime =
x * cos_a -
z * sin_a;
381 if(z_prime < local_straight_section) {
382 double a = std::abs(std::atan((local_straight_section - z_prime) / (x_prime -
lwc()->m_FanFoldRadius)));
383 result.set(
lwc()->m_FanFoldRadius * (1 - std::cos(
a)),
y, local_straight_section -
lwc()->m_FanFoldRadius * std::sin(
a));
384 } else {
386 if(z_prime <= straight_part) {
388 } else {
389 double a = std::abs(std::atan((straight_part - z_prime) / (x_prime +
lwc()->m_FanFoldRadius)) );
390 result.set(
lwc()->m_FanFoldRadius * (std::cos(
a) - 1),
y, straight_part +
lwc()->m_FanFoldRadius * std::sin(
a));
391 }
392 }
393 result.rotateY(std::asin(sin_a));
394 }
399 }