@valeera/mathx
Version:
A math library written in TS.
56 lines (44 loc) • 1.49 kB
text/typescript
import { clamp } from "../common";
import { Vector3, Vector3Like } from "../vector";
const vec1 = new Float32Array(3);
const vec2 = new Float32Array(3);
export class Line3 {
a: Vector3 = new Vector3();
b: Vector3 = new Vector3();
static distancePointToLineSegment(p: Vector3Like, line: Line3): number {
return Math.sqrt(Line3.distancePointToLineSegmentSquared(p, line));
}
static distancePointToLineSegmentSquared(p: Vector3Like, line: Line3): number {
const a = line.a;
const b = line.b;
let l2 = Vector3.distanceToSquared(a, b);
if (l2 === 0) {
return Vector3.distanceToSquared(p, b);
}
Vector3.minus(p, a, vec1);
Vector3.minus(b, a, vec2);
let t = Vector3.dot(vec1, vec2) / l2;
t = clamp(t, 0, 1);
Vector3.multiplyScalar(vec2, t, vec2);
Vector3.add(a, vec2, vec1);
return Vector3.distanceToSquared(a, vec1);
}
static segmentLength(line: Line3): number {
return Vector3.distanceTo(line.a, line.b);
}
static segmentLengthSquared(line: Line3): number {
return Vector3.distanceToSquared(line.a, line.b);
}
static fromPointAndDirection(p: Vector3, direction: Vector3, out: Line3 = new Line3()): Line3 {
out.a.set(p);
Vector3.add(out.a, direction, out.b);
return out;
}
constructor(a: Vector3Like = Vector3.VECTOR3_ZERO, b: Vector3Like = Vector3.VECTOR3_RIGHT) {
this.a.set(a);
this.b.set(b);
}
fromPointAndDirection(p: Vector3, direction: Vector3): this {
return Line3.fromPointAndDirection(p, direction, this) as this;
}
}