segments.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import line from './line';
  2. import { distance } from './util';
  3. function analyzePoints(points) {
  4. // 计算每段的长度和总的长度
  5. var totalLength = 0;
  6. var segments = [];
  7. for (var i = 0; i < points.length - 1; i++) {
  8. var from = points[i];
  9. var to = points[i + 1];
  10. var length_1 = distance(from[0], from[1], to[0], to[1]);
  11. var seg = {
  12. from: from,
  13. to: to,
  14. length: length_1,
  15. };
  16. segments.push(seg);
  17. totalLength += length_1;
  18. }
  19. return { segments: segments, totalLength: totalLength };
  20. }
  21. export function lengthOfSegment(points) {
  22. if (points.length < 2) {
  23. return 0;
  24. }
  25. var totalLength = 0;
  26. for (var i = 0; i < points.length - 1; i++) {
  27. var from = points[i];
  28. var to = points[i + 1];
  29. totalLength += distance(from[0], from[1], to[0], to[1]);
  30. }
  31. return totalLength;
  32. }
  33. /**
  34. * 按照比例在数据片段中获取点
  35. * @param {array} points 点的集合
  36. * @param {number} t 百分比 0-1
  37. * @return {object} 点的坐标
  38. */
  39. export function pointAtSegments(points, t) {
  40. // 边界判断
  41. if (t > 1 || t < 0 || points.length < 2) {
  42. return null;
  43. }
  44. var _a = analyzePoints(points), segments = _a.segments, totalLength = _a.totalLength;
  45. // 多个点有可能重合
  46. if (totalLength === 0) {
  47. return {
  48. x: points[0][0],
  49. y: points[0][1],
  50. };
  51. }
  52. // 计算比例
  53. var startRatio = 0;
  54. var point = null;
  55. for (var i = 0; i < segments.length; i++) {
  56. var seg = segments[i];
  57. var from = seg.from, to = seg.to;
  58. var currentRatio = seg.length / totalLength;
  59. if (t >= startRatio && t <= startRatio + currentRatio) {
  60. var localRatio = (t - startRatio) / currentRatio;
  61. point = line.pointAt(from[0], from[1], to[0], to[1], localRatio);
  62. break;
  63. }
  64. startRatio += currentRatio;
  65. }
  66. return point;
  67. }
  68. /**
  69. * 按照比例在数据片段中获取切线的角度
  70. * @param {array} points 点的集合
  71. * @param {number} t 百分比 0-1
  72. */
  73. export function angleAtSegments(points, t) {
  74. // 边界判断
  75. if (t > 1 || t < 0 || points.length < 2) {
  76. return 0;
  77. }
  78. var _a = analyzePoints(points), segments = _a.segments, totalLength = _a.totalLength;
  79. // 计算比例
  80. var startRatio = 0;
  81. var angle = 0;
  82. for (var i = 0; i < segments.length; i++) {
  83. var seg = segments[i];
  84. var from = seg.from, to = seg.to;
  85. var currentRatio = seg.length / totalLength;
  86. if (t >= startRatio && t <= startRatio + currentRatio) {
  87. angle = Math.atan2(to[1] - from[1], to[0] - from[0]);
  88. break;
  89. }
  90. startRatio += currentRatio;
  91. }
  92. return angle;
  93. }
  94. export function distanceAtSegment(points, x, y) {
  95. var minDistance = Infinity;
  96. for (var i = 0; i < points.length - 1; i++) {
  97. var point = points[i];
  98. var nextPoint = points[i + 1];
  99. var distance_1 = line.pointDistance(point[0], point[1], nextPoint[0], nextPoint[1], x, y);
  100. if (distance_1 < minDistance) {
  101. minDistance = distance_1;
  102. }
  103. }
  104. return minDistance;
  105. }
  106. //# sourceMappingURL=segments.js.map