@itwin/core-geometry 5.9.0-dev.8 → 5.10.0-dev.1
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/CHANGELOG.md +16 -1
- package/lib/cjs/Geometry.d.ts +8 -6
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +8 -6
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts +7 -0
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +11 -0
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +11 -2
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +25 -15
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +15 -6
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +15 -6
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.d.ts +1 -1
- package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurve.js +2 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +21 -0
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +59 -0
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +13 -12
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +12 -11
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/Loop.d.ts.map +1 -1
- package/lib/cjs/curve/Loop.js +3 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +17 -4
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +114 -18
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +3 -11
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +1 -91
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.d.ts +13 -6
- package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js +13 -6
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js +1 -2
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +1 -2
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +1 -2
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +113 -109
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +361 -385
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +17 -17
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +153 -184
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +1 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +9 -3
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +1 -2
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +10 -4
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +3 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +6 -2
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.d.ts +33 -4
- package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js +79 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +9 -6
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +20 -10
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +9 -6
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +20 -10
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +4 -4
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +5 -4
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js +6 -7
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/Newton.d.ts +52 -13
- package/lib/cjs/numerics/Newton.d.ts.map +1 -1
- package/lib/cjs/numerics/Newton.js +73 -23
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +14 -14
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +14 -14
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js +2 -2
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +15 -15
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +1 -1
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +3 -3
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/Geometry.d.ts +8 -6
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +8 -6
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +7 -0
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +11 -0
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +11 -2
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +25 -15
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +15 -6
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +15 -6
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.d.ts +1 -1
- package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurve.js +2 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +21 -0
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +59 -0
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +13 -12
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +12 -11
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/Loop.d.ts.map +1 -1
- package/lib/esm/curve/Loop.js +3 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +17 -4
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +116 -20
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +3 -11
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +2 -92
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.d.ts +13 -6
- package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/esm/curve/StrokeOptions.js +13 -6
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js +1 -2
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +1 -2
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +1 -2
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +113 -109
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +364 -388
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +17 -17
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +153 -184
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +1 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +9 -3
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +1 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +10 -4
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +3 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +6 -2
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.d.ts +33 -4
- package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js +77 -0
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +9 -6
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +20 -10
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +9 -6
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +20 -10
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +4 -4
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +5 -4
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js +6 -7
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js +1 -1
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/Newton.d.ts +52 -13
- package/lib/esm/numerics/Newton.d.ts.map +1 -1
- package/lib/esm/numerics/Newton.js +71 -22
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +14 -14
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +14 -14
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js +2 -2
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +15 -15
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +1 -1
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +3 -3
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/package.json +3 -3
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +0 -23
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +0 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js +0 -37
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +0 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +0 -23
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +0 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js +0 -33
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +0 -1
|
@@ -20,12 +20,13 @@ import { SortablePolygon } from "../geometry3d/SortablePolygon";
|
|
|
20
20
|
import { Transform } from "../geometry3d/Transform";
|
|
21
21
|
import { MomentData } from "../geometry4d/MomentData";
|
|
22
22
|
import { PolyfaceBuilder } from "../polyface/PolyfaceBuilder";
|
|
23
|
-
import { HalfEdgeMask } from "../topology/Graph";
|
|
23
|
+
import { HalfEdge, HalfEdgeMask } from "../topology/Graph";
|
|
24
24
|
import { HalfEdgeGraphSearch } from "../topology/HalfEdgeGraphSearch";
|
|
25
25
|
import { HalfEdgeGraphOps } from "../topology/Merging";
|
|
26
26
|
import { Triangulator } from "../topology/Triangulation";
|
|
27
27
|
import { BagOfCurves, CurveChain, CurveCollection } from "./CurveCollection";
|
|
28
28
|
import { CurveCurve } from "./CurveCurve";
|
|
29
|
+
import { CurveLocationDetail } from "./CurveLocationDetail";
|
|
29
30
|
import { CurveOps } from "./CurveOps";
|
|
30
31
|
import { CurvePrimitive } from "./CurvePrimitive";
|
|
31
32
|
import { CurveWireMomentsXYZ } from "./CurveWireMomentsXYZ";
|
|
@@ -44,7 +45,7 @@ import { CurveSplitContext } from "./Query/CurveSplitContext";
|
|
|
44
45
|
import { PointInOnOutContext } from "./Query/InOutTests";
|
|
45
46
|
import { PlanarSubdivision } from "./Query/PlanarSubdivision";
|
|
46
47
|
import { RegionMomentsXY } from "./RegionMomentsXY";
|
|
47
|
-
import { RegionBooleanContext, RegionGroupOpType, RegionOpsFaceToFaceSearch } from "./RegionOpsClassificationSweeps";
|
|
48
|
+
import { RegionBooleanContext, RegionGroupMember, RegionGroupOpType, RegionOpsFaceToFaceSearch } from "./RegionOpsClassificationSweeps";
|
|
48
49
|
import { UnionRegion } from "./UnionRegion";
|
|
49
50
|
/**
|
|
50
51
|
* * Options to control method [[RegionOps.consolidateAdjacentPrimitives]].
|
|
@@ -743,27 +744,113 @@ export class RegionOps {
|
|
|
743
744
|
}
|
|
744
745
|
return SortablePolygon.sortAsAnyRegion(loopAndArea);
|
|
745
746
|
}
|
|
747
|
+
/**
|
|
748
|
+
* Simplify the graph by removing bridge edges that do not serve to connect inner and outer loops.
|
|
749
|
+
* * If edgeTags are `CurveLocationDetail`s, e.g., as set by `PlanarSubdivision.assembleHalfEdgeGraph`, attempt to heal edges split by removed bridge edges.
|
|
750
|
+
* @param graph half edges to process.
|
|
751
|
+
* @param isBridgeEdge optional function to identify a bridge edge. Default looks for `HalfEdgeMask.BRIDGE_EDGE`.
|
|
752
|
+
* @param faceToArea optional function to compute face area. Default is `HalfEdgeGraphSearch.signedFaceArea`.
|
|
753
|
+
* @returns the number of extraneous bridge edges removed from the graph.
|
|
754
|
+
* @internal
|
|
755
|
+
*/
|
|
756
|
+
static removeExtraneousBridgeEdges(graph, isBridgeEdge, faceToArea) {
|
|
757
|
+
const toHeal = [];
|
|
758
|
+
const interiorBridges = [];
|
|
759
|
+
if (!faceToArea)
|
|
760
|
+
faceToArea = (node) => HalfEdgeGraphSearch.signedFaceArea(node);
|
|
761
|
+
if (!isBridgeEdge)
|
|
762
|
+
isBridgeEdge = (node) => node.isMaskSet(HalfEdgeMask.BRIDGE_EDGE);
|
|
763
|
+
// isolate dangling bridges, bridges separating different faces, and "exterior" bridges in the negative area face
|
|
764
|
+
graph.announceEdges((_g, node) => {
|
|
765
|
+
if (isBridgeEdge(node)) {
|
|
766
|
+
if (node.isDangling || node.edgeMate.isDangling || !node.findAroundFace(node.edgeMate) || faceToArea(node) < 0.0) {
|
|
767
|
+
toHeal.push(node.vertexSuccessor);
|
|
768
|
+
toHeal.push(node.edgeMate.vertexSuccessor);
|
|
769
|
+
node.isolateEdge();
|
|
770
|
+
}
|
|
771
|
+
else {
|
|
772
|
+
interiorBridges.push(node);
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
return true;
|
|
776
|
+
});
|
|
777
|
+
// Relies only on face loop orientation. Doesn't use static HalfEdgeMasks!
|
|
778
|
+
const isBoundaryEdge = (node) => {
|
|
779
|
+
if (faceToArea(node) < 0.0)
|
|
780
|
+
return true; // exterior face
|
|
781
|
+
if (node.findAroundFace(node.edgeMate))
|
|
782
|
+
return false; // interior washer face
|
|
783
|
+
return faceToArea(node.edgeMate) < 0.0; // adjacent to exterior face
|
|
784
|
+
};
|
|
785
|
+
// All bridges in the negative area face were isolated, but this may have promoted other bridges to the
|
|
786
|
+
// negative area face. Keep isolating these bridge edges until none remain.
|
|
787
|
+
let numIsolatedThisPass;
|
|
788
|
+
do {
|
|
789
|
+
numIsolatedThisPass = 0;
|
|
790
|
+
for (const node of interiorBridges) {
|
|
791
|
+
if (!node.isIsolatedEdge && isBoundaryEdge(node)) {
|
|
792
|
+
toHeal.push(node.vertexSuccessor);
|
|
793
|
+
toHeal.push(node.edgeMate.vertexSuccessor);
|
|
794
|
+
node.isolateEdge();
|
|
795
|
+
numIsolatedThisPass++;
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
} while (numIsolatedThisPass > 0);
|
|
799
|
+
// lambda to extend the detail interval on a side of a healed edge
|
|
800
|
+
const mergeDetails = (he, newFraction, newPoint) => {
|
|
801
|
+
if (he && he.edgeTag instanceof CurveLocationDetail && he.sortData !== undefined && newFraction !== undefined && newPoint) {
|
|
802
|
+
if (he.sortData > 0)
|
|
803
|
+
he.edgeTag.captureFraction1Point1(newFraction, newPoint);
|
|
804
|
+
else
|
|
805
|
+
he.edgeTag.captureFractionPoint(newFraction, newPoint);
|
|
806
|
+
}
|
|
807
|
+
};
|
|
808
|
+
// At this point all removable bridges are isolated. Clean up their original vertex loops, if possible.
|
|
809
|
+
for (const doomedA of toHeal) {
|
|
810
|
+
const doomedB = doomedA.vertexSuccessor;
|
|
811
|
+
if ( // are the geometries mergeable?
|
|
812
|
+
doomedA !== doomedB &&
|
|
813
|
+
doomedA.edgeTag instanceof CurveLocationDetail && doomedA.sortData !== undefined &&
|
|
814
|
+
doomedB.edgeTag instanceof CurveLocationDetail && doomedB.sortData !== undefined &&
|
|
815
|
+
doomedA.edgeTag.curve === doomedB.edgeTag.curve &&
|
|
816
|
+
doomedA.edgeTag.isInterval() && doomedB.edgeTag.isInterval() &&
|
|
817
|
+
doomedA.sortData * doomedB.sortData < 0 &&
|
|
818
|
+
((doomedA.sortData > 0 && Geometry.isSmallRelative(doomedA.edgeTag.fraction - doomedB.edgeTag.fraction1)) ||
|
|
819
|
+
(doomedA.sortData < 0 && Geometry.isSmallRelative(doomedA.edgeTag.fraction1 - doomedB.edgeTag.fraction)))) {
|
|
820
|
+
const survivorA = HalfEdge.healEdge(doomedA, false);
|
|
821
|
+
if (survivorA) {
|
|
822
|
+
const endFractionA = (doomedA.sortData > 0) ? doomedA.edgeTag.fraction1 : doomedA.edgeTag.fraction;
|
|
823
|
+
const endPointA = (doomedA.sortData > 0) ? doomedA.edgeTag.point1 : doomedA.edgeTag.point;
|
|
824
|
+
mergeDetails(survivorA, endFractionA, endPointA);
|
|
825
|
+
const endFractionB = (doomedB.sortData > 0) ? doomedB.edgeTag.fraction1 : doomedB.edgeTag.fraction;
|
|
826
|
+
const endPointB = (doomedB.sortData > 0) ? doomedB.edgeTag.point1 : doomedB.edgeTag.point;
|
|
827
|
+
mergeDetails(survivorA.edgeMate, endFractionB, endPointB);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
return graph.deleteIsolatedEdges();
|
|
832
|
+
}
|
|
746
833
|
/**
|
|
747
834
|
* Collect inputs that are nominally closed: regions, and physically closed curves.
|
|
748
835
|
* * Physically closed input curves are each returned wrapped in a Loop to facilitate xy-algorithms,
|
|
749
836
|
* but outside this limited context, these Loops only makes sense if they are planar.
|
|
837
|
+
* @param curves inputs
|
|
838
|
+
* @param openCurves optional array to receive open input curves that were not returned as regions.
|
|
839
|
+
* @param tolerance optional distance tolerance for determining physical closure. Default is [[Geometry.smallMetricDistance]].
|
|
750
840
|
*/
|
|
751
|
-
static collectRegionsAndClosedPrimitives(curves, tolerance = Geometry.smallMetricDistance) {
|
|
841
|
+
static collectRegionsAndClosedPrimitives(curves, openCurves, tolerance = Geometry.smallMetricDistance) {
|
|
752
842
|
const regions = [];
|
|
753
843
|
if (!Array.isArray(curves))
|
|
754
844
|
curves = [curves];
|
|
755
845
|
for (const curve of curves) {
|
|
756
|
-
if (curve instanceof Loop || curve instanceof ParityRegion || curve instanceof UnionRegion)
|
|
846
|
+
if (curve instanceof Loop || curve instanceof ParityRegion || curve instanceof UnionRegion)
|
|
757
847
|
regions.push(curve);
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
if (curve.isPhysicallyClosedCurve(tolerance))
|
|
765
|
-
regions.push(Loop.create(curve));
|
|
766
|
-
}
|
|
848
|
+
else if (curve instanceof Path && curve.isPhysicallyClosedCurve(tolerance))
|
|
849
|
+
regions.push(Loop.create(...curve.children));
|
|
850
|
+
else if (curve instanceof CurvePrimitive && curve.isPhysicallyClosedCurve(tolerance))
|
|
851
|
+
regions.push(Loop.create(curve));
|
|
852
|
+
else if (openCurves)
|
|
853
|
+
openCurves.push(curve);
|
|
767
854
|
}
|
|
768
855
|
return regions;
|
|
769
856
|
}
|
|
@@ -773,9 +860,9 @@ export class RegionOps {
|
|
|
773
860
|
* * "Holes" implied/bounded by inputs are _not_ preserved/discovered in output; in particular [[ParityRegion]]
|
|
774
861
|
* hole loops are treated like any other positive area loops.
|
|
775
862
|
* * A common use case of this method is to assemble the bounding negative-area "exterior" loop for each connected
|
|
776
|
-
* component of input curves. Passing
|
|
777
|
-
*
|
|
778
|
-
*
|
|
863
|
+
* component of input curves. Passing addBridges = true adds "bridge" segments to connect unconnected input [[Loops]]s
|
|
864
|
+
* and thereby increases the likelihood that a single connected component is returned. (This is why the default value
|
|
865
|
+
* for addBridges is true.)
|
|
779
866
|
* @param curvesAndRegions Any collection of curves. Each [[AnyRegion]] contributes its children _stripped of
|
|
780
867
|
* parity context_.
|
|
781
868
|
* @param tolerance optional distance tolerance for coincidence. Default is [[Geometry.smallMetricDistance]].
|
|
@@ -794,21 +881,30 @@ export class RegionOps {
|
|
|
794
881
|
primitives = TransferWithSplitArcs.clone(BagOfCurves.create(...primitives)).children;
|
|
795
882
|
const range = this.curveArrayRange(primitives);
|
|
796
883
|
const areaTol = this.computeXYAreaTolerance(range, tolerance);
|
|
797
|
-
|
|
884
|
+
let hasOpenCurve = false;
|
|
885
|
+
if (addBridges) { // generate a temp graph from ONLY the closed inputs to extract its bridge edges
|
|
798
886
|
const context = RegionBooleanContext.create(RegionGroupOpType.Union, RegionGroupOpType.Union);
|
|
799
|
-
const
|
|
887
|
+
const openCurves = [];
|
|
888
|
+
const regions = this.collectRegionsAndClosedPrimitives(curvesAndRegions, openCurves, tolerance);
|
|
889
|
+
hasOpenCurve = openCurves.length > 0;
|
|
800
890
|
if (regions.length > 0) {
|
|
801
891
|
context.addMembers(regions, undefined);
|
|
802
892
|
context.annotateAndMergeCurvesInGraph(tolerance);
|
|
803
893
|
context.graph.announceEdges((_graph, edge) => {
|
|
804
|
-
if (edge.isMaskSet(HalfEdgeMask.BRIDGE_EDGE))
|
|
805
|
-
|
|
894
|
+
if (edge.isMaskSet(HalfEdgeMask.BRIDGE_EDGE)) {
|
|
895
|
+
// ensure the bridge edge roundtrips thru assembleHalfEdgeGraph so that we can filter it later if necessary
|
|
896
|
+
const bridgeSegment = LineSegment3d.create(edge.getPoint3d(), edge.faceSuccessor.getPoint3d());
|
|
897
|
+
bridgeSegment.parent = new RegionGroupMember(bridgeSegment, context.extraGeometry);
|
|
898
|
+
primitives.push(bridgeSegment);
|
|
899
|
+
}
|
|
806
900
|
return true;
|
|
807
901
|
});
|
|
808
902
|
}
|
|
809
903
|
}
|
|
810
904
|
const intersections = CurveCurve.allIntersectionsAmongPrimitivesXY(primitives, tolerance);
|
|
811
905
|
const graph = PlanarSubdivision.assembleHalfEdgeGraph(primitives, intersections, tolerance);
|
|
906
|
+
if (addBridges && hasOpenCurve)
|
|
907
|
+
RegionOps.removeExtraneousBridgeEdges(graph);
|
|
812
908
|
return PlanarSubdivision.collectSignedLoopSetsInHalfEdgeGraph(graph, areaTol);
|
|
813
909
|
}
|
|
814
910
|
/**
|