path.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.catmullRom2Bezier = void 0;
  4. var tslib_1 = require("tslib");
  5. var matrix_1 = require("./matrix");
  6. function smoothBezier(points, smooth, isLoop, constraint) {
  7. var _a;
  8. var cps = [];
  9. var hasConstraint = !!constraint;
  10. var prevPoint;
  11. var nextPoint;
  12. var min = [Infinity, Infinity];
  13. var max = [-Infinity, -Infinity];
  14. var nextCp0;
  15. var cp1;
  16. var cp0;
  17. if (hasConstraint) {
  18. _a = tslib_1.__read(constraint, 2), min = _a[0], max = _a[1];
  19. for (var i = 0, l = points.length; i < l; i += 1) {
  20. var point = points[i];
  21. min = (0, matrix_1.min)(min, point);
  22. max = (0, matrix_1.max)(max, point);
  23. }
  24. }
  25. for (var i = 0, len = points.length; i < len; i += 1) {
  26. var point = points[i];
  27. if (i === 0 && !isLoop) {
  28. cp0 = point;
  29. }
  30. else if (i === len - 1 && !isLoop) {
  31. cp1 = point;
  32. cps.push(cp0);
  33. cps.push(cp1);
  34. }
  35. else {
  36. var prevIdx = [i ? i - 1 : len - 1, i - 1][isLoop ? 0 : 1];
  37. prevPoint = points[prevIdx];
  38. nextPoint = points[isLoop ? (i + 1) % len : i + 1];
  39. var v = [0, 0];
  40. v = (0, matrix_1.sub)(nextPoint, prevPoint);
  41. v = (0, matrix_1.scale)(v, smooth);
  42. var d0 = (0, matrix_1.distance)(point, prevPoint);
  43. var d1 = (0, matrix_1.distance)(point, nextPoint);
  44. var sum = d0 + d1;
  45. if (sum !== 0) {
  46. d0 /= sum;
  47. d1 /= sum;
  48. }
  49. var v1 = (0, matrix_1.scale)(v, -d0);
  50. var v2 = (0, matrix_1.scale)(v, d1);
  51. cp1 = (0, matrix_1.add)(point, v1);
  52. nextCp0 = (0, matrix_1.add)(point, v2);
  53. // 下一个控制点必须在这个点和下一个点之间
  54. nextCp0 = (0, matrix_1.min)(nextCp0, (0, matrix_1.max)(nextPoint, point));
  55. nextCp0 = (0, matrix_1.max)(nextCp0, (0, matrix_1.min)(nextPoint, point));
  56. // 重新计算 cp1 的值
  57. v1 = (0, matrix_1.sub)(nextCp0, point);
  58. v1 = (0, matrix_1.scale)(v1, -d0 / d1);
  59. cp1 = (0, matrix_1.add)(point, v1);
  60. // 上一个控制点必须要在上一个点和这一个点之间
  61. cp1 = (0, matrix_1.min)(cp1, (0, matrix_1.max)(prevPoint, point));
  62. cp1 = (0, matrix_1.max)(cp1, (0, matrix_1.min)(prevPoint, point));
  63. // 重新计算 nextCp0 的值
  64. v2 = (0, matrix_1.sub)(point, cp1);
  65. v2 = (0, matrix_1.scale)(v2, d1 / d0);
  66. nextCp0 = (0, matrix_1.add)(point, v2);
  67. if (hasConstraint) {
  68. cp1 = (0, matrix_1.max)(cp1, min);
  69. cp1 = (0, matrix_1.min)(cp1, max);
  70. nextCp0 = (0, matrix_1.max)(nextCp0, min);
  71. nextCp0 = (0, matrix_1.min)(nextCp0, max);
  72. }
  73. cps.push(cp0);
  74. cps.push(cp1);
  75. cp0 = nextCp0;
  76. }
  77. }
  78. if (isLoop) {
  79. cps.push(cps.shift());
  80. }
  81. return cps;
  82. }
  83. /**
  84. * create bezier spline from catmull rom spline
  85. * @param {Array} crp Catmull Rom Points
  86. * @param {boolean} z Spline is loop
  87. * @param {Array} constraint Constraint
  88. */
  89. function catmullRom2Bezier(crp, z, constraint) {
  90. var _a;
  91. if (z === void 0) { z = false; }
  92. if (constraint === void 0) { constraint = [
  93. [0, 0],
  94. [1, 1],
  95. ]; }
  96. var isLoop = !!z;
  97. var pointList = [];
  98. for (var i = 0, l = crp.length; i < l; i += 2) {
  99. pointList.push([crp[i], crp[i + 1]]);
  100. }
  101. var controlPointList = smoothBezier(pointList, 0.4, isLoop, constraint);
  102. var len = pointList.length;
  103. var d1 = [];
  104. var cp1;
  105. var cp2;
  106. var p;
  107. for (var i = 0; i < len - 1; i += 1) {
  108. cp1 = controlPointList[i * 2];
  109. cp2 = controlPointList[i * 2 + 1];
  110. p = pointList[i + 1];
  111. d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);
  112. }
  113. if (isLoop) {
  114. cp1 = controlPointList[len];
  115. cp2 = controlPointList[len + 1];
  116. _a = tslib_1.__read(pointList, 1), p = _a[0];
  117. d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);
  118. }
  119. return d1;
  120. }
  121. exports.catmullRom2Bezier = catmullRom2Bezier;
  122. //# sourceMappingURL=path.js.map