UNPKG

pocket-physics

Version:

Verlet physics extracted from pocket-ces demos

45 lines (44 loc) 1.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.projectPointEdge = exports.createPointEdgeProjectionResult = void 0; const v2_1 = require("./v2"); /** * Create a pre-made result object for tests. */ function createPointEdgeProjectionResult() { return { distance: Number.MIN_SAFE_INTEGER, similarity: 0, u: Number.MIN_SAFE_INTEGER, projectedPoint: (0, v2_1.v2)(), edgeNormal: (0, v2_1.v2)(), }; } exports.createPointEdgeProjectionResult = createPointEdgeProjectionResult; const edgeDelta = (0, v2_1.v2)(); const perp = (0, v2_1.v2)(); function projectPointEdge(point, endpoint1, endpoint2, result) { (0, v2_1.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 = (0, v2_1.set)(result.projectedPoint, endpoint1.x + u * edgeDelta.x, endpoint1.y + u * edgeDelta.y); result.distance = (0, v2_1.distance)(proj, point); // given: // E1----------------------E2 Proj // | | // | EdgeNorm | perp // | Point // // What is the similarity (dot product) between EdgeNorm and Perp? const edgeNorm = (0, v2_1.normal)(result.edgeNormal, endpoint1, endpoint2); (0, v2_1.sub)(perp, point, proj); result.similarity = (0, v2_1.dot)(edgeNorm, perp); } exports.projectPointEdge = projectPointEdge;