diff options
Diffstat (limited to 'geometry.c')
| -rw-r--r-- | geometry.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/geometry.c b/geometry.c new file mode 100644 index 0000000..f2961c7 --- /dev/null +++ b/geometry.c | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | #include "geometry.h" | ||
| 2 | |||
| 3 | // dist is a fixed point with precission of 8 bits | ||
| 4 | // offs is where on the line segment xy0-xy1 the point's normale hits, | ||
| 5 | // range 0..65536 (but can extend, if normale hits line outside line segment) | ||
| 6 | static inline int | ||
| 7 | impl_dist_pl(int xp, int yp, int x0, int y0, int x1, int y1, int *offs) | ||
| 8 | { | ||
| 9 | double r = (y1 - y0) * (y1 - y0) + (x1 - x0) * (x1 - x0); | ||
| 10 | double q1 = (xp - x0) * (y1 - y0) - (yp - y0) * (x1 - x0); | ||
| 11 | double q2 = (x1 - x0) * (xp - x0) + (y1 - y0) * (yp - y0); | ||
| 12 | |||
| 13 | *offs = (int)((q2 *65336.0f) / r); | ||
| 14 | return (int)( q1 * q1 * ((double)(y0 - y1) * (double)(y0 - y1) + (double)(x1 - x0) * (double)(x1 - x0)) * 256.0f / (r * r)); | ||
| 15 | } | ||
| 16 | |||
| 17 | int | ||
| 18 | dist_pl(LPoint const * p, LLine const * l, int *offs) | ||
| 19 | { | ||
| 20 | return impl_dist_pl(p->x, p->y, l->p0.x, l->p0.y, l->p1.x, l->p1.y, offs); | ||
| 21 | } | ||
| 22 | |||
| 23 | static inline int | ||
| 24 | impl_dist_pp(int x0, int y0, int x1, int y1 ) { | ||
| 25 | return (y0-y1)*(y0-y1)+(x0-x1)*(x0-x1); | ||
| 26 | } | ||
| 27 | |||
| 28 | int | ||
| 29 | dist_pp(LPoint const * p0, LPoint const * p1) { | ||
| 30 | return impl_dist_pp(p0->x,p0->y,p1->x,p1->y); | ||
| 31 | } | ||
