ref: 210c1a12d99069e6b8a3442c42b1d08d13742339
parent: 27c69fd7f524572d195bb09613931cffecff56f0
author: Andrew Apted <ajapted@gmail.com>
date: Sat Dec 9 07:42:41 EST 2023
finished implementation of BSP_ComputeIntersection().
--- a/nano_bsp.c
+++ b/nano_bsp.c
@@ -433,24 +433,44 @@
return;
}
- // TODO
-/*
- double perp1 = PerpDist (E->x1, E->y1, part->x1, part->y1, part->x2, part->y2);
- double perp2 = PerpDist (E->x2, E->y2, part->x1, part->y1, part->x2, part->y2);
+ fixed_t dx = part->v2->x - part->v1->x;
+ fixed_t dy = part->v2->y - part->v1->y;
- // 0 = start, 1 = end
- double ds = perp1 / (perp1 - perp2);
+ // compute seg coords relative to partition start
+ fixed_t x1 = seg->v1->x - part->v1->x;
+ fixed_t y1 = seg->v1->y - part->v1->y;
- if (E->x1 == E->x2)
- *x = E->x1;
+ fixed_t x2 = seg->v2->x - part->v2->x;
+ fixed_t y2 = seg->v2->y - part->v2->y;
+
+ fixed_t a, b;
+
+ if (abs (dx) >= abs(dy))
+ {+ fixed_t slope = FixedDiv (dy, dx);
+
+ a = abs (y1 - FixedMul (x1, slope));
+ b = abs (y2 - FixedMul (x2, slope));
+ }
else
- *x = E->x1 + (E->x2 - E->x1) * ds;
+ {+ fixed_t slope = FixedDiv (dx, dy);
- if (E->y1 == E->y2)
- *y = E->y1;
+ a = abs (x1 - FixedMul (y1, slope));
+ b = abs (x2 - FixedMul (y2, slope));
+ }
+
+ fixed_t along = FixedDiv (a, a + b);
+
+ if (seg->v1->x == seg->v2->x)
+ *x = seg->v1->x;
else
- *y = E->y1 + (E->y2 - E->y1) * ds;
-*/
+ *x = seg->v1->x + FixedMul (seg->v2->x - seg->v1->x, along);
+
+ if (seg->v1->y == seg->v2->y)
+ *y = seg->v1->y;
+ else
+ *y = seg->v1->y + FixedMul (seg->v2->y - seg->v1->y, along);
}
--
⑨