segments.js 3.6 KB

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