path.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.getSplinePath = exports.catmullRom2bezier = exports.smoothBezier = exports.points2Path = void 0;
  4. var matrix_util_1 = require("@antv/matrix-util");
  5. function points2Path(points, isInCircle) {
  6. var path = [];
  7. if (points.length) {
  8. path.push(['M', points[0].x, points[0].y]);
  9. for (var i = 1, length_1 = points.length; i < length_1; i += 1) {
  10. var item = points[i];
  11. path.push(['L', item.x, item.y]);
  12. }
  13. if (isInCircle) {
  14. path.push(['Z']);
  15. }
  16. }
  17. return path;
  18. }
  19. exports.points2Path = points2Path;
  20. /**
  21. * @ignore
  22. * 计算光滑的贝塞尔曲线
  23. */
  24. var smoothBezier = function (points, smooth, isLoop, constraint) {
  25. var cps = [];
  26. var prevPoint;
  27. var nextPoint;
  28. var hasConstraint = !!constraint;
  29. var min;
  30. var max;
  31. if (hasConstraint) {
  32. min = [Infinity, Infinity];
  33. max = [-Infinity, -Infinity];
  34. for (var i = 0, l = points.length; i < l; i++) {
  35. var point = points[i];
  36. min = matrix_util_1.vec2.min([0, 0], min, point);
  37. max = matrix_util_1.vec2.max([0, 0], max, point);
  38. }
  39. min = matrix_util_1.vec2.min([0, 0], min, constraint[0]);
  40. max = matrix_util_1.vec2.max([0, 0], max, constraint[1]);
  41. }
  42. for (var i = 0, len = points.length; i < len; i++) {
  43. var point = points[i];
  44. if (isLoop) {
  45. prevPoint = points[i ? i - 1 : len - 1];
  46. nextPoint = points[(i + 1) % len];
  47. }
  48. else {
  49. if (i === 0 || i === len - 1) {
  50. cps.push(point);
  51. continue;
  52. }
  53. else {
  54. prevPoint = points[i - 1];
  55. nextPoint = points[i + 1];
  56. }
  57. }
  58. var v = [0, 0];
  59. v = matrix_util_1.vec2.sub(v, nextPoint, prevPoint);
  60. v = matrix_util_1.vec2.scale(v, v, smooth);
  61. var d0 = matrix_util_1.vec2.distance(point, prevPoint);
  62. var d1 = matrix_util_1.vec2.distance(point, nextPoint);
  63. var sum = d0 + d1;
  64. if (sum !== 0) {
  65. d0 /= sum;
  66. d1 /= sum;
  67. }
  68. var v1 = matrix_util_1.vec2.scale([0, 0], v, -d0);
  69. var v2 = matrix_util_1.vec2.scale([0, 0], v, d1);
  70. var cp0 = matrix_util_1.vec2.add([0, 0], point, v1);
  71. var cp1 = matrix_util_1.vec2.add([0, 0], point, v2);
  72. if (hasConstraint) {
  73. cp0 = matrix_util_1.vec2.max([0, 0], cp0, min);
  74. cp0 = matrix_util_1.vec2.min([0, 0], cp0, max);
  75. cp1 = matrix_util_1.vec2.max([0, 0], cp1, min);
  76. cp1 = matrix_util_1.vec2.min([0, 0], cp1, max);
  77. }
  78. cps.push(cp0);
  79. cps.push(cp1);
  80. }
  81. if (isLoop) {
  82. cps.push(cps.shift());
  83. }
  84. return cps;
  85. };
  86. exports.smoothBezier = smoothBezier;
  87. /**
  88. * @ignore
  89. * 贝塞尔曲线
  90. */
  91. function catmullRom2bezier(crp, z, constraint) {
  92. var isLoop = !!z;
  93. var pointList = [];
  94. for (var i = 0, l = crp.length; i < l; i += 2) {
  95. pointList.push([crp[i], crp[i + 1]]);
  96. }
  97. var controlPointList = (0, exports.smoothBezier)(pointList, 0.4, isLoop, constraint);
  98. var len = pointList.length;
  99. var d1 = [];
  100. var cp1;
  101. var cp2;
  102. var p;
  103. for (var i = 0; i < len - 1; i++) {
  104. cp1 = controlPointList[i * 2];
  105. cp2 = controlPointList[i * 2 + 1];
  106. p = pointList[i + 1];
  107. d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);
  108. }
  109. if (isLoop) {
  110. cp1 = controlPointList[len];
  111. cp2 = controlPointList[len + 1];
  112. p = pointList[0];
  113. d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);
  114. }
  115. return d1;
  116. }
  117. exports.catmullRom2bezier = catmullRom2bezier;
  118. /**
  119. * @ignore
  120. * 根据关键点获取限定了范围的平滑线
  121. */
  122. function getSplinePath(points, isInCircle, constaint) {
  123. var data = [];
  124. var first = points[0];
  125. var prePoint = null;
  126. if (points.length <= 2) {
  127. // 两点以内直接绘制成路径
  128. return points2Path(points, isInCircle);
  129. }
  130. for (var i = 0, len = points.length; i < len; i++) {
  131. var point = points[i];
  132. if (!prePoint || !(prePoint.x === point.x && prePoint.y === point.y)) {
  133. data.push(point.x);
  134. data.push(point.y);
  135. prePoint = point;
  136. }
  137. }
  138. var constraint = constaint || [
  139. // 范围
  140. [0, 0],
  141. [1, 1],
  142. ];
  143. var splinePath = catmullRom2bezier(data, isInCircle, constraint);
  144. splinePath.unshift(['M', first.x, first.y]);
  145. return splinePath;
  146. }
  147. exports.getSplinePath = getSplinePath;
  148. //# sourceMappingURL=path.js.map