@deck.gl/experimental-layers
Version:
Experimental layers for deck.gl
54 lines (47 loc) • 1.43 kB
JavaScript
import { Vector3, clamp } from 'math.gl'; // Return the closest point on a line segment
export function getClosestPointOnLine(_ref) {
let p = _ref.p,
p1 = _ref.p1,
p2 = _ref.p2,
_ref$clampToLine = _ref.clampToLine,
clampToLine = _ref$clampToLine === void 0 ? true : _ref$clampToLine;
const lineVector = new Vector3(p2).subtract(p1);
const pointVector = new Vector3(p).subtract(p1);
let dotProduct = lineVector.dot(pointVector);
if (clampToLine) {
dotProduct = clamp(dotProduct, 0, 1);
}
return lineVector.lerp(dotProduct);
} // Return the closest point on a line segment
export function getClosestPointOnPolyline(_ref2) {
let p = _ref2.p,
points = _ref2.points;
p = new Vector3(p);
let pClosest = null;
let distanceSquared = Infinity;
let index = -1;
for (let i = 0; i < points.length - 1; ++i) {
const p1 = points[i];
const p2 = points[i + 1];
const pClosestOnLine = getClosestPointOnLine({
p,
p1,
p2
});
const distanceToLineSquared = p.distanceSquared(pClosestOnLine);
if (distanceToLineSquared < distanceSquared) {
distanceSquared = distanceToLineSquared;
pClosest = pClosestOnLine;
index = i;
}
}
return {
point: pClosest,
index,
p1: points[index],
p2: points[index + 1],
distanceSquared,
distance: Math.sqrt(distanceSquared)
};
}
//# sourceMappingURL=polyline.js.map