# Binary Space Partitioning (BSP) for Point-in-triangle test
## What's BSP
- Binary Space Partitioning (BSP) is a **space subdivision technique** used in computer graphics, collision detection, and geometric computations. It recursively divides a space into two parts (hence "binary") using hyperplanes (like lines in 2D or planes in 3D).
## How BSP works for point-in-triangle test
- Given a triangle with vertices A, B, C and a point P, we can use BSP-like logic to determine if P is inside the triangle
- **Method: Cross product**
- Compute vectors from each edge to the point:
- AB -> AP
- BC -> BP
- CA -> CP
- Calculate cross product
- If all cross product have the same sign, the point is inside
- If any cross product is zero, the point is on the edge
- If signs differ, the point is outside
- **Math formulation**
- For edge AB and point P, the cross product is
$$(Bx - Ax)(Py - Ay) - (By - Ay)(Px - Ax)$$
- Positive: P is on one side
- Negative: P is on the other side
- Zero: P is on the line
- Pseudo implementation
```c++
bool bsp(Point A, Point B, Point C, Point P) {
float d1 = (B.x - A.x) * (P.y - A.y) - (B.y - A.y) * (P.x - A.x);
float d2 = (C.x - B.x) * (P.y - B.y) - (C.y - B.y) * (P.x - B.x);
float d3 = (A.x - C.x) * (P.y - C.y) - (A.y - C.y) * (P.x - C.x);
bool has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0);
bool has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0);
bool has_zero = (d1 == 0) || (d2 == 0) || (d3 == 0);
if (has_zero)
return (false);
return !(has_neg && has_pos); // Inside if all same sign
}
```