| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.distanceAtSegment = exports.angleAtSegments = exports.pointAtSegments = exports.lengthOfSegment = void 0;
- var line_1 = require("./line");
- var util_1 = require("./util");
- function analyzePoints(points) {
- // 计算每段的长度和总的长度
- var totalLength = 0;
- var segments = [];
- for (var i = 0; i < points.length - 1; i++) {
- var from = points[i];
- var to = points[i + 1];
- var length_1 = util_1.distance(from[0], from[1], to[0], to[1]);
- var seg = {
- from: from,
- to: to,
- length: length_1,
- };
- segments.push(seg);
- totalLength += length_1;
- }
- return { segments: segments, totalLength: totalLength };
- }
- function lengthOfSegment(points) {
- if (points.length < 2) {
- return 0;
- }
- var totalLength = 0;
- for (var i = 0; i < points.length - 1; i++) {
- var from = points[i];
- var to = points[i + 1];
- totalLength += util_1.distance(from[0], from[1], to[0], to[1]);
- }
- return totalLength;
- }
- exports.lengthOfSegment = lengthOfSegment;
- /**
- * 按照比例在数据片段中获取点
- * @param {array} points 点的集合
- * @param {number} t 百分比 0-1
- * @return {object} 点的坐标
- */
- function pointAtSegments(points, t) {
- // 边界判断
- if (t > 1 || t < 0 || points.length < 2) {
- return null;
- }
- var _a = analyzePoints(points), segments = _a.segments, totalLength = _a.totalLength;
- // 多个点有可能重合
- if (totalLength === 0) {
- return {
- x: points[0][0],
- y: points[0][1],
- };
- }
- // 计算比例
- var startRatio = 0;
- var point = null;
- for (var i = 0; i < segments.length; i++) {
- var seg = segments[i];
- var from = seg.from, to = seg.to;
- var currentRatio = seg.length / totalLength;
- if (t >= startRatio && t <= startRatio + currentRatio) {
- var localRatio = (t - startRatio) / currentRatio;
- point = line_1.default.pointAt(from[0], from[1], to[0], to[1], localRatio);
- break;
- }
- startRatio += currentRatio;
- }
- return point;
- }
- exports.pointAtSegments = pointAtSegments;
- /**
- * 按照比例在数据片段中获取切线的角度
- * @param {array} points 点的集合
- * @param {number} t 百分比 0-1
- */
- function angleAtSegments(points, t) {
- // 边界判断
- if (t > 1 || t < 0 || points.length < 2) {
- return 0;
- }
- var _a = analyzePoints(points), segments = _a.segments, totalLength = _a.totalLength;
- // 计算比例
- var startRatio = 0;
- var angle = 0;
- for (var i = 0; i < segments.length; i++) {
- var seg = segments[i];
- var from = seg.from, to = seg.to;
- var currentRatio = seg.length / totalLength;
- if (t >= startRatio && t <= startRatio + currentRatio) {
- angle = Math.atan2(to[1] - from[1], to[0] - from[0]);
- break;
- }
- startRatio += currentRatio;
- }
- return angle;
- }
- exports.angleAtSegments = angleAtSegments;
- function distanceAtSegment(points, x, y) {
- var minDistance = Infinity;
- for (var i = 0; i < points.length - 1; i++) {
- var point = points[i];
- var nextPoint = points[i + 1];
- var distance_1 = line_1.default.pointDistance(point[0], point[1], nextPoint[0], nextPoint[1], x, y);
- if (distance_1 < minDistance) {
- minDistance = distance_1;
- }
- }
- return minDistance;
- }
- exports.distanceAtSegment = distanceAtSegment;
- //# sourceMappingURL=segments.js.map
|