shithub: nanobsp

Download patch

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);
 }
 
 
--