pocket-physics
Version:
Verlet physics extracted from pocket-ces demos
40 lines (39 loc) • 1.49 kB
JavaScript
import { distance, dot, normal, set, sub, v2 } from "./v2";
/**
* Create a pre-made result object for tests.
*/
export function createPointEdgeProjectionResult() {
return {
distance: Number.MIN_SAFE_INTEGER,
similarity: 0,
u: Number.MIN_SAFE_INTEGER,
projectedPoint: v2(),
edgeNormal: v2(),
};
}
const edgeDelta = v2();
const perp = v2();
export function projectPointEdge(point, endpoint1, endpoint2, result) {
sub(edgeDelta, endpoint2, endpoint1);
if (edgeDelta.x === 0 && edgeDelta.y === 0) {
throw new Error("ZeroLengthEdge");
}
// http://paulbourke.net/geometry/pointlineplane/
// http://paulbourke.net/geometry/pointlineplane/DistancePoint.java
const u = ((point.x - endpoint1.x) * edgeDelta.x +
(point.y - endpoint1.y) * edgeDelta.y) /
(edgeDelta.x * edgeDelta.x + edgeDelta.y * edgeDelta.y);
result.u = u;
const proj = set(result.projectedPoint, endpoint1.x + u * edgeDelta.x, endpoint1.y + u * edgeDelta.y);
result.distance = distance(proj, point);
// given:
// E1----------------------E2 Proj
// | |
// | EdgeNorm | perp
// | Point
//
// What is the similarity (dot product) between EdgeNorm and Perp?
const edgeNorm = normal(result.edgeNormal, endpoint1, endpoint2);
sub(perp, point, proj);
result.similarity = dot(edgeNorm, perp);
}