aboutsummaryrefslogtreecommitdiffstats
path: root/packages/math/triangle.ts
diff options
context:
space:
mode:
authorkj_sh6042026-03-15 16:19:35 -0400
committerkj_sh6042026-03-15 16:19:35 -0400
commit6ec259a0e71174651bae95d4628138bf6fd68742 (patch)
tree5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/math/triangle.ts
parent16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff)
refactor: packages/
Diffstat (limited to 'packages/math/triangle.ts')
-rw-r--r--packages/math/triangle.ts28
1 files changed, 28 insertions, 0 deletions
diff --git a/packages/math/triangle.ts b/packages/math/triangle.ts
new file mode 100644
index 0000000..bc74372
--- /dev/null
+++ b/packages/math/triangle.ts
@@ -0,0 +1,28 @@
+import type { GlobalPoint, LocalPoint, Triangle } from "./types";
+
+// Types
+
+/**
+ * Tests if a point lies inside a triangle. This function
+ * will return FALSE if the point lies exactly on the sides
+ * of the triangle.
+ *
+ * @param triangle The triangle to test the point for
+ * @param p The point to test whether is in the triangle
+ * @returns TRUE if the point is inside of the triangle
+ */
+export function triangleIncludesPoint<P extends GlobalPoint | LocalPoint>(
+ [a, b, c]: Triangle<P>,
+ p: P,
+): boolean {
+ const triangleSign = (p1: P, p2: P, p3: P) =>
+ (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1]);
+ const d1 = triangleSign(p, a, b);
+ const d2 = triangleSign(p, b, c);
+ const d3 = triangleSign(p, c, a);
+
+ const has_neg = d1 < 0 || d2 < 0 || d3 < 0;
+ const has_pos = d1 > 0 || d2 > 0 || d3 > 0;
+
+ return !(has_neg && has_pos);
+}