mirror of
git://projects.qi-hardware.com/cae-tools.git
synced 2024-12-22 23:51:08 +02:00
cameo/area (hit_segment): only consider vectors pointing in the right direction
This way we avoid false positives, such as exit points while looking for an entry.
This commit is contained in:
parent
5a599e14f6
commit
b607816f95
16
cameo/area.c
16
cameo/area.c
@ -10,6 +10,11 @@
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
/*
|
||||
* We use the following requirement to simplify toolpath generation: the
|
||||
* outlines must be designed such that the tool can pass along all the
|
||||
* outlines without cutting into anything it's not supposed to.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
@ -145,7 +150,8 @@ static int touch(double ax, double ay, double bx, double by,
|
||||
|
||||
|
||||
static int hit_segment(double fx, double fy, double tx, double ty,
|
||||
const struct point *a, const struct point *b, double r, double *n)
|
||||
const struct point *a, const struct point *b, double r, int enter,
|
||||
double *n)
|
||||
{
|
||||
double dx, dy, d;
|
||||
double px, py;
|
||||
@ -158,6 +164,12 @@ printf(" seg (%g,%g)+(%g,%g) -> (%g,%g)-(%g,%g)\n",
|
||||
|
||||
dx = b->x-a->x;
|
||||
dy = b->y-a->y;
|
||||
|
||||
if (enter && dy < 0)
|
||||
return 0;
|
||||
if (!enter && dy > 0)
|
||||
return 0;
|
||||
|
||||
d = hypot(dx, dy);
|
||||
|
||||
px = a->x-dy/d*r;
|
||||
@ -194,7 +206,7 @@ static int hit_path(double fx, double fy, double tx, double ty,
|
||||
left = !left;
|
||||
for (p = path->first; p != path->last; p = p->next) {
|
||||
if (hit_segment(fx, fy, tx, ty,
|
||||
left ? p : p->next, left ? p->next : p, r, &tmp)) {
|
||||
left ? p : p->next, left ? p->next : p, r, enter, &tmp)) {
|
||||
if (!found || nx > tmp)
|
||||
nx = tmp;
|
||||
found = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user