@nebula.gl/layers
Version:
A suite of 3D-enabled data editing layers, suitable for deck.gl
80 lines (58 loc) • 9.32 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.generateCurveFromControlPoints = generateCurveFromControlPoints;
var _cubicHermiteSpline = _interopRequireDefault(require("cubic-hermite-spline"));
var _distance = _interopRequireDefault(require("@turf/distance"));
var _helpers = require("@turf/helpers");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var INTERPOLATION_INTERVAL = 0.005;
var INTERPOLATION_THRESHOLD = 0.001;
function calculateSingleTangent(p0, p1, d) {
var x = (p1[0] - p0[0]) / d;
var y = (p1[1] - p0[1]) / d;
return [x, y];
}
function generateCurveFromControlPoints(line) {
// calculate knots
var knots = [0];
var prev = null;
var totalDistance = 0;
var coords = line.geometry.coordinates;
for (var i = 0; i < coords.length; i++) {
var cur = coords[i];
if (prev !== null) {
totalDistance += (0, _distance["default"])(prev, cur);
knots.push(totalDistance);
}
prev = cur;
} // calculate tangents
var tangents = []; // first tangent
// @ts-ignore
tangents.push(calculateSingleTangent(coords[0], coords[1], knots[1] - knots[0])); // second to before last
for (var _i = 1; _i < coords.length - 1; _i++) {
// @ts-ignore
var A = calculateSingleTangent(coords[_i], coords[_i + 1], knots[_i + 1] - knots[_i]); // @ts-ignore
var B = calculateSingleTangent(coords[_i - 1], coords[_i], knots[_i] - knots[_i - 1]);
var x = (A[0] + B[0]) / 2.0;
var y = (A[1] + B[1]) / 2.0;
tangents.push([x, y]);
} // last tangent
var last = coords.length - 1;
tangents.push( // @ts-ignore
calculateSingleTangent(coords[last - 1], coords[last], knots[last] - knots[last - 1])); // generate curve
var result = [];
for (var _i2 = 0; _i2 < coords.length; _i2++) {
// add control point
result.push(coords[_i2]); // add interpolated values
for (var t = knots[_i2] + INTERPOLATION_INTERVAL; t < knots[_i2 + 1]; t += INTERPOLATION_INTERVAL) {
if (knots[_i2 + 1] - t > INTERPOLATION_THRESHOLD) {
// Only add if not too close to a control point (knot = control point)
result.push((0, _cubicHermiteSpline["default"])(t, coords, tangents, knots));
}
}
}
return (0, _helpers.lineString)(result);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jdXJ2ZS11dGlscy50cyJdLCJuYW1lcyI6WyJJTlRFUlBPTEFUSU9OX0lOVEVSVkFMIiwiSU5URVJQT0xBVElPTl9USFJFU0hPTEQiLCJjYWxjdWxhdGVTaW5nbGVUYW5nZW50IiwicDAiLCJwMSIsImQiLCJ4IiwieSIsImdlbmVyYXRlQ3VydmVGcm9tQ29udHJvbFBvaW50cyIsImxpbmUiLCJrbm90cyIsInByZXYiLCJ0b3RhbERpc3RhbmNlIiwiY29vcmRzIiwiZ2VvbWV0cnkiLCJjb29yZGluYXRlcyIsImkiLCJsZW5ndGgiLCJjdXIiLCJwdXNoIiwidGFuZ2VudHMiLCJBIiwiQiIsImxhc3QiLCJyZXN1bHQiLCJ0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFJQSxJQUFNQSxzQkFBc0IsR0FBRyxLQUEvQjtBQUNBLElBQU1DLHVCQUF1QixHQUFHLEtBQWhDOztBQUVBLFNBQVNDLHNCQUFULENBQWdDQyxFQUFoQyxFQUFzREMsRUFBdEQsRUFBNEVDLENBQTVFLEVBQWlHO0FBQy9GLE1BQU1DLENBQUMsR0FBRyxDQUFDRixFQUFFLENBQUMsQ0FBRCxDQUFGLEdBQVFELEVBQUUsQ0FBQyxDQUFELENBQVgsSUFBa0JFLENBQTVCO0FBQ0EsTUFBTUUsQ0FBQyxHQUFHLENBQUNILEVBQUUsQ0FBQyxDQUFELENBQUYsR0FBUUQsRUFBRSxDQUFDLENBQUQsQ0FBWCxJQUFrQkUsQ0FBNUI7QUFDQSxTQUFPLENBQUNDLENBQUQsRUFBSUMsQ0FBSixDQUFQO0FBQ0Q7O0FBRU0sU0FBU0MsOEJBQVQsQ0FDTEMsSUFESyxFQUVnQjtBQUNyQjtBQUNBLE1BQU1DLEtBQUssR0FBRyxDQUFDLENBQUQsQ0FBZDtBQUNBLE1BQUlDLElBQUksR0FBRyxJQUFYO0FBQ0EsTUFBSUMsYUFBYSxHQUFHLENBQXBCO0FBSnFCLE1BTUFDLE1BTkEsR0FNV0osSUFBSSxDQUFDSyxRQU5oQixDQU1iQyxXQU5hOztBQVFyQixPQUFLLElBQUlD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SXpCLHNCQUF2RSxFQUErRjtBQUM3RixVQUFJVSxLQUFLLENBQUNNLEdBQUMsR0FBRyxDQUFMLENBQUwsR0FBZVMsQ0FBZixHQUFtQnhCLHVCQUF2QixFQUFnRDtBQUM5QztBQUNBdUIsUUFBQUEsTUFBTSxDQUFDTCxJQUFQLENBQVksb0NBQVFNLENBQVIsRUFBV1osTUFBWCxFQUFtQk8sUUFBbkIsRUFBNkJWLEtBQTdCLENBQVo7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsU0FBTyx5QkFBV2MsTUFBWCxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaGVybWl0ZSBmcm9tICdjdWJpYy1oZXJtaXRlLXNwbGluZSc7XG5pbXBvcnQgdHVyZkRpc3RhbmNlIGZyb20gJ0B0dXJmL2Rpc3RhbmNlJztcbmltcG9ydCB7IGxpbmVTdHJpbmcgfSBmcm9tICdAdHVyZi9oZWxwZXJzJztcblxuaW1wb3J0IHsgRmVhdHVyZSwgTXVsdGlMaW5lU3RyaW5nLCBMaW5lU3RyaW5nIH0gZnJvbSAnZ2VvanNvbic7XG5cbmNvbnN0IElOVEVSUE9MQVRJT05fSU5URVJWQUwgPSAwLjAwNTtcbmNvbnN0IElOVEVSUE9MQVRJT05fVEhSRVNIT0xEID0gMC4wMDE7XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVNpbmdsZVRhbmdlbnQocDA6IFtudW1iZXIsIG51bWJlcl0sIHAxOiBbbnVtYmVyLCBudW1iZXJdLCBkOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHggPSAocDFbMF0gLSBwMFswXSkgLyBkO1xuICBjb25zdCB5ID0gKHAxWzFdIC0gcDBbMV0pIC8gZDtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ3VydmVGcm9tQ29udHJvbFBvaW50cyhcbiAgbGluZTogRmVhdHVyZTxNdWx0aUxpbmVTdHJpbmc+XG4pOiBGZWF0dXJlPExpbmVTdHJpbmc+IHtcbiAgLy8gY2FsY3VsYXRlIGtub3RzXG4gIGNvbnN0IGtub3RzID0gWzBdO1xuICBsZXQgcHJldiA9IG51bGw7XG4gIGxldCB0b3RhbERpc3RhbmNlID0gMDtcblxuICBjb25zdCB7IGNvb3JkaW5hdGVzOiBjb29yZHMgfSA9IGxpbmUuZ2VvbWV0cnk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXIgPSBjb29yZHNbaV07XG4gICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgIHRvdGFsRGlzdGFuY2UgKz0gdHVyZkRpc3RhbmNlKHByZXYsIGN1cik7XG4gICAgICBrbm90cy5wdXNoKHRvdGFsRGlzdGFuY2UpO1xuICAgIH1cbiAgICBwcmV2ID0gY3VyO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlIHRhbmdlbnRzXG4gIGNvbnN0IHRhbmdlbnRzID0gW107XG5cbiAgLy8gZmlyc3QgdGFuZ2VudFxuICAvLyBAdHMtaWdub3JlXG4gIHRhbmdlbnRzLnB1c2goY2FsY3VsYXRlU2luZ2xlVGFuZ2VudChjb29yZHNbMF0sIGNvb3Jkc1sxXSwga25vdHNbMV0gLSBrbm90c1swXSkpO1xuXG4gIC8vIHNlY29uZCB0byBiZWZvcmUgbGFzdFxuICBmb3IgKGxldCBpID0gMTsgaSA8IGNvb3Jkcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgQSA9IGNhbGN1bGF0ZVNpbmdsZVRhbmdlbnQoY29vcmRzW2ldLCBjb29yZHNbaSArIDFdLCBrbm90c1tpICsgMV0gLSBrbm90c1tpXSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IEIgPSBjYWxjdWxhdGVTaW5nbGVUYW5nZW50KGNvb3Jkc1tpIC0gMV0sIGNvb3Jkc1tpXSwga25vdHNbaV0gLSBrbm90c1tpIC0gMV0pO1xuICAgIGNvbnN0IHggPSAoQVswXSArIEJbMF0pIC8gMi4wO1xuICAgIGNvbnN0IHkgPSAoQVsxXSArIEJbMV0pIC8gMi4wO1xuICAgIHRhbmdlbnRzLnB1c2goW3gsIHldKTtcbiAgfVxuXG4gIC8vIGxhc3QgdGFuZ2VudFxuICBjb25zdCBsYXN0ID0gY29vcmRzLmxlbmd0aCAtIDE7XG4gIHRhbmdlbnRzLnB1c2goXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNhbGN1bGF0ZVNpbmdsZVRhbmdlbnQoY29vcmRzW2xhc3QgLSAxXSwgY29vcmRzW2xhc3RdLCBrbm90c1tsYXN0XSAtIGtub3RzW2xhc3QgLSAxXSlcbiAgKTtcblxuICAvLyBnZW5lcmF0ZSBjdXJ2ZVxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBhZGQgY29udHJvbCBwb2ludFxuICAgIHJlc3VsdC5wdXNoKGNvb3Jkc1tpXSk7XG5cbiAgICAvLyBhZGQgaW50ZXJwb2xhdGVkIHZhbHVlc1xuICAgIGZvciAobGV0IHQgPSBrbm90c1tpXSArIElOVEVSUE9MQVRJT05fSU5URVJWQUw7IHQgPCBrbm90c1tpICsgMV07IHQgKz0gSU5URVJQT0xBVElPTl9JTlRFUlZBTCkge1xuICAgICAgaWYgKGtub3RzW2kgKyAxXSAtIHQgPiBJTlRFUlBPTEFUSU9OX1RIUkVTSE9MRCkge1xuICAgICAgICAvLyBPbmx5IGFkZCBpZiBub3QgdG9vIGNsb3NlIHRvIGEgY29udHJvbCBwb2ludCAoa25vdCA9IGNvbnRyb2wgcG9pbnQpXG4gICAgICAgIHJlc3VsdC5wdXNoKGhlcm1pdGUodCwgY29vcmRzLCB0YW5nZW50cywga25vdHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGluZVN0cmluZyhyZXN1bHQpO1xufVxuIl19