- Go backend (server/)
- Frontend (web/, server/static/)
- Database and deployment files
- Scripts and docs
Co-Authored-By: 狸花猫/Claude-Qwen3.6-Plus 🐾
113 lines
3.6 KiB
JavaScript
113 lines
3.6 KiB
JavaScript
"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
|