rm-graphical-computing-node 1.0.57 → 1.0.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +335 -335
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -711,10 +711,10 @@ var require_concaveman = __commonJS({
|
|
|
711
711
|
}
|
|
712
712
|
module.exports = concaveman2;
|
|
713
713
|
module.exports.default = concaveman2;
|
|
714
|
-
function concaveman2(
|
|
714
|
+
function concaveman2(points, concavity, lengthThreshold) {
|
|
715
715
|
concavity = Math.max(0, concavity === void 0 ? 2 : concavity);
|
|
716
716
|
lengthThreshold = lengthThreshold || 0;
|
|
717
|
-
var hull = fastConvexHull(
|
|
717
|
+
var hull = fastConvexHull(points);
|
|
718
718
|
var tree = new RBush(16);
|
|
719
719
|
tree.toBBox = function(a2) {
|
|
720
720
|
return {
|
|
@@ -730,7 +730,7 @@ var require_concaveman = __commonJS({
|
|
|
730
730
|
tree.compareMinY = function(a2, b2) {
|
|
731
731
|
return a2[1] - b2[1];
|
|
732
732
|
};
|
|
733
|
-
tree.load(
|
|
733
|
+
tree.load(points);
|
|
734
734
|
var queue = [];
|
|
735
735
|
for (var i = 0, last; i < hull.length; i++) {
|
|
736
736
|
var p = hull[i];
|
|
@@ -837,13 +837,13 @@ var require_concaveman = __commonJS({
|
|
|
837
837
|
node.maxY = Math.max(p1[1], p2[1]);
|
|
838
838
|
return node;
|
|
839
839
|
}
|
|
840
|
-
function fastConvexHull(
|
|
841
|
-
var left =
|
|
842
|
-
var top =
|
|
843
|
-
var right =
|
|
844
|
-
var bottom =
|
|
845
|
-
for (var i = 0; i <
|
|
846
|
-
var p =
|
|
840
|
+
function fastConvexHull(points) {
|
|
841
|
+
var left = points[0];
|
|
842
|
+
var top = points[0];
|
|
843
|
+
var right = points[0];
|
|
844
|
+
var bottom = points[0];
|
|
845
|
+
for (var i = 0; i < points.length; i++) {
|
|
846
|
+
var p = points[i];
|
|
847
847
|
if (p[0] < left[0]) left = p;
|
|
848
848
|
if (p[0] > right[0]) right = p;
|
|
849
849
|
if (p[1] < top[1]) top = p;
|
|
@@ -851,8 +851,8 @@ var require_concaveman = __commonJS({
|
|
|
851
851
|
}
|
|
852
852
|
var cull = [left, top, right, bottom];
|
|
853
853
|
var filtered = cull.slice();
|
|
854
|
-
for (i = 0; i <
|
|
855
|
-
if (!pointInPolygon2(
|
|
854
|
+
for (i = 0; i < points.length; i++) {
|
|
855
|
+
if (!pointInPolygon2(points[i], cull)) filtered.push(points[i]);
|
|
856
856
|
}
|
|
857
857
|
return convexHull(filtered);
|
|
858
858
|
}
|
|
@@ -961,21 +961,21 @@ var require_concaveman = __commonJS({
|
|
|
961
961
|
function compareByX(a, b) {
|
|
962
962
|
return a[0] === b[0] ? a[1] - b[1] : a[0] - b[0];
|
|
963
963
|
}
|
|
964
|
-
function convexHull(
|
|
965
|
-
|
|
964
|
+
function convexHull(points) {
|
|
965
|
+
points.sort(compareByX);
|
|
966
966
|
var lower = [];
|
|
967
|
-
for (var i = 0; i <
|
|
968
|
-
while (lower.length >= 2 && cross3(lower[lower.length - 2], lower[lower.length - 1],
|
|
967
|
+
for (var i = 0; i < points.length; i++) {
|
|
968
|
+
while (lower.length >= 2 && cross3(lower[lower.length - 2], lower[lower.length - 1], points[i]) <= 0) {
|
|
969
969
|
lower.pop();
|
|
970
970
|
}
|
|
971
|
-
lower.push(
|
|
971
|
+
lower.push(points[i]);
|
|
972
972
|
}
|
|
973
973
|
var upper = [];
|
|
974
|
-
for (var ii =
|
|
975
|
-
while (upper.length >= 2 && cross3(upper[upper.length - 2], upper[upper.length - 1],
|
|
974
|
+
for (var ii = points.length - 1; ii >= 0; ii--) {
|
|
975
|
+
while (upper.length >= 2 && cross3(upper[upper.length - 2], upper[upper.length - 1], points[ii]) <= 0) {
|
|
976
976
|
upper.pop();
|
|
977
977
|
}
|
|
978
|
-
upper.push(
|
|
978
|
+
upper.push(points[ii]);
|
|
979
979
|
}
|
|
980
980
|
upper.pop();
|
|
981
981
|
lower.pop();
|
|
@@ -1322,7 +1322,7 @@ var WallSubdivisionAnalyzer = class {
|
|
|
1322
1322
|
* { projectPlane: plane }
|
|
1323
1323
|
* );
|
|
1324
1324
|
*/
|
|
1325
|
-
analyzePointDistribution(wallGroup,
|
|
1325
|
+
analyzePointDistribution(wallGroup, points, tolerance = 0.01, options = {}) {
|
|
1326
1326
|
const projectPlane = options.projectPlane || null;
|
|
1327
1327
|
this.results = {
|
|
1328
1328
|
totalSegments: 0,
|
|
@@ -1388,8 +1388,8 @@ var WallSubdivisionAnalyzer = class {
|
|
|
1388
1388
|
plane.setFromCoplanarPoints(p0, p1, p3);
|
|
1389
1389
|
const temp = new Vector33();
|
|
1390
1390
|
const tempProjectedPoint = new Vector33();
|
|
1391
|
-
for (let pointIndex = 0; pointIndex <
|
|
1392
|
-
const rawPoint = new Vector33(
|
|
1391
|
+
for (let pointIndex = 0; pointIndex < points.length; pointIndex += 3) {
|
|
1392
|
+
const rawPoint = new Vector33(points[pointIndex], points[pointIndex + 1], points[pointIndex + 2]);
|
|
1393
1393
|
const point2 = projectPlane ? projectPlane.projectPoint(rawPoint, tempProjectedPoint) : rawPoint;
|
|
1394
1394
|
const distanceToPlane = Math.abs(plane.distanceToPoint(point2));
|
|
1395
1395
|
if (distanceToPlane > tolerance) {
|
|
@@ -2063,7 +2063,7 @@ var WallSubdivisionAnalyzer2 = class {
|
|
|
2063
2063
|
* { projectPlane: plane }
|
|
2064
2064
|
* );
|
|
2065
2065
|
*/
|
|
2066
|
-
analyzePointDistribution(wallGroup,
|
|
2066
|
+
analyzePointDistribution(wallGroup, points, tolerance = 0.01, options = {}) {
|
|
2067
2067
|
const projectPlane = options.projectPlane || null;
|
|
2068
2068
|
this.results = {
|
|
2069
2069
|
totalSegments: 0,
|
|
@@ -2129,8 +2129,8 @@ var WallSubdivisionAnalyzer2 = class {
|
|
|
2129
2129
|
plane.setFromCoplanarPoints(p0, p1, p3);
|
|
2130
2130
|
const temp = new Vector35();
|
|
2131
2131
|
const tempProjectedPoint = new Vector35();
|
|
2132
|
-
for (let pointIndex = 0; pointIndex <
|
|
2133
|
-
const rawPoint =
|
|
2132
|
+
for (let pointIndex = 0; pointIndex < points.length; pointIndex++) {
|
|
2133
|
+
const rawPoint = points[pointIndex];
|
|
2134
2134
|
const point2 = projectPlane ? projectPlane.projectPoint(rawPoint, tempProjectedPoint) : rawPoint;
|
|
2135
2135
|
const distanceToPlane = Math.abs(plane.distanceToPoint(point2));
|
|
2136
2136
|
if (distanceToPlane > tolerance) {
|
|
@@ -2558,10 +2558,10 @@ import { Vector3 as Vector37 } from "three";
|
|
|
2558
2558
|
var PointsUtils = class {
|
|
2559
2559
|
points = [];
|
|
2560
2560
|
_tempArr = [0, 0, 0];
|
|
2561
|
-
constructor(
|
|
2561
|
+
constructor(points) {
|
|
2562
2562
|
}
|
|
2563
|
-
initPoints(
|
|
2564
|
-
this.points =
|
|
2563
|
+
initPoints(points) {
|
|
2564
|
+
this.points = points;
|
|
2565
2565
|
}
|
|
2566
2566
|
getPointByIndex(index, target) {
|
|
2567
2567
|
const i = index * 3;
|
|
@@ -2584,17 +2584,17 @@ var PointsUtils = class {
|
|
|
2584
2584
|
arr.push(index * 3 + 1);
|
|
2585
2585
|
arr.push(index * 3 + 2);
|
|
2586
2586
|
}
|
|
2587
|
-
pointsToVector3Arr(
|
|
2587
|
+
pointsToVector3Arr(points) {
|
|
2588
2588
|
const vecArr = [];
|
|
2589
|
-
for (let i = 0; i <
|
|
2590
|
-
vecArr.push(new Vector37(
|
|
2589
|
+
for (let i = 0; i < points.length / 3; i++) {
|
|
2590
|
+
vecArr.push(new Vector37(points[i * 3], points[i * 3 + 1], points[i * 3 + 2]));
|
|
2591
2591
|
}
|
|
2592
2592
|
return vecArr;
|
|
2593
2593
|
}
|
|
2594
|
-
vector3ArrToPoints(
|
|
2594
|
+
vector3ArrToPoints(points) {
|
|
2595
2595
|
const arr = [];
|
|
2596
|
-
for (let i = 0; i <
|
|
2597
|
-
arr.push(
|
|
2596
|
+
for (let i = 0; i < points.length; i++) {
|
|
2597
|
+
arr.push(points[i].x, points[i].y, points[i].z);
|
|
2598
2598
|
}
|
|
2599
2599
|
return arr;
|
|
2600
2600
|
}
|
|
@@ -2717,10 +2717,10 @@ var isParallel = (v1, v2, tolerance = 0.01) => {
|
|
|
2717
2717
|
angle
|
|
2718
2718
|
};
|
|
2719
2719
|
};
|
|
2720
|
-
var getPointCloudData = (
|
|
2720
|
+
var getPointCloudData = (points, gridWidth, gridHeight, centerPts) => {
|
|
2721
2721
|
if (gridWidth < 1e-4 || gridHeight < 1e-4)
|
|
2722
2722
|
return {};
|
|
2723
|
-
const pts =
|
|
2723
|
+
const pts = points;
|
|
2724
2724
|
let clonedCenterPts = [];
|
|
2725
2725
|
if (centerPts && centerPts.length) {
|
|
2726
2726
|
clonedCenterPts = centerPts.map((p) => p.clone());
|
|
@@ -3011,27 +3011,27 @@ function closestDistanceBetweenSegments(A, B2, C, D2) {
|
|
|
3011
3011
|
const closest2 = C.clone().add(CD.clone().multiplyScalar(t));
|
|
3012
3012
|
return closest1.distanceTo(closest2);
|
|
3013
3013
|
}
|
|
3014
|
-
var getPointsMinAndMax = (
|
|
3014
|
+
var getPointsMinAndMax = (points) => {
|
|
3015
3015
|
let minZ = 999999;
|
|
3016
3016
|
let maxZ = -999999;
|
|
3017
3017
|
let minZPt = new THREE3.Vector3();
|
|
3018
3018
|
let maxZPt = new THREE3.Vector3();
|
|
3019
3019
|
let averagePz2 = 0;
|
|
3020
|
-
for (let i = 0; i <
|
|
3021
|
-
if (
|
|
3022
|
-
maxZ =
|
|
3023
|
-
maxZPt.set(
|
|
3020
|
+
for (let i = 0; i < points.length; i++) {
|
|
3021
|
+
if (points[i].z > maxZ) {
|
|
3022
|
+
maxZ = points[i].z;
|
|
3023
|
+
maxZPt.set(points[i].x, points[i].y, points[i].z);
|
|
3024
3024
|
}
|
|
3025
|
-
if (
|
|
3026
|
-
minZ =
|
|
3027
|
-
minZPt.set(
|
|
3025
|
+
if (points[i].z < minZ) {
|
|
3026
|
+
minZ = points[i].z;
|
|
3027
|
+
minZPt.set(points[i].x, points[i].y, points[i].z);
|
|
3028
3028
|
}
|
|
3029
|
-
averagePz2 +=
|
|
3029
|
+
averagePz2 += points[i].z;
|
|
3030
3030
|
}
|
|
3031
|
-
averagePz2 = averagePz2 /
|
|
3031
|
+
averagePz2 = averagePz2 / points.length;
|
|
3032
3032
|
return { minZ, maxZ, averagePz: averagePz2, minZPt, maxZPt };
|
|
3033
3033
|
};
|
|
3034
|
-
var getProjectedPointOnLine = (lineSt, lineEd,
|
|
3034
|
+
var getProjectedPointOnLine = (lineSt, lineEd, points) => {
|
|
3035
3035
|
let plane = new THREE3.Plane();
|
|
3036
3036
|
const regionPt1 = new THREE3.Vector3(lineSt.x, lineSt.y, lineSt.z);
|
|
3037
3037
|
const regionPt2 = new THREE3.Vector3(lineEd.x, lineEd.y, lineEd.z);
|
|
@@ -3039,7 +3039,7 @@ var getProjectedPointOnLine = (lineSt, lineEd, points2) => {
|
|
|
3039
3039
|
plane.setFromCoplanarPoints(regionPt1, regionPt2, regionPt3);
|
|
3040
3040
|
const projectPoints = [];
|
|
3041
3041
|
const origionProjectPoints = [];
|
|
3042
|
-
|
|
3042
|
+
points.forEach((point2) => {
|
|
3043
3043
|
const target = new THREE3.Vector3();
|
|
3044
3044
|
plane.projectPoint(point2, target);
|
|
3045
3045
|
origionProjectPoints.push(target.clone());
|
|
@@ -3058,7 +3058,7 @@ var getProjectedPointOnLine = (lineSt, lineEd, points2) => {
|
|
|
3058
3058
|
projectPoints.forEach((point2, i) => {
|
|
3059
3059
|
let ptClose = line3Tmp.closestPointToPoint(point2, true, ptTarget);
|
|
3060
3060
|
if (ptClose.distanceTo(point2) < 1e-3) {
|
|
3061
|
-
newOriginalPoints.push(
|
|
3061
|
+
newOriginalPoints.push(points[i]);
|
|
3062
3062
|
newOnLinePoints.push(origionProjectPoints[i]);
|
|
3063
3063
|
} else {
|
|
3064
3064
|
newProjectPoints.push(point2);
|
|
@@ -3229,15 +3229,15 @@ var isPointOnLine2 = (lineStart, lineEnd, point2, tolerance = 1e-6) => {
|
|
|
3229
3229
|
line2.closestPointToPoint(new THREE3.Vector3(point2.x, point2.y, point2.z), true, closestPoint);
|
|
3230
3230
|
return closestPoint.distanceTo(new THREE3.Vector3(point2.x, point2.y, point2.z)) < tolerance;
|
|
3231
3231
|
};
|
|
3232
|
-
var getFarthestPoints = (
|
|
3232
|
+
var getFarthestPoints = (points) => {
|
|
3233
3233
|
let maxDist = 0;
|
|
3234
3234
|
let result = [];
|
|
3235
|
-
for (let i = 0; i <
|
|
3236
|
-
for (let j = i + 1; j <
|
|
3237
|
-
const dist3 =
|
|
3235
|
+
for (let i = 0; i < points.length; i++) {
|
|
3236
|
+
for (let j = i + 1; j < points.length; j++) {
|
|
3237
|
+
const dist3 = points[i].distanceTo(points[j]);
|
|
3238
3238
|
if (dist3 > maxDist) {
|
|
3239
3239
|
maxDist = dist3;
|
|
3240
|
-
result = [
|
|
3240
|
+
result = [points[i], points[j]];
|
|
3241
3241
|
}
|
|
3242
3242
|
}
|
|
3243
3243
|
}
|
|
@@ -3252,10 +3252,10 @@ var randomLightHex = () => {
|
|
|
3252
3252
|
const b = Math.floor(Math.random() * 75 + 180).toString(16).padStart(2, "0");
|
|
3253
3253
|
return `#${r}${g}${b}`;
|
|
3254
3254
|
};
|
|
3255
|
-
var uniqueVector3ByTolerance = (
|
|
3255
|
+
var uniqueVector3ByTolerance = (points, tolerance = 1e-3) => {
|
|
3256
3256
|
const map = /* @__PURE__ */ new Map();
|
|
3257
3257
|
const result = [];
|
|
3258
|
-
for (const p of
|
|
3258
|
+
for (const p of points) {
|
|
3259
3259
|
const ix = Math.round(p.x / tolerance);
|
|
3260
3260
|
const iy = Math.round(p.y / tolerance);
|
|
3261
3261
|
const iz = Math.round(p.z / tolerance);
|
|
@@ -3278,7 +3278,7 @@ var getOBBPoints = (obb) => {
|
|
|
3278
3278
|
function makePoint(sx, sy, sz) {
|
|
3279
3279
|
return center.clone().addScaledVector(xAxis, sx).addScaledVector(yAxis, sy).addScaledVector(zAxis, sz);
|
|
3280
3280
|
}
|
|
3281
|
-
const
|
|
3281
|
+
const points = [
|
|
3282
3282
|
// 下方一圈,局部 Z = -1
|
|
3283
3283
|
makePoint(-1, -1, -1),
|
|
3284
3284
|
makePoint(1, -1, -1),
|
|
@@ -3290,7 +3290,7 @@ var getOBBPoints = (obb) => {
|
|
|
3290
3290
|
makePoint(1, 1, 1),
|
|
3291
3291
|
makePoint(-1, 1, 1)
|
|
3292
3292
|
];
|
|
3293
|
-
return
|
|
3293
|
+
return points;
|
|
3294
3294
|
};
|
|
3295
3295
|
var createBoxGeometryFromRectPoints = (rectPoints, height) => {
|
|
3296
3296
|
const p0 = rectPoints[0];
|
|
@@ -3318,12 +3318,12 @@ var createBoxGeometryFromRectPoints = (rectPoints, height) => {
|
|
|
3318
3318
|
geometry.computeVertexNormals();
|
|
3319
3319
|
return geometry;
|
|
3320
3320
|
};
|
|
3321
|
-
var getPointSetCentroid = (
|
|
3322
|
-
if (!
|
|
3321
|
+
var getPointSetCentroid = (points) => {
|
|
3322
|
+
if (!points || points.length === 0) {
|
|
3323
3323
|
return null;
|
|
3324
3324
|
}
|
|
3325
3325
|
const center = new THREE3.Vector3(0, 0, 0);
|
|
3326
|
-
for (const p of
|
|
3326
|
+
for (const p of points) {
|
|
3327
3327
|
if (Array.isArray(p)) {
|
|
3328
3328
|
center.x += p[0];
|
|
3329
3329
|
center.y += p[1];
|
|
@@ -3334,18 +3334,18 @@ var getPointSetCentroid = (points2) => {
|
|
|
3334
3334
|
center.z += p.z;
|
|
3335
3335
|
}
|
|
3336
3336
|
}
|
|
3337
|
-
center.divideScalar(
|
|
3337
|
+
center.divideScalar(points.length);
|
|
3338
3338
|
return center;
|
|
3339
3339
|
};
|
|
3340
|
-
var calculatePolygonArea = (
|
|
3341
|
-
if (!
|
|
3340
|
+
var calculatePolygonArea = (points) => {
|
|
3341
|
+
if (!points || points.length < 3) {
|
|
3342
3342
|
return 0;
|
|
3343
3343
|
}
|
|
3344
|
-
let isArray = Array.isArray(
|
|
3344
|
+
let isArray = Array.isArray(points[0]);
|
|
3345
3345
|
let area2 = 0;
|
|
3346
|
-
for (let i = 0; i <
|
|
3347
|
-
const p1 =
|
|
3348
|
-
const p2 =
|
|
3346
|
+
for (let i = 0; i < points.length; i++) {
|
|
3347
|
+
const p1 = points[i];
|
|
3348
|
+
const p2 = points[(i + 1) % points.length];
|
|
3349
3349
|
if (isArray) {
|
|
3350
3350
|
area2 += p1[0] * p2[1] - p2[0] * p1[1];
|
|
3351
3351
|
} else {
|
|
@@ -3447,11 +3447,11 @@ function pointToSegmentDistance(p, a, b) {
|
|
|
3447
3447
|
p.y - y
|
|
3448
3448
|
);
|
|
3449
3449
|
}
|
|
3450
|
-
var voxelDownsample2DForContour = (
|
|
3451
|
-
if (!
|
|
3450
|
+
var voxelDownsample2DForContour = (points, cellSize) => {
|
|
3451
|
+
if (!points || points.length === 0) return [];
|
|
3452
3452
|
const map = /* @__PURE__ */ new Map();
|
|
3453
|
-
for (let i = 0; i <
|
|
3454
|
-
const p =
|
|
3453
|
+
for (let i = 0; i < points.length; i++) {
|
|
3454
|
+
const p = points[i];
|
|
3455
3455
|
const x = p[0];
|
|
3456
3456
|
const y = p[1];
|
|
3457
3457
|
const gx = Math.floor(x / cellSize);
|
|
@@ -3506,10 +3506,10 @@ var voxelDownsample2DForContour = (points2, cellSize) => {
|
|
|
3506
3506
|
}
|
|
3507
3507
|
return result;
|
|
3508
3508
|
};
|
|
3509
|
-
var setPointsSameZ = (
|
|
3510
|
-
for (let i = 0; i <
|
|
3511
|
-
|
|
3512
|
-
return
|
|
3509
|
+
var setPointsSameZ = (points, z) => {
|
|
3510
|
+
for (let i = 0; i < points.length; i++)
|
|
3511
|
+
points[i].z = z;
|
|
3512
|
+
return points;
|
|
3513
3513
|
};
|
|
3514
3514
|
|
|
3515
3515
|
// src/utils/updateLine.mjs
|
|
@@ -3618,12 +3618,12 @@ function isPointInRect2D(point2, rectPoints, plane = "xy") {
|
|
|
3618
3618
|
}
|
|
3619
3619
|
return true;
|
|
3620
3620
|
}
|
|
3621
|
-
function getPointSetCentroid2(
|
|
3622
|
-
if (!
|
|
3621
|
+
function getPointSetCentroid2(points) {
|
|
3622
|
+
if (!points || points.length === 0) {
|
|
3623
3623
|
return null;
|
|
3624
3624
|
}
|
|
3625
3625
|
const center = new THREE4.Vector3(0, 0, 0);
|
|
3626
|
-
for (const p of
|
|
3626
|
+
for (const p of points) {
|
|
3627
3627
|
if (Array.isArray(p)) {
|
|
3628
3628
|
center.x += p[0];
|
|
3629
3629
|
center.y += p[1];
|
|
@@ -3634,7 +3634,7 @@ function getPointSetCentroid2(points2) {
|
|
|
3634
3634
|
center.z += p.z;
|
|
3635
3635
|
}
|
|
3636
3636
|
}
|
|
3637
|
-
center.divideScalar(
|
|
3637
|
+
center.divideScalar(points.length);
|
|
3638
3638
|
return center;
|
|
3639
3639
|
}
|
|
3640
3640
|
function toVector3(p) {
|
|
@@ -3701,17 +3701,17 @@ function eigenVector2x2(a, b, c) {
|
|
|
3701
3701
|
y: y / len
|
|
3702
3702
|
};
|
|
3703
3703
|
}
|
|
3704
|
-
function getTrendLineEndpoints(
|
|
3704
|
+
function getTrendLineEndpoints(points, options = {}) {
|
|
3705
3705
|
const {
|
|
3706
3706
|
plane = "xy",
|
|
3707
3707
|
// 0 表示完全取最远两端
|
|
3708
3708
|
// 0.05 表示两端各去掉 5% 离群点
|
|
3709
3709
|
trimRatio = 0
|
|
3710
3710
|
} = options;
|
|
3711
|
-
if (!
|
|
3711
|
+
if (!points || points.length < 2) {
|
|
3712
3712
|
return null;
|
|
3713
3713
|
}
|
|
3714
|
-
const pts =
|
|
3714
|
+
const pts = points.map((p) => get2D1(p, plane));
|
|
3715
3715
|
let meanX = 0;
|
|
3716
3716
|
let meanY = 0;
|
|
3717
3717
|
let meanUp = 0;
|
|
@@ -5510,7 +5510,7 @@ function splitSegmentsAtIntersections(inputSegments, project, EPS = 1e-6) {
|
|
|
5510
5510
|
const segA = inputSegments[i];
|
|
5511
5511
|
const a1 = project(segA.start);
|
|
5512
5512
|
const a2 = project(segA.end);
|
|
5513
|
-
const
|
|
5513
|
+
const points = [
|
|
5514
5514
|
{
|
|
5515
5515
|
t: 0,
|
|
5516
5516
|
point: clonePoint(segA.start)
|
|
@@ -5528,15 +5528,15 @@ function splitSegmentsAtIntersections(inputSegments, project, EPS = 1e-6) {
|
|
|
5528
5528
|
const hit = segmentIntersection(a1, a2, b1, b2, EPS);
|
|
5529
5529
|
if (!hit) continue;
|
|
5530
5530
|
if (hit.t > EPS && hit.t < 1 - EPS) {
|
|
5531
|
-
|
|
5531
|
+
points.push({
|
|
5532
5532
|
t: hit.t,
|
|
5533
5533
|
point: lerpPoint(segA.start, segA.end, hit.t)
|
|
5534
5534
|
});
|
|
5535
5535
|
}
|
|
5536
5536
|
}
|
|
5537
|
-
|
|
5537
|
+
points.sort((p1, p2) => p1.t - p2.t);
|
|
5538
5538
|
const uniquePoints = [];
|
|
5539
|
-
for (const p of
|
|
5539
|
+
for (const p of points) {
|
|
5540
5540
|
if (uniquePoints.length === 0 || Math.abs(p.t - uniquePoints[uniquePoints.length - 1].t) > EPS) {
|
|
5541
5541
|
uniquePoints.push(p);
|
|
5542
5542
|
}
|
|
@@ -5597,11 +5597,11 @@ function dist2(a, b) {
|
|
|
5597
5597
|
const dy = a.y - b.y;
|
|
5598
5598
|
return dx * dx + dy * dy;
|
|
5599
5599
|
}
|
|
5600
|
-
function signedArea(
|
|
5600
|
+
function signedArea(points) {
|
|
5601
5601
|
let area2 = 0;
|
|
5602
|
-
for (let i = 0; i <
|
|
5603
|
-
const p =
|
|
5604
|
-
const q =
|
|
5602
|
+
for (let i = 0; i < points.length; i++) {
|
|
5603
|
+
const p = points[i];
|
|
5604
|
+
const q = points[(i + 1) % points.length];
|
|
5605
5605
|
area2 += p.x * q.y - q.x * p.y;
|
|
5606
5606
|
}
|
|
5607
5607
|
return area2 / 2;
|
|
@@ -5999,7 +5999,7 @@ var getColLine = async (lines, runDataList, collectDataPath, pointCloudCluster =
|
|
|
5999
5999
|
let maxNum = 0;
|
|
6000
6000
|
for (const cluster of clusterResult[0]) {
|
|
6001
6001
|
if (cluster.length < 50) continue;
|
|
6002
|
-
const newOriginalPoints = cluster.map((i2) =>
|
|
6002
|
+
const newOriginalPoints = cluster.map((i2) => allCenterPoints[i2]);
|
|
6003
6003
|
if (maxNum < newOriginalPoints.length) {
|
|
6004
6004
|
maxNum = newOriginalPoints.length;
|
|
6005
6005
|
newPoints = newOriginalPoints;
|
|
@@ -6435,11 +6435,11 @@ var Delaunator = class _Delaunator {
|
|
|
6435
6435
|
* @param {(p: P) => number} [getY]
|
|
6436
6436
|
*/
|
|
6437
6437
|
// @ts-expect-error TS2322
|
|
6438
|
-
static from(
|
|
6439
|
-
const n =
|
|
6438
|
+
static from(points, getX = defaultGetX, getY = defaultGetY) {
|
|
6439
|
+
const n = points.length;
|
|
6440
6440
|
const coords = new Float64Array(n * 2);
|
|
6441
6441
|
for (let i = 0; i < n; i++) {
|
|
6442
|
-
const p =
|
|
6442
|
+
const p = points[i];
|
|
6443
6443
|
coords[2 * i] = getX(p);
|
|
6444
6444
|
coords[2 * i + 1] = getY(p);
|
|
6445
6445
|
}
|
|
@@ -6916,19 +6916,19 @@ var Voronoi = class {
|
|
|
6916
6916
|
return this;
|
|
6917
6917
|
}
|
|
6918
6918
|
_init() {
|
|
6919
|
-
const { delaunay: { points
|
|
6919
|
+
const { delaunay: { points, hull, triangles }, vectors } = this;
|
|
6920
6920
|
let bx, by;
|
|
6921
6921
|
const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);
|
|
6922
6922
|
for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) {
|
|
6923
6923
|
const t1 = triangles[i] * 2;
|
|
6924
6924
|
const t2 = triangles[i + 1] * 2;
|
|
6925
6925
|
const t3 = triangles[i + 2] * 2;
|
|
6926
|
-
const x12 =
|
|
6927
|
-
const y12 =
|
|
6928
|
-
const x2 =
|
|
6929
|
-
const y2 =
|
|
6930
|
-
const x3 =
|
|
6931
|
-
const y3 =
|
|
6926
|
+
const x12 = points[t1];
|
|
6927
|
+
const y12 = points[t1 + 1];
|
|
6928
|
+
const x2 = points[t2];
|
|
6929
|
+
const y2 = points[t2 + 1];
|
|
6930
|
+
const x3 = points[t3];
|
|
6931
|
+
const y3 = points[t3 + 1];
|
|
6932
6932
|
const dx = x2 - x12;
|
|
6933
6933
|
const dy = y2 - y12;
|
|
6934
6934
|
const ex = x3 - x12;
|
|
@@ -6937,7 +6937,7 @@ var Voronoi = class {
|
|
|
6937
6937
|
if (Math.abs(ab4) < 1e-9) {
|
|
6938
6938
|
if (bx === void 0) {
|
|
6939
6939
|
bx = by = 0;
|
|
6940
|
-
for (const i2 of hull) bx +=
|
|
6940
|
+
for (const i2 of hull) bx += points[i2 * 2], by += points[i2 * 2 + 1];
|
|
6941
6941
|
bx /= hull.length, by /= hull.length;
|
|
6942
6942
|
}
|
|
6943
6943
|
const a = 1e9 * Math.sign((bx - x12) * ey - (by - y12) * ex);
|
|
@@ -6955,13 +6955,13 @@ var Voronoi = class {
|
|
|
6955
6955
|
}
|
|
6956
6956
|
let h = hull[hull.length - 1];
|
|
6957
6957
|
let p0, p1 = h * 4;
|
|
6958
|
-
let x0, x1 =
|
|
6959
|
-
let y0, y1 =
|
|
6958
|
+
let x0, x1 = points[2 * h];
|
|
6959
|
+
let y0, y1 = points[2 * h + 1];
|
|
6960
6960
|
vectors.fill(0);
|
|
6961
6961
|
for (let i = 0; i < hull.length; ++i) {
|
|
6962
6962
|
h = hull[i];
|
|
6963
6963
|
p0 = p1, x0 = x1, y0 = y1;
|
|
6964
|
-
p1 = h * 4, x1 =
|
|
6964
|
+
p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1];
|
|
6965
6965
|
vectors[p0 + 2] = vectors[p1] = y0 - y1;
|
|
6966
6966
|
vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0;
|
|
6967
6967
|
}
|
|
@@ -7000,21 +7000,21 @@ var Voronoi = class {
|
|
|
7000
7000
|
}
|
|
7001
7001
|
renderCell(i, context) {
|
|
7002
7002
|
const buffer = context == null ? context = new Path() : void 0;
|
|
7003
|
-
const
|
|
7004
|
-
if (
|
|
7005
|
-
context.moveTo(
|
|
7006
|
-
let n =
|
|
7007
|
-
while (
|
|
7003
|
+
const points = this._clip(i);
|
|
7004
|
+
if (points === null || !points.length) return;
|
|
7005
|
+
context.moveTo(points[0], points[1]);
|
|
7006
|
+
let n = points.length;
|
|
7007
|
+
while (points[0] === points[n - 2] && points[1] === points[n - 1] && n > 1) n -= 2;
|
|
7008
7008
|
for (let i2 = 2; i2 < n; i2 += 2) {
|
|
7009
|
-
if (
|
|
7010
|
-
context.lineTo(
|
|
7009
|
+
if (points[i2] !== points[i2 - 2] || points[i2 + 1] !== points[i2 - 1])
|
|
7010
|
+
context.lineTo(points[i2], points[i2 + 1]);
|
|
7011
7011
|
}
|
|
7012
7012
|
context.closePath();
|
|
7013
7013
|
return buffer && buffer.value();
|
|
7014
7014
|
}
|
|
7015
7015
|
*cellPolygons() {
|
|
7016
|
-
const { delaunay: { points
|
|
7017
|
-
for (let i = 0, n =
|
|
7016
|
+
const { delaunay: { points } } = this;
|
|
7017
|
+
for (let i = 0, n = points.length / 2; i < n; ++i) {
|
|
7018
7018
|
const cell = this.cellPolygon(i);
|
|
7019
7019
|
if (cell) cell.index = i, yield cell;
|
|
7020
7020
|
}
|
|
@@ -7058,35 +7058,35 @@ var Voronoi = class {
|
|
|
7058
7058
|
const { circumcenters, delaunay: { inedges, halfedges, triangles } } = this;
|
|
7059
7059
|
const e0 = inedges[i];
|
|
7060
7060
|
if (e0 === -1) return null;
|
|
7061
|
-
const
|
|
7061
|
+
const points = [];
|
|
7062
7062
|
let e = e0;
|
|
7063
7063
|
do {
|
|
7064
7064
|
const t = Math.floor(e / 3);
|
|
7065
|
-
|
|
7065
|
+
points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]);
|
|
7066
7066
|
e = e % 3 === 2 ? e - 2 : e + 1;
|
|
7067
7067
|
if (triangles[e] !== i) break;
|
|
7068
7068
|
e = halfedges[e];
|
|
7069
7069
|
} while (e !== e0 && e !== -1);
|
|
7070
|
-
return
|
|
7070
|
+
return points;
|
|
7071
7071
|
}
|
|
7072
7072
|
_clip(i) {
|
|
7073
7073
|
if (i === 0 && this.delaunay.hull.length === 1) {
|
|
7074
7074
|
return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];
|
|
7075
7075
|
}
|
|
7076
|
-
const
|
|
7077
|
-
if (
|
|
7076
|
+
const points = this._cell(i);
|
|
7077
|
+
if (points === null) return null;
|
|
7078
7078
|
const { vectors: V } = this;
|
|
7079
7079
|
const v2 = i * 4;
|
|
7080
|
-
return this._simplify(V[v2] || V[v2 + 1] ? this._clipInfinite(i,
|
|
7080
|
+
return this._simplify(V[v2] || V[v2 + 1] ? this._clipInfinite(i, points, V[v2], V[v2 + 1], V[v2 + 2], V[v2 + 3]) : this._clipFinite(i, points));
|
|
7081
7081
|
}
|
|
7082
|
-
_clipFinite(i,
|
|
7083
|
-
const n =
|
|
7082
|
+
_clipFinite(i, points) {
|
|
7083
|
+
const n = points.length;
|
|
7084
7084
|
let P = null;
|
|
7085
|
-
let x0, y0, x1 =
|
|
7085
|
+
let x0, y0, x1 = points[n - 2], y1 = points[n - 1];
|
|
7086
7086
|
let c0, c1 = this._regioncode(x1, y1);
|
|
7087
7087
|
let e0, e1 = 0;
|
|
7088
7088
|
for (let j = 0; j < n; j += 2) {
|
|
7089
|
-
x0 = x1, y0 = y1, x1 =
|
|
7089
|
+
x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1];
|
|
7090
7090
|
c0 = c1, c1 = this._regioncode(x1, y1);
|
|
7091
7091
|
if (c0 === 0 && c1 === 0) {
|
|
7092
7092
|
e0 = e1, e1 = 0;
|
|
@@ -7134,8 +7134,8 @@ var Voronoi = class {
|
|
|
7134
7134
|
else x1 = x, y1 = y, c1 = this._regioncode(x1, y1);
|
|
7135
7135
|
}
|
|
7136
7136
|
}
|
|
7137
|
-
_clipInfinite(i,
|
|
7138
|
-
let P = Array.from(
|
|
7137
|
+
_clipInfinite(i, points, vx0, vy0, vxn, vyn) {
|
|
7138
|
+
let P = Array.from(points), p;
|
|
7139
7139
|
if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]);
|
|
7140
7140
|
if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]);
|
|
7141
7141
|
if (P = this._clipFinite(i, P)) {
|
|
@@ -7249,13 +7249,13 @@ function jitter(x, y, r) {
|
|
|
7249
7249
|
return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r];
|
|
7250
7250
|
}
|
|
7251
7251
|
var Delaunay = class _Delaunay {
|
|
7252
|
-
static from(
|
|
7253
|
-
return new _Delaunay("length" in
|
|
7252
|
+
static from(points, fx = pointX, fy = pointY, that) {
|
|
7253
|
+
return new _Delaunay("length" in points ? flatArray(points, fx, fy, that) : Float64Array.from(flatIterable(points, fx, fy, that)));
|
|
7254
7254
|
}
|
|
7255
|
-
constructor(
|
|
7256
|
-
this._delaunator = new Delaunator(
|
|
7257
|
-
this.inedges = new Int32Array(
|
|
7258
|
-
this._hullIndex = new Int32Array(
|
|
7255
|
+
constructor(points) {
|
|
7256
|
+
this._delaunator = new Delaunator(points);
|
|
7257
|
+
this.inedges = new Int32Array(points.length / 2);
|
|
7258
|
+
this._hullIndex = new Int32Array(points.length / 2);
|
|
7259
7259
|
this.points = this._delaunator.coords;
|
|
7260
7260
|
this._init();
|
|
7261
7261
|
}
|
|
@@ -7265,16 +7265,16 @@ var Delaunay = class _Delaunay {
|
|
|
7265
7265
|
return this;
|
|
7266
7266
|
}
|
|
7267
7267
|
_init() {
|
|
7268
|
-
const d = this._delaunator,
|
|
7268
|
+
const d = this._delaunator, points = this.points;
|
|
7269
7269
|
if (d.hull && d.hull.length > 2 && collinear(d)) {
|
|
7270
|
-
this.collinear = Int32Array.from({ length:
|
|
7271
|
-
const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds = [
|
|
7272
|
-
for (let i = 0, n =
|
|
7273
|
-
const p = jitter(
|
|
7274
|
-
|
|
7275
|
-
|
|
7276
|
-
}
|
|
7277
|
-
this._delaunator = new Delaunator(
|
|
7270
|
+
this.collinear = Int32Array.from({ length: points.length / 2 }, (_, i) => i).sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]);
|
|
7271
|
+
const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds = [points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1]], r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]);
|
|
7272
|
+
for (let i = 0, n = points.length / 2; i < n; ++i) {
|
|
7273
|
+
const p = jitter(points[2 * i], points[2 * i + 1], r);
|
|
7274
|
+
points[2 * i] = p[0];
|
|
7275
|
+
points[2 * i + 1] = p[1];
|
|
7276
|
+
}
|
|
7277
|
+
this._delaunator = new Delaunator(points);
|
|
7278
7278
|
} else {
|
|
7279
7279
|
delete this.collinear;
|
|
7280
7280
|
}
|
|
@@ -7336,15 +7336,15 @@ var Delaunay = class _Delaunay {
|
|
|
7336
7336
|
return c;
|
|
7337
7337
|
}
|
|
7338
7338
|
_step(i, x, y) {
|
|
7339
|
-
const { inedges, hull, _hullIndex, halfedges, triangles, points
|
|
7340
|
-
if (inedges[i] === -1 || !
|
|
7339
|
+
const { inedges, hull, _hullIndex, halfedges, triangles, points } = this;
|
|
7340
|
+
if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1);
|
|
7341
7341
|
let c = i;
|
|
7342
|
-
let dc = pow(x -
|
|
7342
|
+
let dc = pow(x - points[i * 2], 2) + pow(y - points[i * 2 + 1], 2);
|
|
7343
7343
|
const e0 = inedges[i];
|
|
7344
7344
|
let e = e0;
|
|
7345
7345
|
do {
|
|
7346
7346
|
let t = triangles[e];
|
|
7347
|
-
const dt = pow(x -
|
|
7347
|
+
const dt = pow(x - points[t * 2], 2) + pow(y - points[t * 2 + 1], 2);
|
|
7348
7348
|
if (dt < dc) dc = dt, c = t;
|
|
7349
7349
|
e = e % 3 === 2 ? e - 2 : e + 1;
|
|
7350
7350
|
if (triangles[e] !== i) break;
|
|
@@ -7352,7 +7352,7 @@ var Delaunay = class _Delaunay {
|
|
|
7352
7352
|
if (e === -1) {
|
|
7353
7353
|
e = hull[(_hullIndex[i] + 1) % hull.length];
|
|
7354
7354
|
if (e !== t) {
|
|
7355
|
-
if (pow(x -
|
|
7355
|
+
if (pow(x - points[e * 2], 2) + pow(y - points[e * 2 + 1], 2) < dc) return e;
|
|
7356
7356
|
}
|
|
7357
7357
|
break;
|
|
7358
7358
|
}
|
|
@@ -7361,14 +7361,14 @@ var Delaunay = class _Delaunay {
|
|
|
7361
7361
|
}
|
|
7362
7362
|
render(context) {
|
|
7363
7363
|
const buffer = context == null ? context = new Path() : void 0;
|
|
7364
|
-
const { points
|
|
7364
|
+
const { points, halfedges, triangles } = this;
|
|
7365
7365
|
for (let i = 0, n = halfedges.length; i < n; ++i) {
|
|
7366
7366
|
const j = halfedges[i];
|
|
7367
7367
|
if (j < i) continue;
|
|
7368
7368
|
const ti = triangles[i] * 2;
|
|
7369
7369
|
const tj = triangles[j] * 2;
|
|
7370
|
-
context.moveTo(
|
|
7371
|
-
context.lineTo(
|
|
7370
|
+
context.moveTo(points[ti], points[ti + 1]);
|
|
7371
|
+
context.lineTo(points[tj], points[tj + 1]);
|
|
7372
7372
|
}
|
|
7373
7373
|
this.renderHull(context);
|
|
7374
7374
|
return buffer && buffer.value();
|
|
@@ -7377,9 +7377,9 @@ var Delaunay = class _Delaunay {
|
|
|
7377
7377
|
if (r === void 0 && (!context || typeof context.moveTo !== "function")) r = context, context = null;
|
|
7378
7378
|
r = r == void 0 ? 2 : +r;
|
|
7379
7379
|
const buffer = context == null ? context = new Path() : void 0;
|
|
7380
|
-
const { points
|
|
7381
|
-
for (let i = 0, n =
|
|
7382
|
-
const x =
|
|
7380
|
+
const { points } = this;
|
|
7381
|
+
for (let i = 0, n = points.length; i < n; i += 2) {
|
|
7382
|
+
const x = points[i], y = points[i + 1];
|
|
7383
7383
|
context.moveTo(x + r, y);
|
|
7384
7384
|
context.arc(x, y, r, 0, tau);
|
|
7385
7385
|
}
|
|
@@ -7387,12 +7387,12 @@ var Delaunay = class _Delaunay {
|
|
|
7387
7387
|
}
|
|
7388
7388
|
renderHull(context) {
|
|
7389
7389
|
const buffer = context == null ? context = new Path() : void 0;
|
|
7390
|
-
const { hull, points
|
|
7390
|
+
const { hull, points } = this;
|
|
7391
7391
|
const h = hull[0] * 2, n = hull.length;
|
|
7392
|
-
context.moveTo(
|
|
7392
|
+
context.moveTo(points[h], points[h + 1]);
|
|
7393
7393
|
for (let i = 1; i < n; ++i) {
|
|
7394
7394
|
const h2 = 2 * hull[i];
|
|
7395
|
-
context.lineTo(
|
|
7395
|
+
context.lineTo(points[h2], points[h2 + 1]);
|
|
7396
7396
|
}
|
|
7397
7397
|
context.closePath();
|
|
7398
7398
|
return buffer && buffer.value();
|
|
@@ -7404,13 +7404,13 @@ var Delaunay = class _Delaunay {
|
|
|
7404
7404
|
}
|
|
7405
7405
|
renderTriangle(i, context) {
|
|
7406
7406
|
const buffer = context == null ? context = new Path() : void 0;
|
|
7407
|
-
const { points
|
|
7407
|
+
const { points, triangles } = this;
|
|
7408
7408
|
const t0 = triangles[i *= 3] * 2;
|
|
7409
7409
|
const t1 = triangles[i + 1] * 2;
|
|
7410
7410
|
const t2 = triangles[i + 2] * 2;
|
|
7411
|
-
context.moveTo(
|
|
7412
|
-
context.lineTo(
|
|
7413
|
-
context.lineTo(
|
|
7411
|
+
context.moveTo(points[t0], points[t0 + 1]);
|
|
7412
|
+
context.lineTo(points[t1], points[t1 + 1]);
|
|
7413
|
+
context.lineTo(points[t2], points[t2 + 1]);
|
|
7414
7414
|
context.closePath();
|
|
7415
7415
|
return buffer && buffer.value();
|
|
7416
7416
|
}
|
|
@@ -7426,21 +7426,21 @@ var Delaunay = class _Delaunay {
|
|
|
7426
7426
|
return polygon2.value();
|
|
7427
7427
|
}
|
|
7428
7428
|
};
|
|
7429
|
-
function flatArray(
|
|
7430
|
-
const n =
|
|
7429
|
+
function flatArray(points, fx, fy, that) {
|
|
7430
|
+
const n = points.length;
|
|
7431
7431
|
const array = new Float64Array(n * 2);
|
|
7432
7432
|
for (let i = 0; i < n; ++i) {
|
|
7433
|
-
const p =
|
|
7434
|
-
array[i * 2] = fx.call(that, p, i,
|
|
7435
|
-
array[i * 2 + 1] = fy.call(that, p, i,
|
|
7433
|
+
const p = points[i];
|
|
7434
|
+
array[i * 2] = fx.call(that, p, i, points);
|
|
7435
|
+
array[i * 2 + 1] = fy.call(that, p, i, points);
|
|
7436
7436
|
}
|
|
7437
7437
|
return array;
|
|
7438
7438
|
}
|
|
7439
|
-
function* flatIterable(
|
|
7439
|
+
function* flatIterable(points, fx, fy, that) {
|
|
7440
7440
|
let i = 0;
|
|
7441
|
-
for (const p of
|
|
7442
|
-
yield fx.call(that, p, i,
|
|
7443
|
-
yield fy.call(that, p, i,
|
|
7441
|
+
for (const p of points) {
|
|
7442
|
+
yield fx.call(that, p, i, points);
|
|
7443
|
+
yield fy.call(that, p, i, points);
|
|
7444
7444
|
++i;
|
|
7445
7445
|
}
|
|
7446
7446
|
}
|
|
@@ -7466,12 +7466,12 @@ function addAdj(adj, i, j) {
|
|
|
7466
7466
|
}
|
|
7467
7467
|
arr.push(j);
|
|
7468
7468
|
}
|
|
7469
|
-
function computeContour(
|
|
7470
|
-
if (!
|
|
7469
|
+
function computeContour(points) {
|
|
7470
|
+
if (!points || points.length < 3) return [];
|
|
7471
7471
|
const seen = /* @__PURE__ */ new Set();
|
|
7472
7472
|
const uniq = [];
|
|
7473
|
-
for (let i = 0; i <
|
|
7474
|
-
const p =
|
|
7473
|
+
for (let i = 0; i < points.length; i++) {
|
|
7474
|
+
const p = points[i];
|
|
7475
7475
|
const k = `${p[0]}_${p[1]}`;
|
|
7476
7476
|
if (!seen.has(k)) {
|
|
7477
7477
|
seen.add(k);
|
|
@@ -7927,14 +7927,14 @@ function geomReduce(geojson, callback, initialValue) {
|
|
|
7927
7927
|
var import_concaveman = __toESM(require_concaveman(), 1);
|
|
7928
7928
|
function convex(geojson, options = {}) {
|
|
7929
7929
|
options.concavity = options.concavity || Infinity;
|
|
7930
|
-
const
|
|
7930
|
+
const points = [];
|
|
7931
7931
|
coordEach(geojson, (coord) => {
|
|
7932
|
-
|
|
7932
|
+
points.push([coord[0], coord[1]]);
|
|
7933
7933
|
});
|
|
7934
|
-
if (!
|
|
7934
|
+
if (!points.length) {
|
|
7935
7935
|
return null;
|
|
7936
7936
|
}
|
|
7937
|
-
const convexHull = (0, import_concaveman.default)(
|
|
7937
|
+
const convexHull = (0, import_concaveman.default)(points, options.concavity);
|
|
7938
7938
|
if (convexHull.length > 3) {
|
|
7939
7939
|
return polygon([convexHull]);
|
|
7940
7940
|
}
|
|
@@ -8385,9 +8385,9 @@ function distance(p1, p2) {
|
|
|
8385
8385
|
const dy = p2[1] - p1[1];
|
|
8386
8386
|
return Math.sqrt(dx * dx + dy * dy);
|
|
8387
8387
|
}
|
|
8388
|
-
function getCenter(
|
|
8388
|
+
function getCenter(points) {
|
|
8389
8389
|
let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;
|
|
8390
|
-
for (const [x, y] of
|
|
8390
|
+
for (const [x, y] of points) {
|
|
8391
8391
|
if (x < minX) minX = x;
|
|
8392
8392
|
if (x > maxX) maxX = x;
|
|
8393
8393
|
if (y < minY) minY = y;
|
|
@@ -8534,14 +8534,14 @@ function calculateClosePointRatioWithGrid2(pointsA, pointsB, threshold = 5e-3, m
|
|
|
8534
8534
|
function isNumber2(num) {
|
|
8535
8535
|
return !isNaN(num) && num !== null && !Array.isArray(num);
|
|
8536
8536
|
}
|
|
8537
|
-
function calculateClosePointWithOBB(
|
|
8537
|
+
function calculateClosePointWithOBB(points, box, maxCalculate = 0.5) {
|
|
8538
8538
|
let closePointsCount = 0;
|
|
8539
8539
|
let calculate = 0;
|
|
8540
|
-
for (const point2 of
|
|
8540
|
+
for (const point2 of points) {
|
|
8541
8541
|
const inside = box.containsPoint(point2);
|
|
8542
8542
|
if (inside) {
|
|
8543
8543
|
closePointsCount++;
|
|
8544
|
-
calculate = closePointsCount /
|
|
8544
|
+
calculate = closePointsCount / points.length;
|
|
8545
8545
|
if (calculate > maxCalculate) {
|
|
8546
8546
|
break;
|
|
8547
8547
|
}
|
|
@@ -8577,32 +8577,32 @@ function compareBoxVolume(box1, box2) {
|
|
|
8577
8577
|
return 0;
|
|
8578
8578
|
}
|
|
8579
8579
|
}
|
|
8580
|
-
function containsObbPoints(obb,
|
|
8580
|
+
function containsObbPoints(obb, points) {
|
|
8581
8581
|
let contains = true;
|
|
8582
|
-
for (let i = 0; i <
|
|
8583
|
-
if (!obb.containsPoint(
|
|
8582
|
+
for (let i = 0; i < points.length; i++) {
|
|
8583
|
+
if (!obb.containsPoint(points[i])) {
|
|
8584
8584
|
contains = false;
|
|
8585
8585
|
break;
|
|
8586
8586
|
}
|
|
8587
8587
|
}
|
|
8588
8588
|
return contains;
|
|
8589
8589
|
}
|
|
8590
|
-
function getCenterAndPointHeight(
|
|
8591
|
-
if (
|
|
8590
|
+
function getCenterAndPointHeight(points) {
|
|
8591
|
+
if (points.length === 0)
|
|
8592
8592
|
return { x: 0, y: 0, z: 0, h: 0 };
|
|
8593
8593
|
let x = 0;
|
|
8594
8594
|
let y = 0;
|
|
8595
8595
|
let maxz = -Infinity;
|
|
8596
8596
|
let minz = Infinity;
|
|
8597
|
-
for (const p of
|
|
8597
|
+
for (const p of points) {
|
|
8598
8598
|
x += p.x;
|
|
8599
8599
|
y += p.y;
|
|
8600
8600
|
maxz = Math.max(maxz, p.z);
|
|
8601
8601
|
minz = Math.min(minz, p.z);
|
|
8602
8602
|
}
|
|
8603
8603
|
return {
|
|
8604
|
-
x: x /
|
|
8605
|
-
y: y /
|
|
8604
|
+
x: x / points.length,
|
|
8605
|
+
y: y / points.length,
|
|
8606
8606
|
z: 0,
|
|
8607
8607
|
maxz,
|
|
8608
8608
|
minz,
|
|
@@ -8635,19 +8635,19 @@ var drawStaircase = (pcdPointsArr, scene) => {
|
|
|
8635
8635
|
side: THREE8.DoubleSide
|
|
8636
8636
|
});
|
|
8637
8637
|
for (let i = 0; i < pcdPointsArr.length; i++) {
|
|
8638
|
-
const
|
|
8638
|
+
const points = [];
|
|
8639
8639
|
for (let j = 0; j < pcdPointsArr[i].path.length; j++) {
|
|
8640
|
-
|
|
8640
|
+
points.push(new THREE8.Vector3(
|
|
8641
8641
|
pcdPointsArr[i].path[j][0],
|
|
8642
8642
|
pcdPointsArr[i].path[j][1],
|
|
8643
8643
|
0
|
|
8644
8644
|
));
|
|
8645
8645
|
}
|
|
8646
|
-
if (
|
|
8646
|
+
if (points.length == 0)
|
|
8647
8647
|
continue;
|
|
8648
8648
|
pointCloudGroup.add(pcdPointsArr[i].obb.getBoxEdge());
|
|
8649
8649
|
const geometry3 = new THREE8.BufferGeometry();
|
|
8650
|
-
geometry3.setFromPoints(
|
|
8650
|
+
geometry3.setFromPoints(points);
|
|
8651
8651
|
const hex = "green";
|
|
8652
8652
|
const _lineMaterial = new THREE8.LineBasicMaterial({ color: hex, depthTest: false, depthWrite: false });
|
|
8653
8653
|
const line2 = new THREE8.Line(geometry3, _lineMaterial);
|
|
@@ -8697,7 +8697,7 @@ var getMergeMeaning = (allProjectionResults, averagePz2, pointCloudCluster = nul
|
|
|
8697
8697
|
const pcdPointsArr = [];
|
|
8698
8698
|
const mapMaxSortFloor = /* @__PURE__ */ new Map();
|
|
8699
8699
|
for (let i = 0; i < allProjectionResults.length; i++) {
|
|
8700
|
-
let
|
|
8700
|
+
let points = allProjectionResults[i].points.map((p) => [p.x, p.y]);
|
|
8701
8701
|
let obj_id = allProjectionResults[i].obj_id;
|
|
8702
8702
|
obj_id = obj_id.replace(/calcony railing/g, "balcony railing").replace(/glass balcony railing/g, "balcony railing").replace(/metal balcony railing/g, "balcony railing").replace(/temporary construction guardrail/g, "balcony railing").replace(/the floor of the house/g, "floor").replace(/the outdoor floor/g, "floor").replace(/roof/g, "Ceiling");
|
|
8703
8703
|
const category = obj_id.split("_").slice(1, 3).join("_").split(".")[0].split("_")[0];
|
|
@@ -8748,8 +8748,8 @@ var getMergeMeaning = (allProjectionResults, averagePz2, pointCloudCluster = nul
|
|
|
8748
8748
|
let mostFrequentEntry = [...mapSortPoint.entries()].reduce(
|
|
8749
8749
|
(max, cur) => cur[1].num > max[1].num ? cur : max
|
|
8750
8750
|
);
|
|
8751
|
-
|
|
8752
|
-
|
|
8751
|
+
points = [];
|
|
8752
|
+
points = mostFrequentEntry[1].points.map((p) => [p.x, p.y]);
|
|
8753
8753
|
threePoints = [];
|
|
8754
8754
|
threePoints = mostFrequentEntry[1].points.map((p) => new THREE8.Vector3(p.x, p.y, p.z));
|
|
8755
8755
|
floorZ = mostFrequentEntry[0];
|
|
@@ -8757,7 +8757,7 @@ var getMergeMeaning = (allProjectionResults, averagePz2, pointCloudCluster = nul
|
|
|
8757
8757
|
const centerData = getCenterAndPointHeight(threePoints);
|
|
8758
8758
|
const data = {
|
|
8759
8759
|
points: threePoints,
|
|
8760
|
-
path: computeContour(
|
|
8760
|
+
path: computeContour(points),
|
|
8761
8761
|
h: centerData.h,
|
|
8762
8762
|
minz: centerData.minz,
|
|
8763
8763
|
maxz: centerData.maxz,
|
|
@@ -9224,15 +9224,15 @@ var getMergeMeaning = (allProjectionResults, averagePz2, pointCloudCluster = nul
|
|
|
9224
9224
|
let newArray = [];
|
|
9225
9225
|
for (let j = 0; j < array.length; j++) {
|
|
9226
9226
|
if (delArray.has(j)) continue;
|
|
9227
|
-
let
|
|
9227
|
+
let points = array[j].points;
|
|
9228
9228
|
let obj_id = array[j].obj_id;
|
|
9229
9229
|
let type2 = array[j].type;
|
|
9230
9230
|
let averagePz3 = array[j].averagePz;
|
|
9231
9231
|
let positionArr = array[j].positionArr;
|
|
9232
9232
|
let isStaircaseBalconyRailing = array[j].isStaircaseBalconyRailing;
|
|
9233
|
-
if (
|
|
9233
|
+
if (points.length < 50)
|
|
9234
9234
|
continue;
|
|
9235
|
-
let clusterResult = pointCloudCluster([
|
|
9235
|
+
let clusterResult = pointCloudCluster([points], {
|
|
9236
9236
|
tolerance: tolerancePointCloudCluster,
|
|
9237
9237
|
minClusterSize: 50,
|
|
9238
9238
|
maxClusterSize: 1e7,
|
|
@@ -9242,7 +9242,7 @@ var getMergeMeaning = (allProjectionResults, averagePz2, pointCloudCluster = nul
|
|
|
9242
9242
|
if (clusterResult.length > 0 && clusterResult[0].length > 1) {
|
|
9243
9243
|
for (const cluster of clusterResult[0]) {
|
|
9244
9244
|
if (cluster.length < 50) continue;
|
|
9245
|
-
const newOriginalPoints = cluster.map((i2) =>
|
|
9245
|
+
const newOriginalPoints = cluster.map((i2) => points[i2]);
|
|
9246
9246
|
const centerData = getCenterAndPointHeight(newOriginalPoints);
|
|
9247
9247
|
let pathPoints = newOriginalPoints.map((p) => [p.x, p.y]);
|
|
9248
9248
|
const data = {
|
|
@@ -9302,7 +9302,7 @@ var getMergeFloorMeaning = (allProjectionResults) => {
|
|
|
9302
9302
|
const pcdPointsArr = [];
|
|
9303
9303
|
const mapMaxSortFloor = /* @__PURE__ */ new Map();
|
|
9304
9304
|
for (let i = 0; i < allProjectionResults.length; i++) {
|
|
9305
|
-
let
|
|
9305
|
+
let points = allProjectionResults[i].points.map((p) => [p.x, p.y]);
|
|
9306
9306
|
let obj_id = allProjectionResults[i].obj_id;
|
|
9307
9307
|
obj_id = obj_id.replace(/the floor of the house/g, "floor").replace(/the outdoor floor/g, "floor");
|
|
9308
9308
|
const category = obj_id.split("_").slice(1, 3).join("_").split(".")[0].split("_")[0];
|
|
@@ -9337,8 +9337,8 @@ var getMergeFloorMeaning = (allProjectionResults) => {
|
|
|
9337
9337
|
let mostFrequentEntry = [...mapSortPoint.entries()].reduce(
|
|
9338
9338
|
(max, cur) => cur[1].num > max[1].num ? cur : max
|
|
9339
9339
|
);
|
|
9340
|
-
|
|
9341
|
-
|
|
9340
|
+
points = [];
|
|
9341
|
+
points = mostFrequentEntry[1].points.map((p) => [p.x, p.y]);
|
|
9342
9342
|
threePoints = [];
|
|
9343
9343
|
threePoints = mostFrequentEntry[1].points.map((p) => new THREE8.Vector3(p.x, p.y, p.z));
|
|
9344
9344
|
floorZ = mostFrequentEntry[0];
|
|
@@ -9346,7 +9346,7 @@ var getMergeFloorMeaning = (allProjectionResults) => {
|
|
|
9346
9346
|
const centerData = getCenterAndPointHeight(threePoints);
|
|
9347
9347
|
const data = {
|
|
9348
9348
|
points: threePoints,
|
|
9349
|
-
path: computeContour(
|
|
9349
|
+
path: computeContour(points),
|
|
9350
9350
|
h: centerData.h,
|
|
9351
9351
|
minz: centerData.minz,
|
|
9352
9352
|
maxz: centerData.maxz,
|
|
@@ -9482,7 +9482,7 @@ var getStaircase = (allProjectionResults, scene) => {
|
|
|
9482
9482
|
let pcdPointsArr = [];
|
|
9483
9483
|
const floorAllProjectionResults = splitFloorProjectsResults[i];
|
|
9484
9484
|
for (let i2 = 0; i2 < floorAllProjectionResults.length; i2++) {
|
|
9485
|
-
let
|
|
9485
|
+
let points = floorAllProjectionResults[i2].points.map((p) => [p.x, p.y]);
|
|
9486
9486
|
let obj_id = floorAllProjectionResults[i2].obj_id;
|
|
9487
9487
|
obj_id = obj_id.replace(/the floor of the house/g, "floor").replace(/the outdoor floor/g, "floor").replace(/calcony railing/g, "balcony railing").replace(/glass balcony railing/g, "balcony railing").replace(/metal balcony railing/g, "balcony railing").replace(/temporary construction guardrail/g, "balcony railing");
|
|
9488
9488
|
const category = obj_id.split("_").slice(1, 3).join("_").split(".")[0].split("_")[0];
|
|
@@ -9518,7 +9518,7 @@ var getStaircase = (allProjectionResults, scene) => {
|
|
|
9518
9518
|
const centerData = getCenterAndPointHeight(threePoints);
|
|
9519
9519
|
const data = {
|
|
9520
9520
|
points: threePoints,
|
|
9521
|
-
path: computeContour(
|
|
9521
|
+
path: computeContour(points),
|
|
9522
9522
|
h: centerData.h,
|
|
9523
9523
|
minz: centerData.minz,
|
|
9524
9524
|
maxz: centerData.maxz,
|
|
@@ -9759,7 +9759,7 @@ var getStaircase = (allProjectionResults, scene) => {
|
|
|
9759
9759
|
let minDist = 0.2;
|
|
9760
9760
|
for (let i = 0; i < StaircaseArray.length; i++) {
|
|
9761
9761
|
const size = StaircaseArray[i].obb.halfSize.clone().multiplyScalar(2);
|
|
9762
|
-
const
|
|
9762
|
+
const points = StaircaseArray[i].points;
|
|
9763
9763
|
let width = size.x;
|
|
9764
9764
|
let length2 = size.y;
|
|
9765
9765
|
let height = size.z;
|
|
@@ -9785,31 +9785,31 @@ var getStaircase = (allProjectionResults, scene) => {
|
|
|
9785
9785
|
let nearLine6PtArray = [];
|
|
9786
9786
|
let nearLine7PtArray = [];
|
|
9787
9787
|
let nearLine8PtArray = [];
|
|
9788
|
-
for (let j = 0; j <
|
|
9789
|
-
let pt1 = line1.closestPointToPoint(
|
|
9790
|
-
let pt2 = line2.closestPointToPoint(
|
|
9791
|
-
let pt3 = line3.closestPointToPoint(
|
|
9792
|
-
let pt4 = line4.closestPointToPoint(
|
|
9793
|
-
let pt5 = line5.closestPointToPoint(
|
|
9794
|
-
let pt6 = line6.closestPointToPoint(
|
|
9795
|
-
let pt7 = line7.closestPointToPoint(
|
|
9796
|
-
let pt8 = line8.closestPointToPoint(
|
|
9797
|
-
if (pt1.distanceTo(
|
|
9798
|
-
nearLine1PtArray.push(
|
|
9799
|
-
if (pt2.distanceTo(
|
|
9800
|
-
nearLine2PtArray.push(
|
|
9801
|
-
if (pt3.distanceTo(
|
|
9802
|
-
nearLine3PtArray.push(
|
|
9803
|
-
if (pt4.distanceTo(
|
|
9804
|
-
nearLine4PtArray.push(
|
|
9805
|
-
if (pt5.distanceTo(
|
|
9806
|
-
nearLine5PtArray.push(
|
|
9807
|
-
if (pt6.distanceTo(
|
|
9808
|
-
nearLine6PtArray.push(
|
|
9809
|
-
if (pt7.distanceTo(
|
|
9810
|
-
nearLine7PtArray.push(
|
|
9811
|
-
if (pt8.distanceTo(
|
|
9812
|
-
nearLine8PtArray.push(
|
|
9788
|
+
for (let j = 0; j < points.length; j++) {
|
|
9789
|
+
let pt1 = line1.closestPointToPoint(points[j], true, new THREE8.Vector3());
|
|
9790
|
+
let pt2 = line2.closestPointToPoint(points[j], true, new THREE8.Vector3());
|
|
9791
|
+
let pt3 = line3.closestPointToPoint(points[j], true, new THREE8.Vector3());
|
|
9792
|
+
let pt4 = line4.closestPointToPoint(points[j], true, new THREE8.Vector3());
|
|
9793
|
+
let pt5 = line5.closestPointToPoint(points[j], true, new THREE8.Vector3());
|
|
9794
|
+
let pt6 = line6.closestPointToPoint(points[j], true, new THREE8.Vector3());
|
|
9795
|
+
let pt7 = line7.closestPointToPoint(points[j], true, new THREE8.Vector3());
|
|
9796
|
+
let pt8 = line8.closestPointToPoint(points[j], true, new THREE8.Vector3());
|
|
9797
|
+
if (pt1.distanceTo(points[j]) < minDist)
|
|
9798
|
+
nearLine1PtArray.push(points[j]);
|
|
9799
|
+
if (pt2.distanceTo(points[j]) < minDist)
|
|
9800
|
+
nearLine2PtArray.push(points[j]);
|
|
9801
|
+
if (pt3.distanceTo(points[j]) < minDist)
|
|
9802
|
+
nearLine3PtArray.push(points[j]);
|
|
9803
|
+
if (pt4.distanceTo(points[j]) < minDist)
|
|
9804
|
+
nearLine4PtArray.push(points[j]);
|
|
9805
|
+
if (pt5.distanceTo(points[j]) < minDist)
|
|
9806
|
+
nearLine5PtArray.push(points[j]);
|
|
9807
|
+
if (pt6.distanceTo(points[j]) < minDist)
|
|
9808
|
+
nearLine6PtArray.push(points[j]);
|
|
9809
|
+
if (pt7.distanceTo(points[j]) < minDist)
|
|
9810
|
+
nearLine7PtArray.push(points[j]);
|
|
9811
|
+
if (pt8.distanceTo(points[j]) < minDist)
|
|
9812
|
+
nearLine8PtArray.push(points[j]);
|
|
9813
9813
|
}
|
|
9814
9814
|
let len1 = obbPoints[0].distanceTo(obbPoints[1]);
|
|
9815
9815
|
let len2 = obbPoints[1].distanceTo(obbPoints[2]);
|
|
@@ -10492,7 +10492,7 @@ function filterPointSetByMainDirection(inputPoints, options = {}) {
|
|
|
10492
10492
|
const sideY = dirX;
|
|
10493
10493
|
let minT = Infinity;
|
|
10494
10494
|
let maxT = -Infinity;
|
|
10495
|
-
const
|
|
10495
|
+
const points = rawPoints.map((p) => {
|
|
10496
10496
|
const dx = p.x - meanX;
|
|
10497
10497
|
const dy = p.y - meanY;
|
|
10498
10498
|
const t = dx * dirX + dy * dirY;
|
|
@@ -10508,7 +10508,7 @@ function filterPointSetByMainDirection(inputPoints, options = {}) {
|
|
|
10508
10508
|
const totalT = maxT - minT || 1;
|
|
10509
10509
|
const binSize = totalT / binCount;
|
|
10510
10510
|
const bins = /* @__PURE__ */ new Map();
|
|
10511
|
-
for (const p of
|
|
10511
|
+
for (const p of points) {
|
|
10512
10512
|
let bin = Math.floor((p.t - minT) / binSize);
|
|
10513
10513
|
if (bin < 0) bin = 0;
|
|
10514
10514
|
if (bin >= binCount) bin = binCount - 1;
|
|
@@ -10555,7 +10555,7 @@ function filterPointSetByMainDirection(inputPoints, options = {}) {
|
|
|
10555
10555
|
}
|
|
10556
10556
|
const keep = [];
|
|
10557
10557
|
const removed = [];
|
|
10558
|
-
for (const p of
|
|
10558
|
+
for (const p of points) {
|
|
10559
10559
|
let bin = Math.floor((p.t - minT) / binSize);
|
|
10560
10560
|
if (bin < 0) bin = 0;
|
|
10561
10561
|
if (bin >= binCount) bin = binCount - 1;
|
|
@@ -10599,10 +10599,10 @@ function medianSorted(arr) {
|
|
|
10599
10599
|
}
|
|
10600
10600
|
return arr[mid];
|
|
10601
10601
|
}
|
|
10602
|
-
function buildPointGrid(
|
|
10602
|
+
function buildPointGrid(points, cellSize) {
|
|
10603
10603
|
const grid = /* @__PURE__ */ new Map();
|
|
10604
|
-
for (let i = 0; i <
|
|
10605
|
-
const p =
|
|
10604
|
+
for (let i = 0; i < points.length; i++) {
|
|
10605
|
+
const p = points[i];
|
|
10606
10606
|
const ix = Math.floor(p.x / cellSize);
|
|
10607
10607
|
const iy = Math.floor(p.y / cellSize);
|
|
10608
10608
|
const iz = Math.floor(p.z / cellSize);
|
|
@@ -10614,8 +10614,8 @@ function buildPointGrid(points2, cellSize) {
|
|
|
10614
10614
|
}
|
|
10615
10615
|
return grid;
|
|
10616
10616
|
}
|
|
10617
|
-
function findPointNeighbors(
|
|
10618
|
-
const p =
|
|
10617
|
+
function findPointNeighbors(points, grid, pointIndex, radius, radiusSq) {
|
|
10618
|
+
const p = points[pointIndex];
|
|
10619
10619
|
const ix = Math.floor(p.x / radius);
|
|
10620
10620
|
const iy = Math.floor(p.y / radius);
|
|
10621
10621
|
const iz = Math.floor(p.z / radius);
|
|
@@ -10628,7 +10628,7 @@ function findPointNeighbors(points2, grid, pointIndex, radius, radiusSq) {
|
|
|
10628
10628
|
if (!list) continue;
|
|
10629
10629
|
for (const candidateIndex of list) {
|
|
10630
10630
|
if (candidateIndex === pointIndex) continue;
|
|
10631
|
-
const q =
|
|
10631
|
+
const q = points[candidateIndex];
|
|
10632
10632
|
const ddx = p.x - q.x;
|
|
10633
10633
|
const ddy = p.y - q.y;
|
|
10634
10634
|
const ddz = p.z - q.z;
|
|
@@ -10674,18 +10674,18 @@ function removeSmallClustersKeepInfo(inputPoints, options = {}) {
|
|
|
10674
10674
|
const {
|
|
10675
10675
|
radius = 0.35
|
|
10676
10676
|
} = options;
|
|
10677
|
-
const
|
|
10677
|
+
const points = inputPoints.map((p, index) => ({
|
|
10678
10678
|
index,
|
|
10679
10679
|
x: p.x,
|
|
10680
10680
|
y: p.y,
|
|
10681
10681
|
z: p.z,
|
|
10682
10682
|
raw: p
|
|
10683
10683
|
}));
|
|
10684
|
-
const grid = buildPointGrid(
|
|
10684
|
+
const grid = buildPointGrid(points, radius);
|
|
10685
10685
|
const radiusSq = radius * radius;
|
|
10686
|
-
const visited = new Array(
|
|
10686
|
+
const visited = new Array(points.length).fill(false);
|
|
10687
10687
|
const clusters = [];
|
|
10688
|
-
for (let i = 0; i <
|
|
10688
|
+
for (let i = 0; i < points.length; i++) {
|
|
10689
10689
|
if (visited[i]) continue;
|
|
10690
10690
|
const cluster = [];
|
|
10691
10691
|
const queue = [i];
|
|
@@ -10694,7 +10694,7 @@ function removeSmallClustersKeepInfo(inputPoints, options = {}) {
|
|
|
10694
10694
|
const currentIndex = queue.shift();
|
|
10695
10695
|
cluster.push(currentIndex);
|
|
10696
10696
|
const neighbors = findPointNeighbors(
|
|
10697
|
-
|
|
10697
|
+
points,
|
|
10698
10698
|
grid,
|
|
10699
10699
|
currentIndex,
|
|
10700
10700
|
radius,
|
|
@@ -10710,7 +10710,7 @@ function removeSmallClustersKeepInfo(inputPoints, options = {}) {
|
|
|
10710
10710
|
clusters.push(cluster);
|
|
10711
10711
|
}
|
|
10712
10712
|
return {
|
|
10713
|
-
points
|
|
10713
|
+
points,
|
|
10714
10714
|
clusters
|
|
10715
10715
|
};
|
|
10716
10716
|
}
|
|
@@ -10755,8 +10755,8 @@ function obbContainsPoint(obb, point2, epsilon3 = 1e-6) {
|
|
|
10755
10755
|
}
|
|
10756
10756
|
|
|
10757
10757
|
// src/utils/clusert.mjs
|
|
10758
|
-
function alphaForTriangle(
|
|
10759
|
-
const xZero =
|
|
10758
|
+
function alphaForTriangle(points, ia, ib, ic) {
|
|
10759
|
+
const xZero = points[ia][0] === 0 || points[ib][0] === 0 || points[ic][0] === 0;
|
|
10760
10760
|
return 1 + (xZero ? 1 : 0);
|
|
10761
10761
|
}
|
|
10762
10762
|
function circumradius2(ax, ay, bx, by, cx, cy) {
|
|
@@ -10767,11 +10767,11 @@ function circumradius2(ax, ay, bx, by, cx, cy) {
|
|
|
10767
10767
|
if (area2 === 0) return Infinity;
|
|
10768
10768
|
return a * b * c / (4 * area2);
|
|
10769
10769
|
}
|
|
10770
|
-
function computeContour2(
|
|
10771
|
-
if (!
|
|
10770
|
+
function computeContour2(points) {
|
|
10771
|
+
if (!points || points.length < 3) return [];
|
|
10772
10772
|
const seen = /* @__PURE__ */ new Set();
|
|
10773
10773
|
const uniq = [];
|
|
10774
|
-
for (const p of
|
|
10774
|
+
for (const p of points) {
|
|
10775
10775
|
const k = `${p[0]}_${p[1]}`;
|
|
10776
10776
|
if (!seen.has(k)) {
|
|
10777
10777
|
seen.add(k);
|
|
@@ -10863,28 +10863,28 @@ var getFlatSlabData = (lines, runDataList, pointCloudCluster = null) => {
|
|
|
10863
10863
|
let maxPointsNum = 0;
|
|
10864
10864
|
let maxPointsZ = 0;
|
|
10865
10865
|
for (const line2 of lines) {
|
|
10866
|
-
let
|
|
10867
|
-
if (
|
|
10866
|
+
let points = line2[1].points;
|
|
10867
|
+
if (points.length < 30) continue;
|
|
10868
10868
|
let mapSortPoint = /* @__PURE__ */ new Map();
|
|
10869
|
-
for (let c = 0; c <
|
|
10870
|
-
let z =
|
|
10869
|
+
for (let c = 0; c < points.length; c++) {
|
|
10870
|
+
let z = points[c].z;
|
|
10871
10871
|
z = Math.floor(z * 10) / 10;
|
|
10872
10872
|
if (mapSortPoint.has(z)) {
|
|
10873
10873
|
const item = mapSortPoint.get(z);
|
|
10874
10874
|
item.num += 1;
|
|
10875
|
-
item.points.push(
|
|
10875
|
+
item.points.push(points[c]);
|
|
10876
10876
|
mapSortPoint.set(z, item);
|
|
10877
10877
|
} else {
|
|
10878
|
-
mapSortPoint.set(z, { num: 1, points: [
|
|
10878
|
+
mapSortPoint.set(z, { num: 1, points: [points[c]] });
|
|
10879
10879
|
}
|
|
10880
10880
|
}
|
|
10881
10881
|
let mostFrequentEntry = [...mapSortPoint.entries()].reduce(
|
|
10882
10882
|
(max, cur) => cur[1].num > max[1].num ? cur : max
|
|
10883
10883
|
);
|
|
10884
|
-
|
|
10884
|
+
points = mostFrequentEntry[1].points.map((p) => new THREE9.Vector3(p.x, p.y, p.z));
|
|
10885
10885
|
let newPoints = [];
|
|
10886
10886
|
if (pointCloudCluster != null) {
|
|
10887
|
-
let clusterResult = pointCloudCluster([
|
|
10887
|
+
let clusterResult = pointCloudCluster([points], {
|
|
10888
10888
|
tolerance: 0.1,
|
|
10889
10889
|
minClusterSize: 30,
|
|
10890
10890
|
maxClusterSize: 1e7,
|
|
@@ -10893,13 +10893,13 @@ var getFlatSlabData = (lines, runDataList, pointCloudCluster = null) => {
|
|
|
10893
10893
|
if (clusterResult.length > 0) {
|
|
10894
10894
|
for (const cluster of clusterResult[0]) {
|
|
10895
10895
|
if (cluster.length < 50) continue;
|
|
10896
|
-
const newOriginalPoints = cluster.map((i) =>
|
|
10896
|
+
const newOriginalPoints = cluster.map((i) => points[i]);
|
|
10897
10897
|
newPoints.push(newOriginalPoints);
|
|
10898
10898
|
}
|
|
10899
10899
|
} else
|
|
10900
|
-
newPoints.push(
|
|
10900
|
+
newPoints.push(points);
|
|
10901
10901
|
} else
|
|
10902
|
-
newPoints.push(
|
|
10902
|
+
newPoints.push(points);
|
|
10903
10903
|
for (let u4 = 0; u4 < newPoints.length; u4++) {
|
|
10904
10904
|
let { minZ, maxZ, averagePz: averagePz2 } = getPointsMinAndMax(newPoints[u4]);
|
|
10905
10905
|
const height = maxZ - minZ;
|
|
@@ -10972,10 +10972,10 @@ var getObliqueSlabData = (lines, runDataList, pointCloudCluster = null) => {
|
|
|
10972
10972
|
}
|
|
10973
10973
|
const averageZ = totalZ / (runDataList.length - 1) + 0.3;
|
|
10974
10974
|
for (let i = 0; i < lines.length; i++) {
|
|
10975
|
-
let
|
|
10975
|
+
let points = lines[i][1].points;
|
|
10976
10976
|
let newPoints = [];
|
|
10977
10977
|
if (pointCloudCluster != null) {
|
|
10978
|
-
let clusterResult = pointCloudCluster([
|
|
10978
|
+
let clusterResult = pointCloudCluster([points], {
|
|
10979
10979
|
tolerance: 0.2,
|
|
10980
10980
|
minClusterSize: 30,
|
|
10981
10981
|
maxClusterSize: 1e7,
|
|
@@ -10984,13 +10984,13 @@ var getObliqueSlabData = (lines, runDataList, pointCloudCluster = null) => {
|
|
|
10984
10984
|
if (clusterResult.length > 0) {
|
|
10985
10985
|
for (const cluster of clusterResult[0]) {
|
|
10986
10986
|
if (cluster.length < 50) continue;
|
|
10987
|
-
const newOriginalPoints = cluster.map((i2) =>
|
|
10987
|
+
const newOriginalPoints = cluster.map((i2) => points[i2]);
|
|
10988
10988
|
newPoints.push(newOriginalPoints);
|
|
10989
10989
|
}
|
|
10990
10990
|
} else
|
|
10991
|
-
newPoints.push(
|
|
10991
|
+
newPoints.push(points);
|
|
10992
10992
|
} else
|
|
10993
|
-
newPoints.push(
|
|
10993
|
+
newPoints.push(points);
|
|
10994
10994
|
if (newPoints.length == 0)
|
|
10995
10995
|
continue;
|
|
10996
10996
|
for (let x = 0; x < newPoints.length; x++) {
|
|
@@ -11041,10 +11041,10 @@ var getObliqueSlabData = (lines, runDataList, pointCloudCluster = null) => {
|
|
|
11041
11041
|
}
|
|
11042
11042
|
slabDatas = [];
|
|
11043
11043
|
for (let i = 0; i < newSlabDatas.length; i++) {
|
|
11044
|
-
let
|
|
11044
|
+
let points = newSlabDatas[i].points;
|
|
11045
11045
|
let newPoints = [];
|
|
11046
11046
|
if (pointCloudCluster != null) {
|
|
11047
|
-
let clusterResult = pointCloudCluster([
|
|
11047
|
+
let clusterResult = pointCloudCluster([points], {
|
|
11048
11048
|
tolerance: 0.2,
|
|
11049
11049
|
minClusterSize: 30,
|
|
11050
11050
|
maxClusterSize: 1e7,
|
|
@@ -11053,13 +11053,13 @@ var getObliqueSlabData = (lines, runDataList, pointCloudCluster = null) => {
|
|
|
11053
11053
|
if (clusterResult.length > 0) {
|
|
11054
11054
|
for (const cluster of clusterResult[0]) {
|
|
11055
11055
|
if (cluster.length < 50) continue;
|
|
11056
|
-
const newOriginalPoints = cluster.map((i2) =>
|
|
11056
|
+
const newOriginalPoints = cluster.map((i2) => points[i2]);
|
|
11057
11057
|
newPoints.push(newOriginalPoints);
|
|
11058
11058
|
}
|
|
11059
11059
|
} else
|
|
11060
|
-
newPoints.push(
|
|
11060
|
+
newPoints.push(points);
|
|
11061
11061
|
} else
|
|
11062
|
-
newPoints.push(
|
|
11062
|
+
newPoints.push(points);
|
|
11063
11063
|
if (newPoints.length == 0)
|
|
11064
11064
|
continue;
|
|
11065
11065
|
for (let x = 0; x < newPoints.length; x++) {
|
|
@@ -11082,15 +11082,15 @@ var getObliqueSlabData = (lines, runDataList, pointCloudCluster = null) => {
|
|
|
11082
11082
|
}
|
|
11083
11083
|
return slabDatas;
|
|
11084
11084
|
};
|
|
11085
|
-
function getPathZ(path3,
|
|
11085
|
+
function getPathZ(path3, points) {
|
|
11086
11086
|
let pathPt = new THREE9.Vector3();
|
|
11087
|
-
for (let i = 0; i <
|
|
11087
|
+
for (let i = 0; i < points.length; i++) {
|
|
11088
11088
|
for (let j = 0; j < path3.length; j++) {
|
|
11089
11089
|
if (path3[j].length == 3)
|
|
11090
11090
|
continue;
|
|
11091
|
-
pathPt.set(path3[j][0], path3[j][1],
|
|
11092
|
-
if (pathPt.distanceTo(
|
|
11093
|
-
path3[j].push(
|
|
11091
|
+
pathPt.set(path3[j][0], path3[j][1], points[i].z);
|
|
11092
|
+
if (pathPt.distanceTo(points[i]) < 1e-3) {
|
|
11093
|
+
path3[j].push(points[i].z);
|
|
11094
11094
|
break;
|
|
11095
11095
|
}
|
|
11096
11096
|
}
|
|
@@ -14817,14 +14817,14 @@ function pointToSegDist(px, pz, x1, z1, x2, z2) {
|
|
|
14817
14817
|
const ez = pz - cz;
|
|
14818
14818
|
return Math.sqrt(ex * ex + ez * ez);
|
|
14819
14819
|
}
|
|
14820
|
-
function polygonArea2(
|
|
14821
|
-
if (
|
|
14820
|
+
function polygonArea2(points) {
|
|
14821
|
+
if (points.length < 3) return 0;
|
|
14822
14822
|
let area2 = 0;
|
|
14823
|
-
const n =
|
|
14823
|
+
const n = points.length;
|
|
14824
14824
|
for (let i = 0; i < n; i++) {
|
|
14825
14825
|
const j = (i + 1) % n;
|
|
14826
|
-
area2 +=
|
|
14827
|
-
area2 -=
|
|
14826
|
+
area2 += points[i].x * points[j].z;
|
|
14827
|
+
area2 -= points[j].x * points[i].z;
|
|
14828
14828
|
}
|
|
14829
14829
|
return Math.abs(area2) / 2;
|
|
14830
14830
|
}
|
|
@@ -15401,23 +15401,23 @@ function rotatePoint(x, z, angle) {
|
|
|
15401
15401
|
z: x * sin + z * cos
|
|
15402
15402
|
};
|
|
15403
15403
|
}
|
|
15404
|
-
function calcTotalLength(
|
|
15404
|
+
function calcTotalLength(points) {
|
|
15405
15405
|
let len = 0;
|
|
15406
|
-
for (let i = 1; i <
|
|
15407
|
-
const dx =
|
|
15408
|
-
const dz =
|
|
15406
|
+
for (let i = 1; i < points.length; i++) {
|
|
15407
|
+
const dx = points[i].x - points[i - 1].x;
|
|
15408
|
+
const dz = points[i].z - points[i - 1].z;
|
|
15409
15409
|
len += Math.sqrt(dx * dx + dz * dz);
|
|
15410
15410
|
}
|
|
15411
15411
|
return len;
|
|
15412
15412
|
}
|
|
15413
|
-
function polygonArea3(
|
|
15414
|
-
if (
|
|
15413
|
+
function polygonArea3(points) {
|
|
15414
|
+
if (points.length < 3) return 0;
|
|
15415
15415
|
let area2 = 0;
|
|
15416
|
-
const n =
|
|
15416
|
+
const n = points.length;
|
|
15417
15417
|
for (let i = 0; i < n; i++) {
|
|
15418
15418
|
const j = (i + 1) % n;
|
|
15419
|
-
area2 +=
|
|
15420
|
-
area2 -=
|
|
15419
|
+
area2 += points[i].x * points[j].z;
|
|
15420
|
+
area2 -= points[j].x * points[i].z;
|
|
15421
15421
|
}
|
|
15422
15422
|
return Math.abs(area2) / 2;
|
|
15423
15423
|
}
|
|
@@ -15463,10 +15463,10 @@ function minDistBetweenPolylines(a, b) {
|
|
|
15463
15463
|
}
|
|
15464
15464
|
|
|
15465
15465
|
// src/wall-shape-classifier/point-cloud.ts
|
|
15466
|
-
function buildDensityGrid(
|
|
15466
|
+
function buildDensityGrid(points, cellSize) {
|
|
15467
15467
|
const cells = /* @__PURE__ */ new Map();
|
|
15468
15468
|
let minX = Infinity, maxX = -Infinity, minZ = Infinity, maxZ = -Infinity;
|
|
15469
|
-
for (const p of
|
|
15469
|
+
for (const p of points) {
|
|
15470
15470
|
const cx = Math.floor(p.x / cellSize);
|
|
15471
15471
|
const cz = Math.floor(p.z / cellSize);
|
|
15472
15472
|
const key = cx + "," + cz;
|
|
@@ -15640,22 +15640,22 @@ function extractBoundaryContour(component, cellSize) {
|
|
|
15640
15640
|
}
|
|
15641
15641
|
return result;
|
|
15642
15642
|
}
|
|
15643
|
-
function simplifyPolyline(
|
|
15644
|
-
if (
|
|
15643
|
+
function simplifyPolyline(points, epsilon3) {
|
|
15644
|
+
if (points.length <= 2) return [...points];
|
|
15645
15645
|
let maxDist = 0;
|
|
15646
15646
|
let maxIdx = 0;
|
|
15647
|
-
const first =
|
|
15648
|
-
const last =
|
|
15649
|
-
for (let i = 1; i <
|
|
15650
|
-
const d = distToSegment(
|
|
15647
|
+
const first = points[0];
|
|
15648
|
+
const last = points[points.length - 1];
|
|
15649
|
+
for (let i = 1; i < points.length - 1; i++) {
|
|
15650
|
+
const d = distToSegment(points[i].x, points[i].z, first.x, first.z, last.x, last.z);
|
|
15651
15651
|
if (d > maxDist) {
|
|
15652
15652
|
maxDist = d;
|
|
15653
15653
|
maxIdx = i;
|
|
15654
15654
|
}
|
|
15655
15655
|
}
|
|
15656
15656
|
if (maxDist > epsilon3) {
|
|
15657
|
-
const left = simplifyPolyline(
|
|
15658
|
-
const right = simplifyPolyline(
|
|
15657
|
+
const left = simplifyPolyline(points.slice(0, maxIdx + 1), epsilon3);
|
|
15658
|
+
const right = simplifyPolyline(points.slice(maxIdx), epsilon3);
|
|
15659
15659
|
return [...left.slice(0, -1), ...right];
|
|
15660
15660
|
}
|
|
15661
15661
|
return [first, last];
|
|
@@ -16854,10 +16854,10 @@ function emptyResult(rawLines, startTime) {
|
|
|
16854
16854
|
}
|
|
16855
16855
|
|
|
16856
16856
|
// src/wall-shape-classifier/point-cloud-filter.ts
|
|
16857
|
-
function removeOutlierPoints(
|
|
16858
|
-
if (!
|
|
16857
|
+
function removeOutlierPoints(points, cellSize, minNeighbors) {
|
|
16858
|
+
if (!points.length || minNeighbors <= 1) return points;
|
|
16859
16859
|
const grid = /* @__PURE__ */ new Map();
|
|
16860
|
-
for (const p of
|
|
16860
|
+
for (const p of points) {
|
|
16861
16861
|
const gx = Math.floor(p.x / cellSize);
|
|
16862
16862
|
const gy = Math.floor(p.y / cellSize);
|
|
16863
16863
|
const key = `${gx},${gy}`;
|
|
@@ -16879,7 +16879,7 @@ function removeOutlierPoints(points2, cellSize, minNeighbors) {
|
|
|
16879
16879
|
}
|
|
16880
16880
|
const kept = [];
|
|
16881
16881
|
let removed = 0;
|
|
16882
|
-
for (const p of
|
|
16882
|
+
for (const p of points) {
|
|
16883
16883
|
const gx = Math.floor(p.x / cellSize);
|
|
16884
16884
|
const gy = Math.floor(p.y / cellSize);
|
|
16885
16885
|
const key = `${gx},${gy}`;
|
|
@@ -16891,10 +16891,10 @@ function removeOutlierPoints(points2, cellSize, minNeighbors) {
|
|
|
16891
16891
|
}
|
|
16892
16892
|
return kept;
|
|
16893
16893
|
}
|
|
16894
|
-
function applyVoxelFilter(
|
|
16895
|
-
if (!
|
|
16894
|
+
function applyVoxelFilter(points, voxelSize, minPointsPerVoxel) {
|
|
16895
|
+
if (!points.length || minPointsPerVoxel <= 1 || voxelSize <= 0) return points;
|
|
16896
16896
|
const grid = /* @__PURE__ */ new Map();
|
|
16897
|
-
for (const p of
|
|
16897
|
+
for (const p of points) {
|
|
16898
16898
|
const ix = Math.floor(p.x / voxelSize);
|
|
16899
16899
|
const iy = Math.floor(p.y / voxelSize);
|
|
16900
16900
|
const iz = Math.floor(p.z / voxelSize);
|
|
@@ -16913,9 +16913,9 @@ function applyVoxelFilter(points2, voxelSize, minPointsPerVoxel) {
|
|
|
16913
16913
|
}
|
|
16914
16914
|
return kept;
|
|
16915
16915
|
}
|
|
16916
|
-
function voxelFilter(
|
|
16917
|
-
const r = applyVoxelFilter(
|
|
16918
|
-
const removed =
|
|
16916
|
+
function voxelFilter(points, voxelSize, minPointsPerVoxel) {
|
|
16917
|
+
const r = applyVoxelFilter(points, voxelSize, minPointsPerVoxel);
|
|
16918
|
+
const removed = points.length - r.length;
|
|
16919
16919
|
return r;
|
|
16920
16920
|
}
|
|
16921
16921
|
function computeVoxelParams(data) {
|
|
@@ -17445,14 +17445,14 @@ function growPolylines(lines, connectDist, angleTolRad) {
|
|
|
17445
17445
|
}
|
|
17446
17446
|
return results;
|
|
17447
17447
|
}
|
|
17448
|
-
function computeTurnAngles(
|
|
17449
|
-
if (
|
|
17448
|
+
function computeTurnAngles(points) {
|
|
17449
|
+
if (points.length < 3) return [];
|
|
17450
17450
|
const deltas = [];
|
|
17451
|
-
for (let i = 1; i <
|
|
17452
|
-
const dx1 =
|
|
17453
|
-
const dz1 =
|
|
17454
|
-
const dx2 =
|
|
17455
|
-
const dz2 =
|
|
17451
|
+
for (let i = 1; i < points.length - 1; i++) {
|
|
17452
|
+
const dx1 = points[i].x - points[i - 1].x;
|
|
17453
|
+
const dz1 = points[i].z - points[i - 1].z;
|
|
17454
|
+
const dx2 = points[i + 1].x - points[i].x;
|
|
17455
|
+
const dz2 = points[i + 1].z - points[i].z;
|
|
17456
17456
|
const angle1 = Math.atan2(dz1, dx1);
|
|
17457
17457
|
const angle2 = Math.atan2(dz2, dx2);
|
|
17458
17458
|
let delta = normalizeAngle(angle2 - angle1);
|
|
@@ -17460,45 +17460,45 @@ function computeTurnAngles(points2) {
|
|
|
17460
17460
|
}
|
|
17461
17461
|
return deltas;
|
|
17462
17462
|
}
|
|
17463
|
-
function classifyType(
|
|
17464
|
-
if (
|
|
17465
|
-
const first =
|
|
17466
|
-
const last =
|
|
17463
|
+
function classifyType(points, minCurvePoints = 6) {
|
|
17464
|
+
if (points.length < 3) return "straight";
|
|
17465
|
+
const first = points[0];
|
|
17466
|
+
const last = points[points.length - 1];
|
|
17467
17467
|
const dx = last.x - first.x;
|
|
17468
17468
|
const dz = last.z - first.z;
|
|
17469
17469
|
const chordLen = Math.sqrt(dx * dx + dz * dz);
|
|
17470
17470
|
if (chordLen > 0.1) {
|
|
17471
17471
|
let maxDev = 0;
|
|
17472
|
-
for (const p of
|
|
17472
|
+
for (const p of points) {
|
|
17473
17473
|
const d = distToSegment(p.x, p.z, first.x, first.z, last.x, last.z);
|
|
17474
17474
|
if (d > maxDev) maxDev = d;
|
|
17475
17475
|
}
|
|
17476
17476
|
if (maxDev < 0.05) return "straight";
|
|
17477
17477
|
}
|
|
17478
|
-
const deltas = computeTurnAngles(
|
|
17478
|
+
const deltas = computeTurnAngles(points);
|
|
17479
17479
|
const totalBend = deltas.reduce((sum2, d) => sum2 + Math.abs(d), 0);
|
|
17480
17480
|
if (totalBend < 0.1) return "straight";
|
|
17481
|
-
if (
|
|
17481
|
+
if (points.length < minCurvePoints) return "straight";
|
|
17482
17482
|
let signChanges = 0;
|
|
17483
17483
|
for (let i = 0; i < deltas.length - 1; i++) {
|
|
17484
17484
|
if (deltas[i] * deltas[i + 1] < 0) signChanges++;
|
|
17485
17485
|
}
|
|
17486
17486
|
return signChanges > 0 ? "S_curve" : "C_curve";
|
|
17487
17487
|
}
|
|
17488
|
-
function splitAtHardCorners(
|
|
17489
|
-
if (
|
|
17488
|
+
function splitAtHardCorners(points, thresholdDeg) {
|
|
17489
|
+
if (points.length < 3) return [points];
|
|
17490
17490
|
const threshold = degToRad(thresholdDeg);
|
|
17491
|
-
const deltas = computeTurnAngles(
|
|
17491
|
+
const deltas = computeTurnAngles(points);
|
|
17492
17492
|
const segments = [];
|
|
17493
17493
|
let startIdx = 0;
|
|
17494
17494
|
for (let i = 0; i < deltas.length; i++) {
|
|
17495
17495
|
if (Math.abs(deltas[i]) > threshold) {
|
|
17496
|
-
segments.push(
|
|
17496
|
+
segments.push(points.slice(startIdx, i + 2));
|
|
17497
17497
|
startIdx = i + 1;
|
|
17498
17498
|
}
|
|
17499
17499
|
}
|
|
17500
|
-
if (startIdx <
|
|
17501
|
-
segments.push(
|
|
17500
|
+
if (startIdx < points.length - 1) {
|
|
17501
|
+
segments.push(points.slice(startIdx));
|
|
17502
17502
|
}
|
|
17503
17503
|
return segments;
|
|
17504
17504
|
}
|