diff --git a/src/csg/levelset_3d.cpp b/src/csg/levelset_3d.cpp index 1f3756c7f26710bd64f0b1dba1ce2a9d6834f3e1..61701ce6e7e88401e97d4a171fbb74e61f8ede11 100644 --- a/src/csg/levelset_3d.cpp +++ b/src/csg/levelset_3d.cpp @@ -146,14 +146,13 @@ double signed_distance_3d(const LinearExtrude &lin_ext, double xx, double yy, double signed_distance_3d(const RotateExtrude &rot_ext, double xx, double yy, double zz) { - double tt = atan(yy / xx) * DEGREES_PER_RADIAN; - if ((xx < 0 && yy >= 0) || (xx < 0 && yy < 0)) - tt += 180; // Quadrants II & III - else if (xx >= 0 && yy < 0) - tt += 360; // Quadrant IV - - double sign_t = (tt >= 0 && tt <= rot_ext.angle) ? -1.0 : 1.0; - double dist_t = std::min(std::fabs(rot_ext.angle - tt), std::fabs(360 - tt)); + double tt = std::atan2(yy, xx) * DEGREES_PER_RADIAN; + tt = tt >= 0 ? tt : 360 + tt; + + assert(tt >= 0 && tt <= 360); //tt must be between 0 and 360 + + double sign_t = (tt <= rot_ext.angle) ? -1.0 : 1.0; + double dist_t = std::min(std::fabs(rot_ext.angle - tt), (360 - tt)); auto XX = std::hypot(xx, yy); auto YY = zz;