| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.getSplinePath = exports.catmullRom2bezier = exports.smoothBezier = exports.points2Path = void 0;
- var matrix_util_1 = require("@antv/matrix-util");
- function points2Path(points, isInCircle) {
- var path = [];
- if (points.length) {
- path.push(['M', points[0].x, points[0].y]);
- for (var i = 1, length_1 = points.length; i < length_1; i += 1) {
- var item = points[i];
- path.push(['L', item.x, item.y]);
- }
- if (isInCircle) {
- path.push(['Z']);
- }
- }
- return path;
- }
- exports.points2Path = points2Path;
- /**
- * @ignore
- * 计算光滑的贝塞尔曲线
- */
- var smoothBezier = function (points, smooth, isLoop, constraint) {
- var cps = [];
- var prevPoint;
- var nextPoint;
- var hasConstraint = !!constraint;
- var min;
- var max;
- if (hasConstraint) {
- min = [Infinity, Infinity];
- max = [-Infinity, -Infinity];
- for (var i = 0, l = points.length; i < l; i++) {
- var point = points[i];
- min = matrix_util_1.vec2.min([0, 0], min, point);
- max = matrix_util_1.vec2.max([0, 0], max, point);
- }
- min = matrix_util_1.vec2.min([0, 0], min, constraint[0]);
- max = matrix_util_1.vec2.max([0, 0], max, constraint[1]);
- }
- for (var i = 0, len = points.length; i < len; i++) {
- var point = points[i];
- if (isLoop) {
- prevPoint = points[i ? i - 1 : len - 1];
- nextPoint = points[(i + 1) % len];
- }
- else {
- if (i === 0 || i === len - 1) {
- cps.push(point);
- continue;
- }
- else {
- prevPoint = points[i - 1];
- nextPoint = points[i + 1];
- }
- }
- var v = [0, 0];
- v = matrix_util_1.vec2.sub(v, nextPoint, prevPoint);
- v = matrix_util_1.vec2.scale(v, v, smooth);
- var d0 = matrix_util_1.vec2.distance(point, prevPoint);
- var d1 = matrix_util_1.vec2.distance(point, nextPoint);
- var sum = d0 + d1;
- if (sum !== 0) {
- d0 /= sum;
- d1 /= sum;
- }
- var v1 = matrix_util_1.vec2.scale([0, 0], v, -d0);
- var v2 = matrix_util_1.vec2.scale([0, 0], v, d1);
- var cp0 = matrix_util_1.vec2.add([0, 0], point, v1);
- var cp1 = matrix_util_1.vec2.add([0, 0], point, v2);
- if (hasConstraint) {
- cp0 = matrix_util_1.vec2.max([0, 0], cp0, min);
- cp0 = matrix_util_1.vec2.min([0, 0], cp0, max);
- cp1 = matrix_util_1.vec2.max([0, 0], cp1, min);
- cp1 = matrix_util_1.vec2.min([0, 0], cp1, max);
- }
- cps.push(cp0);
- cps.push(cp1);
- }
- if (isLoop) {
- cps.push(cps.shift());
- }
- return cps;
- };
- exports.smoothBezier = smoothBezier;
- /**
- * @ignore
- * 贝塞尔曲线
- */
- function catmullRom2bezier(crp, z, constraint) {
- var isLoop = !!z;
- var pointList = [];
- for (var i = 0, l = crp.length; i < l; i += 2) {
- pointList.push([crp[i], crp[i + 1]]);
- }
- var controlPointList = (0, exports.smoothBezier)(pointList, 0.4, isLoop, constraint);
- var len = pointList.length;
- var d1 = [];
- var cp1;
- var cp2;
- var p;
- for (var i = 0; i < len - 1; i++) {
- cp1 = controlPointList[i * 2];
- cp2 = controlPointList[i * 2 + 1];
- p = pointList[i + 1];
- d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);
- }
- if (isLoop) {
- cp1 = controlPointList[len];
- cp2 = controlPointList[len + 1];
- p = pointList[0];
- d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);
- }
- return d1;
- }
- exports.catmullRom2bezier = catmullRom2bezier;
- /**
- * @ignore
- * 根据关键点获取限定了范围的平滑线
- */
- function getSplinePath(points, isInCircle, constaint) {
- var data = [];
- var first = points[0];
- var prePoint = null;
- if (points.length <= 2) {
- // 两点以内直接绘制成路径
- return points2Path(points, isInCircle);
- }
- for (var i = 0, len = points.length; i < len; i++) {
- var point = points[i];
- if (!prePoint || !(prePoint.x === point.x && prePoint.y === point.y)) {
- data.push(point.x);
- data.push(point.y);
- prePoint = point;
- }
- }
- var constraint = constaint || [
- // 范围
- [0, 0],
- [1, 1],
- ];
- var splinePath = catmullRom2bezier(data, isInCircle, constraint);
- splinePath.unshift(['M', first.x, first.y]);
- return splinePath;
- }
- exports.getSplinePath = getSplinePath;
- //# sourceMappingURL=path.js.map
|