fix find_closest_arc() and arc_bbox() if arc was saved with negative "b" angle

This commit is contained in:
stefan schippers 2025-10-30 01:12:11 +01:00
parent bf344309f0
commit 3fcc5cdfc6
2 changed files with 27 additions and 6 deletions

View File

@ -1934,8 +1934,19 @@ void arc_bbox(double x, double y, double r, double a, double b,
*by2 = y+r; *by2 = y+r;
return; return;
} }
if(b < 0.) {
double aa = a;
a = fmod(aa + b, 360.);
if(a < 0) a += 360.;
b = fmod(aa, 360.);
if(b < 0) b += 360.;
} else {
b = fmod(a + b, 360.);
if(b < 0) b += 360.;
a = fmod(a, 360.); a = fmod(a, 360.);
if(a < 0) a += 360.; if(a < 0) a += 360.;
}
aa = (int)(ceil(a/90.))*90; aa = (int)(ceil(a/90.))*90;
bb = (int)(floor((a+b)/90.))*90; bb = (int)(floor((a+b)/90.))*90;

View File

@ -353,7 +353,17 @@ static void find_closest_arc(double mx, double my, int override_lock)
if(angle<0.) angle +=360.; if(angle<0.) angle +=360.;
angle1 = xctx->arc[c][i].a; angle1 = xctx->arc[c][i].a;
angle2 = fmod(xctx->arc[c][i].a + xctx->arc[c][i].b, 360.); angle2 = fmod(xctx->arc[c][i].a + xctx->arc[c][i].b, 360.);
if(xctx->arc[c][i].b < 0) {
angle1 = fmod(xctx->arc[c][i].a + xctx->arc[c][i].b, 360.);
if(angle1 < 0.) angle1 += 360.;
angle2 = fmod(xctx->arc[c][i].a, 360.);
if(angle2 < 0.) angle2 += 360.;
} else {
angle1 = fmod(xctx->arc[c][i].a, 360.);
if(angle1 < 0.) angle1 += 360.;
angle2 = fmod(xctx->arc[c][i].a + xctx->arc[c][i].b, 360.);
if(angle2 < 0.) angle2 += 360.;
}
match=0; match=0;
if(dist < d) { if(dist < d) {
if(xctx->arc[c][i].b==360.) match=1; if(xctx->arc[c][i].b==360.) match=1;
@ -367,7 +377,7 @@ static void find_closest_arc(double mx, double my, int override_lock)
} }
} }
} }
dbg(1, "find_closest_arc(): dist = %g, angle = %g\n", dist, angle); dbg(1, "find_closest_arc(): dist = %g, angle = %g, angle1=%g, angle2=%g\n", dist, angle, angle1, angle2);
dbg(1, "find_closest_arc(): center=%g, %g: mouse: %g:%g\n", dbg(1, "find_closest_arc(): center=%g, %g: mouse: %g:%g\n",
xctx->arc[c][i].x, xctx->arc[c][i].y, mx, my); xctx->arc[c][i].x, xctx->arc[c][i].y, mx, my);
if(match ) { if(match ) {