@threeify/math
Version:
Computer graphics oriented, High performance, tree-shakeable, TypeScript 3D vector math library.
88 lines (76 loc) • 2.51 kB
text/typescript
import { delta } from './Functions.js';
import { Plane } from './Plane.js';
import { Sphere } from './Sphere.js';
import { Triangle3 } from './Triangle3.js';
import {
crossFromCoplanarPoints as vec3CrossFromCoplanarPoints,
vec3Add,
vec3Delta,
vec3Dot,
vec3Equals,
vec3Length,
vec3MultiplyByScalar,
vec3Negate,
vec3Normalize
} from './Vec3.Functions.js';
import { Vec3 } from './Vec3.js';
export function planeDelta(a: Plane, b: Plane): number {
return vec3Delta(a.normal, b.normal) + delta(a.distance, b.distance);
}
export function planeNormalize(p: Plane, result = new Plane()): Plane {
// Note: will lead to a divide by zero if the plane is invalid.
const inverseNormalLength = 1 / vec3Length(p.normal);
vec3MultiplyByScalar(p.normal, inverseNormalLength, result.normal);
result.distance = p.distance * inverseNormalLength;
return result;
}
export function planeInvert(p: Plane, result = new Plane()): Plane {
result.distance = p.distance * -1;
vec3Negate(p.normal, result.normal);
return result;
}
export function planeEquals(a: Plane, b: Plane): boolean {
return vec3Equals(a.normal, b.normal) && a.distance === b.distance;
}
export function coplanarPointsToPlane(
a: Vec3,
b: Vec3,
c: Vec3,
result = new Plane()
): Plane {
vec3CrossFromCoplanarPoints(a, b, c, result.normal);
vec3Normalize(result.normal, result.normal);
return normalAndCoplanarPointToPlane(result.normal, a, result);
}
export function triangleToPlane(t: Triangle3, result = new Plane()): Plane {
return coplanarPointsToPlane(t.a, t.b, t.c, result);
}
export function normalAndCoplanarPointToPlane(
normal: Vec3,
point: Vec3,
result: Plane = new Plane()
): Plane {
normal.clone(result.normal);
result.distance = vec3Dot(point, normal);
return result;
}
export function planePointDistance(plane: Plane, point: Vec3): number {
return vec3Dot(plane.normal, point) - plane.distance;
}
// TODO: organize the function naming always in alphabetical if equivalent
export function planeSphereDistance(plane: Plane, sphere: Sphere): number {
return planePointDistance(plane, sphere.center) - sphere.radius;
}
export function planeProjectPointOnPlane(
plane: Plane,
point: Vec3,
result: Vec3 = new Vec3()
): Vec3 {
// TODO: Determine if this is even correct
const v = point.clone();
plane.normal.clone(result);
const delta = -planePointDistance(plane, v);
vec3MultiplyByScalar(result, delta, result);
vec3Add(v, result, result);
return result;
}