From 3fcc5cdfc6a80c2743a019e9a661fbff487e513a Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Thu, 30 Oct 2025 01:12:11 +0100 Subject: [PATCH] fix find_closest_arc() and arc_bbox() if arc was saved with negative "b" angle --- src/draw.c | 15 +++++++++++++-- src/findnet.c | 18 ++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/draw.c b/src/draw.c index b92d4906..4b86c21f 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1934,8 +1934,19 @@ void arc_bbox(double x, double y, double r, double a, double b, *by2 = y+r; return; } - a = fmod(a, 360.); - if(a<0) a+=360.; + + 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.); + if(a < 0) a += 360.; + } aa = (int)(ceil(a/90.))*90; bb = (int)(floor((a+b)/90.))*90; diff --git a/src/findnet.c b/src/findnet.c index 9266f236..2ff10292 100644 --- a/src/findnet.c +++ b/src/findnet.c @@ -351,9 +351,19 @@ static void find_closest_arc(double mx, double my, int override_lock) dist *= dist; /* square d */ angle = fmod(atan2(xctx->arc[c][i].y-my, mx-xctx->arc[c][i].x)*180./XSCH_PI, 360.); if(angle<0.) angle +=360.; - angle1 = xctx->arc[c][i].a; - angle2 = fmod(xctx->arc[c][i].a + xctx->arc[c][i].b, 360.); - + angle1 = xctx->arc[c][i].a; + 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; if(dist < d) { 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", xctx->arc[c][i].x, xctx->arc[c][i].y, mx, my); if(match ) {