@deck.gl/experimental-layers
Version:
Experimental layers for deck.gl
168 lines (147 loc) • 4.85 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createPathMarkers;
var _math = require("math.gl");
function getLineLength(vPoints) {
// calculate total length
var lineLength = 0;
for (var i = 0; i < vPoints.length - 1; i++) {
lineLength += vPoints[i].distance(vPoints[i + 1]);
}
return lineLength;
}
var DEFAULT_COLOR = [0, 0, 0, 255];
var DEFAULT_DIRECTION = {
forward: true,
backward: false
};
function createPathMarkers(_ref) {
var data = _ref.data,
_ref$getPath = _ref.getPath,
getPath = _ref$getPath === void 0 ? function (x) {
return x.path;
} : _ref$getPath,
_ref$getDirection = _ref.getDirection,
getDirection = _ref$getDirection === void 0 ? function (x) {
return x.direction;
} : _ref$getDirection,
_ref$getColor = _ref.getColor,
getColor = _ref$getColor === void 0 ? function (x) {
return DEFAULT_COLOR;
} : _ref$getColor,
_ref$getMarkerPercent = _ref.getMarkerPercentages,
getMarkerPercentages = _ref$getMarkerPercent === void 0 ? function (x) {
return [0.5];
} : _ref$getMarkerPercent,
projectFlat = _ref.projectFlat;
var markers = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var object = _step.value;
var path = getPath(object);
var direction = getDirection(object) || DEFAULT_DIRECTION;
var color = getColor(object);
var vPoints = path.map(function (p) {
return new _math.Vector2(p);
});
var vPointsReverse = vPoints.slice(0).reverse(); // calculate total length
var lineLength = getLineLength(vPoints); // Ask for where to put markers
var percentages = getMarkerPercentages(object, {
lineLength: lineLength
}); // Create the markers
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = percentages[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var percentage = _step2.value;
if (direction.forward) {
var marker = createMarkerAlongPath({
path: vPoints,
percentage: percentage,
lineLength: lineLength,
color: color,
object: object,
projectFlat: projectFlat
});
markers.push(marker);
}
if (direction.backward) {
var _marker = createMarkerAlongPath({
path: vPointsReverse,
percentage: percentage,
lineLength: lineLength,
color: color,
object: object,
projectFlat: projectFlat
});
markers.push(_marker);
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return markers;
}
function createMarkerAlongPath(_ref2) {
var path = _ref2.path,
percentage = _ref2.percentage,
lineLength = _ref2.lineLength,
color = _ref2.color,
object = _ref2.object,
projectFlat = _ref2.projectFlat;
var distanceAlong = lineLength * percentage;
var currentDistance = 0;
var previousDistance = 0;
var i = 0;
for (i = 0; i < path.length - 1; i++) {
currentDistance += path[i].distance(path[i + 1]);
if (currentDistance > distanceAlong) {
break;
}
previousDistance = currentDistance;
}
var vDirection = path[i + 1].clone().subtract(path[i]).normalize();
var along = distanceAlong - previousDistance;
var vCenter = vDirection.clone().multiply(new _math.Vector2(along, along)).add(path[i]);
var vDirection2 = new _math.Vector2(projectFlat(path[i + 1])).subtract(projectFlat(path[i]));
var angle = -vDirection2.verticalAngle() * 180 / Math.PI;
return {
position: [vCenter.x, vCenter.y, 0],
angle: angle,
color: color,
object: object
};
}
//# sourceMappingURL=create-path-markers.js.map