"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var matrix_util_1 = require("@antv/matrix-util"); function smoothBezier(points, smooth, isLoop, constraint) { var cps = []; var hasConstraint = !!constraint; var prevPoint; var nextPoint; var min; var max; var nextCp0; var cp1; var cp0; if (hasConstraint) { min = constraint[0], max = constraint[1]; for (var i = 0, l = points.length; i < l; i += 1) { var point = points[i]; min = matrix_util_1.vec2.min([0, 0], min, point); max = matrix_util_1.vec2.max([0, 0], max, point); } } for (var i = 0, len = points.length; i < len; i += 1) { var point = points[i]; if (i === 0 && !isLoop) { cp0 = point; } else if (i === len - 1 && !isLoop) { cp1 = point; cps.push(cp0); cps.push(cp1); } else { var prevIdx = [i ? i - 1 : len - 1, i - 1][isLoop ? 0 : 1]; prevPoint = points[prevIdx]; nextPoint = points[isLoop ? (i + 1) % len : 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); cp1 = matrix_util_1.vec2.add([0, 0], point, v1); nextCp0 = matrix_util_1.vec2.add([0, 0], point, v2); // 下一个控制点必须在这个点和下一个点之间 nextCp0 = matrix_util_1.vec2.min([0, 0], nextCp0, matrix_util_1.vec2.max([0, 0], nextPoint, point)); nextCp0 = matrix_util_1.vec2.max([0, 0], nextCp0, matrix_util_1.vec2.min([0, 0], nextPoint, point)); // 重新计算 cp1 的值 v1 = matrix_util_1.vec2.sub([0, 0], nextCp0, point); v1 = matrix_util_1.vec2.scale([0, 0], v1, -d0 / d1); cp1 = matrix_util_1.vec2.add([0, 0], point, v1); // 上一个控制点必须要在上一个点和这一个点之间 cp1 = matrix_util_1.vec2.min([0, 0], cp1, matrix_util_1.vec2.max([0, 0], prevPoint, point)); cp1 = matrix_util_1.vec2.max([0, 0], cp1, matrix_util_1.vec2.min([0, 0], prevPoint, point)); // 重新计算 nextCp0 的值 v2 = matrix_util_1.vec2.sub([0, 0], point, cp1); v2 = matrix_util_1.vec2.scale([0, 0], v2, d1 / d0); nextCp0 = matrix_util_1.vec2.add([0, 0], point, v2); if (hasConstraint) { cp1 = matrix_util_1.vec2.max([0, 0], cp1, min); cp1 = matrix_util_1.vec2.min([0, 0], cp1, max); nextCp0 = matrix_util_1.vec2.max([0, 0], nextCp0, min); nextCp0 = matrix_util_1.vec2.min([0, 0], nextCp0, max); } cps.push(cp0); cps.push(cp1); cp0 = nextCp0; } } if (isLoop) { cps.push(cps.shift()); } return cps; } /** * create bezier spline from catmull rom spline * @param {Array} crp Catmull Rom Points * @param {boolean} z Spline is loop * @param {Array} constraint Constraint */ function catmullRom2Bezier(crp, z, constraint) { if (z === void 0) { z = false; } if (constraint === void 0) { constraint = [ [0, 0], [1, 1], ]; } 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 = 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 += 1) { 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.default = catmullRom2Bezier; //# sourceMappingURL=catmull-rom-2-bezier.js.map