smooth.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.smooth = catmullRom2bezier;
  4. var _vector = _interopRequireDefault(require("./vector2"));
  5. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
  6. /**
  7. * @fileOverview convert the line to curve
  8. * @author dxq613@gmail.com
  9. */
  10. function getPoint(v) {
  11. return [v.x, v.y];
  12. }
  13. function smoothBezier(points, smooth, isLoop, constraint) {
  14. var cps = [];
  15. var prevPoint;
  16. var nextPoint;
  17. var hasConstraint = !!constraint;
  18. var min;
  19. var max;
  20. var point;
  21. var len;
  22. var l;
  23. var i;
  24. if (hasConstraint) {
  25. min = [Infinity, Infinity];
  26. max = [-Infinity, -Infinity];
  27. for (i = 0, l = points.length; i < l; i++) {
  28. point = getPoint(points[i]);
  29. _vector["default"].min(min, min, point);
  30. _vector["default"].max(max, max, point);
  31. }
  32. _vector["default"].min(min, min, constraint[0]);
  33. _vector["default"].max(max, max, constraint[1]);
  34. }
  35. for (i = 0, len = points.length; i < len; i++) {
  36. point = getPoint(points[i]);
  37. if (isLoop) {
  38. prevPoint = getPoint(points[i ? i - 1 : len - 1]);
  39. nextPoint = getPoint(points[(i + 1) % len]);
  40. } else {
  41. if (i === 0 || i === len - 1) {
  42. cps.push([point[0], point[1]]);
  43. continue;
  44. } else {
  45. prevPoint = getPoint(points[i - 1]);
  46. nextPoint = getPoint(points[i + 1]);
  47. }
  48. }
  49. var v = _vector["default"].sub([], nextPoint, prevPoint);
  50. _vector["default"].scale(v, v, smooth);
  51. var d0 = _vector["default"].distance(point, prevPoint);
  52. var d1 = _vector["default"].distance(point, nextPoint);
  53. var sum = d0 + d1;
  54. if (sum !== 0) {
  55. d0 /= sum;
  56. d1 /= sum;
  57. }
  58. var v1 = _vector["default"].scale([], v, -d0);
  59. var v2 = _vector["default"].scale([], v, d1);
  60. var cp0 = _vector["default"].add([], point, v1);
  61. var cp1 = _vector["default"].add([], point, v2);
  62. if (hasConstraint) {
  63. _vector["default"].max(cp0, cp0, min);
  64. _vector["default"].min(cp0, cp0, max);
  65. _vector["default"].max(cp1, cp1, min);
  66. _vector["default"].min(cp1, cp1, max);
  67. }
  68. cps.push([cp0[0], cp0[1]]);
  69. cps.push([cp1[0], cp1[1]]);
  70. }
  71. if (isLoop) {
  72. cps.push(cps.shift());
  73. }
  74. return cps;
  75. }
  76. function catmullRom2bezier(pointList, z, constraint) {
  77. var isLoop = !!z;
  78. var controlPointList = smoothBezier(pointList, 0.4, isLoop, constraint);
  79. var len = pointList.length;
  80. var d1 = [];
  81. var cp1;
  82. var cp2;
  83. var p;
  84. for (var i = 0; i < len - 1; i++) {
  85. cp1 = controlPointList[i * 2];
  86. cp2 = controlPointList[i * 2 + 1];
  87. p = pointList[i + 1];
  88. d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p.x, p.y]);
  89. }
  90. if (isLoop) {
  91. cp1 = controlPointList[len];
  92. cp2 = controlPointList[len + 1];
  93. p = pointList[0];
  94. d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p.x, p.y]);
  95. }
  96. return d1;
  97. }