1
0
mirror of git://projects.qi-hardware.com/cae-tools.git synced 2025-01-03 20:30:14 +02:00

Corrected math for offsets to work also for angles different from 90 degrees.

- cameo/path.c (offset_point): calculation assumed the normals were
  linearly independent. Replaced it with corrected version.
This commit is contained in:
Werner Almesberger 2010-11-01 16:42:32 -03:00
parent 54d8549fa2
commit 5c9e7d5e52

View File

@ -104,6 +104,7 @@ static struct point *offset_point(const struct point *a, const struct point *b,
double ax, ay, bx, by; double ax, ay, bx, by;
double aa, bb; double aa, bb;
double nx, ny; double nx, ny;
double angle, f;
struct point *p; struct point *p;
ax = b->x-a->x; ax = b->x-a->x;
@ -113,6 +114,7 @@ static struct point *offset_point(const struct point *a, const struct point *b,
aa = hypot(ax, ay); aa = hypot(ax, ay);
bb = hypot(bx, by); bb = hypot(bx, by);
if (left) { if (left) {
nx = -(ay/aa+by/bb); nx = -(ay/aa+by/bb);
ny = ax/aa+bx/bb; ny = ax/aa+bx/bb;
@ -121,8 +123,15 @@ static struct point *offset_point(const struct point *a, const struct point *b,
ny = -(ax/aa+bx/bb); ny = -(ax/aa+bx/bb);
} }
nx *= off; /* angle between AB and BC */
ny *= off; angle = acos(-(ax*bx+ay*by)/aa/bb);
/* multiplier for combination of normal vectors */
f = off/sin(angle/2);
f /= hypot(nx, ny);
nx *= f;
ny *= f;
p = alloc_type(struct point); p = alloc_type(struct point);
p->x = b->x+nx; p->x = b->x+nx;