d680d5088a0dd47801f6636701abd4a1327c5c975bf14b1dd35973f79ddb95f80d386c1cdf79feb3559b4472f9b34d588d056722a9f533303d160c5c6b856c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports["default"] = void 0;
  7. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  8. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  9. /**
  10. * @description Abstract the polyline formed by N points into a set of bezier curve
  11. * @param {Array} polyline A set of points that make up a polyline
  12. * @param {Boolean} close Closed curve
  13. * @param {Number} offsetA Smoothness
  14. * @param {Number} offsetB Smoothness
  15. * @return {Array|Boolean} A set of bezier curve (Invalid input will return false)
  16. */
  17. function polylineToBezierCurve(polyline) {
  18. var close = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  19. var offsetA = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.25;
  20. var offsetB = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.25;
  21. if (!(polyline instanceof Array)) {
  22. console.error('polylineToBezierCurve: Parameter polyline must be an array!');
  23. return false;
  24. }
  25. if (polyline.length <= 2) {
  26. console.error('polylineToBezierCurve: Converting to a curve requires at least 3 points!');
  27. return false;
  28. }
  29. var startPoint = polyline[0];
  30. var bezierCurveLineNum = polyline.length - 1;
  31. var bezierCurvePoints = new Array(bezierCurveLineNum).fill(0).map(function (foo, i) {
  32. return [].concat((0, _toConsumableArray2["default"])(getBezierCurveLineControlPoints(polyline, i, close, offsetA, offsetB)), [polyline[i + 1]]);
  33. });
  34. if (close) closeBezierCurve(bezierCurvePoints, startPoint);
  35. bezierCurvePoints.unshift(polyline[0]);
  36. return bezierCurvePoints;
  37. }
  38. /**
  39. * @description Get the control points of the Bezier curve
  40. * @param {Array} polyline A set of points that make up a polyline
  41. * @param {Number} index The index of which get controls points's point in polyline
  42. * @param {Boolean} close Closed curve
  43. * @param {Number} offsetA Smoothness
  44. * @param {Number} offsetB Smoothness
  45. * @return {Array} Control points
  46. */
  47. function getBezierCurveLineControlPoints(polyline, index) {
  48. var close = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  49. var offsetA = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.25;
  50. var offsetB = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.25;
  51. var pointNum = polyline.length;
  52. if (pointNum < 3 || index >= pointNum) return;
  53. var beforePointIndex = index - 1;
  54. if (beforePointIndex < 0) beforePointIndex = close ? pointNum + beforePointIndex : 0;
  55. var afterPointIndex = index + 1;
  56. if (afterPointIndex >= pointNum) afterPointIndex = close ? afterPointIndex - pointNum : pointNum - 1;
  57. var afterNextPointIndex = index + 2;
  58. if (afterNextPointIndex >= pointNum) afterNextPointIndex = close ? afterNextPointIndex - pointNum : pointNum - 1;
  59. var pointBefore = polyline[beforePointIndex];
  60. var pointMiddle = polyline[index];
  61. var pointAfter = polyline[afterPointIndex];
  62. var pointAfterNext = polyline[afterNextPointIndex];
  63. 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])]];
  64. }
  65. /**
  66. * @description Get the last curve of the closure
  67. * @param {Array} bezierCurve A set of sub-curve
  68. * @param {Array} startPoint Start point
  69. * @return {Array} The last curve for closure
  70. */
  71. function closeBezierCurve(bezierCurve, startPoint) {
  72. var firstSubCurve = bezierCurve[0];
  73. var lastSubCurve = bezierCurve.slice(-1)[0];
  74. bezierCurve.push([getSymmetryPoint(lastSubCurve[1], lastSubCurve[2]), getSymmetryPoint(firstSubCurve[0], startPoint), startPoint]);
  75. return bezierCurve;
  76. }
  77. /**
  78. * @description Get the symmetry point
  79. * @param {Array} point Symmetric point
  80. * @param {Array} centerPoint Symmetric center
  81. * @return {Array} Symmetric point
  82. */
  83. function getSymmetryPoint(point, centerPoint) {
  84. var _point = (0, _slicedToArray2["default"])(point, 2),
  85. px = _point[0],
  86. py = _point[1];
  87. var _centerPoint = (0, _slicedToArray2["default"])(centerPoint, 2),
  88. cx = _centerPoint[0],
  89. cy = _centerPoint[1];
  90. var minusX = cx - px;
  91. var minusY = cy - py;
  92. return [cx + minusX, cy + minusY];
  93. }
  94. var _default = polylineToBezierCurve;
  95. exports["default"] = _default;