rm-graphical-computing-node 1.0.71 → 1.0.73
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 +218 -202
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -774,11 +774,11 @@ var require_concaveman = __commonJS({
|
|
|
774
774
|
while (node) {
|
|
775
775
|
for (var i = 0; i < node.children.length; i++) {
|
|
776
776
|
var child = node.children[i];
|
|
777
|
-
var
|
|
778
|
-
if (
|
|
777
|
+
var dist2 = node.leaf ? sqSegDist(child, b, c) : sqSegBoxDist(b, c, child);
|
|
778
|
+
if (dist2 > maxDist) continue;
|
|
779
779
|
queue.push({
|
|
780
780
|
node: child,
|
|
781
|
-
dist:
|
|
781
|
+
dist: dist2
|
|
782
782
|
});
|
|
783
783
|
}
|
|
784
784
|
while (queue.length && !queue.peek().node.children) {
|
|
@@ -3087,8 +3087,8 @@ var removeNoisePoints = (lines, lineReader, lineEditor) => {
|
|
|
3087
3087
|
let ptCenter = line2.checkResults[g].allCenterPoints[h];
|
|
3088
3088
|
ptCenter = new THREE3.Vector3(ptCenter.x, ptCenter.y, ptCenter.z);
|
|
3089
3089
|
let ptClose = line3.closestPointToPoint(ptCenter, true, ptTarget);
|
|
3090
|
-
let
|
|
3091
|
-
if (Math.abs(
|
|
3090
|
+
let dist2 = ptCenter.distanceTo(ptClose);
|
|
3091
|
+
if (Math.abs(dist2 - halfLen) < 0.01) {
|
|
3092
3092
|
tmpNum++;
|
|
3093
3093
|
if (!removePtsIndexMap.has(g)) {
|
|
3094
3094
|
removePtsIndexMap.set(g, {
|
|
@@ -3234,9 +3234,9 @@ var getFarthestPoints = (points) => {
|
|
|
3234
3234
|
let result = [];
|
|
3235
3235
|
for (let i = 0; i < points.length; i++) {
|
|
3236
3236
|
for (let j = i + 1; j < points.length; j++) {
|
|
3237
|
-
const
|
|
3238
|
-
if (
|
|
3239
|
-
maxDist =
|
|
3237
|
+
const dist2 = points[i].distanceTo(points[j]);
|
|
3238
|
+
if (dist2 > maxDist) {
|
|
3239
|
+
maxDist = dist2;
|
|
3240
3240
|
result = [points[i], points[j]];
|
|
3241
3241
|
}
|
|
3242
3242
|
}
|
|
@@ -3482,10 +3482,10 @@ var voxelDownsample2DForContour = (points, cellSize) => {
|
|
|
3482
3482
|
if (y > cell.maxY[1]) cell.maxY = p;
|
|
3483
3483
|
const dx = x - cell.cx;
|
|
3484
3484
|
const dy = y - cell.cy;
|
|
3485
|
-
const
|
|
3486
|
-
if (
|
|
3485
|
+
const dist2 = dx * dx + dy * dy;
|
|
3486
|
+
if (dist2 < cell.centerDist2) {
|
|
3487
3487
|
cell.center = p;
|
|
3488
|
-
cell.centerDist2 =
|
|
3488
|
+
cell.centerDist2 = dist2;
|
|
3489
3489
|
}
|
|
3490
3490
|
}
|
|
3491
3491
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -3942,13 +3942,13 @@ var getBeamLine = async (lines, runDataList, pcdData, lineReader, lineEditor, on
|
|
|
3942
3942
|
let newDoorSt = new THREE5.Vector3(lines[u4].start.x, lines[u4].start.y, 0);
|
|
3943
3943
|
let newDoorEd = new THREE5.Vector3(lines[u4].end.x, lines[u4].end.y, 0);
|
|
3944
3944
|
let dist1 = door.doorStartPt.distanceTo(door.doorEndPt);
|
|
3945
|
-
let
|
|
3945
|
+
let dist2 = newDoorSt.distanceTo(newDoorEd);
|
|
3946
3946
|
let res = getParallelism(door.doorStartPt, door.doorEndPt, newDoorSt, newDoorEd);
|
|
3947
|
-
if (Math.abs(
|
|
3947
|
+
if (Math.abs(dist2 - dist1) < 0.5 && res && res.angleDeg < 10) {
|
|
3948
3948
|
door.doorStartPt = new THREE5.Vector3(lines[u4].start.x, lines[u4].start.y, 0);
|
|
3949
3949
|
door.doorEndPt = new THREE5.Vector3(lines[u4].end.x, lines[u4].end.y, 0);
|
|
3950
3950
|
break;
|
|
3951
|
-
} else if (Math.abs(
|
|
3951
|
+
} else if (Math.abs(dist2 - dist1) > 1.3 && res && res.angleDeg < 10) {
|
|
3952
3952
|
let restmp = classifySegments(door.doorStartPt, door.doorEndPt, newDoorSt, newDoorEd, { parallelAngleMax: THREE5.MathUtils.degToRad(15) });
|
|
3953
3953
|
let dist11 = door.doorStartPt.distanceTo(newDoorSt);
|
|
3954
3954
|
let dist12 = door.doorStartPt.distanceTo(newDoorEd);
|
|
@@ -3963,8 +3963,8 @@ var getBeamLine = async (lines, runDataList, pcdData, lineReader, lineEditor, on
|
|
|
3963
3963
|
let resTmp1 = lineTmp33.closestPointToPoint(door.doorStartPt, true, new THREE5.Vector3());
|
|
3964
3964
|
let resTmp2 = lineTmp33.closestPointToPoint(door.doorEndPt, true, new THREE5.Vector3());
|
|
3965
3965
|
let dist15 = resTmp1.distanceTo(door.doorStartPt);
|
|
3966
|
-
let
|
|
3967
|
-
if (dist15 < 0.1 ||
|
|
3966
|
+
let dist22 = resTmp2.distanceTo(door.doorEndPt);
|
|
3967
|
+
if (dist15 < 0.1 || dist22 < 0.1) {
|
|
3968
3968
|
door.inWall = true;
|
|
3969
3969
|
break;
|
|
3970
3970
|
}
|
|
@@ -4392,14 +4392,14 @@ var getBeamLine = async (lines, runDataList, pcdData, lineReader, lineEditor, on
|
|
|
4392
4392
|
let line3 = new THREE5.Line3(new THREE5.Vector3(line2.start.x, line2.start.y, 0), new THREE5.Vector3(line2.end.x, line2.end.y, 0));
|
|
4393
4393
|
let targeVec = new THREE5.Vector3();
|
|
4394
4394
|
let ptClose = line3.closestPointToPoint(ptCenter, true, targeVec);
|
|
4395
|
-
let
|
|
4396
|
-
if (
|
|
4395
|
+
let dist2 = ptCenter.distanceTo(ptClose);
|
|
4396
|
+
if (dist2 < 0.15) {
|
|
4397
4397
|
let dist1 = beamSt.distanceTo(doorSt);
|
|
4398
4398
|
let dist22 = beamEd.distanceTo(doorSt);
|
|
4399
4399
|
if (dist1 > 0.25 && dist22 > 0.25) {
|
|
4400
|
-
let
|
|
4400
|
+
let dist3 = beamSt.distanceTo(doorEd);
|
|
4401
4401
|
let dist4 = beamEd.distanceTo(doorEd);
|
|
4402
|
-
if (
|
|
4402
|
+
if (dist3 > 0.2 && dist4 > 0.2) {
|
|
4403
4403
|
continue;
|
|
4404
4404
|
}
|
|
4405
4405
|
}
|
|
@@ -4434,10 +4434,10 @@ var getBeamLine = async (lines, runDataList, pcdData, lineReader, lineEditor, on
|
|
|
4434
4434
|
if (Math.abs(distTmp1 - result.overlap) < 0.25 || Math.abs(distTmp2 - result.overlap) < 0.25) {
|
|
4435
4435
|
if (distTmp2 > distTmp1 && Math.abs(distTmp2 - result.overlap) > 1) {
|
|
4436
4436
|
let dist1 = beamSt.distanceTo(doorSt);
|
|
4437
|
-
let
|
|
4437
|
+
let dist2 = beamSt.distanceTo(doorEd);
|
|
4438
4438
|
let dist3 = beamEd.distanceTo(doorSt);
|
|
4439
4439
|
let dist4 = beamEd.distanceTo(doorEd);
|
|
4440
|
-
let dist5 = dist1 <
|
|
4440
|
+
let dist5 = dist1 < dist2 ? dist1 : dist2;
|
|
4441
4441
|
let dist6 = dist3 < dist4 ? dist3 : dist4;
|
|
4442
4442
|
let beamVec = new THREE5.Vector3().subVectors(beamSt, beamEd).normalize();
|
|
4443
4443
|
let addDoorLen = distTmp2 - result.overlap;
|
|
@@ -4783,13 +4783,13 @@ var getBeamLine = async (lines, runDataList, pcdData, lineReader, lineEditor, on
|
|
|
4783
4783
|
}
|
|
4784
4784
|
let targetVector = new THREE5.Vector3();
|
|
4785
4785
|
let ptClose = line3.closestPointToPoint(ptCenter, true, targetVector);
|
|
4786
|
-
let
|
|
4786
|
+
let dist2 = ptClose.distanceTo(ptCenter);
|
|
4787
4787
|
let vec2 = new THREE5.Vector3().subVectors(ptCenter, ptClose).normalize();
|
|
4788
4788
|
let vecNegate = vec2.clone().negate();
|
|
4789
|
-
let ptCenterOther = ptCenter.clone().addScaledVector(vecNegate,
|
|
4789
|
+
let ptCenterOther = ptCenter.clone().addScaledVector(vecNegate, dist2 + 0.1);
|
|
4790
4790
|
let isInsert = segmentsIntersect2D(line3.start, line3.end, ptCenter, ptCenterOther);
|
|
4791
4791
|
let isTrue = !isDoor && !tmpDoorBeamData.isDoor && (length1 > length22 * 2.5 || length22 > length1 * 2.5);
|
|
4792
|
-
if (
|
|
4792
|
+
if (dist2 < 0.5 && isInsert != null && !isTrue) {
|
|
4793
4793
|
let isSameLine = false;
|
|
4794
4794
|
for (let v2 = 0; v2 < line2.doorAndBeamData.length; v2++) {
|
|
4795
4795
|
if (line2.doorAndBeamData[v2].id == tmpDoorBeamData.id) {
|
|
@@ -4836,28 +4836,28 @@ var getBeamLine = async (lines, runDataList, pcdData, lineReader, lineEditor, on
|
|
|
4836
4836
|
vec2 = vec2.negate();
|
|
4837
4837
|
}
|
|
4838
4838
|
if (length1 > minDoorLength2 && !tmpDoorBeamData.isPullOutDoor) {
|
|
4839
|
-
tmpDoorBeamData.beamStart = beamTmpSt.clone().addScaledVector(vecNegate,
|
|
4840
|
-
tmpDoorBeamData.beamEnd = beamTmpEd.clone().addScaledVector(vecNegate,
|
|
4841
|
-
tmpDoorBeamData.doorStart = doorTmpSt.clone().addScaledVector(vecNegate,
|
|
4842
|
-
tmpDoorBeamData.doorEnd = doorTmpEd.clone().addScaledVector(vecNegate,
|
|
4839
|
+
tmpDoorBeamData.beamStart = beamTmpSt.clone().addScaledVector(vecNegate, dist2);
|
|
4840
|
+
tmpDoorBeamData.beamEnd = beamTmpEd.clone().addScaledVector(vecNegate, dist2);
|
|
4841
|
+
tmpDoorBeamData.doorStart = doorTmpSt.clone().addScaledVector(vecNegate, dist2);
|
|
4842
|
+
tmpDoorBeamData.doorEnd = doorTmpEd.clone().addScaledVector(vecNegate, dist2);
|
|
4843
4843
|
tmpDoorBeamData.doorHeight = doorAndBeamDataObj.doorHeight;
|
|
4844
4844
|
tmpDoorBeamData.beamStart.z = tmpDoorBeamData.beamEnd.z = tmpDoorBeamData.doorStart.z + tmpDoorBeamData.doorHeight;
|
|
4845
4845
|
tmpDoorBeamData.doorOpenEndPoint = doorAndBeamDataObj.doorOpenEndPoint.clone();
|
|
4846
4846
|
tmpDoorBeamData.doorOpenVector = doorAndBeamDataObj.doorOpenVector.clone();
|
|
4847
4847
|
} else if (!isPullOutDoor || isPullOutDoor && tmpDoorBeamData.isPullOutDoor && hasCommon) {
|
|
4848
|
-
doorAndBeamDataObj.beamStart = tmpDoorBeamData.beamStart.clone().addScaledVector(vec2,
|
|
4849
|
-
doorAndBeamDataObj.beamEnd = tmpDoorBeamData.beamEnd.clone().addScaledVector(vec2,
|
|
4850
|
-
doorAndBeamDataObj.doorStart = tmpDoorBeamData.doorStart.clone().addScaledVector(vec2,
|
|
4851
|
-
doorAndBeamDataObj.doorEnd = tmpDoorBeamData.doorEnd.clone().addScaledVector(vec2,
|
|
4848
|
+
doorAndBeamDataObj.beamStart = tmpDoorBeamData.beamStart.clone().addScaledVector(vec2, dist2);
|
|
4849
|
+
doorAndBeamDataObj.beamEnd = tmpDoorBeamData.beamEnd.clone().addScaledVector(vec2, dist2);
|
|
4850
|
+
doorAndBeamDataObj.doorStart = tmpDoorBeamData.doorStart.clone().addScaledVector(vec2, dist2);
|
|
4851
|
+
doorAndBeamDataObj.doorEnd = tmpDoorBeamData.doorEnd.clone().addScaledVector(vec2, dist2);
|
|
4852
4852
|
doorAndBeamDataObj.doorHeight = tmpDoorBeamData.doorHeight;
|
|
4853
4853
|
doorAndBeamDataObj.beamStart.z = doorAndBeamDataObj.beamEnd.z = doorAndBeamDataObj.doorStart.z + doorAndBeamDataObj.doorHeight;
|
|
4854
4854
|
doorAndBeamDataObj.doorOpenEndPoint = tmpDoorBeamData.doorOpenEndPoint.clone();
|
|
4855
4855
|
doorAndBeamDataObj.doorOpenVector = tmpDoorBeamData.doorOpenVector.clone();
|
|
4856
4856
|
} else {
|
|
4857
|
-
tmpDoorBeamData.beamStart = beamTmpSt.clone().addScaledVector(vecNegate,
|
|
4858
|
-
tmpDoorBeamData.beamEnd = beamTmpEd.clone().addScaledVector(vecNegate,
|
|
4859
|
-
tmpDoorBeamData.doorStart = doorTmpSt.clone().addScaledVector(vecNegate,
|
|
4860
|
-
tmpDoorBeamData.doorEnd = doorTmpEd.clone().addScaledVector(vecNegate,
|
|
4857
|
+
tmpDoorBeamData.beamStart = beamTmpSt.clone().addScaledVector(vecNegate, dist2);
|
|
4858
|
+
tmpDoorBeamData.beamEnd = beamTmpEd.clone().addScaledVector(vecNegate, dist2);
|
|
4859
|
+
tmpDoorBeamData.doorStart = doorTmpSt.clone().addScaledVector(vecNegate, dist2);
|
|
4860
|
+
tmpDoorBeamData.doorEnd = doorTmpEd.clone().addScaledVector(vecNegate, dist2);
|
|
4861
4861
|
tmpDoorBeamData.doorHeight = doorAndBeamDataObj.doorHeight;
|
|
4862
4862
|
tmpDoorBeamData.beamStart.z = tmpDoorBeamData.beamEnd.z = tmpDoorBeamData.doorStart.z + tmpDoorBeamData.doorHeight;
|
|
4863
4863
|
tmpDoorBeamData.doorOpenEndPoint = doorAndBeamDataObj.doorOpenEndPoint.clone();
|
|
@@ -4869,28 +4869,28 @@ var getBeamLine = async (lines, runDataList, pcdData, lineReader, lineEditor, on
|
|
|
4869
4869
|
vec2 = vec2.negate();
|
|
4870
4870
|
}
|
|
4871
4871
|
if (length22 > minDoorLength2 && !isPullOutDoor) {
|
|
4872
|
-
doorAndBeamDataObj.beamStart = tmpDoorBeamData.beamStart.clone().addScaledVector(vecNegate,
|
|
4873
|
-
doorAndBeamDataObj.beamEnd = tmpDoorBeamData.beamEnd.clone().addScaledVector(vecNegate,
|
|
4874
|
-
doorAndBeamDataObj.doorStart = tmpDoorBeamData.doorStart.clone().addScaledVector(vecNegate,
|
|
4875
|
-
doorAndBeamDataObj.doorEnd = tmpDoorBeamData.doorEnd.clone().addScaledVector(vecNegate,
|
|
4872
|
+
doorAndBeamDataObj.beamStart = tmpDoorBeamData.beamStart.clone().addScaledVector(vecNegate, dist2);
|
|
4873
|
+
doorAndBeamDataObj.beamEnd = tmpDoorBeamData.beamEnd.clone().addScaledVector(vecNegate, dist2);
|
|
4874
|
+
doorAndBeamDataObj.doorStart = tmpDoorBeamData.doorStart.clone().addScaledVector(vecNegate, dist2);
|
|
4875
|
+
doorAndBeamDataObj.doorEnd = tmpDoorBeamData.doorEnd.clone().addScaledVector(vecNegate, dist2);
|
|
4876
4876
|
doorAndBeamDataObj.doorHeight = tmpDoorBeamData.doorHeight;
|
|
4877
4877
|
doorAndBeamDataObj.beamStart.z = doorAndBeamDataObj.beamEnd.z = doorAndBeamDataObj.doorStart.z + doorAndBeamDataObj.doorHeight;
|
|
4878
4878
|
doorAndBeamDataObj.doorOpenEndPoint = tmpDoorBeamData.doorOpenEndPoint.clone();
|
|
4879
4879
|
doorAndBeamDataObj.doorOpenVector = tmpDoorBeamData.doorOpenVector.clone();
|
|
4880
4880
|
} else if (!tmpDoorBeamData.isPullOutDoor || isPullOutDoor && tmpDoorBeamData.isPullOutDoor && hasCommon) {
|
|
4881
|
-
tmpDoorBeamData.beamStart = beamTmpSt.clone().addScaledVector(vec2,
|
|
4882
|
-
tmpDoorBeamData.beamEnd = beamTmpEd.clone().addScaledVector(vec2,
|
|
4883
|
-
tmpDoorBeamData.doorStart = doorTmpSt.clone().addScaledVector(vec2,
|
|
4884
|
-
tmpDoorBeamData.doorEnd = doorTmpEd.clone().addScaledVector(vec2,
|
|
4881
|
+
tmpDoorBeamData.beamStart = beamTmpSt.clone().addScaledVector(vec2, dist2);
|
|
4882
|
+
tmpDoorBeamData.beamEnd = beamTmpEd.clone().addScaledVector(vec2, dist2);
|
|
4883
|
+
tmpDoorBeamData.doorStart = doorTmpSt.clone().addScaledVector(vec2, dist2);
|
|
4884
|
+
tmpDoorBeamData.doorEnd = doorTmpEd.clone().addScaledVector(vec2, dist2);
|
|
4885
4885
|
tmpDoorBeamData.doorHeight = doorAndBeamDataObj.doorHeight;
|
|
4886
4886
|
tmpDoorBeamData.beamStart.z = tmpDoorBeamData.beamEnd.z = tmpDoorBeamData.doorStart.z + tmpDoorBeamData.doorHeight;
|
|
4887
4887
|
tmpDoorBeamData.doorOpenEndPoint = doorAndBeamDataObj.doorOpenEndPoint.clone();
|
|
4888
4888
|
tmpDoorBeamData.doorOpenVector = doorAndBeamDataObj.doorOpenVector.clone();
|
|
4889
4889
|
} else {
|
|
4890
|
-
doorAndBeamDataObj.beamStart = tmpDoorBeamData.beamStart.clone().addScaledVector(vecNegate,
|
|
4891
|
-
doorAndBeamDataObj.beamEnd = tmpDoorBeamData.beamEnd.clone().addScaledVector(vecNegate,
|
|
4892
|
-
doorAndBeamDataObj.doorStart = tmpDoorBeamData.doorStart.clone().addScaledVector(vecNegate,
|
|
4893
|
-
doorAndBeamDataObj.doorEnd = tmpDoorBeamData.doorEnd.clone().addScaledVector(vecNegate,
|
|
4890
|
+
doorAndBeamDataObj.beamStart = tmpDoorBeamData.beamStart.clone().addScaledVector(vecNegate, dist2);
|
|
4891
|
+
doorAndBeamDataObj.beamEnd = tmpDoorBeamData.beamEnd.clone().addScaledVector(vecNegate, dist2);
|
|
4892
|
+
doorAndBeamDataObj.doorStart = tmpDoorBeamData.doorStart.clone().addScaledVector(vecNegate, dist2);
|
|
4893
|
+
doorAndBeamDataObj.doorEnd = tmpDoorBeamData.doorEnd.clone().addScaledVector(vecNegate, dist2);
|
|
4894
4894
|
doorAndBeamDataObj.doorHeight = tmpDoorBeamData.doorHeight;
|
|
4895
4895
|
doorAndBeamDataObj.beamStart.z = doorAndBeamDataObj.beamEnd.z = doorAndBeamDataObj.doorStart.z + doorAndBeamDataObj.doorHeight;
|
|
4896
4896
|
doorAndBeamDataObj.doorOpenEndPoint = tmpDoorBeamData.doorOpenEndPoint.clone();
|
|
@@ -5069,19 +5069,19 @@ var getBeamLine = async (lines, runDataList, pcdData, lineReader, lineEditor, on
|
|
|
5069
5069
|
let ptClose1 = line3.closestPointToPoint(beamStOther, true, target);
|
|
5070
5070
|
let ptClose2 = line3.closestPointToPoint(beamEdOther, true, target);
|
|
5071
5071
|
let dist1 = ptClose1.distanceTo(beamStOther);
|
|
5072
|
-
let
|
|
5072
|
+
let dist2 = ptClose2.distanceTo(beamEdOther);
|
|
5073
5073
|
let doorStartPt, doorEndPt;
|
|
5074
|
-
if (dist1 >
|
|
5074
|
+
if (dist1 > dist2 && dist2 > minDoorLength) {
|
|
5075
5075
|
doorStartPt = beamEdOther;
|
|
5076
5076
|
doorEndPt = ptClose2;
|
|
5077
|
-
} else if (dist1 <
|
|
5077
|
+
} else if (dist1 < dist2 && dist1 > minDoorLength) {
|
|
5078
5078
|
doorStartPt = beamStOther;
|
|
5079
5079
|
doorEndPt = ptClose1;
|
|
5080
5080
|
} else
|
|
5081
5081
|
continue;
|
|
5082
5082
|
dist1 = nearDoorPt.distanceTo(beamStOther);
|
|
5083
|
-
|
|
5084
|
-
if (dist1 > maxDoorLength &&
|
|
5083
|
+
dist2 = nearDoorPt.distanceTo(beamEdOther);
|
|
5084
|
+
if (dist1 > maxDoorLength && dist2 > maxDoorLength)
|
|
5085
5085
|
continue;
|
|
5086
5086
|
let isPP2 = getParallelism(doorStartPt, doorEndPt, beamStOther, beamEdOther);
|
|
5087
5087
|
let isPPP = getParallelism(doorStartPt, doorEndPt, doorStExtended, doorEdExtended);
|
|
@@ -5409,7 +5409,6 @@ var findClosedRegionUuidGroups = (inputSegments, options = {}) => {
|
|
|
5409
5409
|
for (const seg of segments) {
|
|
5410
5410
|
const a2 = project(seg.start);
|
|
5411
5411
|
const b2 = project(seg.end);
|
|
5412
|
-
if (dist2(a2, b2) < EPS * EPS) continue;
|
|
5413
5412
|
const va = getVertexId(a2);
|
|
5414
5413
|
const vb = getVertexId(b2);
|
|
5415
5414
|
if (va === vb) continue;
|
|
@@ -5572,9 +5571,6 @@ function splitSegmentsAtIntersections(inputSegments, project, EPS = 1e-6) {
|
|
|
5572
5571
|
for (let k = 0; k < uniquePoints.length - 1; k++) {
|
|
5573
5572
|
const p1 = uniquePoints[k].point;
|
|
5574
5573
|
const p2 = uniquePoints[k + 1].point;
|
|
5575
|
-
const p12 = project(p1);
|
|
5576
|
-
const p22 = project(p2);
|
|
5577
|
-
if (dist2(p12, p22) < EPS * EPS) continue;
|
|
5578
5574
|
result.push({
|
|
5579
5575
|
start: p1,
|
|
5580
5576
|
end: p2,
|
|
@@ -5620,11 +5616,6 @@ function segmentIntersection(p1, p2, q1, q2, EPS = 1e-6) {
|
|
|
5620
5616
|
function cross2(a, b) {
|
|
5621
5617
|
return a.x * b.y - a.y * b.x;
|
|
5622
5618
|
}
|
|
5623
|
-
function dist2(a, b) {
|
|
5624
|
-
const dx = a.x - b.x;
|
|
5625
|
-
const dy = a.y - b.y;
|
|
5626
|
-
return dx * dx + dy * dy;
|
|
5627
|
-
}
|
|
5628
5619
|
function signedArea(points) {
|
|
5629
5620
|
let area2 = 0;
|
|
5630
5621
|
for (let i = 0; i < points.length; i++) {
|
|
@@ -5665,7 +5656,8 @@ var getColLine = async (lines, runDataList, collectDataPath, pointCloudCluster =
|
|
|
5665
5656
|
threeEdgeRect: []
|
|
5666
5657
|
};
|
|
5667
5658
|
let isFindColIndexs = /* @__PURE__ */ new Set();
|
|
5668
|
-
let minColLineLength = 0.
|
|
5659
|
+
let minColLineLength = 0.01;
|
|
5660
|
+
let threeMinColLineLength = 0.15;
|
|
5669
5661
|
let maxColLineLength = 2;
|
|
5670
5662
|
let minArea = 0.1;
|
|
5671
5663
|
let maxArea = 2.5;
|
|
@@ -5814,7 +5806,7 @@ var getColLine = async (lines, runDataList, collectDataPath, pointCloudCluster =
|
|
|
5814
5806
|
let isEq6 = ptIsEqual(startPt4, endPt1);
|
|
5815
5807
|
let isEq7 = ptIsEqual(endPt4, startPt1);
|
|
5816
5808
|
let isEq8 = ptIsEqual(endPt4, endPt1);
|
|
5817
|
-
if (isEq5 || isEq6 || isEq7 || isEq8) {
|
|
5809
|
+
if ((isEq5 || isEq6 || isEq7 || isEq8) && length1 < length2 * 3 && length2 < length1 * 3) {
|
|
5818
5810
|
isRect = true;
|
|
5819
5811
|
} else {
|
|
5820
5812
|
for (let m = l + 1; m < result[i].lineIndexes.length; m++) {
|
|
@@ -5850,8 +5842,10 @@ var getColLine = async (lines, runDataList, collectDataPath, pointCloudCluster =
|
|
|
5850
5842
|
isEq7 = ptIsEqual(endPt4, startPt1);
|
|
5851
5843
|
isEq8 = ptIsEqual(endPt4, endPt1);
|
|
5852
5844
|
if (isEq5 || isEq6 || isEq7 || isEq8) {
|
|
5853
|
-
|
|
5854
|
-
|
|
5845
|
+
if (length1 < length2 * 3 && length2 < length1 * 3) {
|
|
5846
|
+
isRect = true;
|
|
5847
|
+
break;
|
|
5848
|
+
}
|
|
5855
5849
|
}
|
|
5856
5850
|
}
|
|
5857
5851
|
}
|
|
@@ -5872,7 +5866,7 @@ var getColLine = async (lines, runDataList, collectDataPath, pointCloudCluster =
|
|
|
5872
5866
|
}
|
|
5873
5867
|
for (let i = 0; i < lines.length; i++) {
|
|
5874
5868
|
let length1 = lines[i].length;
|
|
5875
|
-
if (isFindColIndexs.has(lines[i].uuid) || length1 <
|
|
5869
|
+
if (isFindColIndexs.has(lines[i].uuid) || length1 < threeMinColLineLength || length1 > maxColLineLength)
|
|
5876
5870
|
continue;
|
|
5877
5871
|
let colIndexs = {
|
|
5878
5872
|
uuids: [],
|
|
@@ -5911,7 +5905,7 @@ var getColLine = async (lines, runDataList, collectDataPath, pointCloudCluster =
|
|
|
5911
5905
|
let vec2 = vec1.clone().negate();
|
|
5912
5906
|
for (let j = 0; j < lines.length; j++) {
|
|
5913
5907
|
let length2 = lines[j].length;
|
|
5914
|
-
if (j == i || isFindColIndexs.has(j) || length2 <
|
|
5908
|
+
if (j == i || isFindColIndexs.has(j) || length2 < threeMinColLineLength || length2 > maxColLineLength)
|
|
5915
5909
|
continue;
|
|
5916
5910
|
let startPt2 = new THREE6.Vector3(lines[j].start.x, lines[j].start.y, lines[j].start.z);
|
|
5917
5911
|
let endPt2 = new THREE6.Vector3(lines[j].end.x, lines[j].end.y, lines[j].end.z);
|
|
@@ -5932,7 +5926,7 @@ var getColLine = async (lines, runDataList, collectDataPath, pointCloudCluster =
|
|
|
5932
5926
|
}
|
|
5933
5927
|
for (let k = 0; k < lines.length; k++) {
|
|
5934
5928
|
let length3 = lines[k].length;
|
|
5935
|
-
if (k == i || k == j || isFindColIndexs.has(k) || length3 <
|
|
5929
|
+
if (k == i || k == j || isFindColIndexs.has(k) || length3 < threeMinColLineLength || length3 > maxColLineLength)
|
|
5936
5930
|
continue;
|
|
5937
5931
|
let startPt3 = new THREE6.Vector3(lines[k].start.x, lines[k].start.y, lines[k].start.z);
|
|
5938
5932
|
let endPt3 = new THREE6.Vector3(lines[k].end.x, lines[k].end.y, lines[k].end.z);
|
|
@@ -8081,8 +8075,8 @@ function calculateRhumbDistance(origin, destination, radius) {
|
|
|
8081
8075
|
const delta = Math.sqrt(
|
|
8082
8076
|
DeltaPhi * DeltaPhi + q * q * DeltaLambda * DeltaLambda
|
|
8083
8077
|
);
|
|
8084
|
-
const
|
|
8085
|
-
return
|
|
8078
|
+
const dist2 = delta * R;
|
|
8079
|
+
return dist2;
|
|
8086
8080
|
}
|
|
8087
8081
|
|
|
8088
8082
|
// node_modules/@turf/rhumb-destination/dist/esm/index.js
|
|
@@ -10113,7 +10107,7 @@ var getStaircase = (allProjectionResults, scene) => {
|
|
|
10113
10107
|
let isP = perpendicularInfo(ptBottom3i, ptBottom1i, ptBottom3j, ptBottom1j);
|
|
10114
10108
|
if (isP && isP.angle > 75) {
|
|
10115
10109
|
let dist1 = ptBottom1j.distanceTo(ptTop1i);
|
|
10116
|
-
let
|
|
10110
|
+
let dist2 = ptBottom1j.distanceTo(ptTop2i);
|
|
10117
10111
|
let dist3 = ptBottom2j.distanceTo(ptTop1i);
|
|
10118
10112
|
let dist4 = ptBottom2j.distanceTo(ptTop2i);
|
|
10119
10113
|
let retcBotton1j = ptTop1i.clone();
|
|
@@ -10125,8 +10119,8 @@ var getStaircase = (allProjectionResults, scene) => {
|
|
|
10125
10119
|
let newTop1j = retcBotton1j.clone().addScaledVector(vecMove, stairDatas[j].stairLength);
|
|
10126
10120
|
let newTop2j = rectBotton2j.clone().addScaledVector(vecMove, stairDatas[j].stairLength);
|
|
10127
10121
|
let nearDist = dist1;
|
|
10128
|
-
if (nearDist >
|
|
10129
|
-
nearDist =
|
|
10122
|
+
if (nearDist > dist2 || nearDist > dist4) {
|
|
10123
|
+
nearDist = dist2;
|
|
10130
10124
|
retcBotton1j = ptTop2i.clone();
|
|
10131
10125
|
rectBotton2j = retcBotton1j.clone().addScaledVector(vecStepWidthi, stairDatas[j].staitWidth);
|
|
10132
10126
|
vecMove = new THREE8.Vector3().subVectors(ptTop1i, ptTop2i).normalize();
|
|
@@ -10354,12 +10348,12 @@ function getStaircaseFloor(stairDatas, finalFloorMap) {
|
|
|
10354
10348
|
for (let f = 0; f < floorPoints.length; f++) {
|
|
10355
10349
|
let tmpFloorPoint = new THREE8.Vector3(floorPoints[f].x, floorPoints[f].y, ptTmpTmpBottom1i.z);
|
|
10356
10350
|
let ptTmpClose = tmpTmpLine.closestPointToPoint(tmpFloorPoint, false, new THREE8.Vector3());
|
|
10357
|
-
let
|
|
10351
|
+
let dist2 = ptTmpClose.distanceTo(tmpFloorPoint);
|
|
10358
10352
|
let ptTmpClose2 = tmpTmpLine2.closestPointToPoint(tmpFloorPoint, false, new THREE8.Vector3());
|
|
10359
10353
|
let tmpVec = new THREE8.Vector3().subVectors(tmpFloorPoint, ptTmpClose2).normalize();
|
|
10360
10354
|
const isP = isParallel(tmpVec, stairDatas[i].vecStepWidth.clone().negate(), 0.1);
|
|
10361
|
-
if (
|
|
10362
|
-
maxDist =
|
|
10355
|
+
if (dist2 < maxDist && isP.sameDirection) {
|
|
10356
|
+
maxDist = dist2;
|
|
10363
10357
|
moveDist = tmpFloorPoint.distanceTo(ptTmpClose2);
|
|
10364
10358
|
nearPt = tmpFloorPoint.clone();
|
|
10365
10359
|
nearPtZ = floorPoints[f].z;
|
|
@@ -10383,10 +10377,10 @@ function getStaircaseFloor(stairDatas, finalFloorMap) {
|
|
|
10383
10377
|
let ptTmpClose = tmpTmpLine.closestPointToPoint(tmpFloorPoint, false, new THREE8.Vector3());
|
|
10384
10378
|
let ptTmpClose2 = tmpTmpLine2.closestPointToPoint(tmpFloorPoint, false, new THREE8.Vector3());
|
|
10385
10379
|
let tmpVec = new THREE8.Vector3().subVectors(tmpFloorPoint, ptTmpClose2).normalize();
|
|
10386
|
-
let
|
|
10380
|
+
let dist2 = ptTmpClose.distanceTo(tmpFloorPoint);
|
|
10387
10381
|
const isP = isParallel(tmpVec, stairDatas[i].vecStepWidth);
|
|
10388
|
-
if (
|
|
10389
|
-
maxDist =
|
|
10382
|
+
if (dist2 < maxDist && isP.sameDirection) {
|
|
10383
|
+
maxDist = dist2;
|
|
10390
10384
|
moveDist = tmpFloorPoint.distanceTo(ptTmpClose2);
|
|
10391
10385
|
nearPt = tmpFloorPoint;
|
|
10392
10386
|
nearPtZ = floorPoints[f].z;
|
|
@@ -11150,6 +11144,8 @@ var getFlatFloorData = (lines, runDataList, pointCloudCluster = null) => {
|
|
|
11150
11144
|
avaregPzs.push(1e4);
|
|
11151
11145
|
}
|
|
11152
11146
|
}
|
|
11147
|
+
if (maxContourIndex == -1)
|
|
11148
|
+
return null;
|
|
11153
11149
|
return {
|
|
11154
11150
|
contour: floorDatas[maxContourIndex].contour,
|
|
11155
11151
|
averagePz: avaregPzs[maxContourIndex]
|
|
@@ -11474,7 +11470,7 @@ var getWindowData = (lines, pcdData, lineReader) => {
|
|
|
11474
11470
|
for (let i = 0; i < pcdData.length; i++) {
|
|
11475
11471
|
const window = pcdData[i];
|
|
11476
11472
|
window.isFindWindow = false;
|
|
11477
|
-
if (window.category == "window") {
|
|
11473
|
+
if (window.category == "window" && !window.isBayWindowObj) {
|
|
11478
11474
|
let boxPoints = [];
|
|
11479
11475
|
window.coordinatesByArea.coordinates.forEach((p) => {
|
|
11480
11476
|
boxPoints.push(new THREE10.Vector3(p.x, p.y, p.z));
|
|
@@ -11658,14 +11654,14 @@ var getWindowData = (lines, pcdData, lineReader) => {
|
|
|
11658
11654
|
let line3 = new THREE10.Line3(new THREE10.Vector3(line2.start.x, line2.start.y, 0), new THREE10.Vector3(line2.end.x, line2.end.y, 0));
|
|
11659
11655
|
let targeVec = new THREE10.Vector3();
|
|
11660
11656
|
let ptClose = line3.closestPointToPoint(ptCenter, true, targeVec);
|
|
11661
|
-
let
|
|
11662
|
-
if (
|
|
11657
|
+
let dist2 = ptCenter.distanceTo(ptClose);
|
|
11658
|
+
if (dist2 < 0.15) {
|
|
11663
11659
|
let dist1 = beamSt.distanceTo(doorSt);
|
|
11664
11660
|
let dist22 = beamEd.distanceTo(doorSt);
|
|
11665
11661
|
if (dist1 > 0.25 && dist22 > 0.25) {
|
|
11666
|
-
let
|
|
11662
|
+
let dist3 = beamSt.distanceTo(doorEd);
|
|
11667
11663
|
let dist4 = beamEd.distanceTo(doorEd);
|
|
11668
|
-
if (
|
|
11664
|
+
if (dist3 > 0.2 && dist4 > 0.2) {
|
|
11669
11665
|
continue;
|
|
11670
11666
|
}
|
|
11671
11667
|
}
|
|
@@ -11845,104 +11841,124 @@ var getWindowData = (lines, pcdData, lineReader) => {
|
|
|
11845
11841
|
let afterDoorLen = doorTmpEd.distanceTo(doorTmpSt);
|
|
11846
11842
|
if (afterDoorLen < 0.4 && !isWindow || afterDoorLen < 0.3 && isWindow)
|
|
11847
11843
|
continue;
|
|
11848
|
-
const windowLine = new THREE10.Line3(doorTmpSt, doorTmpEd);
|
|
11849
11844
|
const windowPcd = windowDatas[findDoorDataIndex];
|
|
11850
11845
|
const windowPcdSt = windowPcd.windowStartPt.clone();
|
|
11851
11846
|
const windowPcdEd = windowPcd.windowEndPt.clone();
|
|
11852
|
-
const
|
|
11853
|
-
|
|
11854
|
-
|
|
11855
|
-
|
|
11856
|
-
let
|
|
11857
|
-
|
|
11858
|
-
|
|
11859
|
-
|
|
11860
|
-
|
|
11861
|
-
|
|
11862
|
-
|
|
11863
|
-
|
|
11864
|
-
|
|
11865
|
-
|
|
11866
|
-
|
|
11867
|
-
|
|
11847
|
+
const windowPcdLen = windowPcdSt.distanceTo(windowPcdEd);
|
|
11848
|
+
const windowPcdHeight = Math.abs(windowPcd.maxZ - windowPcd.minZ);
|
|
11849
|
+
let windowHeight = beamTmpSt.z - doorTmpSt.z;
|
|
11850
|
+
const windowLen = doorTmpSt.distanceTo(doorTmpEd);
|
|
11851
|
+
let changeWindowSize = false;
|
|
11852
|
+
let windowSizeThreshold = 0.5;
|
|
11853
|
+
if ((Math.abs(windowPcdLen - windowLen) < windowSizeThreshold || windowPcdLen > windowLen) && (Math.abs(windowPcdHeight - windowHeight) < windowSizeThreshold || windowPcdHeight > windowHeight)) {
|
|
11854
|
+
changeWindowSize = true;
|
|
11855
|
+
} else {
|
|
11856
|
+
let checkResultsNum = region.points.length / 4;
|
|
11857
|
+
let gridWidth = region.gridWidth;
|
|
11858
|
+
let gridHeight = region.gridHeight;
|
|
11859
|
+
let lenNum = Math.floor(windowLen / gridWidth);
|
|
11860
|
+
let heightNum = Math.floor(windowHeight / gridHeight);
|
|
11861
|
+
let totalCheckResultsNum = lenNum * heightNum;
|
|
11862
|
+
let checkResultsPercentage = checkResultsNum / totalCheckResultsNum;
|
|
11863
|
+
if (checkResultsPercentage < 0.8)
|
|
11864
|
+
changeWindowSize = true;
|
|
11868
11865
|
}
|
|
11869
|
-
|
|
11870
|
-
|
|
11871
|
-
|
|
11872
|
-
|
|
11873
|
-
|
|
11874
|
-
|
|
11875
|
-
|
|
11876
|
-
|
|
11877
|
-
|
|
11878
|
-
|
|
11879
|
-
|
|
11880
|
-
|
|
11881
|
-
|
|
11882
|
-
|
|
11883
|
-
|
|
11884
|
-
|
|
11885
|
-
|
|
11886
|
-
let dist55 = intersect1.point.distanceTo(doorTmpSt);
|
|
11887
|
-
let dist66 = intersect1.point.distanceTo(doorTmpEd);
|
|
11888
|
-
if (dist55 < 0.1 || dist66 < 0.1) {
|
|
11889
|
-
if (dist55 < dist66) {
|
|
11890
|
-
near1St = true;
|
|
11891
|
-
distIntersect1 = dist55;
|
|
11892
|
-
} else
|
|
11893
|
-
distIntersect1 = dist66;
|
|
11866
|
+
if (changeWindowSize) {
|
|
11867
|
+
const windowLine = new THREE10.Line3(doorTmpSt, doorTmpEd);
|
|
11868
|
+
let rectPts = windowPcd.rectPts.map((p) => new THREE10.Vector3(p.x, p.y, p.z));
|
|
11869
|
+
rectPts = setPointsSameZ(rectPts, doorTmpSt.z);
|
|
11870
|
+
let ptClose = new THREE10.Vector3();
|
|
11871
|
+
let vec2 = new THREE10.Vector3();
|
|
11872
|
+
if (rectPts.length == 5)
|
|
11873
|
+
rectPts.splice(4, 1);
|
|
11874
|
+
let shortLinePt1 = rectPts[0];
|
|
11875
|
+
let shortLinePt2 = rectPts[1];
|
|
11876
|
+
let shortLinePt3 = rectPts[2];
|
|
11877
|
+
let shortLinePt4 = rectPts[3];
|
|
11878
|
+
if (rectPts[0].distanceTo(rectPts[1]) > rectPts[1].distanceTo(rectPts[2])) {
|
|
11879
|
+
shortLinePt1 = rectPts[1];
|
|
11880
|
+
shortLinePt2 = rectPts[2];
|
|
11881
|
+
shortLinePt3 = rectPts[3];
|
|
11882
|
+
shortLinePt4 = rectPts[0];
|
|
11894
11883
|
}
|
|
11895
|
-
|
|
11896
|
-
|
|
11897
|
-
let
|
|
11898
|
-
|
|
11899
|
-
|
|
11900
|
-
|
|
11901
|
-
|
|
11902
|
-
|
|
11903
|
-
|
|
11904
|
-
|
|
11884
|
+
let addShortLen = 0.2;
|
|
11885
|
+
let vecShort1 = new THREE10.Vector3().subVectors(shortLinePt2, shortLinePt1).normalize();
|
|
11886
|
+
let vecShort2 = new THREE10.Vector3().subVectors(shortLinePt4, shortLinePt3).normalize();
|
|
11887
|
+
shortLinePt1 = shortLinePt1.addScaledVector(vecShort1, -addShortLen);
|
|
11888
|
+
shortLinePt2 = shortLinePt2.addScaledVector(vecShort1, addShortLen);
|
|
11889
|
+
shortLinePt3 = shortLinePt3.addScaledVector(vecShort2, -addShortLen);
|
|
11890
|
+
shortLinePt4 = shortLinePt4.addScaledVector(vecShort2, addShortLen);
|
|
11891
|
+
let tmpVec = new THREE10.Vector3().subVectors(doorTmpEd, doorTmpSt).normalize();
|
|
11892
|
+
let tmpDoorTmpSt = doorTmpSt.clone().addScaledVector(tmpVec, -addShortLen);
|
|
11893
|
+
let tmpDoorTmpEd = doorTmpEd.clone().addScaledVector(tmpVec, addShortLen);
|
|
11894
|
+
let intersect1 = segmentsIntersect2D(shortLinePt1, shortLinePt2, tmpDoorTmpSt, tmpDoorTmpEd);
|
|
11895
|
+
let intersect2 = segmentsIntersect2D(shortLinePt3, shortLinePt4, tmpDoorTmpSt, tmpDoorTmpEd);
|
|
11896
|
+
let distIntersect1 = 99999;
|
|
11897
|
+
let distIntersect2 = 99999;
|
|
11898
|
+
let near1St = false;
|
|
11899
|
+
let near2St = false;
|
|
11900
|
+
if (intersect1 != null) {
|
|
11901
|
+
let dist55 = intersect1.point.distanceTo(doorTmpSt);
|
|
11902
|
+
let dist66 = intersect1.point.distanceTo(doorTmpEd);
|
|
11903
|
+
if (dist55 < 0.1 || dist66 < 0.1) {
|
|
11904
|
+
if (dist55 < dist66) {
|
|
11905
|
+
near1St = true;
|
|
11906
|
+
distIntersect1 = dist55;
|
|
11907
|
+
} else
|
|
11908
|
+
distIntersect1 = dist66;
|
|
11909
|
+
}
|
|
11905
11910
|
}
|
|
11906
|
-
|
|
11907
|
-
|
|
11908
|
-
|
|
11909
|
-
|
|
11910
|
-
|
|
11911
|
-
|
|
11912
|
-
|
|
11913
|
-
|
|
11914
|
-
|
|
11915
|
-
|
|
11916
|
-
ptClose = windowLine.closestPointToPoint(windowPcdSt, false, new THREE10.Vector3());
|
|
11917
|
-
vec2 = new THREE10.Vector3().subVectors(doorTmpEd, doorTmpSt).normalize();
|
|
11918
|
-
} else if (dist22 == minDist) {
|
|
11919
|
-
ptClose = windowLine.closestPointToPoint(windowPcdEd, false, new THREE10.Vector3());
|
|
11920
|
-
vec2 = new THREE10.Vector3().subVectors(doorTmpEd, doorTmpSt).normalize();
|
|
11921
|
-
} else if (dist33 == minDist) {
|
|
11922
|
-
ptClose = windowLine.closestPointToPoint(windowPcdSt, false, new THREE10.Vector3());
|
|
11923
|
-
vec2 = new THREE10.Vector3().subVectors(doorTmpSt, doorTmpEd).normalize();
|
|
11924
|
-
} else if (dist44 == minDist) {
|
|
11925
|
-
ptClose = windowLine.closestPointToPoint(windowPcdEd, false, new THREE10.Vector3());
|
|
11926
|
-
vec2 = new THREE10.Vector3().subVectors(doorTmpSt, doorTmpEd).normalize();
|
|
11911
|
+
if (intersect2 != null) {
|
|
11912
|
+
let dist55 = intersect2.point.distanceTo(doorTmpSt);
|
|
11913
|
+
let dist66 = intersect2.point.distanceTo(doorTmpEd);
|
|
11914
|
+
if (dist55 < 0.1 || dist66 < 0.1) {
|
|
11915
|
+
if (dist55 < dist66) {
|
|
11916
|
+
near2St = true;
|
|
11917
|
+
distIntersect2 = dist55;
|
|
11918
|
+
} else
|
|
11919
|
+
distIntersect2 = dist66;
|
|
11920
|
+
}
|
|
11927
11921
|
}
|
|
11928
|
-
|
|
11929
|
-
|
|
11930
|
-
|
|
11931
|
-
|
|
11922
|
+
if (distIntersect1 == 99999 && distIntersect2 == 99999) {
|
|
11923
|
+
windowPcdSt.z = windowPcdEd.z = doorTmpSt.z;
|
|
11924
|
+
let dist11 = doorTmpSt.distanceTo(windowPcdSt);
|
|
11925
|
+
let dist22 = doorTmpSt.distanceTo(windowPcdEd);
|
|
11926
|
+
let dist33 = doorTmpEd.distanceTo(windowPcdSt);
|
|
11927
|
+
let dist44 = doorTmpEd.distanceTo(windowPcdEd);
|
|
11928
|
+
let minDist = Math.min(dist11, dist22, dist33, dist44);
|
|
11929
|
+
let wZ = doorTmpSt.z;
|
|
11930
|
+
if (dist11 == minDist) {
|
|
11931
|
+
ptClose = windowLine.closestPointToPoint(windowPcdSt, false, new THREE10.Vector3());
|
|
11932
|
+
vec2 = new THREE10.Vector3().subVectors(doorTmpEd, doorTmpSt).normalize();
|
|
11933
|
+
} else if (dist22 == minDist) {
|
|
11934
|
+
ptClose = windowLine.closestPointToPoint(windowPcdEd, false, new THREE10.Vector3());
|
|
11935
|
+
vec2 = new THREE10.Vector3().subVectors(doorTmpEd, doorTmpSt).normalize();
|
|
11936
|
+
} else if (dist33 == minDist) {
|
|
11937
|
+
ptClose = windowLine.closestPointToPoint(windowPcdSt, false, new THREE10.Vector3());
|
|
11938
|
+
vec2 = new THREE10.Vector3().subVectors(doorTmpSt, doorTmpEd).normalize();
|
|
11939
|
+
} else if (dist44 == minDist) {
|
|
11940
|
+
ptClose = windowLine.closestPointToPoint(windowPcdEd, false, new THREE10.Vector3());
|
|
11941
|
+
vec2 = new THREE10.Vector3().subVectors(doorTmpSt, doorTmpEd).normalize();
|
|
11942
|
+
}
|
|
11932
11943
|
} else {
|
|
11933
|
-
|
|
11934
|
-
|
|
11944
|
+
if (distIntersect1 < distIntersect2) {
|
|
11945
|
+
ptClose = intersect1.point.clone();
|
|
11946
|
+
vec2 = near1St ? new THREE10.Vector3().subVectors(doorTmpEd, doorTmpSt).normalize() : new THREE10.Vector3().subVectors(doorTmpSt, doorTmpEd).normalize();
|
|
11947
|
+
} else {
|
|
11948
|
+
ptClose = intersect2.point.clone();
|
|
11949
|
+
vec2 = near2St ? new THREE10.Vector3().subVectors(doorTmpEd, doorTmpSt).normalize() : new THREE10.Vector3().subVectors(doorTmpSt, doorTmpEd).normalize();
|
|
11950
|
+
}
|
|
11935
11951
|
}
|
|
11952
|
+
doorTmpSt = ptClose.clone();
|
|
11953
|
+
doorTmpEd = doorTmpSt.clone().addScaledVector(vec2, windowPcdLen);
|
|
11954
|
+
doorTmpSt.z = doorTmpEd.z = windowPcd.minZ;
|
|
11955
|
+
beamTmpSt = doorTmpSt.clone();
|
|
11956
|
+
beamTmpEd = doorTmpEd.clone();
|
|
11957
|
+
beamTmpSt.z = beamTmpEd.z = windowPcd.maxZ;
|
|
11936
11958
|
}
|
|
11937
|
-
doorTmpSt = ptClose.clone();
|
|
11938
|
-
doorTmpEd = doorTmpSt.clone().addScaledVector(vec2, windowLen);
|
|
11939
|
-
doorTmpSt.z = doorTmpEd.z = windowPcd.minZ;
|
|
11940
|
-
beamTmpSt = doorTmpSt.clone();
|
|
11941
|
-
beamTmpEd = doorTmpEd.clone();
|
|
11942
|
-
beamTmpSt.z = beamTmpEd.z = windowPcd.maxZ;
|
|
11943
11959
|
let doorType = "";
|
|
11944
11960
|
let groundClearance = doorTmpSt.z - line2.start.z > 1e-4 ? doorTmpSt.z - line2.start.z : 0;
|
|
11945
|
-
|
|
11961
|
+
windowHeight = beamTmpSt.z - doorTmpSt.z;
|
|
11946
11962
|
let doorAndBeamDataObj = {
|
|
11947
11963
|
id,
|
|
11948
11964
|
windowTopSt: new THREE10.Vector3(doorTmpSt.x, doorTmpSt.y, doorTmpSt.z + windowHeight),
|
|
@@ -12147,8 +12163,8 @@ function pointToSegmentDist(cx, cy, ax, ay, bx, by) {
|
|
|
12147
12163
|
const t = (wx * vx + wy * vy) / len2;
|
|
12148
12164
|
const projX = ax + t * vx;
|
|
12149
12165
|
const projY = ay + t * vy;
|
|
12150
|
-
const
|
|
12151
|
-
return { dist:
|
|
12166
|
+
const dist2 = Math.sqrt((cx - projX) ** 2 + (cy - projY) ** 2);
|
|
12167
|
+
return { dist: dist2, t };
|
|
12152
12168
|
}
|
|
12153
12169
|
function pointInQuad(px, py, quad) {
|
|
12154
12170
|
let sign = 0;
|
|
@@ -12293,8 +12309,8 @@ function scoreDistanceVariance(wall, checkPoints) {
|
|
|
12293
12309
|
const ds = [];
|
|
12294
12310
|
const { start, end } = wall;
|
|
12295
12311
|
for (const pt of checkPoints) {
|
|
12296
|
-
const { dist:
|
|
12297
|
-
ds.push(
|
|
12312
|
+
const { dist: dist2 } = pointToSegmentDist(pt.x, pt.y, start.x, start.y, end.x, end.y);
|
|
12313
|
+
ds.push(dist2);
|
|
12298
12314
|
}
|
|
12299
12315
|
const mean = ds.reduce((s, v2) => s + v2, 0) / ds.length;
|
|
12300
12316
|
const variance = ds.reduce((s, v2) => s + (v2 - mean) ** 2, 0) / ds.length;
|
|
@@ -12407,8 +12423,8 @@ function mergeIntervals(group, gref, dirX, dirY, gapTol) {
|
|
|
12407
12423
|
const last = merged[merged.length - 1];
|
|
12408
12424
|
if (l <= last.r + gapTol) {
|
|
12409
12425
|
const overlapLen = Math.min(last.r, r) - Math.max(last.l, l);
|
|
12410
|
-
const
|
|
12411
|
-
if (overlapLen >= overlapForceMergeLen ||
|
|
12426
|
+
const dist2 = Math.hypot(last.endPt.x - startPt.x, last.endPt.y - startPt.y);
|
|
12427
|
+
if (overlapLen >= overlapForceMergeLen || dist2 <= endPointDistTol) {
|
|
12412
12428
|
if (l < last.l) {
|
|
12413
12429
|
last.l = l;
|
|
12414
12430
|
last.startPt = startPt;
|
|
@@ -12624,10 +12640,10 @@ function collectCandidates(candidateSegments, winLong, winDirX, winDirY, checkPo
|
|
|
12624
12640
|
let validPoint = false;
|
|
12625
12641
|
let minDist = Infinity;
|
|
12626
12642
|
for (const pt of checkPoints) {
|
|
12627
|
-
const { dist:
|
|
12628
|
-
if (t >= -attempt.margin && t <= 1 + attempt.margin &&
|
|
12643
|
+
const { dist: dist2, t } = pointToSegmentDist(pt.x, pt.y, start.x, start.y, end.x, end.y);
|
|
12644
|
+
if (t >= -attempt.margin && t <= 1 + attempt.margin && dist2 <= attempt.maxDist) {
|
|
12629
12645
|
validPoint = true;
|
|
12630
|
-
minDist = Math.min(minDist,
|
|
12646
|
+
minDist = Math.min(minDist, dist2);
|
|
12631
12647
|
}
|
|
12632
12648
|
}
|
|
12633
12649
|
if (!validPoint) {
|
|
@@ -13264,8 +13280,8 @@ function pointToSegmentDist2(cx, cy, ax, ay, bx, by) {
|
|
|
13264
13280
|
const t = (wx * vx + wy * vy) / len2;
|
|
13265
13281
|
const projX = ax + t * vx;
|
|
13266
13282
|
const projY = ay + t * vy;
|
|
13267
|
-
const
|
|
13268
|
-
return { dist:
|
|
13283
|
+
const dist2 = Math.sqrt((cx - projX) ** 2 + (cy - projY) ** 2);
|
|
13284
|
+
return { dist: dist2, t };
|
|
13269
13285
|
}
|
|
13270
13286
|
function pointInQuad2(px, py, quad) {
|
|
13271
13287
|
let sign = 0;
|
|
@@ -13333,9 +13349,9 @@ function extractVerticalEdges(corners) {
|
|
|
13333
13349
|
if (usedTop.has(i)) continue;
|
|
13334
13350
|
const dx = topPts[i].x - bp.x;
|
|
13335
13351
|
const dy = topPts[i].y - bp.y;
|
|
13336
|
-
const
|
|
13337
|
-
if (
|
|
13338
|
-
bestDist =
|
|
13352
|
+
const dist2 = Math.sqrt(dx * dx + dy * dy);
|
|
13353
|
+
if (dist2 < bestDist) {
|
|
13354
|
+
bestDist = dist2;
|
|
13339
13355
|
bestIdx = i;
|
|
13340
13356
|
}
|
|
13341
13357
|
}
|
|
@@ -13723,8 +13739,8 @@ function scoreDistanceVariance2(wall, checkPoints) {
|
|
|
13723
13739
|
const ds = [];
|
|
13724
13740
|
const { start, end } = wall;
|
|
13725
13741
|
for (const pt of checkPoints) {
|
|
13726
|
-
const { dist:
|
|
13727
|
-
ds.push(
|
|
13742
|
+
const { dist: dist2 } = pointToSegmentDist2(pt.x, pt.y, start.x, start.y, end.x, end.y);
|
|
13743
|
+
ds.push(dist2);
|
|
13728
13744
|
}
|
|
13729
13745
|
const mean = ds.reduce((s, v2) => s + v2, 0) / ds.length;
|
|
13730
13746
|
const variance = ds.reduce((s, v2) => s + (v2 - mean) ** 2, 0) / ds.length;
|
|
@@ -13837,8 +13853,8 @@ function mergeIntervals2(group, gref, dirX, dirY, gapTol) {
|
|
|
13837
13853
|
const last = merged[merged.length - 1];
|
|
13838
13854
|
if (l <= last.r + gapTol) {
|
|
13839
13855
|
const overlapLen = Math.min(last.r, r) - Math.max(last.l, l);
|
|
13840
|
-
const
|
|
13841
|
-
if (overlapLen >= overlapForceMergeLen ||
|
|
13856
|
+
const dist2 = Math.hypot(last.endPt.x - startPt.x, last.endPt.y - startPt.y);
|
|
13857
|
+
if (overlapLen >= overlapForceMergeLen || dist2 <= endPointDistTol) {
|
|
13842
13858
|
if (l < last.l) {
|
|
13843
13859
|
last.l = l;
|
|
13844
13860
|
last.startPt = startPt;
|
|
@@ -14064,10 +14080,10 @@ function collectCandidates2(candidateSegments, doorLong, doorDirX, doorDirY, che
|
|
|
14064
14080
|
let validPoint = false;
|
|
14065
14081
|
let minDist = Infinity;
|
|
14066
14082
|
for (const pt of checkPoints) {
|
|
14067
|
-
const { dist:
|
|
14068
|
-
if (t >= -attempt.margin && t <= 1 + attempt.margin &&
|
|
14083
|
+
const { dist: dist2, t } = pointToSegmentDist2(pt.x, pt.y, start.x, start.y, end.x, end.y);
|
|
14084
|
+
if (t >= -attempt.margin && t <= 1 + attempt.margin && dist2 <= attempt.maxDist) {
|
|
14069
14085
|
validPoint = true;
|
|
14070
|
-
if (
|
|
14086
|
+
if (dist2 < minDist) minDist = dist2;
|
|
14071
14087
|
}
|
|
14072
14088
|
}
|
|
14073
14089
|
if (!validPoint) {
|
|
@@ -14409,8 +14425,8 @@ function findDoorWalls(doorObjs, wallSegments, options, preMerged) {
|
|
|
14409
14425
|
for (const seg of candidateSegments) {
|
|
14410
14426
|
const dx = seg.start.x + (seg.end.x - seg.start.x) / 2 - centerX;
|
|
14411
14427
|
const dy = seg.start.y + (seg.end.y - seg.start.y) / 2 - centerY;
|
|
14412
|
-
const
|
|
14413
|
-
if (
|
|
14428
|
+
const dist2 = Math.sqrt(dx * dx + dy * dy);
|
|
14429
|
+
if (dist2 > 2) continue;
|
|
14414
14430
|
const segDx = seg.end.x - seg.start.x;
|
|
14415
14431
|
const segDy = seg.end.y - seg.start.y;
|
|
14416
14432
|
const segLen = Math.sqrt(segDx * segDx + segDy * segDy);
|
|
@@ -16024,8 +16040,8 @@ function fitCircle(pts) {
|
|
|
16024
16040
|
const r = Math.sqrt(Math.abs((sx2 + sz2 - 2 * cx * sx - 2 * cz * sz) / n + cx * cx + cz * cz));
|
|
16025
16041
|
let sumSq = 0;
|
|
16026
16042
|
for (const p of pts) {
|
|
16027
|
-
const
|
|
16028
|
-
const diff =
|
|
16043
|
+
const dist2 = Math.hypot(p.x - cx, p.z - cz);
|
|
16044
|
+
const diff = dist2 - r;
|
|
16029
16045
|
sumSq += diff * diff;
|
|
16030
16046
|
}
|
|
16031
16047
|
const rmsResidual = Math.sqrt(sumSq / n);
|
|
@@ -16456,8 +16472,8 @@ function findWallCorners(lineSegs) {
|
|
|
16456
16472
|
for (const e1 of endpoints1) {
|
|
16457
16473
|
for (const e2 of endpoints2) {
|
|
16458
16474
|
const dx = e1.x - e2.x, dz = e1.z - e2.z;
|
|
16459
|
-
const
|
|
16460
|
-
if (
|
|
16475
|
+
const dist2 = Math.sqrt(dx * dx + dz * dz);
|
|
16476
|
+
if (dist2 < CORNER_DIST) {
|
|
16461
16477
|
corners.push({ x: (e1.x + e2.x) / 2, z: (e1.z + e2.z) / 2 });
|
|
16462
16478
|
}
|
|
16463
16479
|
}
|
|
@@ -16985,9 +17001,9 @@ function processFromPointCloud(points3D, rawLines, pcConfig) {
|
|
|
16985
17001
|
let bestDist = Infinity, bestJ = -1;
|
|
16986
17002
|
for (let k = 0; k < pts.length; k++) {
|
|
16987
17003
|
const dx = pts[k].x - corner.x, dz = pts[k].z - corner.z;
|
|
16988
|
-
const
|
|
16989
|
-
if (
|
|
16990
|
-
bestDist =
|
|
17004
|
+
const dist2 = dx * dx + dz * dz;
|
|
17005
|
+
if (dist2 < bestDist) {
|
|
17006
|
+
bestDist = dist2;
|
|
16991
17007
|
bestJ = k;
|
|
16992
17008
|
}
|
|
16993
17009
|
}
|