UNPKG

pocket-physics

Version:

Verlet physics extracted from pocket-ces demos

40 lines (39 loc) 1.49 kB
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); }