@antv/util
Version:
> AntV 底层依赖的工具库,不建议在自己业务中使用。
93 lines • 4 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.pathLengthFactory = pathLengthFactory;
var normalize_path_1 = require("../process/normalize-path");
var segment_line_factory_1 = require("./segment-line-factory");
var segment_arc_factory_1 = require("./segment-arc-factory");
var segment_cubic_factory_1 = require("./segment-cubic-factory");
var segment_quad_factory_1 = require("./segment-quad-factory");
/**
* Returns a {x,y} point at a given length
* of a shape, the shape total length and
* the shape minimum and maximum {x,y} coordinates.
*/
function pathLengthFactory(pathInput, distance, options) {
var _a, _b, _c, _d, _e, _f;
var path = (0, normalize_path_1.normalizePath)(pathInput);
var distanceIsNumber = typeof distance === 'number';
var isM;
var data = [];
var pathCommand;
var x = 0;
var y = 0;
var mx = 0;
var my = 0;
var seg;
var MIN = [];
var MAX = [];
var length = 0;
var min = { x: 0, y: 0 };
var max = min;
var point = min;
var POINT = min;
var LENGTH = 0;
for (var i = 0, ll = path.length; i < ll; i += 1) {
seg = path[i];
pathCommand = seg[0];
isM = pathCommand === 'M';
data = !isM ? [x, y].concat(seg.slice(1)) : data;
// this segment is always ZERO
/* istanbul ignore else */
if (isM) {
// remember mx, my for Z
mx = seg[1], my = seg[2];
min = { x: mx, y: my };
max = min;
length = 0;
if (distanceIsNumber && distance < 0.001) {
POINT = min;
}
}
else if (pathCommand === 'L') {
(_a = (0, segment_line_factory_1.segmentLineFactory)(data[0], data[1], data[2], data[3], (distance || 0) - LENGTH), length = _a.length, min = _a.min, max = _a.max, point = _a.point);
}
else if (pathCommand === 'A') {
(_b = (0, segment_arc_factory_1.segmentArcFactory)(data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], (distance || 0) - LENGTH, options || {}), length = _b.length, min = _b.min, max = _b.max, point = _b.point);
}
else if (pathCommand === 'C') {
(_c = (0, segment_cubic_factory_1.segmentCubicFactory)(data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], (distance || 0) - LENGTH, options || {}), length = _c.length, min = _c.min, max = _c.max, point = _c.point);
}
else if (pathCommand === 'Q') {
(_d = (0, segment_quad_factory_1.segmentQuadFactory)(data[0], data[1], data[2], data[3], data[4], data[5], (distance || 0) - LENGTH, options || {}), length = _d.length, min = _d.min, max = _d.max, point = _d.point);
}
else if (pathCommand === 'Z') {
data = [x, y, mx, my];
(_e = (0, segment_line_factory_1.segmentLineFactory)(data[0], data[1], data[2], data[3], (distance || 0) - LENGTH), length = _e.length, min = _e.min, max = _e.max, point = _e.point);
}
if (distanceIsNumber && LENGTH < distance && LENGTH + length >= distance) {
POINT = point;
}
MAX.push(max);
MIN.push(min);
LENGTH += length;
_f = pathCommand !== 'Z' ? seg.slice(-2) : [mx, my], x = _f[0], y = _f[1];
}
// native `getPointAtLength` behavior when the given distance
// is higher than total length
if (distanceIsNumber && distance >= LENGTH) {
POINT = { x: x, y: y };
}
return {
length: LENGTH,
point: POINT,
min: {
x: Math.min.apply(null, MIN.map(function (n) { return n.x; })),
y: Math.min.apply(null, MIN.map(function (n) { return n.y; })),
},
max: {
x: Math.max.apply(null, MAX.map(function (n) { return n.x; })),
y: Math.max.apply(null, MAX.map(function (n) { return n.y; })),
},
};
}
//# sourceMappingURL=path-length-factory.js.map
;