class_name GeometryTools ## Utilities for specialized geometric operations. ## Transform cartesian coordinates to barycentric wrt the given triangle. static func barycentric(p: Vector3, a: Vector3, b: Vector3, c: Vector3) -> Vector3: var v0 := b - a var v1 := c - a var v2 := p - a var d00 := v0.dot(v0) var d01 := v0.dot(v1) var d11 := v1.dot(v1) var d20 := v2.dot(v0) var d21 := v2.dot(v1) var denom := d00 * d11 - d01 * d01 var v := (d11 * d20 - d01 * d21) / denom var w := (d00 * d21 - d01 * d20) / denom var u := 1.0 - v - w return Vector3(u, v, w) ## Is the given point on the planar triangle defined by v1, v2, and v3? static func is_in_triangle(point: Vector3, v1: Vector3, v2: Vector3, v3: Vector3) -> bool: var bc := barycentric(point, v1, v2, v3) return (bc.x > 0 and bc.x < 1) and (bc.y > 0 and bc.y < 1) and (bc.z > 0 and bc.z < 1)