Skip to content

Commit

Permalink
Fix G2/G3 arcs > 180° (MarlinFirmware#20292)
Browse files Browse the repository at this point in the history
  • Loading branch information
yysh12 authored and zillarob committed Feb 25, 2021
1 parent 900dc5c commit a002725
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions Marlin/src/gcode/motion/G2_G3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,21 @@ void plan_arc(
linear_travel = cart[l_axis] - start_L,
extruder_travel = cart.e - current_position.e;

// CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required.
// Angle of rotation between position and target from the circle center.
float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y);
if (angular_travel < 0) angular_travel += RADIANS(360);

// Make sure angular travel over 180 degrees goes the other way around.
switch (((angular_travel < 0) << 1) + clockwise) {
case 1: angular_travel -= RADIANS(360); break; // Positive but CW? Reverse direction.
case 2: angular_travel += RADIANS(360); break; // Negative but CCW? Reverse direction.
}

#ifdef MIN_ARC_SEGMENTS
uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * (angular_travel / RADIANS(360)));
uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * ABS(angular_travel) / RADIANS(360));
NOLESS(min_segments, 1U);
#else
constexpr uint16_t min_segments = 1;
#endif
if (clockwise) angular_travel -= RADIANS(360);

// Make a circle if the angular rotation is 0 and the target is current position
if (angular_travel == 0 && current_position[p_axis] == cart[p_axis] && current_position[q_axis] == cart[q_axis]) {
Expand Down

0 comments on commit a002725

Please sign in to comment.