better threshold detection for bezier selection

This commit is contained in:
stefan schippers 2025-02-22 11:37:19 +01:00
parent 0e438829c6
commit a93fb64e12
1 changed files with 7 additions and 14 deletions

View File

@ -49,7 +49,7 @@ static void find_closest_wire(double mx, double my)
}
}
static void find_closest_bezier(double mx, double my, int c, int i, int *l, int *col)
static double find_closest_bezier(double mx, double my, double d, int c, int i, int *l, int *col)
{
const double bez_steps = 1.0/8.0; /* divide the t = [0,1] interval into 8 steps */
int b;
@ -97,13 +97,14 @@ static void find_closest_bezier(double mx, double my, int c, int i, int *l, int
xp1 = (1 - t1) * (1 - t1) * x0 + 2 * (1 - t1) * t1 * x1 + t1 * t1 * x2;
yp1 = (1 - t1) * (1 - t1) * y0 + 2 * (1 - t1) * t1 * y1 + t1 * t1 * y2;
ORDER(xp, yp, xp1, yp1);
if( (tmp = dist(xp, yp, xp1, yp1, mx, my)) < distance )
if( (tmp = dist(xp, yp, xp1, yp1, mx, my)) < d )
{
*l = i; distance = tmp; *col = c;
dbg(1, "find_closest_bezier(): distance=%.16g n=%d\n", distance, i);
*l = i; d = tmp; *col = c;
}
}
}
dbg(1, "find_closest_bezier(): d=%.16g n=%d\n", d, i);
return d;
}
static void find_closest_polygon(double mx, double my)
@ -126,15 +127,7 @@ static void find_closest_polygon(double mx, double my)
bezier = bezier && (p->points > 2);
if(bezier) {
double ds = xctx->cadhalfdotsize;
find_closest_bezier(mx, my, c, i, &l, &col);
for(j = 0; j < p->points; j++) {
if( POINTINSIDE(mx, my, p->x[j] - ds, p->y[j] - ds, p->x[j] + ds, p->y[j] + ds)) {
l = i; d = 0.0;col = c;
break;
}
}
d = find_closest_bezier(mx, my, d, c, i, &l, &col);
} else {
for(j=0; j<xctx->poly[c][i].points-1; ++j) {
x1 = p->x[j];
@ -145,9 +138,9 @@ static void find_closest_polygon(double mx, double my)
if( (tmp = dist(x1, y1, x2, y2, mx, my)) < d )
{
l = i; d = tmp;col = c;
dbg(1, "find_closest_polygon(): d=%.16g n=%d\n", d, i);
}
}
dbg(1, "find_closest_polygon(): d=%.16g n=%d\n", d, i);
}
} /* end for i */
} /* end for c */