@nebula.gl/layers
Version:
A suite of 3D-enabled data editing layers, suitable for deck.gl
65 lines (54 loc) • 5.98 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getClosestPointOnLine = getClosestPointOnLine;
exports.getClosestPointOnPolyline = getClosestPointOnPolyline;
var _math = require("math.gl");
// Return the closest point on a line segment
function getClosestPointOnLine(_ref) {
var p = _ref.p,
p1 = _ref.p1,
p2 = _ref.p2,
_ref$clampToLine = _ref.clampToLine,
clampToLine = _ref$clampToLine === void 0 ? true : _ref$clampToLine;
var lineVector = new _math.Vector3(p2).subtract(p1);
var pointVector = new _math.Vector3(p).subtract(p1);
var dotProduct = lineVector.dot(pointVector);
if (clampToLine) {
dotProduct = (0, _math.clamp)(dotProduct, 0, 1);
} // @ts-ignore
return lineVector.lerp(dotProduct);
} // Return the closest point on a line segment
function getClosestPointOnPolyline(_ref2) {
var p = _ref2.p,
points = _ref2.points;
p = new _math.Vector3(p);
var pClosest = null;
var distanceSquared = Infinity;
var index = -1;
for (var i = 0; i < points.length - 1; ++i) {
var p1 = points[i];
var p2 = points[i + 1];
var pClosestOnLine = getClosestPointOnLine({
p: p,
p1: p1,
p2: p2
});
var distanceToLineSquared = p.distanceSquared(pClosestOnLine);
if (distanceToLineSquared < distanceSquared) {
distanceSquared = distanceToLineSquared;
pClosest = pClosestOnLine;
index = i;
}
}
return {
point: pClosest,
index: index,
p1: points[index],
p2: points[index + 1],
distanceSquared: distanceSquared,
distance: Math.sqrt(distanceSquared)
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvcGF0aC1tYXJrZXItbGF5ZXIvcG9seWxpbmUudHMiXSwibmFtZXMiOlsiZ2V0Q2xvc2VzdFBvaW50T25MaW5lIiwicCIsInAxIiwicDIiLCJjbGFtcFRvTGluZSIsImxpbmVWZWN0b3IiLCJWZWN0b3IzIiwic3VidHJhY3QiLCJwb2ludFZlY3RvciIsImRvdFByb2R1Y3QiLCJkb3QiLCJsZXJwIiwiZ2V0Q2xvc2VzdFBvaW50T25Qb2x5bGluZSIsInBvaW50cyIsInBDbG9zZXN0IiwiZGlzdGFuY2VTcXVhcmVkIiwiSW5maW5pdHkiLCJpbmRleCIsImkiLCJsZW5ndGgiLCJwQ2xvc2VzdE9uTGluZSIsImRpc3RhbmNlVG9MaW5lU3F1YXJlZCIsInBvaW50IiwiZGlzdGFuY2UiLCJNYXRoIiwic3FydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7QUFFQTtBQUNPLFNBQVNBLHFCQUFULE9BQWtFO0FBQUEsTUFBakNDLENBQWlDLFFBQWpDQSxDQUFpQztBQUFBLE1BQTlCQyxFQUE4QixRQUE5QkEsRUFBOEI7QUFBQSxNQUExQkMsRUFBMEIsUUFBMUJBLEVBQTBCO0FBQUEsOEJBQXRCQyxXQUFzQjtBQUFBLE1BQXRCQSxXQUFzQixpQ0FBUixJQUFRO0FBQ3ZFLE1BQU1DLFVBQVUsR0FBRyxJQUFJQyxhQUFKLENBQVlILEVBQVosRUFBZ0JJLFFBQWhCLENBQXlCTCxFQUF6QixDQUFuQjtBQUNBLE1BQU1NLFdBQVcsR0FBRyxJQUFJRixhQUFKLENBQVlMLENBQVosRUFBZU0sUUFBZixDQUF3QkwsRUFBeEIsQ0FBcEI7QUFDQSxNQUFJTyxVQUFVLEdBQUdKLFVBQVUsQ0FBQ0ssR0FBWCxDQUFlRixXQUFmLENBQWpCOztBQUNBLE1BQUlKLFdBQUosRUFBaUI7QUFDZkssSUFBQUEsVUFBVSxHQUFHLGlCQUFNQSxVQUFOLEVBQWtCLENBQWxCLEVBQXFCLENBQXJCLENBQWI7QUFDRCxHQU5zRSxDQU92RTs7O0FBQ0EsU0FBT0osVUFBVSxDQUFDTSxJQUFYLENBQWdCRixVQUFoQixDQUFQO0FBQ0QsQyxDQUVEOzs7QUFDTyxTQUFTRyx5QkFBVCxRQUFrRDtBQUFBLE1BQWJYLENBQWEsU0FBYkEsQ0FBYTtBQUFBLE1BQVZZLE1BQVUsU0FBVkEsTUFBVTtBQUN2RFosRUFBQUEsQ0FBQyxHQUFHLElBQUlLLGFBQUosQ0FBWUwsQ0FBWixDQUFKO0FBQ0EsTUFBSWEsUUFBUSxHQUFHLElBQWY7QUFDQSxNQUFJQyxlQUFlLEdBQUdDLFFBQXRCO0FBQ0EsTUFBSUMsS0FBSyxHQUFHLENBQUMsQ0FBYjs7QUFDQSxPQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdMLE1BQU0sQ0FBQ00sTUFBUCxHQUFnQixDQUFwQyxFQUF1QyxFQUFFRCxDQUF6QyxFQUE0QztBQUMxQyxRQUFNaEIsRUFBRSxHQUFHVyxNQUFNLENBQUNLLENBQUQsQ0FBakI7QUFDQSxRQUFNZixFQUFFLEdBQUdVLE1BQU0sQ0FBQ0ssQ0FBQyxHQUFHLENBQUwsQ0FBakI7QUFDQSxRQUFNRSxjQUFjLEdBQUdwQixxQkFBcUIsQ0FBQztBQUFFQyxNQUFBQSxDQUFDLEVBQURBLENBQUY7QUFBS0MsTUFBQUEsRUFBRSxFQUFGQSxFQUFMO0FBQVNDLE1BQUFBLEVBQUUsRUFBRkE7QUFBVCxLQUFELENBQTVDO0FBQ0EsUUFBTWtCLHFCQUFxQixHQUFHcEIsQ0FBQyxDQUFDYyxlQUFGLENBQWtCSyxjQUFsQixDQUE5Qjs7QUFDQSxRQUFJQyxxQkFBcUIsR0FBR04sZUFBNUIsRUFBNkM7QUFDM0NBLE1BQUFBLGVBQWUsR0FBR00scUJBQWxCO0FBQ0FQLE1BQUFBLFFBQVEsR0FBR00sY0FBWDtBQUNBSCxNQUFBQSxLQUFLLEdBQUdDLENBQVI7QUFDRDtBQUNGOztBQUNELFNBQU87QUFDTEksSUFBQUEsS0FBSyxFQUFFUixRQURGO0FBRUxHLElBQUFBLEtBQUssRUFBTEEsS0FGSztBQUdMZixJQUFBQSxFQUFFLEVBQUVXLE1BQU0sQ0FBQ0ksS0FBRCxDQUhMO0FBSUxkLElBQUFBLEVBQUUsRUFBRVUsTUFBTSxDQUFDSSxLQUFLLEdBQUcsQ0FBVCxDQUpMO0FBS0xGLElBQUFBLGVBQWUsRUFBZkEsZUFMSztBQU1MUSxJQUFBQSxRQUFRLEVBQUVDLElBQUksQ0FBQ0MsSUFBTCxDQUFVVixlQUFWO0FBTkwsR0FBUDtBQVFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmVjdG9yMywgY2xhbXAgfSBmcm9tICdtYXRoLmdsJztcblxuLy8gUmV0dXJuIHRoZSBjbG9zZXN0IHBvaW50IG9uIGEgbGluZSBzZWdtZW50XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xvc2VzdFBvaW50T25MaW5lKHsgcCwgcDEsIHAyLCBjbGFtcFRvTGluZSA9IHRydWUgfSkge1xuICBjb25zdCBsaW5lVmVjdG9yID0gbmV3IFZlY3RvcjMocDIpLnN1YnRyYWN0KHAxKTtcbiAgY29uc3QgcG9pbnRWZWN0b3IgPSBuZXcgVmVjdG9yMyhwKS5zdWJ0cmFjdChwMSk7XG4gIGxldCBkb3RQcm9kdWN0ID0gbGluZVZlY3Rvci5kb3QocG9pbnRWZWN0b3IpO1xuICBpZiAoY2xhbXBUb0xpbmUpIHtcbiAgICBkb3RQcm9kdWN0ID0gY2xhbXAoZG90UHJvZHVjdCwgMCwgMSk7XG4gIH1cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gbGluZVZlY3Rvci5sZXJwKGRvdFByb2R1Y3QpO1xufVxuXG4vLyBSZXR1cm4gdGhlIGNsb3Nlc3QgcG9pbnQgb24gYSBsaW5lIHNlZ21lbnRcbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG9zZXN0UG9pbnRPblBvbHlsaW5lKHsgcCwgcG9pbnRzIH0pIHtcbiAgcCA9IG5ldyBWZWN0b3IzKHApO1xuICBsZXQgcENsb3Nlc3QgPSBudWxsO1xuICBsZXQgZGlzdGFuY2VTcXVhcmVkID0gSW5maW5pdHk7XG4gIGxldCBpbmRleCA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICBjb25zdCBwMSA9IHBvaW50c1tpXTtcbiAgICBjb25zdCBwMiA9IHBvaW50c1tpICsgMV07XG4gICAgY29uc3QgcENsb3Nlc3RPbkxpbmUgPSBnZXRDbG9zZXN0UG9pbnRPbkxpbmUoeyBwLCBwMSwgcDIgfSk7XG4gICAgY29uc3QgZGlzdGFuY2VUb0xpbmVTcXVhcmVkID0gcC5kaXN0YW5jZVNxdWFyZWQocENsb3Nlc3RPbkxpbmUpO1xuICAgIGlmIChkaXN0YW5jZVRvTGluZVNxdWFyZWQgPCBkaXN0YW5jZVNxdWFyZWQpIHtcbiAgICAgIGRpc3RhbmNlU3F1YXJlZCA9IGRpc3RhbmNlVG9MaW5lU3F1YXJlZDtcbiAgICAgIHBDbG9zZXN0ID0gcENsb3Nlc3RPbkxpbmU7XG4gICAgICBpbmRleCA9IGk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgcG9pbnQ6IHBDbG9zZXN0LFxuICAgIGluZGV4LFxuICAgIHAxOiBwb2ludHNbaW5kZXhdLFxuICAgIHAyOiBwb2ludHNbaW5kZXggKyAxXSxcbiAgICBkaXN0YW5jZVNxdWFyZWQsXG4gICAgZGlzdGFuY2U6IE1hdGguc3FydChkaXN0YW5jZVNxdWFyZWQpLFxuICB9O1xufVxuIl19
;