| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports["default"] = void 0;
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
- /**
- * @description Abstract the polyline formed by N points into a set of bezier curve
- * @param {Array} polyline A set of points that make up a polyline
- * @param {Boolean} close Closed curve
- * @param {Number} offsetA Smoothness
- * @param {Number} offsetB Smoothness
- * @return {Array|Boolean} A set of bezier curve (Invalid input will return false)
- */
- function polylineToBezierCurve(polyline) {
- var close = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var offsetA = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.25;
- var offsetB = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.25;
- if (!(polyline instanceof Array)) {
- console.error('polylineToBezierCurve: Parameter polyline must be an array!');
- return false;
- }
- if (polyline.length <= 2) {
- console.error('polylineToBezierCurve: Converting to a curve requires at least 3 points!');
- return false;
- }
- var startPoint = polyline[0];
- var bezierCurveLineNum = polyline.length - 1;
- var bezierCurvePoints = new Array(bezierCurveLineNum).fill(0).map(function (foo, i) {
- return [].concat((0, _toConsumableArray2["default"])(getBezierCurveLineControlPoints(polyline, i, close, offsetA, offsetB)), [polyline[i + 1]]);
- });
- if (close) closeBezierCurve(bezierCurvePoints, startPoint);
- bezierCurvePoints.unshift(polyline[0]);
- return bezierCurvePoints;
- }
- /**
- * @description Get the control points of the Bezier curve
- * @param {Array} polyline A set of points that make up a polyline
- * @param {Number} index The index of which get controls points's point in polyline
- * @param {Boolean} close Closed curve
- * @param {Number} offsetA Smoothness
- * @param {Number} offsetB Smoothness
- * @return {Array} Control points
- */
- function getBezierCurveLineControlPoints(polyline, index) {
- var close = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var offsetA = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.25;
- var offsetB = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.25;
- var pointNum = polyline.length;
- if (pointNum < 3 || index >= pointNum) return;
- var beforePointIndex = index - 1;
- if (beforePointIndex < 0) beforePointIndex = close ? pointNum + beforePointIndex : 0;
- var afterPointIndex = index + 1;
- if (afterPointIndex >= pointNum) afterPointIndex = close ? afterPointIndex - pointNum : pointNum - 1;
- var afterNextPointIndex = index + 2;
- if (afterNextPointIndex >= pointNum) afterNextPointIndex = close ? afterNextPointIndex - pointNum : pointNum - 1;
- var pointBefore = polyline[beforePointIndex];
- var pointMiddle = polyline[index];
- var pointAfter = polyline[afterPointIndex];
- var pointAfterNext = polyline[afterNextPointIndex];
- return [[pointMiddle[0] + offsetA * (pointAfter[0] - pointBefore[0]), pointMiddle[1] + offsetA * (pointAfter[1] - pointBefore[1])], [pointAfter[0] - offsetB * (pointAfterNext[0] - pointMiddle[0]), pointAfter[1] - offsetB * (pointAfterNext[1] - pointMiddle[1])]];
- }
- /**
- * @description Get the last curve of the closure
- * @param {Array} bezierCurve A set of sub-curve
- * @param {Array} startPoint Start point
- * @return {Array} The last curve for closure
- */
- function closeBezierCurve(bezierCurve, startPoint) {
- var firstSubCurve = bezierCurve[0];
- var lastSubCurve = bezierCurve.slice(-1)[0];
- bezierCurve.push([getSymmetryPoint(lastSubCurve[1], lastSubCurve[2]), getSymmetryPoint(firstSubCurve[0], startPoint), startPoint]);
- return bezierCurve;
- }
- /**
- * @description Get the symmetry point
- * @param {Array} point Symmetric point
- * @param {Array} centerPoint Symmetric center
- * @return {Array} Symmetric point
- */
- function getSymmetryPoint(point, centerPoint) {
- var _point = (0, _slicedToArray2["default"])(point, 2),
- px = _point[0],
- py = _point[1];
- var _centerPoint = (0, _slicedToArray2["default"])(centerPoint, 2),
- cx = _centerPoint[0],
- cy = _centerPoint[1];
- var minusX = cx - px;
- var minusY = cy - py;
- return [cx + minusX, cy + minusY];
- }
- var _default = polylineToBezierCurve;
- exports["default"] = _default;
|