@itwin/core-geometry 4.4.0-dev.8 → 4.5.0-dev.0
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 +6 -1
- package/lib/cjs/Geometry.d.ts +17 -0
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +14 -0
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/core-geometry.d.ts +3 -2
- package/lib/cjs/core-geometry.d.ts.map +1 -1
- package/lib/cjs/core-geometry.js +3 -2
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +2 -2
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +3 -3
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.d.ts +7 -6
- package/lib/cjs/curve/CurveExtendMode.d.ts.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js +7 -6
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +23 -18
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.d.ts +14 -4
- package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js +107 -2
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +41 -8
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +53 -15
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +2 -2
- package/lib/cjs/curve/Query/PlanarSubdivision.js +2 -2
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +1 -2
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +5 -8
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +12 -12
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +2 -2
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +2 -3
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +18 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +13 -0
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.d.ts +1 -2
- package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.d.ts +1 -1
- package/lib/cjs/geometry3d/PointStreaming.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js +3 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +68 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +152 -4
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts +23 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js +73 -1
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +1 -1
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.js +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts +7 -5
- package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js +8 -6
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.d.ts +13 -1
- package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
- package/lib/cjs/numerics/Polynomials.js +13 -1
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.d.ts +28 -5
- package/lib/cjs/polyface/FacetLocationDetail.d.ts.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.js +50 -15
- package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts +1 -1
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +7 -3
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +23 -0
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.d.ts +52 -0
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.d.ts.map +1 -0
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js +78 -0
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -0
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.d.ts +60 -0
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.d.ts.map +1 -0
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js +96 -0
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -0
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +57 -0
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -0
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +73 -0
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -0
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +57 -0
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -0
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +84 -0
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -0
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +274 -0
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -0
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +505 -0
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -0
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +204 -0
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -0
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +383 -0
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -0
- package/lib/cjs/serialization/GeometrySamples.d.ts +36 -3
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js +93 -4
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.d.ts +1 -1
- package/lib/cjs/solid/LinearSweep.js +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/SweepContour.d.ts +2 -2
- package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +5 -6
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +7 -6
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +4 -4
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +5 -5
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +108 -71
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js +223 -109
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/Merging.d.ts +1 -1
- package/lib/cjs/topology/Merging.d.ts.map +1 -1
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.d.ts +13 -13
- package/lib/cjs/topology/SignedDataSummary.d.ts.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js +3 -3
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/Triangulation.d.ts +1 -12
- package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.d.ts +27 -21
- package/lib/cjs/topology/XYParitySearchContext.d.ts.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js +73 -71
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Geometry.d.ts +17 -0
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +14 -0
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/core-geometry.d.ts +3 -2
- package/lib/esm/core-geometry.d.ts.map +1 -1
- package/lib/esm/core-geometry.js +3 -2
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +2 -2
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +3 -3
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.d.ts +7 -6
- package/lib/esm/curve/CurveExtendMode.d.ts.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js +7 -6
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +23 -18
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.d.ts +14 -4
- package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/esm/curve/LineSegment3d.js +108 -3
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +41 -8
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +53 -15
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +2 -2
- package/lib/esm/curve/Query/PlanarSubdivision.js +2 -2
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +1 -2
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +1 -1
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +5 -8
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +12 -12
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +2 -2
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +2 -3
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +18 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +13 -0
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.d.ts +1 -2
- package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.d.ts +1 -1
- package/lib/esm/geometry3d/PointStreaming.d.ts.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js +3 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +68 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +150 -3
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts +23 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js +73 -1
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +1 -1
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Transform.js +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.d.ts +7 -5
- package/lib/esm/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js +8 -6
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/numerics/Polynomials.d.ts +13 -1
- package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
- package/lib/esm/numerics/Polynomials.js +13 -1
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.d.ts +28 -5
- package/lib/esm/polyface/FacetLocationDetail.d.ts.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.js +48 -14
- package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts +1 -1
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +7 -3
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +23 -0
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.d.ts +52 -0
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.d.ts.map +1 -0
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js +74 -0
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -0
- package/lib/esm/polyface/RangeTree/MinimumValueTester.d.ts +60 -0
- package/lib/esm/polyface/RangeTree/MinimumValueTester.d.ts.map +1 -0
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js +92 -0
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -0
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +57 -0
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -0
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +69 -0
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -0
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +57 -0
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -0
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +80 -0
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -0
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +274 -0
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -0
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js +497 -0
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -0
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +204 -0
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -0
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +374 -0
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -0
- package/lib/esm/serialization/GeometrySamples.d.ts +36 -3
- package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js +93 -4
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/solid/LinearSweep.d.ts +1 -1
- package/lib/esm/solid/LinearSweep.js +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/SweepContour.d.ts +2 -2
- package/lib/esm/solid/SweepContour.d.ts.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +5 -6
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +7 -6
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +4 -4
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +5 -5
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +108 -71
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js +223 -109
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/Merging.d.ts +1 -1
- package/lib/esm/topology/Merging.d.ts.map +1 -1
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.d.ts +13 -13
- package/lib/esm/topology/SignedDataSummary.d.ts.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js +3 -3
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/Triangulation.d.ts +1 -12
- package/lib/esm/topology/Triangulation.d.ts.map +1 -1
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.d.ts +27 -21
- package/lib/esm/topology/XYParitySearchContext.d.ts.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js +73 -71
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegionOpsClassificationSweeps.js","sourceRoot":"","sources":["../../../src/curve/RegionOpsClassificationSweeps.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask, NodeToNumberFunction } from \"../topology/Graph\";\nimport { HalfEdgeGraphSearch } from \"../topology/HalfEdgeGraphSearch\";\nimport { HalfEdgeGraphMerge } from \"../topology/Merging\";\nimport { RegularizationContext } from \"../topology/RegularizeFace\";\nimport { MultiLineStringDataVariant } from \"../topology/Triangulation\";\nimport { GraphCheckPointFunction, RegionBinaryOpType, RegionOps } from \"./RegionOps\";\nimport { ParityRegion } from \"./ParityRegion\";\nimport { Loop } from \"./Loop\";\nimport { CurvePrimitive } from \"./CurvePrimitive\";\nimport { CurveCurve } from \"./CurveCurve\";\nimport { PlanarSubdivision } from \"./Query/PlanarSubdivision\";\nimport { Geometry } from \"../Geometry\";\nimport { AnyRegion } from \"./CurveTypes\";\nimport { UnionRegion } from \"./UnionRegion\";\nimport { CurveLocationDetail } from \"./CurveLocationDetail\";\nimport { XAndY } from \"../geometry3d/XYZProps\";\nimport { LineSegment3d } from \"./LineSegment3d\";\nimport { Arc3d } from \"./Arc3d\";\nimport { Range2d, Range3d } from \"../geometry3d/Range\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { PlaneAltitudeRangeContext } from \"./internalContexts/PlaneAltitudeRangeContext\";\nimport { GeometryQuery } from \"./GeometryQuery\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\n\n/**\n * base class for callbacks during region sweeps.\n * * At start of a component, `startComponent(node)` is called announcing a representative node on the outermost face.\n * * A Component in this usage is a component that is edge connected when ignoring \"exterior bridge edges\".\n * * As each face is entered, `enterFace(facePathStack, newFaceNode)` is called\n * * facePathStack[0] is the outermost node of the path from the outer face.\n * * facePathStack[1] is its inside mate.\n * * facePathStack[2k] is the outside node at crossing to face at depth k.\n * * facePathStack[2k+1] is the node where face at depth k was entered.\n * * newFaceNode is the entry node (redundant of stack tip)\n * * On retreat from a face, `leaveFace(facePathStack, faceNode)` is called.\n * * At end of component, `finishComponent (node)` is called.\n * * The base class is fully implemented to do nothing during the sweep.\n * @internal\n */\nabstract class RegionOpsFaceToFaceSearchCallbacks {\n /** Announce a representative node on the outer face of a component */\n public startComponent(_node: HalfEdge): boolean { return true; }\n /** Announce return to outer face */\n public finishComponent(_node: HalfEdge): boolean { return true; }\n /** Announce face entry */\n public enterFace(_facePathStack: HalfEdge[], _newFaceNode: HalfEdge): boolean { return true; }\n /** Announce face exit */\n public leaveFace(_facePathStack: HalfEdge[], _newFaceNode: HalfEdge): boolean { return true; }\n}\n/** Function signature to test if a pair of boolean states is to be accepted by area booleans (during face-to-face sweeps)\n * @internal\n */\ntype BinaryBooleanAcceptFunction = (stateA: boolean, stateB: boolean) => boolean;\n/** Function signature ot announce classification of a face.\n * The `faceType` parameters are\n * * -1 for a fully exterior face. This is a negative area face.\n * * 0 for a positive area face classified as \"out\" for the boolean.\n * * 1 for a positive area face classified as \"in\" for the boolean.\n */\ntype AnnounceClassifiedFace = (graph: HalfEdgeGraph, faceSeed: HalfEdge, faceType: -1 | 0 | 1, area: number) => void;\n/**\n * Implementation of `RegionOpsFaceToFaceSearchCallbacks` for binary boolean sweep with polygonal regions.\n * * For this linear-boundary case the boundary geometry is carried entirely from the coordinates in the half edges.\n * * This assumes the each node in the graph has edgeTag set to:\n * * `edgeTag === undefined` if the edge crossing does not change classification.\n * * for example, an edge added by regularization\n * * `edgeTag === 1` if this is a boundary for the first of the boolean input regions\n * * `edgeTag === 2` if this is a boundary for the second of the boolean input regions\n * * constructor\n * * takes caller-supplied function to decide whether to accept a face given its state relative to the two boolean terms.\n * * sets the in/out status of both terms to false.\n * * `startComponent` marks the entire outer face as `EXTERIOR`\n * * `enterFace`\n * * if this is a bounding edge (according to `node.faceTag`) toggle the in/out status if this boolean term.\n * * ask the faceAcceptFunction if the current term states combine to in/out for the result\n * * if out, set the `EXTERIOR` mask around the face.\n * * `leaveFace`\n * * if this is a bounding edge (according to `node.faceTag`) toggle the in/out status if this boolean term.\n * * `finishComponent` is not reimplemented.\n * @internal\n */\nclass RegionOpsBinaryBooleanSweepCallbacks extends RegionOpsFaceToFaceSearchCallbacks {\n private _faceSelectFunction: BinaryBooleanAcceptFunction;\n private _inComponent: boolean[];\n private _exteriorMask: HalfEdgeMask;\n public constructor(acceptFaceFunction: BinaryBooleanAcceptFunction, exteriorMask: HalfEdgeMask) {\n super();\n this._inComponent = [false, false, false]; // entry 0 is never reused.\n this._exteriorMask = exteriorMask;\n this._faceSelectFunction = acceptFaceFunction;\n }\n /** Mark this face as exterior */\n public override startComponent(node: HalfEdge): boolean { node.setMaskAroundFace(this._exteriorMask); return true; }\n /**\n * * If necessary, toggle a term state.\n * * if indicated, mark this face exterior.\n */\n public override enterFace(_facePathStack: HalfEdge[], node: HalfEdge): boolean {\n const thisFaceIndex = node.edgeTag;\n if (node.edgeTag === 1 || node.edgeTag === 2)\n this._inComponent[thisFaceIndex] = !this._inComponent[thisFaceIndex];\n if (!this._faceSelectFunction(this._inComponent[1], this._inComponent[2]))\n node.setMaskAroundFace(this._exteriorMask);\n return true;\n }\n /**\n * * If necessary, toggle a term state.\n */\n public override leaveFace(_facePathStack: HalfEdge[], node: HalfEdge): boolean {\n const thisFaceIndex = node.edgeTag;\n if (node.edgeTag === 1 || node.edgeTag === 2)\n this._inComponent[thisFaceIndex] = !this._inComponent[thisFaceIndex];\n return true;\n }\n}\n/**\n * Low level graph search for face classification.\n * @internal\n */\nexport class RegionOpsFaceToFaceSearch {\n /**\n * run a DFS with face-to-face step announcements.\n * * false return from any function terminates search immediately.\n * * all reachable nodes assumed to have both visit masks clear.\n * @param graph containing graph.\n * @param seed first node to visit.\n * @param faceHasBeenVisited mask marking faces that have been seen.\n * @param nodeHasBeenVisited mask marking node-to-node step around face.\n *\n */\n public static faceToFaceSearchFromOuterLoop(_graph: HalfEdgeGraph, seed: HalfEdge, faceHasBeenVisited: HalfEdgeMask, nodeHasBeenVisited: HalfEdgeMask, callbacks: RegionOpsFaceToFaceSearchCallbacks) {\n if (seed.isMaskSet(faceHasBeenVisited))\n return;\n if (!callbacks.startComponent(seed))\n return;\n const facePathStack = [];\n seed.setMaskAroundFace(faceHasBeenVisited);\n let faceWalker = seed;\n do {\n let entryNode = faceWalker;\n let mate = faceWalker.edgeMate;\n if (!mate.isMaskSet(faceHasBeenVisited)) {\n // the faceWalker seed is always on the base of the stack.\n // the stack then contains even-odd pairs of (entryNode, currentNode)\n // * entryNode is the node where a face was entered.\n // * faceNode is another node around that face.\n facePathStack.push(faceWalker);\n facePathStack.push(mate);\n let faceNode = mate.faceSuccessor;\n mate.setMaskAroundFace(faceHasBeenVisited);\n entryNode = mate;\n if (callbacks.enterFace(facePathStack, mate)) {\n for (; ;) {\n mate = faceNode.edgeMate;\n if (!mate.isMaskSet(faceHasBeenVisited)) {\n mate.setMaskAroundFace(faceHasBeenVisited);\n if (!callbacks.enterFace(facePathStack, mate))\n return;\n facePathStack.push(faceNode);\n facePathStack.push(mate);\n faceNode = mate;\n entryNode = mate;\n }\n faceNode.setMask(nodeHasBeenVisited);\n faceNode = faceNode.faceSuccessor;\n if (faceNode === entryNode) {\n callbacks.leaveFace(facePathStack, faceNode);\n if (facePathStack.length <= 2) {\n break;\n }\n facePathStack.pop();\n faceNode = facePathStack[facePathStack.length - 1];\n facePathStack.pop();\n entryNode = facePathStack[facePathStack.length - 1];\n }\n if (faceNode.isMaskSet(nodeHasBeenVisited)) {\n // this is disaster !!!\n return;\n }\n }\n }\n }\n // continue at outermost level .....\n faceWalker = faceWalker.faceSuccessor;\n } while (faceWalker !== seed);\n callbacks.finishComponent(seed);\n }\n /** Complete multi-step process for polygon binary booleans starting with arrays of coordinates.\n * * Each of the binary input terms is a collection of loops\n * * Within the binary term, in/out is determined by edge-crossing parity rules.\n * * Processing steps are\n * * Build the loops for each set.\n * * Each edge labeled with 1 or 2 as binary term identifier.\n * * find crossings among the edges.\n * * Edges are split as needed, but split preserves the edgeTag\n * * sort edges around vertices\n * * add regularization edges so holes are connected to their parent.\n */\n public static doPolygonBoolean(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, faceSelectFunction: (inA: boolean, inB: boolean) => boolean, graphCheckPoint?: GraphCheckPointFunction): HalfEdgeGraph | undefined {\n const graph = new HalfEdgeGraph();\n const baseMask = HalfEdgeMask.BOUNDARY_EDGE | HalfEdgeMask.PRIMARY_EDGE;\n const seedA = RegionOps.addLoopsWithEdgeTagToGraph(graph, loopsA, baseMask, 1);\n const seedB = RegionOps.addLoopsWithEdgeTagToGraph(graph, loopsB, baseMask, 2);\n if (graphCheckPoint)\n graphCheckPoint(\"unmerged loops\", graph, \"U\");\n if (seedA || seedB) {\n // split edges where they cross . . .\n HalfEdgeGraphMerge.splitIntersectingEdges(graph);\n if (graphCheckPoint)\n graphCheckPoint(\"After splitIntersectingEdges\", graph, \"S\");\n // sort radially around vertices.\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph);\n if (graphCheckPoint)\n graphCheckPoint(\"After clusterAndMergeXYTheta\", graph, \"M\");\n // add edges to connect various components (e.g. holes!!!)\n const context = new RegularizationContext(graph);\n context.regularizeGraph(true, true);\n if (graphCheckPoint)\n graphCheckPoint(\"After regularize\", graph, \"MR\");\n const exteriorHalfEdge = HalfEdgeGraphSearch.findMinimumAreaFace(graph);\n if (exteriorHalfEdge === undefined)\n return undefined;\n const exteriorMask = HalfEdgeMask.EXTERIOR;\n const faceVisitedMask = graph.grabMask();\n const nodeVisitedMask = graph.grabMask();\n const allMasksToClear = exteriorMask | faceVisitedMask | nodeVisitedMask;\n graph.clearMask(allMasksToClear);\n const callbacks = new RegionOpsBinaryBooleanSweepCallbacks(faceSelectFunction, exteriorMask);\n this.faceToFaceSearchFromOuterLoop(graph, exteriorHalfEdge, faceVisitedMask, nodeVisitedMask, callbacks);\n if (graphCheckPoint)\n graphCheckPoint(\"After faceToFaceSearchFromOuterLoop\", graph, \"MRX\");\n graph.dropMask(faceVisitedMask);\n graph.dropMask(nodeVisitedMask);\n return graph;\n }\n return undefined;\n }\n\n /** Complete multi-step process for polygon binary booleans starting with arrays of coordinates.\n * * the manyLoopsAndParitySets input is an array.\n * * Each entry is one or more loops.\n * * An entry that is \"just points\" is a simple loop.\n * * An entry that is itself an array of arrays of points is a set of loops with \"parity\" -- relation:\n * * typically the first is an outer loop an others are holes.\n * * but if there is self intersection or multiple outer loops, parity rules are applied to decide inner and outer.\n * * Processing steps are\n * * Build the loops for each set.\n * * Each edge labeled with index to the outer array.\n * * find crossings among the edges.\n * * Edges are split as needed, but split preserves the edgeTag\n * * sort edges around vertices\n * * add regularization edges so holes are connected to their parent.\n * * assign inside/outside by parity within each set and overall union.\n */\n public static doBinaryBooleanBetweenMultiLoopInputs(\n dataA: MultiLineStringDataVariant[],\n opA: RegionGroupOpType,\n binaryOp: RegionBinaryOpType,\n dataB: MultiLineStringDataVariant[],\n opB: RegionGroupOpType,\n purgeSliverExteriorFaces: boolean,\n ): HalfEdgeGraph | undefined {\n const graph = new HalfEdgeGraph();\n const baseMask = HalfEdgeMask.BOUNDARY_EDGE | HalfEdgeMask.PRIMARY_EDGE;\n const callbacks = RegionBooleanContext.create(opA, opB);\n callbacks.graph = graph;\n callbacks.faceAreaFunction = (node) => HalfEdgeGraphSearch.signedFaceArea(node);\n\n // Add all the members in groupA ..\n for (const data of dataA) {\n if (data.length > 2) {\n const member = new RegionGroupMember(data, callbacks.groupA);\n RegionOps.addLoopsWithEdgeTagToGraph(graph, data, baseMask, member);\n }\n }\n for (const data of dataB) {\n if (data.length > 2) {\n const member = new RegionGroupMember(data, callbacks.groupB);\n RegionOps.addLoopsWithEdgeTagToGraph(graph, data, baseMask, member);\n }\n }\n // split edges where they cross . . .\n HalfEdgeGraphMerge.splitIntersectingEdges(graph);\n // sort radially around vertices.\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph);\n // add edges to connect various components (e.g. holes!!!)\n const context = new RegularizationContext(graph);\n context.regularizeGraph(true, true);\n callbacks.runClassificationSweep(binaryOp);\n if (purgeSliverExteriorFaces)\n callbacks.unmaskMaskedNullFaces(HalfEdgeMask.EXTERIOR);\n return graph;\n }\n}\n\n/**\n * Enumeration of operation types \"within a group operand\" for a `RegionBooleanContext`.\n * @internal\n */\nexport enum RegionGroupOpType {\n Union = 0,\n Parity = 1,\n Intersection = 2,\n NonBounding = -1,\n}\n/**\n * Each loop or parity region in a `RegionBooleanContext` is recorded as a `RegionGroupMember`, which carries\n * * the Loop or parityRegion object\n * * a numeric indication of the sweep state (parity) during the classification search.\n * * a reference to the parent group (which in turn leads back to the `RegionBooleanContext`)\n * @internal\n */\nclass RegionGroupMember {\n public region: Loop | ParityRegion | CurvePrimitive | MultiLineStringDataVariant;\n public sweepState: number;\n public parentGroup: RegionGroup;\n public constructor(region: Loop | ParityRegion | CurvePrimitive | MultiLineStringDataVariant, parentGroup: RegionGroup) {\n this.region = region;\n this.parentGroup = parentGroup;\n this.sweepState = 0;\n }\n public clearState() { this.sweepState = 0; }\n}\n/**\n * A `RegionGroup` is\n * * An array of `RegionGroupMembers`, carrying the regions of the Ai or Bi part of the boolean expression.\n * * The `RegionGroupOpType` to be applied among those members.\n * * Pointer to the containing context\n * * The count of number of regions known to be \"in\" as the search progresses.\n * @internal\n */\nexport class RegionGroup {\n public members: RegionGroupMember[];\n public groupOpType: RegionGroupOpType;\n public parent: RegionBooleanContext;\n private _numIn: number;\n public constructor(parent: RegionBooleanContext, groupOpType: RegionGroupOpType) {\n this.members = [];\n this.parent = parent;\n this.groupOpType = groupOpType;\n this._numIn = 0;\n }\n /** deep clear of state data -- group header plus all members */\n public clearState() {\n for (const member of this.members)\n member.clearState();\n this._numIn = 0;\n }\n public range(): Range3d {\n const range = Range3d.createNull();\n for (const m of this.members) {\n if (m.region instanceof GeometryQuery)\n m.region.extendRange(range);\n else {\n const range1 = Range3d.createFromVariantData(m.region);\n range.extendRange(range1);\n }\n }\n return range;\n }\n /** Ask if the current _numIn count qualifies as an \"in\" for this operation type.\n */\n public getInOut(): boolean {\n // UNION is true if one or more members are IN\n if (this.groupOpType === RegionGroupOpType.Union)\n return this._numIn > 0;\n // PARITY is true if an odd number of regions are IN\n if (this.groupOpType === RegionGroupOpType.Parity)\n return Geometry.isOdd(this._numIn);\n // INTERSECTION is true if ALL the regions are IN\n if (this.groupOpType === RegionGroupOpType.Intersection)\n return this._numIn === this.members.length;\n return false;\n }\n // push new members into the group.\n public addMember(data: AnyRegion | AnyRegion[] | LineSegment3d | undefined, allowLineSegment: boolean = false) {\n if (data instanceof Loop || data instanceof ParityRegion) {\n const cleanerData = data.clone() as (ParityRegion | Loop);\n RegionOps.consolidateAdjacentPrimitives(cleanerData);\n this.members.push(new RegionGroupMember(cleanerData, this));\n } else if (data instanceof UnionRegion) {\n for (const child of data.children) {\n this.addMember(child);\n }\n } else if (Array.isArray(data)) {\n for (const item of data) {\n this.addMember(item);\n }\n } else if (allowLineSegment && data instanceof LineSegment3d) {\n this.members.push(new RegionGroupMember(data, this));\n\n }\n }\n // update the \"in\" count _numIn according to old and new states (parity counts) for some member region.\n public recordMemberStateChange(oldState: number, newState: number) {\n const oldIn = Geometry.isOdd(oldState);\n const newIn = Geometry.isOdd(newState);\n if (!oldIn && newIn)\n this._numIn++;\n else if (oldIn && !newIn)\n this._numIn--;\n }\n}\n/**\n * A `RegionBooleanContext` carries structure and operations for binary operations between two sets of regions.\n * * In the binary operation OP (union, intersection, parity, difference), the left and right operands\n * are each a composite union, difference, or parity among multiple inputs, i.e.\n * * (operationA among Ai) OP (operationB among Bi)\n * * where the Ai are one set of regions, being combined by operationA\n * * and the Bi are the another set of regions, being combined by operationB\n * * Each group of Ai and Bi is a `RegionGroup`\n * * This is an extremely delicate structure.\n * * Members are public because of the unique variety of queries, but should only be used for queries.\n * * The graph and curves in the booleans are connected by an extended pointer chain:\n * * (HalfEdge in Graph).edgeTag points to a CurveLocationDetail\n * * (CurveLocationDetail).curve points to a curve\n * * (Curve).parent points to RegionGroupMember\n * * (RegionGroupMember) points to RegionGroup\n * * (RegionGroup) points to RegionBooleanBinaryContext\n * * So..when a graph sweep crosses an edge,\n * * the chain leads to a parity count in the RegionGroupMember\n * * that can change the number of members active in the RegionGroup\n * * which can change the state of the context.\n * @internal\n */\nexport class RegionBooleanContext implements RegionOpsFaceToFaceSearchCallbacks {\n public groupA!: RegionGroup;\n public groupB!: RegionGroup;\n public extraGeometry!: RegionGroup;\n public graph!: HalfEdgeGraph;\n public faceAreaFunction!: NodeToNumberFunction;\n public binaryOp: RegionBinaryOpType;\n\n private constructor(groupTypeA: RegionGroupOpType, groupTypeB: RegionGroupOpType) {\n this.groupA = new RegionGroup(this, groupTypeA);\n this.groupB = new RegionGroup(this, groupTypeB);\n this.extraGeometry = new RegionGroup(this, RegionGroupOpType.NonBounding);\n this.binaryOp = RegionBinaryOpType.Union; // it will be revised on can calls.\n }\n /**\n * Create a context with both A and B groups empty.\n * * Caller follows up by calls to `context.groupA.addMember (loopOrParityRegion)` or `context.groupB.addMember (loopOrParityRegion)`\n * @param groupTypeA\n * @param groupTypeB\n */\n public static create(groupTypeA: RegionGroupOpType, groupTypeB: RegionGroupOpType): RegionBooleanContext {\n return new RegionBooleanContext(groupTypeA, groupTypeB);\n }\n public addMembers(dataA: AnyRegion | AnyRegion[] | undefined, dataB: AnyRegion | AnyRegion[] | undefined) {\n this.groupA.addMember(dataA);\n this.groupB.addMember(dataB);\n // const doConnectives = 1;\n // if (doConnectives !== 0)\n this.addConnectives();\n }\n\n private _workSegment?: LineSegment3d;\n private static _bridgeDirection = Vector3d.createNormalized(1.0, -0.12328974132467)!; // magic unit direction to minimize vertex hits\n /**\n * The sweep operations require access to all geometry by edge crossings and face walk.\n * If input loops are non-overlapping, there may be disconnected islands not reachable.\n * This method:\n * * finds the total range\n * * creates parallel rays from the extreme point of each loop and extending beyond the overall range\n * * places those lines in the extraGeometry group\n */\n public addConnectives() {\n const rangeA = this.groupA.range();\n const rangeB = this.groupB.range();\n const rangeAB = rangeA.union(rangeB);\n const areaTol = RegionOps.computeXYAreaTolerance(rangeAB);\n let margin = 0.1;\n this._workSegment = PlaneAltitudeRangeContext.findExtremePointsInDirection(rangeAB.corners(), RegionBooleanContext._bridgeDirection, this._workSegment);\n if (this._workSegment)\n margin *= this._workSegment.point0Ref.distanceXY(this._workSegment.point1Ref); // how much further to extend each bridge ray\n\n const maxPoints: Point3d[] = [];\n const findExtremePointsInLoop = (region: Loop) => {\n const area = RegionOps.computeXYArea(region);\n if (area === undefined || Math.abs(area) < areaTol)\n return; // avoid bridging trivial faces\n this._workSegment = PlaneAltitudeRangeContext.findExtremePointsInDirection(region, RegionBooleanContext._bridgeDirection, this._workSegment);\n if (this._workSegment)\n maxPoints.push(this._workSegment.point1Ref);\n };\n\n for (const groupMembers of [this.groupA.members, this.groupB.members]) {\n for (const m of groupMembers) {\n if (m.region instanceof Loop) {\n findExtremePointsInLoop(m.region);\n } else if (m.region instanceof ParityRegion) {\n for (const loop of m.region.children)\n findExtremePointsInLoop(loop);\n }\n }\n }\n\n const ray = Ray3d.createZero();\n for (const p of maxPoints) {\n // Make a line from...\n // 1) exactly the max point of the loops to\n // 2) a point clearly outside the big range\n // If p came from some inner loop this will...\n // 1) create a bridge from the inner loop through any containing loops (always)\n // 2) avoid crossing any containing loop at a vertex. (with high probability, but not absolutely always)\n const bridgeLength = margin + Ray3d.create(p, RegionBooleanContext._bridgeDirection, ray).intersectionWithRange3d(rangeAB).high;\n const outside = Point3d.createAdd2Scaled(p, 1.0, RegionBooleanContext._bridgeDirection, bridgeLength);\n const bridgeLine = LineSegment3d.createXYXY(p.x, p.y, outside.x, outside.y);\n this.extraGeometry.addMember(bridgeLine, true);\n }\n }\n\n /**\n * Markup and assembly steps for geometry in the RegionGroups.\n * * Annotate connection from group to curves.\n * * groups with point data but no curves get no further annotation.\n * * compute intersections.\n * * assemble and merge the HalfEdgeGraph.\n * @param mergeTolerance absolute distance tolerance for merging loops\n */\n public annotateAndMergeCurvesInGraph(mergeTolerance: number = Geometry.smallMetricDistance) {\n const allPrimitives: CurvePrimitive[] = [];\n // ASSUME loops have fine-grained types -- no linestrings !!\n for (const group of [this.groupA, this.groupB, this.extraGeometry]) {\n for (const member of group.members) {\n let k = allPrimitives.length;\n if (member.region instanceof GeometryQuery) {\n RegionOps.collectCurvePrimitives(member.region, allPrimitives, true, true);\n for (; k < allPrimitives.length; k++)\n allPrimitives[k].parent = member;\n }\n }\n }\n // const range = RegionOps.curveArrayRange(allPrimitives);\n const intersections = CurveCurve.allIntersectionsAmongPrimitivesXY(allPrimitives, mergeTolerance);\n const graph = PlanarSubdivision.assembleHalfEdgeGraph(allPrimitives, intersections, mergeTolerance);\n this.graph = graph;\n this.faceAreaFunction = faceAreaFromCurvedEdgeData;\n }\n private _announceFaceFunction?: AnnounceClassifiedFace;\n /**\n * Sweep through the graph to assign in/out classifications to all faces.\n * * the classification is announced in two ways:\n * * the EXTERNAL mask is set on all half edges that are NOT interior faces.\n * * the announceFaceFunction is called once for each face.\n * @param binaryOp\n * @param announceFaceFunction\n */\n public runClassificationSweep(\n binaryOp: RegionBinaryOpType,\n announceFaceFunction?: AnnounceClassifiedFace) {\n this._announceFaceFunction = announceFaceFunction;\n this.binaryOp = binaryOp;\n this.graph.clearMask(HalfEdgeMask.EXTERIOR);\n for (const group of [this.groupA, this.groupB]) {\n group.clearState();\n }\n const faceHasBeenVisitedMask = this.graph.grabMask();\n const nodeHasBeenVisitedMask = this.graph.grabMask();\n const componentArray = GraphComponentArray.create(this.graph);\n for (const component of componentArray.components) {\n const exteriorHalfEdge = HalfEdgeGraphSearch.findMinimumAreaFace(component.faces, this.faceAreaFunction);\n if (exteriorHalfEdge) {\n const exteriorMask = HalfEdgeMask.EXTERIOR;\n const allMasksToClear = exteriorMask | faceHasBeenVisitedMask | nodeHasBeenVisitedMask;\n this.graph.clearMask(allMasksToClear);\n RegionOpsFaceToFaceSearch.faceToFaceSearchFromOuterLoop(this.graph, exteriorHalfEdge, faceHasBeenVisitedMask, nodeHasBeenVisitedMask, this);\n }\n }\n this.graph.dropMask(faceHasBeenVisitedMask);\n this.graph.dropMask(nodeHasBeenVisitedMask);\n }\n // search the graph for faces with\n // .. exactly 2 edges\n // .. both with given mask\n // .. at least one mate is not exterior.\n // .. clear that mark\n public unmaskMaskedNullFaces(mask: number) {\n for (const nodeA of this.graph.allHalfEdges) {\n const nodeB = nodeA.faceSuccessor;\n if (nodeB.faceSuccessor === nodeA) {\n if (nodeA.getMask(mask) && nodeB.getMask(mask)) {\n if (!nodeA.edgeMate.getMask(mask) || !nodeB.edgeMate.getMask(mask)) {\n nodeA.clearMask(mask);\n nodeB.clearMask(mask);\n }\n }\n }\n }\n }\n private getInOut(): boolean {\n if (this.binaryOp === RegionBinaryOpType.Union)\n return this.groupA.getInOut() || this.groupB.getInOut();\n if (this.binaryOp === RegionBinaryOpType.Intersection)\n return this.groupA.getInOut() && this.groupB.getInOut();\n if (this.binaryOp === RegionBinaryOpType.AMinusB)\n return this.groupA.getInOut() && !this.groupB.getInOut();\n if (this.binaryOp === RegionBinaryOpType.BMinusA)\n return !this.groupA.getInOut() && this.groupB.getInOut();\n if (this.binaryOp === RegionBinaryOpType.Parity)\n return this.groupA.getInOut() !== this.groupB.getInOut();\n return false;\n }\n /**\n * Record transition across an edge as entry or exit from a RegionGroup.\n * * Work backward from the node to a RegionGroup. This path can be:\n * * If the node points to a CurveLocationDetail of a (possibly partial) curve, the path is (take a deep breath)\n * * node points to CurveLocation Detail\n * * CurveLocationDetail points to curve\n * * curve points to RegionGroupMember\n * * If the node points directly to a RegionGroup, it's ready to go!!!\n * @param node\n * @param delta\n */\n private recordTransitionAcrossEdge(node: HalfEdge, delta: number): RegionGroupMember | undefined {\n const updateRegionGroupMemberState = (member: RegionGroupMember): RegionGroupMember => {\n if (member.parentGroup.groupOpType === RegionGroupOpType.NonBounding)\n return member; // no transition across a bridge edge\n if (delta !== 0) {\n const oldSweepState = member.sweepState;\n member.sweepState += delta;\n member.parentGroup.recordMemberStateChange(oldSweepState, member.sweepState);\n }\n return member;\n };\n\n const data = node.edgeTag;\n if (data instanceof RegionGroupMember)\n return updateRegionGroupMemberState(data);\n\n if (data instanceof CurveLocationDetail) {\n // We trust that the caller has linked from the graph node to a curve which has a RegionGroupMember as its parent.\n const member = data.curve!.parent;\n if (member instanceof RegionGroupMember)\n return updateRegionGroupMemberState(member);\n }\n return undefined;\n }\n // obligations to act as sweep callback ...\n /** Announce a representative node on the outer face of a component */\n public startComponent(outerFaceNode: HalfEdge): boolean {\n outerFaceNode.setMaskAroundFace(HalfEdgeMask.EXTERIOR);\n if (this._announceFaceFunction)\n this._announceFaceFunction(this.graph, outerFaceNode, -1, faceAreaFromCurvedEdgeData(outerFaceNode));\n return true;\n }\n /** Announce return to outer face */\n public finishComponent(_node: HalfEdge): boolean {\n return true;\n }\n /** Announce entry to a graph face.\n * * Both both sides of a graph edge are from the same RegionGroupMember.\n * * Hence \"crossing that edge\" changes the parity count for the RegionGroupMember that owns that edge by 1.\n * * The parity count for other RegionGroupMembers are never affected by this crossing.\n * * Crossing a bridge edge does not change the parity count.\n */\n public enterFace(_facePathStack: HalfEdge[], newFaceNode: HalfEdge): boolean {\n this.recordTransitionAcrossEdge(newFaceNode, 1);\n const state = this.getInOut();\n if (!state)\n newFaceNode.setMaskAroundFace(HalfEdgeMask.EXTERIOR);\n if (this._announceFaceFunction)\n this._announceFaceFunction(this.graph, newFaceNode, state ? 1 : 0, faceAreaFromCurvedEdgeData(newFaceNode));\n return true;\n }\n /** Announce face exit */\n public leaveFace(_facePathStack: HalfEdge[], oldFaceNode: HalfEdge): boolean {\n this.recordTransitionAcrossEdge(oldFaceNode, -1);\n return true;\n }\n}\n/** return xy area between a (part of a) curve and the x axis through a reference point.\n * If detail is undefined or does not have both start and end fractions, just do trapezoid area\n */\nfunction areaUnderPartialCurveXY(detail: CurveLocationDetail | undefined, xyStart: XAndY, xyEnd: XAndY, referencePoint: XAndY): number {\n // area between trapezoid and axis\n let trapezoidArea;\n if (detail && detail.point1) {\n trapezoidArea = -(detail.point1.x - detail.point.x) * (0.5 * (detail.point.y + detail.point1.y) - referencePoint.y);\n } else {\n trapezoidArea = -(xyEnd.x - xyStart.x) * (0.5 * (xyStart.y + xyEnd.y) - referencePoint.y);\n }\n let areaToChord = 0.0;\n if (detail && detail.curve && detail.hasFraction1) {\n\n if (detail.curve instanceof LineSegment3d) {\n // ah .. nothing to do for a line segment\n } else if (detail.curve instanceof Arc3d) {\n areaToChord = detail.curve.areaToChordXY(detail.fraction, detail.fraction1!);\n }\n }\n return trapezoidArea + areaToChord;\n}\n/** Compute face area for a face whose edges are decorated with CurveLocationDetail for their (partial) curves */\nfunction faceAreaFromCurvedEdgeData(faceSeed: HalfEdge): number {\n let area = 0.0;\n let edge = faceSeed;\n do {\n area += (edge.sortData as number) * areaUnderPartialCurveXY((edge.edgeTag as CurveLocationDetail), edge, edge.faceSuccessor, faceSeed);\n } while ((edge = edge.faceSuccessor) !== faceSeed);\n return area;\n}\n\n/**\n * Function to accumulate area under edges\n * Array of nodes representing faces in a subset of a graph.\n * @internal\n */\nexport type NodeAndRangeFunction = (edge: HalfEdge, range: Range2d) => void;\n/**\n * Array of nodes representing faces in a subset of a graph.\n * @internal\n */\nexport class GraphComponent {\n public faces: HalfEdge[];\n public faceAreas: number[];\n public range: Range2d;\n public constructor(faces: HalfEdge[]) {\n this.faces = faces;\n this.range = Range2d.createNull();\n this.faceAreas = [];\n }\n /**\n * visit all vertices and edges in the component to build face area array and composite range.\n *\n * @param extendRangeForEdge optional function to compute edge range. If undefined, linear edge is assumed.\n * @param faceAreaFunction optional function to compute face area. If undefined, linear edges are assumed.\n */\n public buildFaceData(extendRangeForEdge: NodeAndRangeFunction | undefined, faceAreaFunction: NodeToNumberFunction | undefined) {\n const vertexFunction = (node: HalfEdge) => {\n if (extendRangeForEdge)\n extendRangeForEdge(node, this.range);\n else\n this.range.extendXY(node.x, node.y);\n return 0;\n };\n this.range.setNull();\n for (const f of this.faces) {\n f.sumAroundFace(vertexFunction);\n }\n this.faceAreas.length = 0;\n if (!faceAreaFunction)\n faceAreaFunction = (node) => HalfEdgeGraphSearch.signedFaceArea(node);\n for (const f of this.faces) {\n this.faceAreas.push(faceAreaFunction(f));\n }\n }\n}\n/** build and hold an array of component data for a HalfEdgeGraph.\n * @internal\n */\nexport class GraphComponentArray {\n public components: GraphComponent[];\n public graph: HalfEdgeGraph;\n private constructor(graph: HalfEdgeGraph) {\n this.graph = graph;\n this.components = [];\n }\n public static create(graph: HalfEdgeGraph, extendRangeForEdge?: (edge: HalfEdge, range: Range2d) => void): GraphComponentArray {\n const result = new GraphComponentArray(graph);\n const componentArrays = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\n for (const componentFaces of componentArrays) {\n const component = new GraphComponent(componentFaces);\n component.buildFaceData(extendRangeForEdge, faceAreaFromCurvedEdgeData);\n result.components.push(component);\n }\n return result;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RegionOpsClassificationSweeps.js","sourceRoot":"","sources":["../../../src/curve/RegionOpsClassificationSweeps.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { MultiLineStringDataVariant } from \"../geometry3d/IndexedXYZCollection\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Range2d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { XAndY } from \"../geometry3d/XYZProps\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask, NodeToNumberFunction } from \"../topology/Graph\";\nimport { HalfEdgeGraphSearch } from \"../topology/HalfEdgeGraphSearch\";\nimport { HalfEdgeGraphMerge } from \"../topology/Merging\";\nimport { RegularizationContext } from \"../topology/RegularizeFace\";\nimport { Arc3d } from \"./Arc3d\";\nimport { CurveCurve } from \"./CurveCurve\";\nimport { CurveLocationDetail } from \"./CurveLocationDetail\";\nimport { CurvePrimitive } from \"./CurvePrimitive\";\nimport { AnyRegion } from \"./CurveTypes\";\nimport { GeometryQuery } from \"./GeometryQuery\";\nimport { PlaneAltitudeRangeContext } from \"./internalContexts/PlaneAltitudeRangeContext\";\nimport { LineSegment3d } from \"./LineSegment3d\";\nimport { Loop } from \"./Loop\";\nimport { ParityRegion } from \"./ParityRegion\";\nimport { PlanarSubdivision } from \"./Query/PlanarSubdivision\";\nimport { GraphCheckPointFunction, RegionBinaryOpType, RegionOps } from \"./RegionOps\";\nimport { UnionRegion } from \"./UnionRegion\";\n\n/**\n * base class for callbacks during region sweeps.\n * * At start of a component, `startComponent(node)` is called announcing a representative node on the outermost face.\n * * A Component in this usage is a component that is edge connected when ignoring \"exterior bridge edges\".\n * * As each face is entered, `enterFace(facePathStack, newFaceNode)` is called\n * * facePathStack[0] is the outermost node of the path from the outer face.\n * * facePathStack[1] is its inside mate.\n * * facePathStack[2k] is the outside node at crossing to face at depth k.\n * * facePathStack[2k+1] is the node where face at depth k was entered.\n * * newFaceNode is the entry node (redundant of stack tip)\n * * On retreat from a face, `leaveFace(facePathStack, faceNode)` is called.\n * * At end of component, `finishComponent (node)` is called.\n * * The base class is fully implemented to do nothing during the sweep.\n * @internal\n */\nabstract class RegionOpsFaceToFaceSearchCallbacks {\n /** Announce a representative node on the outer face of a component */\n public startComponent(_node: HalfEdge): boolean { return true; }\n /** Announce return to outer face */\n public finishComponent(_node: HalfEdge): boolean { return true; }\n /** Announce face entry */\n public enterFace(_facePathStack: HalfEdge[], _newFaceNode: HalfEdge): boolean { return true; }\n /** Announce face exit */\n public leaveFace(_facePathStack: HalfEdge[], _newFaceNode: HalfEdge): boolean { return true; }\n}\n/** Function signature to test if a pair of boolean states is to be accepted by area booleans (during face-to-face sweeps)\n * @internal\n */\ntype BinaryBooleanAcceptFunction = (stateA: boolean, stateB: boolean) => boolean;\n/** Function signature ot announce classification of a face.\n * The `faceType` parameters are\n * * -1 for a fully exterior face. This is a negative area face.\n * * 0 for a positive area face classified as \"out\" for the boolean.\n * * 1 for a positive area face classified as \"in\" for the boolean.\n */\ntype AnnounceClassifiedFace = (graph: HalfEdgeGraph, faceSeed: HalfEdge, faceType: -1 | 0 | 1, area: number) => void;\n/**\n * Implementation of `RegionOpsFaceToFaceSearchCallbacks` for binary boolean sweep with polygonal regions.\n * * For this linear-boundary case the boundary geometry is carried entirely from the coordinates in the half edges.\n * * This assumes the each node in the graph has edgeTag set to:\n * * `edgeTag === undefined` if the edge crossing does not change classification.\n * * for example, an edge added by regularization\n * * `edgeTag === 1` if this is a boundary for the first of the boolean input regions\n * * `edgeTag === 2` if this is a boundary for the second of the boolean input regions\n * * constructor\n * * takes caller-supplied function to decide whether to accept a face given its state relative to the two boolean terms.\n * * sets the in/out status of both terms to false.\n * * `startComponent` marks the entire outer face as `EXTERIOR`\n * * `enterFace`\n * * if this is a bounding edge (according to `node.faceTag`) toggle the in/out status if this boolean term.\n * * ask the faceAcceptFunction if the current term states combine to in/out for the result\n * * if out, set the `EXTERIOR` mask around the face.\n * * `leaveFace`\n * * if this is a bounding edge (according to `node.faceTag`) toggle the in/out status if this boolean term.\n * * `finishComponent` is not reimplemented.\n * @internal\n */\nclass RegionOpsBinaryBooleanSweepCallbacks extends RegionOpsFaceToFaceSearchCallbacks {\n private _faceSelectFunction: BinaryBooleanAcceptFunction;\n private _inComponent: boolean[];\n private _exteriorMask: HalfEdgeMask;\n public constructor(acceptFaceFunction: BinaryBooleanAcceptFunction, exteriorMask: HalfEdgeMask) {\n super();\n this._inComponent = [false, false, false]; // entry 0 is never reused.\n this._exteriorMask = exteriorMask;\n this._faceSelectFunction = acceptFaceFunction;\n }\n /** Mark this face as exterior */\n public override startComponent(node: HalfEdge): boolean { node.setMaskAroundFace(this._exteriorMask); return true; }\n /**\n * * If necessary, toggle a term state.\n * * if indicated, mark this face exterior.\n */\n public override enterFace(_facePathStack: HalfEdge[], node: HalfEdge): boolean {\n const thisFaceIndex = node.edgeTag;\n if (node.edgeTag === 1 || node.edgeTag === 2)\n this._inComponent[thisFaceIndex] = !this._inComponent[thisFaceIndex];\n if (!this._faceSelectFunction(this._inComponent[1], this._inComponent[2]))\n node.setMaskAroundFace(this._exteriorMask);\n return true;\n }\n /**\n * * If necessary, toggle a term state.\n */\n public override leaveFace(_facePathStack: HalfEdge[], node: HalfEdge): boolean {\n const thisFaceIndex = node.edgeTag;\n if (node.edgeTag === 1 || node.edgeTag === 2)\n this._inComponent[thisFaceIndex] = !this._inComponent[thisFaceIndex];\n return true;\n }\n}\n/**\n * Low level graph search for face classification.\n * @internal\n */\nexport class RegionOpsFaceToFaceSearch {\n /**\n * run a DFS with face-to-face step announcements.\n * * false return from any function terminates search immediately.\n * * all reachable nodes assumed to have both visit masks clear.\n * @param graph containing graph.\n * @param seed first node to visit.\n * @param faceHasBeenVisited mask marking faces that have been seen.\n * @param nodeHasBeenVisited mask marking node-to-node step around face.\n *\n */\n public static faceToFaceSearchFromOuterLoop(_graph: HalfEdgeGraph, seed: HalfEdge, faceHasBeenVisited: HalfEdgeMask, nodeHasBeenVisited: HalfEdgeMask, callbacks: RegionOpsFaceToFaceSearchCallbacks) {\n if (seed.isMaskSet(faceHasBeenVisited))\n return;\n if (!callbacks.startComponent(seed))\n return;\n const facePathStack = [];\n seed.setMaskAroundFace(faceHasBeenVisited);\n let faceWalker = seed;\n do {\n let entryNode = faceWalker;\n let mate = faceWalker.edgeMate;\n if (!mate.isMaskSet(faceHasBeenVisited)) {\n // the faceWalker seed is always on the base of the stack.\n // the stack then contains even-odd pairs of (entryNode, currentNode)\n // * entryNode is the node where a face was entered.\n // * faceNode is another node around that face.\n facePathStack.push(faceWalker);\n facePathStack.push(mate);\n let faceNode = mate.faceSuccessor;\n mate.setMaskAroundFace(faceHasBeenVisited);\n entryNode = mate;\n if (callbacks.enterFace(facePathStack, mate)) {\n for (; ;) {\n mate = faceNode.edgeMate;\n if (!mate.isMaskSet(faceHasBeenVisited)) {\n mate.setMaskAroundFace(faceHasBeenVisited);\n if (!callbacks.enterFace(facePathStack, mate))\n return;\n facePathStack.push(faceNode);\n facePathStack.push(mate);\n faceNode = mate;\n entryNode = mate;\n }\n faceNode.setMask(nodeHasBeenVisited);\n faceNode = faceNode.faceSuccessor;\n if (faceNode === entryNode) {\n callbacks.leaveFace(facePathStack, faceNode);\n if (facePathStack.length <= 2) {\n break;\n }\n facePathStack.pop();\n faceNode = facePathStack[facePathStack.length - 1];\n facePathStack.pop();\n entryNode = facePathStack[facePathStack.length - 1];\n }\n if (faceNode.isMaskSet(nodeHasBeenVisited)) {\n // this is disaster !!!\n return;\n }\n }\n }\n }\n // continue at outermost level .....\n faceWalker = faceWalker.faceSuccessor;\n } while (faceWalker !== seed);\n callbacks.finishComponent(seed);\n }\n /** Complete multi-step process for polygon binary booleans starting with arrays of coordinates.\n * * Each of the binary input terms is a collection of loops\n * * Within the binary term, in/out is determined by edge-crossing parity rules.\n * * Processing steps are\n * * Build the loops for each set.\n * * Each edge labeled with 1 or 2 as binary term identifier.\n * * find crossings among the edges.\n * * Edges are split as needed, but split preserves the edgeTag\n * * sort edges around vertices\n * * add regularization edges so holes are connected to their parent.\n */\n public static doPolygonBoolean(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, faceSelectFunction: (inA: boolean, inB: boolean) => boolean, graphCheckPoint?: GraphCheckPointFunction): HalfEdgeGraph | undefined {\n const graph = new HalfEdgeGraph();\n const baseMask = HalfEdgeMask.BOUNDARY_EDGE | HalfEdgeMask.PRIMARY_EDGE;\n const seedA = RegionOps.addLoopsWithEdgeTagToGraph(graph, loopsA, baseMask, 1);\n const seedB = RegionOps.addLoopsWithEdgeTagToGraph(graph, loopsB, baseMask, 2);\n if (graphCheckPoint)\n graphCheckPoint(\"unmerged loops\", graph, \"U\");\n if (seedA || seedB) {\n // split edges where they cross . . .\n HalfEdgeGraphMerge.splitIntersectingEdges(graph);\n if (graphCheckPoint)\n graphCheckPoint(\"After splitIntersectingEdges\", graph, \"S\");\n // sort radially around vertices.\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph);\n if (graphCheckPoint)\n graphCheckPoint(\"After clusterAndMergeXYTheta\", graph, \"M\");\n // add edges to connect various components (e.g. holes!!!)\n const context = new RegularizationContext(graph);\n context.regularizeGraph(true, true);\n if (graphCheckPoint)\n graphCheckPoint(\"After regularize\", graph, \"MR\");\n const exteriorHalfEdge = HalfEdgeGraphSearch.findMinimumAreaFace(graph);\n if (exteriorHalfEdge === undefined)\n return undefined;\n const exteriorMask = HalfEdgeMask.EXTERIOR;\n const faceVisitedMask = graph.grabMask();\n const nodeVisitedMask = graph.grabMask();\n const allMasksToClear = exteriorMask | faceVisitedMask | nodeVisitedMask;\n graph.clearMask(allMasksToClear);\n const callbacks = new RegionOpsBinaryBooleanSweepCallbacks(faceSelectFunction, exteriorMask);\n this.faceToFaceSearchFromOuterLoop(graph, exteriorHalfEdge, faceVisitedMask, nodeVisitedMask, callbacks);\n if (graphCheckPoint)\n graphCheckPoint(\"After faceToFaceSearchFromOuterLoop\", graph, \"MRX\");\n graph.dropMask(faceVisitedMask);\n graph.dropMask(nodeVisitedMask);\n return graph;\n }\n return undefined;\n }\n\n /** Complete multi-step process for polygon binary booleans starting with arrays of coordinates.\n * * the manyLoopsAndParitySets input is an array.\n * * Each entry is one or more loops.\n * * An entry that is \"just points\" is a simple loop.\n * * An entry that is itself an array of arrays of points is a set of loops with \"parity\" -- relation:\n * * typically the first is an outer loop an others are holes.\n * * but if there is self intersection or multiple outer loops, parity rules are applied to decide inner and outer.\n * * Processing steps are\n * * Build the loops for each set.\n * * Each edge labeled with index to the outer array.\n * * find crossings among the edges.\n * * Edges are split as needed, but split preserves the edgeTag\n * * sort edges around vertices\n * * add regularization edges so holes are connected to their parent.\n * * assign inside/outside by parity within each set and overall union.\n */\n public static doBinaryBooleanBetweenMultiLoopInputs(\n dataA: MultiLineStringDataVariant[],\n opA: RegionGroupOpType,\n binaryOp: RegionBinaryOpType,\n dataB: MultiLineStringDataVariant[],\n opB: RegionGroupOpType,\n purgeSliverExteriorFaces: boolean,\n ): HalfEdgeGraph | undefined {\n const graph = new HalfEdgeGraph();\n const baseMask = HalfEdgeMask.BOUNDARY_EDGE | HalfEdgeMask.PRIMARY_EDGE;\n const callbacks = RegionBooleanContext.create(opA, opB);\n callbacks.graph = graph;\n callbacks.faceAreaFunction = (node) => HalfEdgeGraphSearch.signedFaceArea(node);\n\n // Add all the members in groupA ..\n for (const data of dataA) {\n if (data.length > 2) {\n const member = new RegionGroupMember(data, callbacks.groupA);\n RegionOps.addLoopsWithEdgeTagToGraph(graph, data, baseMask, member);\n }\n }\n for (const data of dataB) {\n if (data.length > 2) {\n const member = new RegionGroupMember(data, callbacks.groupB);\n RegionOps.addLoopsWithEdgeTagToGraph(graph, data, baseMask, member);\n }\n }\n // split edges where they cross . . .\n HalfEdgeGraphMerge.splitIntersectingEdges(graph);\n // sort radially around vertices.\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph);\n // add edges to connect various components (e.g. holes!!!)\n const context = new RegularizationContext(graph);\n context.regularizeGraph(true, true);\n callbacks.runClassificationSweep(binaryOp);\n if (purgeSliverExteriorFaces)\n callbacks.unmaskMaskedNullFaces(HalfEdgeMask.EXTERIOR);\n return graph;\n }\n}\n\n/**\n * Enumeration of operation types \"within a group operand\" for a `RegionBooleanContext`.\n * @internal\n */\nexport enum RegionGroupOpType {\n Union = 0,\n Parity = 1,\n Intersection = 2,\n NonBounding = -1,\n}\n/**\n * Each loop or parity region in a `RegionBooleanContext` is recorded as a `RegionGroupMember`, which carries\n * * the Loop or parityRegion object\n * * a numeric indication of the sweep state (parity) during the classification search.\n * * a reference to the parent group (which in turn leads back to the `RegionBooleanContext`)\n * @internal\n */\nclass RegionGroupMember {\n public region: Loop | ParityRegion | CurvePrimitive | MultiLineStringDataVariant;\n public sweepState: number;\n public parentGroup: RegionGroup;\n public constructor(region: Loop | ParityRegion | CurvePrimitive | MultiLineStringDataVariant, parentGroup: RegionGroup) {\n this.region = region;\n this.parentGroup = parentGroup;\n this.sweepState = 0;\n }\n public clearState() { this.sweepState = 0; }\n}\n/**\n * A `RegionGroup` is\n * * An array of `RegionGroupMembers`, carrying the regions of the Ai or Bi part of the boolean expression.\n * * The `RegionGroupOpType` to be applied among those members.\n * * Pointer to the containing context\n * * The count of number of regions known to be \"in\" as the search progresses.\n * @internal\n */\nexport class RegionGroup {\n public members: RegionGroupMember[];\n public groupOpType: RegionGroupOpType;\n public parent: RegionBooleanContext;\n private _numIn: number;\n public constructor(parent: RegionBooleanContext, groupOpType: RegionGroupOpType) {\n this.members = [];\n this.parent = parent;\n this.groupOpType = groupOpType;\n this._numIn = 0;\n }\n /** deep clear of state data -- group header plus all members */\n public clearState() {\n for (const member of this.members)\n member.clearState();\n this._numIn = 0;\n }\n public range(): Range3d {\n const range = Range3d.createNull();\n for (const m of this.members) {\n if (m.region instanceof GeometryQuery)\n m.region.extendRange(range);\n else {\n const range1 = Range3d.createFromVariantData(m.region);\n range.extendRange(range1);\n }\n }\n return range;\n }\n /** Ask if the current _numIn count qualifies as an \"in\" for this operation type.\n */\n public getInOut(): boolean {\n // UNION is true if one or more members are IN\n if (this.groupOpType === RegionGroupOpType.Union)\n return this._numIn > 0;\n // PARITY is true if an odd number of regions are IN\n if (this.groupOpType === RegionGroupOpType.Parity)\n return Geometry.isOdd(this._numIn);\n // INTERSECTION is true if ALL the regions are IN\n if (this.groupOpType === RegionGroupOpType.Intersection)\n return this._numIn === this.members.length;\n return false;\n }\n // push new members into the group.\n public addMember(data: AnyRegion | AnyRegion[] | LineSegment3d | undefined, allowLineSegment: boolean = false) {\n if (data instanceof Loop || data instanceof ParityRegion) {\n const cleanerData = data.clone() as (ParityRegion | Loop);\n RegionOps.consolidateAdjacentPrimitives(cleanerData);\n this.members.push(new RegionGroupMember(cleanerData, this));\n } else if (data instanceof UnionRegion) {\n for (const child of data.children) {\n this.addMember(child);\n }\n } else if (Array.isArray(data)) {\n for (const item of data) {\n this.addMember(item);\n }\n } else if (allowLineSegment && data instanceof LineSegment3d) {\n this.members.push(new RegionGroupMember(data, this));\n\n }\n }\n // update the \"in\" count _numIn according to old and new states (parity counts) for some member region.\n public recordMemberStateChange(oldState: number, newState: number) {\n const oldIn = Geometry.isOdd(oldState);\n const newIn = Geometry.isOdd(newState);\n if (!oldIn && newIn)\n this._numIn++;\n else if (oldIn && !newIn)\n this._numIn--;\n }\n}\n/**\n * A `RegionBooleanContext` carries structure and operations for binary operations between two sets of regions.\n * * In the binary operation OP (union, intersection, parity, difference), the left and right operands\n * are each a composite union, difference, or parity among multiple inputs, i.e.\n * * (operationA among Ai) OP (operationB among Bi)\n * * where the Ai are one set of regions, being combined by operationA\n * * and the Bi are the another set of regions, being combined by operationB\n * * Each group of Ai and Bi is a `RegionGroup`\n * * This is an extremely delicate structure.\n * * Members are public because of the unique variety of queries, but should only be used for queries.\n * * The graph and curves in the booleans are connected by an extended pointer chain:\n * * (HalfEdge in Graph).edgeTag points to a CurveLocationDetail\n * * (CurveLocationDetail).curve points to a curve\n * * (Curve).parent points to RegionGroupMember\n * * (RegionGroupMember) points to RegionGroup\n * * (RegionGroup) points to RegionBooleanBinaryContext\n * * So..when a graph sweep crosses an edge,\n * * the chain leads to a parity count in the RegionGroupMember\n * * that can change the number of members active in the RegionGroup\n * * which can change the state of the context.\n * @internal\n */\nexport class RegionBooleanContext implements RegionOpsFaceToFaceSearchCallbacks {\n public groupA!: RegionGroup;\n public groupB!: RegionGroup;\n public extraGeometry!: RegionGroup;\n public graph!: HalfEdgeGraph;\n public faceAreaFunction!: NodeToNumberFunction;\n public binaryOp: RegionBinaryOpType;\n\n private constructor(groupTypeA: RegionGroupOpType, groupTypeB: RegionGroupOpType) {\n this.groupA = new RegionGroup(this, groupTypeA);\n this.groupB = new RegionGroup(this, groupTypeB);\n this.extraGeometry = new RegionGroup(this, RegionGroupOpType.NonBounding);\n this.binaryOp = RegionBinaryOpType.Union; // it will be revised on can calls.\n }\n /**\n * Create a context with both A and B groups empty.\n * * Caller follows up by calls to `context.groupA.addMember (loopOrParityRegion)` or `context.groupB.addMember (loopOrParityRegion)`\n * @param groupTypeA\n * @param groupTypeB\n */\n public static create(groupTypeA: RegionGroupOpType, groupTypeB: RegionGroupOpType): RegionBooleanContext {\n return new RegionBooleanContext(groupTypeA, groupTypeB);\n }\n public addMembers(dataA: AnyRegion | AnyRegion[] | undefined, dataB: AnyRegion | AnyRegion[] | undefined) {\n this.groupA.addMember(dataA);\n this.groupB.addMember(dataB);\n // const doConnectives = 1;\n // if (doConnectives !== 0)\n this.addConnectives();\n }\n\n private _workSegment?: LineSegment3d;\n private static _bridgeDirection = Vector3d.createNormalized(1.0, -0.12328974132467)!; // magic unit direction to minimize vertex hits\n /**\n * The sweep operations require access to all geometry by edge crossings and face walk.\n * If input loops are non-overlapping, there may be disconnected islands not reachable.\n * This method:\n * * finds the total range\n * * creates parallel rays from the extreme point of each loop and extending beyond the overall range\n * * places those lines in the extraGeometry group\n */\n public addConnectives() {\n const rangeA = this.groupA.range();\n const rangeB = this.groupB.range();\n const rangeAB = rangeA.union(rangeB);\n const areaTol = RegionOps.computeXYAreaTolerance(rangeAB);\n let margin = 0.1;\n this._workSegment = PlaneAltitudeRangeContext.findExtremePointsInDirection(rangeAB.corners(), RegionBooleanContext._bridgeDirection, this._workSegment);\n if (this._workSegment)\n margin *= this._workSegment.point0Ref.distanceXY(this._workSegment.point1Ref); // how much further to extend each bridge ray\n\n const maxPoints: Point3d[] = [];\n const findExtremePointsInLoop = (region: Loop) => {\n const area = RegionOps.computeXYArea(region);\n if (area === undefined || Math.abs(area) < areaTol)\n return; // avoid bridging trivial faces\n this._workSegment = PlaneAltitudeRangeContext.findExtremePointsInDirection(region, RegionBooleanContext._bridgeDirection, this._workSegment);\n if (this._workSegment)\n maxPoints.push(this._workSegment.point1Ref);\n };\n\n for (const groupMembers of [this.groupA.members, this.groupB.members]) {\n for (const m of groupMembers) {\n if (m.region instanceof Loop) {\n findExtremePointsInLoop(m.region);\n } else if (m.region instanceof ParityRegion) {\n for (const loop of m.region.children)\n findExtremePointsInLoop(loop);\n }\n }\n }\n\n const ray = Ray3d.createZero();\n for (const p of maxPoints) {\n // Make a line from...\n // 1) exactly the max point of the loops to\n // 2) a point clearly outside the big range\n // If p came from some inner loop this will...\n // 1) create a bridge from the inner loop through any containing loops (always)\n // 2) avoid crossing any containing loop at a vertex. (with high probability, but not absolutely always)\n const bridgeLength = margin + Ray3d.create(p, RegionBooleanContext._bridgeDirection, ray).intersectionWithRange3d(rangeAB).high;\n const outside = Point3d.createAdd2Scaled(p, 1.0, RegionBooleanContext._bridgeDirection, bridgeLength);\n const bridgeLine = LineSegment3d.createXYXY(p.x, p.y, outside.x, outside.y);\n this.extraGeometry.addMember(bridgeLine, true);\n }\n }\n\n /**\n * Markup and assembly steps for geometry in the RegionGroups.\n * * Annotate connection from group to curves.\n * * groups with point data but no curves get no further annotation.\n * * compute intersections.\n * * assemble and merge the HalfEdgeGraph.\n * @param mergeTolerance absolute distance tolerance for merging loops\n */\n public annotateAndMergeCurvesInGraph(mergeTolerance: number = Geometry.smallMetricDistance) {\n const allPrimitives: CurvePrimitive[] = [];\n // ASSUME loops have fine-grained types -- no linestrings !!\n for (const group of [this.groupA, this.groupB, this.extraGeometry]) {\n for (const member of group.members) {\n let k = allPrimitives.length;\n if (member.region instanceof GeometryQuery) {\n RegionOps.collectCurvePrimitives(member.region, allPrimitives, true, true);\n for (; k < allPrimitives.length; k++)\n allPrimitives[k].parent = member;\n }\n }\n }\n // const range = RegionOps.curveArrayRange(allPrimitives);\n const intersections = CurveCurve.allIntersectionsAmongPrimitivesXY(allPrimitives, mergeTolerance);\n const graph = PlanarSubdivision.assembleHalfEdgeGraph(allPrimitives, intersections, mergeTolerance);\n this.graph = graph;\n this.faceAreaFunction = faceAreaFromCurvedEdgeData;\n }\n private _announceFaceFunction?: AnnounceClassifiedFace;\n /**\n * Sweep through the graph to assign in/out classifications to all faces.\n * * the classification is announced in two ways:\n * * the EXTERNAL mask is set on all half edges that are NOT interior faces.\n * * the announceFaceFunction is called once for each face.\n * @param binaryOp\n * @param announceFaceFunction\n */\n public runClassificationSweep(\n binaryOp: RegionBinaryOpType,\n announceFaceFunction?: AnnounceClassifiedFace) {\n this._announceFaceFunction = announceFaceFunction;\n this.binaryOp = binaryOp;\n this.graph.clearMask(HalfEdgeMask.EXTERIOR);\n for (const group of [this.groupA, this.groupB]) {\n group.clearState();\n }\n const faceHasBeenVisitedMask = this.graph.grabMask();\n const nodeHasBeenVisitedMask = this.graph.grabMask();\n const componentArray = GraphComponentArray.create(this.graph);\n for (const component of componentArray.components) {\n const exteriorHalfEdge = HalfEdgeGraphSearch.findMinimumAreaFace(component.faces, this.faceAreaFunction);\n if (exteriorHalfEdge) {\n const exteriorMask = HalfEdgeMask.EXTERIOR;\n const allMasksToClear = exteriorMask | faceHasBeenVisitedMask | nodeHasBeenVisitedMask;\n this.graph.clearMask(allMasksToClear);\n RegionOpsFaceToFaceSearch.faceToFaceSearchFromOuterLoop(this.graph, exteriorHalfEdge, faceHasBeenVisitedMask, nodeHasBeenVisitedMask, this);\n }\n }\n this.graph.dropMask(faceHasBeenVisitedMask);\n this.graph.dropMask(nodeHasBeenVisitedMask);\n }\n // search the graph for faces with\n // .. exactly 2 edges\n // .. both with given mask\n // .. at least one mate is not exterior.\n // .. clear that mark\n public unmaskMaskedNullFaces(mask: number) {\n for (const nodeA of this.graph.allHalfEdges) {\n const nodeB = nodeA.faceSuccessor;\n if (nodeB.faceSuccessor === nodeA) {\n if (nodeA.getMask(mask) && nodeB.getMask(mask)) {\n if (!nodeA.edgeMate.getMask(mask) || !nodeB.edgeMate.getMask(mask)) {\n nodeA.clearMask(mask);\n nodeB.clearMask(mask);\n }\n }\n }\n }\n }\n private getInOut(): boolean {\n if (this.binaryOp === RegionBinaryOpType.Union)\n return this.groupA.getInOut() || this.groupB.getInOut();\n if (this.binaryOp === RegionBinaryOpType.Intersection)\n return this.groupA.getInOut() && this.groupB.getInOut();\n if (this.binaryOp === RegionBinaryOpType.AMinusB)\n return this.groupA.getInOut() && !this.groupB.getInOut();\n if (this.binaryOp === RegionBinaryOpType.BMinusA)\n return !this.groupA.getInOut() && this.groupB.getInOut();\n if (this.binaryOp === RegionBinaryOpType.Parity)\n return this.groupA.getInOut() !== this.groupB.getInOut();\n return false;\n }\n /**\n * Record transition across an edge as entry or exit from a RegionGroup.\n * * Work backward from the node to a RegionGroup. This path can be:\n * * If the node points to a CurveLocationDetail of a (possibly partial) curve, the path is (take a deep breath)\n * * node points to CurveLocation Detail\n * * CurveLocationDetail points to curve\n * * curve points to RegionGroupMember\n * * If the node points directly to a RegionGroup, it's ready to go!!!\n * @param node\n * @param delta\n */\n private recordTransitionAcrossEdge(node: HalfEdge, delta: number): RegionGroupMember | undefined {\n const updateRegionGroupMemberState = (member: RegionGroupMember): RegionGroupMember => {\n if (member.parentGroup.groupOpType === RegionGroupOpType.NonBounding)\n return member; // no transition across a bridge edge\n if (delta !== 0) {\n const oldSweepState = member.sweepState;\n member.sweepState += delta;\n member.parentGroup.recordMemberStateChange(oldSweepState, member.sweepState);\n }\n return member;\n };\n\n const data = node.edgeTag;\n if (data instanceof RegionGroupMember)\n return updateRegionGroupMemberState(data);\n\n if (data instanceof CurveLocationDetail) {\n // We trust that the caller has linked from the graph node to a curve which has a RegionGroupMember as its parent.\n const member = data.curve!.parent;\n if (member instanceof RegionGroupMember)\n return updateRegionGroupMemberState(member);\n }\n return undefined;\n }\n // obligations to act as sweep callback ...\n /** Announce a representative node on the outer face of a component */\n public startComponent(outerFaceNode: HalfEdge): boolean {\n outerFaceNode.setMaskAroundFace(HalfEdgeMask.EXTERIOR);\n if (this._announceFaceFunction)\n this._announceFaceFunction(this.graph, outerFaceNode, -1, faceAreaFromCurvedEdgeData(outerFaceNode));\n return true;\n }\n /** Announce return to outer face */\n public finishComponent(_node: HalfEdge): boolean {\n return true;\n }\n /** Announce entry to a graph face.\n * * Both both sides of a graph edge are from the same RegionGroupMember.\n * * Hence \"crossing that edge\" changes the parity count for the RegionGroupMember that owns that edge by 1.\n * * The parity count for other RegionGroupMembers are never affected by this crossing.\n * * Crossing a bridge edge does not change the parity count.\n */\n public enterFace(_facePathStack: HalfEdge[], newFaceNode: HalfEdge): boolean {\n this.recordTransitionAcrossEdge(newFaceNode, 1);\n const state = this.getInOut();\n if (!state)\n newFaceNode.setMaskAroundFace(HalfEdgeMask.EXTERIOR);\n if (this._announceFaceFunction)\n this._announceFaceFunction(this.graph, newFaceNode, state ? 1 : 0, faceAreaFromCurvedEdgeData(newFaceNode));\n return true;\n }\n /** Announce face exit */\n public leaveFace(_facePathStack: HalfEdge[], oldFaceNode: HalfEdge): boolean {\n this.recordTransitionAcrossEdge(oldFaceNode, -1);\n return true;\n }\n}\n/** return xy area between a (part of a) curve and the x axis through a reference point.\n * If detail is undefined or does not have both start and end fractions, just do trapezoid area\n */\nfunction areaUnderPartialCurveXY(detail: CurveLocationDetail | undefined, xyStart: XAndY, xyEnd: XAndY, referencePoint: XAndY): number {\n // area between trapezoid and axis\n let trapezoidArea;\n if (detail && detail.point1) {\n trapezoidArea = -(detail.point1.x - detail.point.x) * (0.5 * (detail.point.y + detail.point1.y) - referencePoint.y);\n } else {\n trapezoidArea = -(xyEnd.x - xyStart.x) * (0.5 * (xyStart.y + xyEnd.y) - referencePoint.y);\n }\n let areaToChord = 0.0;\n if (detail && detail.curve && detail.hasFraction1) {\n\n if (detail.curve instanceof LineSegment3d) {\n // ah .. nothing to do for a line segment\n } else if (detail.curve instanceof Arc3d) {\n areaToChord = detail.curve.areaToChordXY(detail.fraction, detail.fraction1!);\n }\n }\n return trapezoidArea + areaToChord;\n}\n/** Compute face area for a face whose edges are decorated with CurveLocationDetail for their (partial) curves */\nfunction faceAreaFromCurvedEdgeData(faceSeed: HalfEdge): number {\n let area = 0.0;\n let edge = faceSeed;\n do {\n area += (edge.sortData as number) * areaUnderPartialCurveXY((edge.edgeTag as CurveLocationDetail), edge, edge.faceSuccessor, faceSeed);\n } while ((edge = edge.faceSuccessor) !== faceSeed);\n return area;\n}\n\n/**\n * Function to accumulate area under edges\n * Array of nodes representing faces in a subset of a graph.\n * @internal\n */\nexport type NodeAndRangeFunction = (edge: HalfEdge, range: Range2d) => void;\n/**\n * Array of nodes representing faces in a subset of a graph.\n * @internal\n */\nexport class GraphComponent {\n public faces: HalfEdge[];\n public faceAreas: number[];\n public range: Range2d;\n public constructor(faces: HalfEdge[]) {\n this.faces = faces;\n this.range = Range2d.createNull();\n this.faceAreas = [];\n }\n /**\n * visit all vertices and edges in the component to build face area array and composite range.\n *\n * @param extendRangeForEdge optional function to compute edge range. If undefined, linear edge is assumed.\n * @param faceAreaFunction optional function to compute face area. If undefined, linear edges are assumed.\n */\n public buildFaceData(extendRangeForEdge: NodeAndRangeFunction | undefined, faceAreaFunction: NodeToNumberFunction | undefined) {\n const vertexFunction = (node: HalfEdge) => {\n if (extendRangeForEdge)\n extendRangeForEdge(node, this.range);\n else\n this.range.extendXY(node.x, node.y);\n return 0;\n };\n this.range.setNull();\n for (const f of this.faces) {\n f.sumAroundFace(vertexFunction);\n }\n this.faceAreas.length = 0;\n if (!faceAreaFunction)\n faceAreaFunction = (node) => HalfEdgeGraphSearch.signedFaceArea(node);\n for (const f of this.faces) {\n this.faceAreas.push(faceAreaFunction(f));\n }\n }\n}\n/** build and hold an array of component data for a HalfEdgeGraph.\n * @internal\n */\nexport class GraphComponentArray {\n public components: GraphComponent[];\n public graph: HalfEdgeGraph;\n private constructor(graph: HalfEdgeGraph) {\n this.graph = graph;\n this.components = [];\n }\n public static create(graph: HalfEdgeGraph, extendRangeForEdge?: (edge: HalfEdge, range: Range2d) => void): GraphComponentArray {\n const result = new GraphComponentArray(graph);\n const componentArrays = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\n for (const componentFaces of componentArrays) {\n const component = new GraphComponent(componentFaces);\n component.buildFaceData(extendRangeForEdge, faceAreaFromCurvedEdgeData);\n result.components.push(component);\n }\n return result;\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { MultiLineStringDataVariant } from "../topology/Triangulation";
|
|
2
1
|
import { GrowableXYZArray } from "./GrowableXYZArray";
|
|
3
2
|
import { IndexedXYCollection } from "./IndexedXYCollection";
|
|
3
|
+
import { MultiLineStringDataVariant } from "./IndexedXYZCollection";
|
|
4
4
|
import { Matrix3d } from "./Matrix3d";
|
|
5
5
|
import { Point2d, Vector2d } from "./Point2dVector2d";
|
|
6
6
|
import { Point3d } from "./Point3dVector3d";
|
|
@@ -88,7 +88,7 @@ export declare class GrowableXYArray extends IndexedXYCollection {
|
|
|
88
88
|
pushAll(points: XAndY[]): void;
|
|
89
89
|
/** push all points of an array */
|
|
90
90
|
pushAllXYAndZ(points: XYAndZ[] | GrowableXYZArray): void;
|
|
91
|
-
/** Push points from variant sources.
|
|
91
|
+
/** Push copies of points from variant sources.
|
|
92
92
|
* Valid inputs are:
|
|
93
93
|
* * Point2d
|
|
94
94
|
* * Point3d
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrowableXYArray.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/GrowableXYArray.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"GrowableXYArray.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/GrowableXYArray.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrowableXYArray.js","sourceRoot":"","sources":["../../../src/geometry3d/GrowableXYArray.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK5C;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,mBAAmB;IAkBtD;;;OAGG;IACH,YAAmB,YAAoB,CAAC,EAAE,YAAqB;QAC7D,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAG,qBAAqB;QACrE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,CAAC,SAAS,KAAK,YAAY,IAAI,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;IAChG,CAAC;IAED;;;;;OAKG;IACO,QAAQ,CAAC,MAA+B,EAAE,WAAoB,EAAE,UAAmB;QAC3F,qDAAqD;QACrD,IAAI,QAAQ,GAAG,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,QAAQ,GAAG,CAAC;YACd,QAAQ,GAAG,CAAC,CAAC;QACf,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAC/B,OAAO,EAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAC,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5E,IAAI,OAAO,GAAG,CAAC,EAAE;YACf,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM;gBACzB,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,IAAI,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;gBACxC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;YACzC,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC;gBACnB,OAAO,IAAI,OAAO,GAAG,CAAC,CAAC;SAC1B;QACD,IAAI,OAAO,IAAI,CAAC;YACd,OAAO,EAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAC,CAAC;QAC/B,IAAI,OAAO,KAAK,MAAM,CAAC,MAAM;YAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;aAC9B,IAAI,MAAM,YAAY,YAAY;YACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;;YAEtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrD,OAAO,EAAC,KAAK,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAC,CAAC;IACpD,CAAC;IAED,kGAAkG;IAClG,IAAoB,MAAM,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,IAAW,MAAM,CAAC,SAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEtE,2CAA2C;IAC3C,IAAW,aAAa,KAAK,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD;;OAEG;IACI,WAAW,KAAmB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEzD,4HAA4H;IACrH,cAAc,CAAC,aAAqB,EAAE,oBAA6B,IAAI;QAC5E,IAAI,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE;YACpC,IAAI,iBAAiB;gBACnB,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC;SAClC;IACH,CAAC;IACD;;;;;OAKG;IACK,MAAM,CAAC,UAAkB,EAAE,WAAqB;QACtD,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ;YAC/C,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;aACxB,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE;YACnC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACvC,IAAI,WAAW,IAAI,KAAK;gBACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;SAC5B;IACH,CAAC;IACD;;;OAGG;IACI,KAAK;QACV,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,MAAM,CAAC,IAAS,EAAE,MAAwB;QACtD,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,KAAK,EAAE,CAAC;SAChB;aAAM;YACL,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/E,MAAM,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;SAC1C;QACD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,6BAA6B,CAAC,IAAgC;QAC1E,OAAO,gBAAgB,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,2CAA2C;IACpC,IAAI,CAAC,MAAa;QACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,kCAAkC;IAC3B,OAAO,CAAC,MAAe;QAC5B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,MAAM;YACpB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,kCAAkC;IAC3B,aAAa,CAAC,MAAmC;QACtD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,MAAM,YAAY,gBAAgB,EAAE;YACtC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC/C;aAAM;YACL,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C;IACH,CAAC;IACD;;;;;;;;;;OAUG;IACI,QAAQ,CAAC,CAAM;QACpB,IAAI,CAAC,YAAY,OAAO,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACvB;aAAM,IAAI,CAAC,YAAY,gBAAgB,EAAE;YACxC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACvB;aAAM,IAAI,CAAC,YAAY,OAAO,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACvB;aAAM,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,YAAY,EAAE;YACpE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;SAC1B;aAAM,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzB;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC3B,8DAA8D;YAC9D,KAAK,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACpB;aAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACvB;aAAM,IAAI,CAAC,YAAY,mBAAmB,EAAE;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YACnB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/E;IACH,CAAC;IACD;;;OAGG;IACI,QAAQ,CAAC,OAAe;QAC7B,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,EAAE;YAC5B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBAChC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC/C;SACF;IACH,CAAC;IACD,4CAA4C;IACrC,MAAM,CAAC,CAAS,EAAE,CAAS;QAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,GAAG;QACR,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC;YACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IACD;;;OAGG;IACI,YAAY,CAAC,KAAa;QAC/B,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,CAAC;IACD;;;;OAIG;IACI,+BAA+B,CAAC,UAAkB,EAAE,MAAgB;QACzE,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC;QAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACa,yBAAyB,CAAC,UAAkB;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACa,yBAAyB,CAAC,UAAkB;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,eAAe;QACpB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0CAA0C;IAC1B,6BAA6B,CAAC,UAAkB,EAAE,MAAgB;QAChF,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;YACjC,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC;YAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;SACzE;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2CAA2C;IAC3B,+BAA+B,CAAC,WAAmB,EAAE,MAAiB;QACpF,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE;YAClC,MAAM,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC;YAC9B,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;SAC1E;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACI,2BAA2B,CAAC,SAAiB,EAAE,MAAuB,EAAE,WAAmB;QAChG,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE;YACpE,MAAM,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACI,uBAAuB,CAAC,MAAuB,EAAE,WAAoB;QAC1E,yBAAyB;QACzB,IAAI,WAAW,KAAK,SAAS,EAAE;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;YAC1B,OAAO,QAAQ,CAAC;SACjB;QACD,0BAA0B;QAC1B,IAAI,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE;YACpC,MAAM,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC;SACV;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;;OAGG;IACI,mCAAmC,CAAC,MAAuB,EAAE,CAAS,EAAE,QAAgB,EAAE,CAAS;QACxG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;YACpD,MAAM,SAAS,GAAG,GAAG,GAAG,QAAQ,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACV,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,CAAC,MAAM,CACT,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EACxC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACrD;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,0BAA0B,CAAC,MAAwB,EAAE,SAAqB,EAAE,IAAsB;QAC9G,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,IAAI;YACP,IAAI,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC;aACnC;YACH,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;QACD,IAAI,SAAS,EAAE;YACb,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;gBACnC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrB,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aACrG;SACF;aAAM;YACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;SAC5B;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;OAEG;IACI,KAAK,CAAC,MAAgB;QAC3B,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,IAAI,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IACD;;OAEG;IACI,IAAI,CAAC,MAAgB;QAC1B,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IACD;;;;OAIG;IACI,sBAAsB,CAAC,UAAkB,EAAE,KAAY;QAC5D,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;OAKG;IACI,wBAAwB,CAAC,UAAkB,EAAE,CAAS,EAAE,CAAS;QACtE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;OAGG;IACK,yBAAyB,CAAC,UAAkB,EAAE,CAAS,EAAE,CAAS;QACxE,OAAO,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,IAAY,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,mCAAmC;IAC5B,cAAc;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,EAAE,EAAE,EAAE,CAAC;QACX,IAAI,CAAC,CAAC;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YAChD,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAChD,EAAE,EAAE,CAAC;YACL,EAAE,EAAE,CAAC;YACL,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;SACjD;IACH,CAAC;IAED,4DAA4D;IACrD,wBAAwB,CAAC,SAAoB;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;QACnC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;QACrC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;YACvC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAC3C,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;SAChD;IACH,CAAC;IAED,gEAAgE;IACzD,uBAAuB,CAAC,MAAgB;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;YACvC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC3C;IACH,CAAC;IAED,4DAA4D;IACrD,0BAA0B,CAAC,SAAoB;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;QACnC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;QAClC,IAAI,CAAC,KAAK;YACR,OAAO,KAAK,CAAC;QACf,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;YACvC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACjB,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC3C;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,8DAA8D;IACvD,WAAW,CAAC,aAAsB,EAAE,SAAqB;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,SAAS,EAAE;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,CAAC;gBACvC,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACtE;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,CAAC;gBACvC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAEhD;IACH,CAAC;IACD,kDAAkD;IAC3C,UAAU;QACf,IAAI,GAAG,GAAG,GAAG,CAAC;QACd,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAE,gEAAgE;QACpG,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,CACzD,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EACrB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,GAAG,CAAC;IACb,CAAC;IACD;;;OAGG;IACI,YAAY,CAAC,MAAc;QAChC,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;gBAC/B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;SAC1C;IACH,CAAC;IACD,sEAAsE;IAC/D,WAAW,CAAC,CAAS,EAAE,QAAgB,EAAE,CAAS,EAAE,MAAgB;QACzE,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;YAChD,MAAM,SAAS,GAAG,GAAG,GAAG,QAAQ,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACV,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,OAAO,CAAC,MAAM,CACnB,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EACxC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;SAC7D;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,yDAAyD;IAClD,MAAM;QACX,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAI,iBAAiB;QACjD,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;gBACnD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBACzB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC7B,IAAI,IAAI,QAAQ,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aACvD;SACF;QACD,OAAO,GAAG,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,gEAAgE;IAChD,gBAAgB,CAAC,CAAS,EAAE,CAAS,EAAE,MAAiB;QACtE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAChD,OAAO,SAAS,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACV,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,uDAAuD;IACvC,gBAAgB,CAAC,MAAa,EAAE,CAAS,EAAE,MAAiB;QAC1E,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,QAAQ,CAAC,MAAM,CACpB,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAClB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;SACnC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,+FAA+F;IAC/E,2BAA2B,CAAC,WAAmB,EAAE,YAAoB,EAAE,YAAoB;QACzG,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE;YACxG,MAAM,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,OAAO,QAAQ,CAAC,gBAAgB,CAC9B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACjD;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uFAAuF;IACvE,2BAA2B,CAAC,MAAa,EAAE,YAAoB,EAAE,YAAoB;QACnG,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE;YACtE,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,OAAO,QAAQ,CAAC,gBAAgB,CAC9B,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAC1C,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;SAC/C;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2DAA2D;IACpD,QAAQ,CAAC,CAAS,EAAE,CAAS;QAClC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;YAChD,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,QAAQ,CAAC,YAAY,CAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAC/B,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;SAC5C;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,sEAAsE;IAC/D,oBAAoB,CAAC,CAAS,EAAE,UAAmB;QACxD,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;YACxB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,QAAQ,CAAC,YAAY,CAC1B,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAC7B,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;SACtC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,oCAAoC;IAC7B,MAAM,CAAC,aAAa,CAAC,KAAkC,EAAE,KAAkC;QAChG,IAAI,KAAK,IAAI,KAAK,EAAE;YAClB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBAC/B,OAAO,KAAK,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;gBACnC,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC;oBACnG,OAAO,KAAK,CAAC;YACjB,OAAO,IAAI,CAAC;SACb;QACD,kDAAkD;QAClD,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,+EAA+E;IACxE,kBAAkB;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,sBAAsB;QACtB,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CACT,CAAC,WAAmB,EAAE,WAAmB,EAAE,EAAE;YAC3C,gBAAgB;YAChB,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACL,+BAA+B;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kDAAkD;IAC3C,mBAAmB,CAAC,EAAU,EAAE,EAAU;QAC/C,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,IAAI,EAAE,GAAG,EAAE;gBAAE,OAAO,CAAC,CAAC;YACtB,IAAI,EAAE,GAAG,EAAE;gBAAE,OAAO,CAAC,CAAC,CAAC;SACxB;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,wDAAwD;IAC1E,CAAC;IAED,oFAAoF;IAC7E,SAAS,CAAC,UAAkB,EAAE,cAAsB;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,GAAG,cAAc,CAAC,CAAC;IACrD,CAAC;IACD,+BAA+B;IACxB,aAAa,CAAC,KAAsB,EAAE,YAAoB,QAAQ,CAAC,mBAAmB;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK;YAC1B,OAAO,KAAK,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAClC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;gBAC3C,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module ArraysAndInterfaces\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { MultiLineStringDataVariant } from \"../topology/Triangulation\";\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\nimport { IndexedXYCollection } from \"./IndexedXYCollection\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point2d, Vector2d } from \"./Point2dVector2d\";\nimport { Point3d } from \"./Point3dVector3d\";\nimport { Range2d } from \"./Range\";\nimport { Transform } from \"./Transform\";\nimport { XAndY, XYAndZ } from \"./XYZProps\";\n\n/** `GrowableXYArray` manages a (possibly growing) Float64Array to pack xy coordinates.\n * @public\n */\nexport class GrowableXYArray extends IndexedXYCollection {\n /**\n * array of packed xy xy xy components\n */\n private _data: Float64Array;\n /**\n * Number of xy tuples (not floats) in the array\n */\n private _xyInUse: number;\n /**\n * capacity in xy tuples. (not floats)\n */\n private _xyCapacity: number;\n /**\n * multiplier used by ensureCapacity to expand requested reallocation size\n */\n private _growthFactor: number;\n\n /** Construct a new GrowablePoint2d array.\n * @param numPoints initial capacity in xy tuples (default 8)\n * @param growthFactor used by ensureCapacity to expand requested reallocation size (default 1.5)\n */\n public constructor(numPoints: number = 8, growthFactor?: number) {\n super();\n this._data = new Float64Array(numPoints * 2); // 2 values per point\n this._xyInUse = 0;\n this._xyCapacity = numPoints;\n this._growthFactor = (undefined !== growthFactor && growthFactor >= 1.0) ? growthFactor : 1.5;\n }\n\n /** Copy xy points from source array. Does not reallocate or change active point count.\n * @param source array to copy from\n * @param sourceCount copy the first sourceCount points; all points if undefined\n * @param destOffset copy to instance array starting at this point index; zero if undefined\n * @return count and offset of points copied\n */\n protected copyData(source: Float64Array | number[], sourceCount?: number, destOffset?: number): {count: number, offset: number} {\n // validate inputs and convert from points to entries\n let myOffset = (undefined !== destOffset) ? destOffset * 2 : 0;\n if (myOffset < 0)\n myOffset = 0;\n if (myOffset >= this._data.length)\n return {count: 0, offset: 0};\n let myCount = (undefined !== sourceCount) ? sourceCount * 2 : source.length;\n if (myCount > 0) {\n if (myCount > source.length)\n myCount = source.length;\n if (myOffset + myCount > this._data.length)\n myCount = this._data.length - myOffset;\n if (myCount % 2 !== 0)\n myCount -= myCount % 2;\n }\n if (myCount <= 0)\n return {count: 0, offset: 0};\n if (myCount === source.length)\n this._data.set(source, myOffset);\n else if (source instanceof Float64Array)\n this._data.set(source.subarray(0, myCount), myOffset);\n else\n this._data.set(source.slice(0, myCount), myOffset);\n return {count: myCount / 2, offset: myOffset / 2};\n }\n\n /** The number of points in use. When the length is increased, the array is padded with zeroes. */\n public override get length() { return this._xyInUse; }\n public set length(newLength: number) { this.resize(newLength, true); }\n\n /** Return the number of float64 in use. */\n public get float64Length() { return this._xyInUse * 2; }\n /** Return the raw packed data.\n * * Note that the length of the returned Float64Array is a count of doubles, and includes the excess capacity\n */\n public float64Data(): Float64Array { return this._data; }\n\n /** If necessary, increase the capacity to a new pointCount. Current coordinates and point count (length) are unchanged. */\n public ensureCapacity(pointCapacity: number, applyGrowthFactor: boolean = true) {\n if (pointCapacity > this._xyCapacity) {\n if (applyGrowthFactor)\n pointCapacity *= this._growthFactor;\n const prevData = this._data;\n this._data = new Float64Array(pointCapacity * 2);\n this.copyData(prevData, this._xyInUse);\n this._xyCapacity = pointCapacity;\n }\n }\n /**\n * * If pointCount is less than current length, just reset current length to pointCount, effectively trimming active points but preserving original capacity.\n * * If pointCount is greater than current length, reallocate to exactly pointCount, copy existing points, and optionally pad excess with zero.\n * @param pointCount new number of active points in array\n * @param padWithZero when increasing point count, whether to zero out new points (default false)\n */\n public resize(pointCount: number, padWithZero?: boolean) {\n if (pointCount >= 0 && pointCount < this._xyInUse)\n this._xyInUse = pointCount;\n else if (pointCount > this._xyInUse) {\n this.ensureCapacity(pointCount, false);\n if (padWithZero ?? false)\n this._data.fill(0, this._xyInUse * 2);\n this._xyInUse = pointCount;\n }\n }\n /**\n * Make a copy of the (active) points in this array.\n * (The clone does NOT get excess capacity)\n */\n public clone(): GrowableXYArray {\n const newPoints = new GrowableXYArray(this.length);\n newPoints.copyData(this._data, this.length);\n newPoints._xyInUse = this.length;\n return newPoints;\n }\n /** Create an array populated from\n * Valid inputs are:\n * * Point2d\n * * Point3d\n * * An array of 2 doubles\n * * An array of 3 doubles\n * * A GrowableXYZArray\n * * A GrowableXYArray\n * * Any json object satisfying Point3d.isXAndY\n * * A Float64Array of doubles, interpreted as xyxy\n * * An array of any of the above\n */\n public static create(data: any, result?: GrowableXYArray): GrowableXYArray {\n if (result) {\n result.clear();\n } else {\n const pointCount = typeof data[0] === \"number\" ? data.length / 2 : data.length;\n result = new GrowableXYArray(pointCount);\n }\n result.pushFrom(data);\n return result;\n }\n\n /** Restructure MultiLineStringDataVariant as array of GrowableXYZArray\n * @deprecated in 4.x. Moved to GrowableXYZArray class.\n */\n public static createArrayOfGrowableXYZArray(data: MultiLineStringDataVariant): GrowableXYZArray[] | undefined {\n return GrowableXYZArray.createArrayOfGrowableXYZArray(data);\n }\n /** push a point to the end of the array */\n public push(toPush: XAndY) {\n this.pushXY(toPush.x, toPush.y);\n }\n\n /** push all points of an array */\n public pushAll(points: XAndY[]) {\n this.ensureCapacity(this._xyInUse + points.length, false);\n for (const p of points)\n this.push(p);\n }\n /** push all points of an array */\n public pushAllXYAndZ(points: XYAndZ[] | GrowableXYZArray) {\n this.ensureCapacity(this._xyInUse + points.length, false);\n if (points instanceof GrowableXYZArray) {\n const xyzBuffer = points.float64Data();\n const n = points.length * 3;\n for (let i = 0; i + 2 < n; i += 3)\n this.pushXY(xyzBuffer[i], xyzBuffer[i + 1]);\n } else {\n for (const p of points) this.pushXY(p.x, p.y);\n }\n }\n /** Push points from variant sources.\n * Valid inputs are:\n * * Point2d\n * * Point3d\n * * An array of 2 doubles\n * * A GrowableXYArray\n * * A GrowableXYZArray\n * * Any json object satisfying Point3d.isXAndY\n * * A Float64Array of doubles, interpreted as xyxy\n * * An array of any of the above\n */\n public pushFrom(p: any) {\n if (p instanceof Point3d) {\n this.pushXY(p.x, p.y);\n } else if (p instanceof GrowableXYZArray) {\n this.pushAllXYAndZ(p);\n } else if (p instanceof Point2d) {\n this.pushXY(p.x, p.y);\n } else if (Geometry.isNumberArray(p, 3) || p instanceof Float64Array) {\n const xyToAdd = Math.trunc(p.length / 2);\n this.ensureCapacity(this._xyInUse + xyToAdd, false);\n this.copyData(p, xyToAdd, this._xyInUse);\n this._xyInUse += xyToAdd;\n } else if (Geometry.isNumberArray(p, 2)) {\n this.pushXY(p[0], p[1]);\n } else if (Array.isArray(p)) {\n // direct recursion re-wraps p and goes infinite. Unroll here.\n for (const q of p)\n this.pushFrom(q);\n } else if (Point3d.isXAndY(p)) {\n this.pushXY(p.x, p.y);\n } else if (p instanceof IndexedXYCollection) {\n const n = p.length;\n this.ensureCapacity(this._xyInUse + n, false);\n for (let i = 0; i < n; i++)\n this.pushXY(p.getXAtUncheckedPointIndex(i), p.getYAtUncheckedPointIndex(i));\n }\n }\n /**\n * Replicate numWrap xy values from the front of the array as new values at the end.\n * @param numWrap number of xy values to replicate\n */\n public pushWrap(numWrap: number) {\n if (this._xyInUse >= numWrap) {\n this.ensureCapacity(this._xyInUse + numWrap, false);\n for (let i = 0; i < numWrap; i++) {\n const k = 2 * i;\n this.pushXY(this._data[k], this._data[k + 1]);\n }\n }\n }\n /** push a point given by x,y coordinates */\n public pushXY(x: number, y: number) {\n this.ensureCapacity(this._xyInUse + 1);\n const index = this._xyInUse * 2;\n this._data[index] = x;\n this._data[index + 1] = y;\n this._xyInUse++;\n }\n\n /** Remove one point from the back.\n * * NOTE that (in the manner of std::vector native) this is \"just\" removing the point -- no point is NOT returned.\n * * Use `back ()` to get the last x,y assembled into a `Point2d `\n */\n public pop() {\n if (this._xyInUse > 0)\n this._xyInUse--;\n }\n /**\n * Test if index is valid for an xy (point or vector) within this array\n * @param index xy index to test.\n */\n public isIndexValid(index: number): boolean {\n if (index >= this._xyInUse || index < 0)\n return false;\n return true;\n }\n /**\n * Clear all xy data, but leave capacity unchanged.\n */\n public clear() {\n this._xyInUse = 0;\n }\n /**\n * Get a point by index, strongly typed as a Point2d. This is unchecked. Use atPoint2dIndex to have validity test.\n * @param pointIndex index to access\n * @param result optional result\n */\n public getPoint2dAtUncheckedPointIndex(pointIndex: number, result?: Point2d): Point2d {\n const index = 2 * pointIndex;\n return Point2d.create(this._data[index], this._data[index + 1], result);\n }\n\n /**\n * Get x coordinate by point index, with no index checking\n * @param pointIndex index to access\n */\n public override getXAtUncheckedPointIndex(pointIndex: number): number {\n return this._data[2 * pointIndex];\n }\n\n /**\n * Get y coordinate by point index, with no index checking\n * @param pointIndex index to access\n */\n public override getYAtUncheckedPointIndex(pointIndex: number): number {\n return this._data[2 * pointIndex + 1];\n }\n\n /**\n * Gather all points as a Point2d[]\n */\n public getPoint2dArray(): Point2d[] {\n const n = 2 * this._xyInUse;\n const result = [];\n const data = this._data;\n for (let i = 0; i < n; i += 2)\n result.push(Point2d.create(data[i], data[i + 1]));\n return result;\n }\n\n /** copy xy into strongly typed Point2d */\n public override getPoint2dAtCheckedPointIndex(pointIndex: number, result?: Point2d): Point2d | undefined {\n if (this.isIndexValid(pointIndex)) {\n const index = 2 * pointIndex;\n return Point2d.create(this._data[index], this._data[index + 1], result);\n }\n return undefined;\n }\n\n /** copy xy into strongly typed Vector2d */\n public override getVector2dAtCheckedVectorIndex(vectorIndex: number, result?: Vector2d): Vector2d | undefined {\n if (this.isIndexValid(vectorIndex)) {\n const index = 2 * vectorIndex;\n return Vector2d.create(this._data[index], this._data[index + 1], result);\n }\n return undefined;\n }\n\n /**\n * Read coordinates from source array, place them at index within this array.\n * @param destIndex point index where coordinates are to be placed in this array\n * @param source source array\n * @param sourceIndex point index in source array\n * @returns true if destIndex and sourceIndex are both valid.\n */\n public transferFromGrowableXYArray(destIndex: number, source: GrowableXYArray, sourceIndex: number): boolean {\n if (this.isIndexValid(destIndex) && source.isIndexValid(sourceIndex)) {\n const i = destIndex * 2;\n const j = sourceIndex * 2;\n this._data[i] = source._data[j];\n this._data[i + 1] = source._data[j + 1];\n return true;\n }\n return false;\n }\n\n /**\n * push coordinates from the source array to the end of this array.\n * @param source source array\n * @param sourceIndex xy index within the source. If undefined, push entire contents of source\n * @returns number of points pushed.\n */\n public pushFromGrowableXYArray(source: GrowableXYArray, sourceIndex?: number): number {\n // full array push . . .\n if (sourceIndex === undefined) {\n const numXYAdd = source.length;\n this.ensureCapacity(this.length + numXYAdd, false);\n this.copyData(source._data, numXYAdd, this.length);\n this._xyInUse += numXYAdd;\n return numXYAdd;\n }\n // single point push . . .\n if (source.isIndexValid(sourceIndex)) {\n const j = sourceIndex * 2;\n this.pushXY(source._data[j], source._data[j + 1]);\n return 1;\n }\n return 0;\n }\n\n /**\n * * Compute a point at fractional coordinate between points i and j of source\n * * push onto this array.\n */\n public pushInterpolatedFromGrowableXYArray(source: GrowableXYArray, i: number, fraction: number, j: number) {\n if (source.isIndexValid(i) && source.isIndexValid(j)) {\n const fraction0 = 1.0 - fraction;\n const data = source._data;\n i = 2 * i;\n j = 2 * j;\n this.pushXY(\n fraction0 * data[i] + fraction * data[j],\n fraction0 * data[i + 1] + fraction * data[j + 1]);\n }\n }\n\n /**\n * Create an array of xy points from source xyz points.\n * @param source source array of xyz\n * @param transform optional transform to apply to xyz points.\n * @param dest optional result.\n */\n public static createFromGrowableXYZArray(source: GrowableXYZArray, transform?: Transform, dest?: GrowableXYArray) {\n const numPoints = source.length;\n if (!dest)\n dest = new GrowableXYArray(numPoints);\n else {\n dest.ensureCapacity(numPoints, false);\n dest.clear();\n }\n if (transform) {\n const packedXYZ = source.float64Data();\n const nDouble = 3 * numPoints;\n let x, y, z;\n for (let i = 0; i < nDouble; i += 3) {\n x = packedXYZ[i];\n y = packedXYZ[i + 1];\n z = packedXYZ[i + 2];\n dest.pushXY(transform.multiplyComponentXYZ(0, x, y, z), transform.multiplyComponentXYZ(1, x, y, z));\n }\n } else {\n dest.pushAllXYAndZ(source);\n }\n return dest;\n }\n /**\n * Return the first point, or undefined if the array is empty.\n */\n public front(result?: Point2d): Point2d | undefined {\n if (this._xyInUse === 0) return undefined;\n return this.getPoint2dAtUncheckedPointIndex(0, result);\n }\n /**\n * Return the last point, or undefined if the array is empty.\n */\n public back(result?: Point2d): Point2d | undefined {\n if (this._xyInUse < 1) return undefined;\n return this.getPoint2dAtUncheckedPointIndex(this._xyInUse - 1, result);\n }\n /**\n * Set the coordinates of a single point.\n * @param pointIndex index of point to set\n * @param value coordinates to set\n */\n public setAtCheckedPointIndex(pointIndex: number, value: XAndY): boolean {\n if (!this.isIndexValid(pointIndex))\n return false;\n const index = pointIndex * 2;\n this._data[index] = value.x;\n this._data[index + 1] = value.y;\n return true;\n }\n /**\n * Set the coordinates of a single point given as coordinates.\n * @param pointIndex index of point to set\n * @param x x coordinate\n * @param y y coordinate\n */\n public setXYAtCheckedPointIndex(pointIndex: number, x: number, y: number): boolean {\n if (!this.isIndexValid(pointIndex))\n return false;\n const index = pointIndex * 2;\n this._data[index] = x;\n this._data[index + 1] = y;\n return true;\n }\n /**\n * Set the coordinates of a single point given as coordinates.\n * @deprecated in 3.x. Use setXYAtCheckedPointIndex instead\n */\n public setXYZAtCheckedPointIndex(pointIndex: number, x: number, y: number): boolean {\n return this.setXYAtCheckedPointIndex(pointIndex, x, y);\n }\n\n /**\n * Copy all points into a simple array of Point3d with given z.\n */\n public getPoint3dArray(z: number = 0): Point3d[] {\n const n = 2 * this._xyInUse;\n const result = [];\n const data = this._data;\n for (let i = 0; i < n; i += 2)\n result.push(Point3d.create(data[i], data[i + 1], z));\n return result;\n }\n /** reverse the order of points. */\n public reverseInPlace() {\n const n = this.length;\n let j0, j1;\n let a;\n const data = this._data;\n for (let i0 = 0, i1 = n - 1; i0 < i1; i0++, i1--) {\n j0 = 2 * i0;\n j1 = 2 * i1;\n a = data[j0]; data[j0] = data[j1]; data[j1] = a;\n j0++;\n j1++;\n a = data[j0]; data[j0] = data[j1]; data[j1] = a;\n }\n }\n\n /** multiply each point by the transform, replace values. */\n public multiplyTransformInPlace(transform: Transform) {\n const data = this._data;\n const nDouble = this.float64Length;\n const coffs = transform.matrix.coffs;\n const origin = transform.origin;\n const x0 = origin.x;\n const y0 = origin.y;\n let x = 0;\n let y = 0;\n for (let i = 0; i + 1 < nDouble; i += 2) {\n x = data[i];\n y = data[i + 1];\n data[i] = coffs[0] * x + coffs[1] * y + x0;\n data[i + 1] = coffs[3] * x + coffs[4] * y + y0;\n }\n }\n\n /** multiply each xy (as a vector) by matrix, replace values. */\n public multiplyMatrix3dInPlace(matrix: Matrix3d) {\n const data = this._data;\n const nDouble = this.float64Length;\n const coffs = matrix.coffs;\n let x = 0;\n let y = 0;\n for (let i = 0; i + 1 < nDouble; i += 2) {\n x = data[i];\n y = data[i + 1];\n data[i] = coffs[0] * x + coffs[1] * y;\n data[i + 1] = coffs[3] * x + coffs[4] * y;\n }\n }\n\n /** multiply each point by the transform, replace values. */\n public tryTransformInverseInPlace(transform: Transform): boolean {\n const data = this._data;\n const nDouble = this.float64Length;\n const matrix = transform.matrix;\n matrix.computeCachedInverse(true);\n const coffs = matrix.inverseCoffs;\n if (!coffs)\n return false;\n const origin = transform.origin;\n const x0 = origin.x;\n const y0 = origin.y;\n let x = 0;\n let y = 0;\n for (let i = 0; i + 1 < nDouble; i += 2) {\n x = data[i] - x0;\n y = data[i + 1] - y0;\n data[i] = coffs[0] * x + coffs[1] * y;\n data[i + 1] = coffs[3] * x + coffs[4] * y;\n }\n return true;\n }\n /** Extend a `Range2d`, optionally transforming the points. */\n public extendRange(rangeToExtend: Range2d, transform?: Transform) {\n const numDouble = this.float64Length;\n const data = this._data;\n if (transform) {\n for (let i = 0; i + 1 < numDouble; i += 2)\n rangeToExtend.extendTransformedXY(transform, data[i], data[i + 1]);\n } else {\n for (let i = 0; i + 1 < numDouble; i += 2)\n rangeToExtend.extendXY(data[i], data[i + 1]);\n\n }\n }\n /** sum the lengths of segments between points. */\n public sumLengths(): number {\n let sum = 0.0;\n const n = 2 * (this._xyInUse - 1); // Length already takes into account what specifically is in use\n const data = this._data;\n for (let i = 0; i < n; i += 2) sum += Geometry.hypotenuseXY(\n data[i + 2] - data[i],\n data[i + 3] - data[i + 1]);\n return sum;\n }\n /**\n * Multiply each x,y by the scale factor.\n * @param factor\n */\n public scaleInPlace(factor: number) {\n if (this._data) {\n const numFloat = this.float64Length;\n for (let i = 0; i < numFloat; i++)\n this._data[i] = this._data[i] * factor;\n }\n }\n /** Compute a point at fractional coordinate between points i and j */\n public interpolate(i: number, fraction: number, j: number, result?: Point2d): Point2d | undefined {\n if (this.isIndexValid(i) && this.isIndexValid(j)) {\n const fraction0 = 1.0 - fraction;\n const data = this._data;\n i = 2 * i;\n j = 2 * j;\n return Point2d.create(\n fraction0 * data[i] + fraction * data[j],\n fraction0 * data[i + 1] + fraction * data[j + 1], result);\n }\n return undefined;\n }\n\n /** Sum the signed areas of the projection to xy plane */\n public areaXY(): number {\n let area = 0.0;\n const n = 2 * this._xyInUse; // float count !!\n if (n > 4) {\n const x0 = this._data[n - 2];\n const y0 = this._data[n - 1];\n let dx1 = this._data[0] - x0;\n let dy1 = this._data[1] - y0;\n let dx2 = 0;\n let dy2 = 0;\n for (let i = 2; i < n; i += 2, dx1 = dx2, dy1 = dy2) {\n dx2 = this._data[i] - x0;\n dy2 = this._data[i + 1] - y0;\n area += Geometry.crossProductXYXY(dx1, dy1, dx2, dy2);\n }\n }\n return 0.5 * area;\n }\n\n /** Compute a vector from index origin i to indexed target j */\n public override vectorIndexIndex(i: number, j: number, result?: Vector2d): Vector2d | undefined {\n if (!this.isIndexValid(i) || !this.isIndexValid(j))\n return undefined;\n const data = this._data;\n i = 2 * i;\n j = 2 * j;\n return Vector2d.create(data[j] - data[i], data[j + 1] - data[i + 1], result);\n }\n\n /** Compute a vector from origin to indexed target j */\n public override vectorXAndYIndex(origin: XAndY, j: number, result?: Vector2d): Vector2d | undefined {\n if (this.isIndexValid(j)) {\n const data = this._data;\n j = 2 * j;\n return Vector2d.create(\n data[j] - origin.x,\n data[j + 1] - origin.y, result);\n }\n return undefined;\n }\n\n /** Compute the cross product of vectors from from indexed origin to indexed targets i and j */\n public override crossProductIndexIndexIndex(originIndex: number, targetAIndex: number, targetBIndex: number): number | undefined {\n if (this.isIndexValid(originIndex) && this.isIndexValid(targetAIndex) && this.isIndexValid(targetBIndex)) {\n const i = originIndex * 2;\n const j = targetAIndex * 2;\n const k = targetBIndex * 2;\n const data = this._data;\n return Geometry.crossProductXYXY(\n data[j] - data[i], data[j + 1] - data[i + 1],\n data[k] - data[i], data[k + 1] - data[i + 1]);\n }\n return undefined;\n }\n\n /** Compute the cross product of vectors from from origin to indexed targets i and j */\n public override crossProductXAndYIndexIndex(origin: XAndY, targetAIndex: number, targetBIndex: number): number | undefined {\n if (this.isIndexValid(targetAIndex) && this.isIndexValid(targetBIndex)) {\n const j = targetAIndex * 2;\n const k = targetBIndex * 2;\n const data = this._data;\n return Geometry.crossProductXYXY(\n data[j] - origin.x, data[j + 1] - origin.y,\n data[k] - origin.x, data[k + 1] - origin.y);\n }\n return undefined;\n }\n\n /** Return the distance between two points in the array. */\n public distance(i: number, j: number): number | undefined {\n if (this.isIndexValid(i) && this.isIndexValid(j)) {\n const i0 = 2 * i;\n const j0 = 2 * j;\n return Geometry.hypotenuseXY(\n this._data[j0] - this._data[i0],\n this._data[j0 + 1] - this._data[i0 + 1]);\n }\n return undefined;\n }\n /** Return the distance between an array point and the input point. */\n public distanceIndexToPoint(i: number, spacePoint: Point2d): number | undefined {\n if (this.isIndexValid(i)) {\n const i0 = 2 * i;\n return Geometry.hypotenuseXY(\n spacePoint.x - this._data[i0],\n spacePoint.y - this._data[i0 + 1]);\n }\n return undefined;\n }\n /** Test for nearly equal arrays. */\n public static isAlmostEqual(dataA: GrowableXYArray | undefined, dataB: GrowableXYArray | undefined): boolean {\n if (dataA && dataB) {\n if (dataA.length !== dataB.length)\n return false;\n for (let i = 0; i < dataA.length; i++)\n if (!dataA.getPoint2dAtUncheckedPointIndex(i).isAlmostEqual(dataB.getPoint2dAtUncheckedPointIndex(i)))\n return false;\n return true;\n }\n // if both are null it is equal, otherwise unequal\n return (!dataA && !dataB);\n }\n\n /** Return an array of block indices sorted per compareLexicalBlock function */\n public sortIndicesLexical(): Uint32Array {\n const n = this._xyInUse;\n // let numCompare = 0;\n const result = new Uint32Array(n);\n for (let i = 0; i < n; i++) result[i] = i;\n result.sort(\n (blockIndexA: number, blockIndexB: number) => {\n // numCompare++;\n return this.compareLexicalBlock(blockIndexA, blockIndexB);\n });\n // console.log (n, numCompare);\n return result;\n }\n\n /** compare two blocks in simple lexical order. */\n public compareLexicalBlock(ia: number, ib: number): number {\n let ax = 0;\n let bx = 0;\n for (let i = 0; i < 2; i++) {\n ax = this._data[ia * 2 + i];\n bx = this._data[ib * 2 + i];\n if (ax > bx) return 1;\n if (ax < bx) return -1;\n }\n return ia - ib; // so original order is maintained among duplicates !!!!\n }\n\n /** Access a single double at offset within a block. This has no index checking. */\n public component(pointIndex: number, componentIndex: number): number {\n return this._data[2 * pointIndex + componentIndex];\n }\n /** Toleranced equality test */\n public isAlmostEqual(other: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): boolean {\n const numXY = this._xyInUse;\n if (other._xyInUse !== numXY)\n return false;\n const dataA = this._data;\n const dataB = other._data;\n for (let i = 0; i < 2 * numXY; i++) {\n if (Math.abs(dataA[i] - dataB[i]) > tolerance)\n return false;\n }\n return true;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GrowableXYArray.js","sourceRoot":"","sources":["../../../src/geometry3d/GrowableXYArray.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module ArraysAndInterfaces\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\nimport { IndexedXYCollection } from \"./IndexedXYCollection\";\nimport { MultiLineStringDataVariant } from \"./IndexedXYZCollection\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point2d, Vector2d } from \"./Point2dVector2d\";\nimport { Point3d } from \"./Point3dVector3d\";\nimport { Range2d } from \"./Range\";\nimport { Transform } from \"./Transform\";\nimport { XAndY, XYAndZ } from \"./XYZProps\";\n\n/** `GrowableXYArray` manages a (possibly growing) Float64Array to pack xy coordinates.\n * @public\n */\nexport class GrowableXYArray extends IndexedXYCollection {\n /**\n * array of packed xy xy xy components\n */\n private _data: Float64Array;\n /**\n * Number of xy tuples (not floats) in the array\n */\n private _xyInUse: number;\n /**\n * capacity in xy tuples. (not floats)\n */\n private _xyCapacity: number;\n /**\n * multiplier used by ensureCapacity to expand requested reallocation size\n */\n private _growthFactor: number;\n\n /** Construct a new GrowablePoint2d array.\n * @param numPoints initial capacity in xy tuples (default 8)\n * @param growthFactor used by ensureCapacity to expand requested reallocation size (default 1.5)\n */\n public constructor(numPoints: number = 8, growthFactor?: number) {\n super();\n this._data = new Float64Array(numPoints * 2); // 2 values per point\n this._xyInUse = 0;\n this._xyCapacity = numPoints;\n this._growthFactor = (undefined !== growthFactor && growthFactor >= 1.0) ? growthFactor : 1.5;\n }\n\n /** Copy xy points from source array. Does not reallocate or change active point count.\n * @param source array to copy from\n * @param sourceCount copy the first sourceCount points; all points if undefined\n * @param destOffset copy to instance array starting at this point index; zero if undefined\n * @return count and offset of points copied\n */\n protected copyData(source: Float64Array | number[], sourceCount?: number, destOffset?: number): {count: number, offset: number} {\n // validate inputs and convert from points to entries\n let myOffset = (undefined !== destOffset) ? destOffset * 2 : 0;\n if (myOffset < 0)\n myOffset = 0;\n if (myOffset >= this._data.length)\n return {count: 0, offset: 0};\n let myCount = (undefined !== sourceCount) ? sourceCount * 2 : source.length;\n if (myCount > 0) {\n if (myCount > source.length)\n myCount = source.length;\n if (myOffset + myCount > this._data.length)\n myCount = this._data.length - myOffset;\n if (myCount % 2 !== 0)\n myCount -= myCount % 2;\n }\n if (myCount <= 0)\n return {count: 0, offset: 0};\n if (myCount === source.length)\n this._data.set(source, myOffset);\n else if (source instanceof Float64Array)\n this._data.set(source.subarray(0, myCount), myOffset);\n else\n this._data.set(source.slice(0, myCount), myOffset);\n return {count: myCount / 2, offset: myOffset / 2};\n }\n\n /** The number of points in use. When the length is increased, the array is padded with zeroes. */\n public override get length() { return this._xyInUse; }\n public set length(newLength: number) { this.resize(newLength, true); }\n\n /** Return the number of float64 in use. */\n public get float64Length() { return this._xyInUse * 2; }\n /** Return the raw packed data.\n * * Note that the length of the returned Float64Array is a count of doubles, and includes the excess capacity\n */\n public float64Data(): Float64Array { return this._data; }\n\n /** If necessary, increase the capacity to a new pointCount. Current coordinates and point count (length) are unchanged. */\n public ensureCapacity(pointCapacity: number, applyGrowthFactor: boolean = true) {\n if (pointCapacity > this._xyCapacity) {\n if (applyGrowthFactor)\n pointCapacity *= this._growthFactor;\n const prevData = this._data;\n this._data = new Float64Array(pointCapacity * 2);\n this.copyData(prevData, this._xyInUse);\n this._xyCapacity = pointCapacity;\n }\n }\n /**\n * * If pointCount is less than current length, just reset current length to pointCount, effectively trimming active points but preserving original capacity.\n * * If pointCount is greater than current length, reallocate to exactly pointCount, copy existing points, and optionally pad excess with zero.\n * @param pointCount new number of active points in array\n * @param padWithZero when increasing point count, whether to zero out new points (default false)\n */\n public resize(pointCount: number, padWithZero?: boolean) {\n if (pointCount >= 0 && pointCount < this._xyInUse)\n this._xyInUse = pointCount;\n else if (pointCount > this._xyInUse) {\n this.ensureCapacity(pointCount, false);\n if (padWithZero ?? false)\n this._data.fill(0, this._xyInUse * 2);\n this._xyInUse = pointCount;\n }\n }\n /**\n * Make a copy of the (active) points in this array.\n * (The clone does NOT get excess capacity)\n */\n public clone(): GrowableXYArray {\n const newPoints = new GrowableXYArray(this.length);\n newPoints.copyData(this._data, this.length);\n newPoints._xyInUse = this.length;\n return newPoints;\n }\n /** Create an array populated from\n * Valid inputs are:\n * * Point2d\n * * Point3d\n * * An array of 2 doubles\n * * An array of 3 doubles\n * * A GrowableXYZArray\n * * A GrowableXYArray\n * * Any json object satisfying Point3d.isXAndY\n * * A Float64Array of doubles, interpreted as xyxy\n * * An array of any of the above\n */\n public static create(data: any, result?: GrowableXYArray): GrowableXYArray {\n if (result) {\n result.clear();\n } else {\n const pointCount = typeof data[0] === \"number\" ? data.length / 2 : data.length;\n result = new GrowableXYArray(pointCount);\n }\n result.pushFrom(data);\n return result;\n }\n\n /** Restructure MultiLineStringDataVariant as array of GrowableXYZArray\n * @deprecated in 4.x. Moved to GrowableXYZArray class.\n */\n public static createArrayOfGrowableXYZArray(data: MultiLineStringDataVariant): GrowableXYZArray[] | undefined {\n return GrowableXYZArray.createArrayOfGrowableXYZArray(data);\n }\n /** push a point to the end of the array */\n public push(toPush: XAndY) {\n this.pushXY(toPush.x, toPush.y);\n }\n\n /** push all points of an array */\n public pushAll(points: XAndY[]) {\n this.ensureCapacity(this._xyInUse + points.length, false);\n for (const p of points)\n this.push(p);\n }\n /** push all points of an array */\n public pushAllXYAndZ(points: XYAndZ[] | GrowableXYZArray) {\n this.ensureCapacity(this._xyInUse + points.length, false);\n if (points instanceof GrowableXYZArray) {\n const xyzBuffer = points.float64Data();\n const n = points.length * 3;\n for (let i = 0; i + 2 < n; i += 3)\n this.pushXY(xyzBuffer[i], xyzBuffer[i + 1]);\n } else {\n for (const p of points) this.pushXY(p.x, p.y);\n }\n }\n /** Push copies of points from variant sources.\n * Valid inputs are:\n * * Point2d\n * * Point3d\n * * An array of 2 doubles\n * * A GrowableXYArray\n * * A GrowableXYZArray\n * * Any json object satisfying Point3d.isXAndY\n * * A Float64Array of doubles, interpreted as xyxy\n * * An array of any of the above\n */\n public pushFrom(p: any) {\n if (p instanceof Point3d) {\n this.pushXY(p.x, p.y);\n } else if (p instanceof GrowableXYZArray) {\n this.pushAllXYAndZ(p);\n } else if (p instanceof Point2d) {\n this.pushXY(p.x, p.y);\n } else if (Geometry.isNumberArray(p, 3) || p instanceof Float64Array) {\n const xyToAdd = Math.trunc(p.length / 2);\n this.ensureCapacity(this._xyInUse + xyToAdd, false);\n this.copyData(p, xyToAdd, this._xyInUse);\n this._xyInUse += xyToAdd;\n } else if (Geometry.isNumberArray(p, 2)) {\n this.pushXY(p[0], p[1]);\n } else if (Array.isArray(p)) {\n // direct recursion re-wraps p and goes infinite. Unroll here.\n for (const q of p)\n this.pushFrom(q);\n } else if (Point3d.isXAndY(p)) {\n this.pushXY(p.x, p.y);\n } else if (p instanceof IndexedXYCollection) {\n const n = p.length;\n this.ensureCapacity(this._xyInUse + n, false);\n for (let i = 0; i < n; i++)\n this.pushXY(p.getXAtUncheckedPointIndex(i), p.getYAtUncheckedPointIndex(i));\n }\n }\n /**\n * Replicate numWrap xy values from the front of the array as new values at the end.\n * @param numWrap number of xy values to replicate\n */\n public pushWrap(numWrap: number) {\n if (this._xyInUse >= numWrap) {\n this.ensureCapacity(this._xyInUse + numWrap, false);\n for (let i = 0; i < numWrap; i++) {\n const k = 2 * i;\n this.pushXY(this._data[k], this._data[k + 1]);\n }\n }\n }\n /** push a point given by x,y coordinates */\n public pushXY(x: number, y: number) {\n this.ensureCapacity(this._xyInUse + 1);\n const index = this._xyInUse * 2;\n this._data[index] = x;\n this._data[index + 1] = y;\n this._xyInUse++;\n }\n\n /** Remove one point from the back.\n * * NOTE that (in the manner of std::vector native) this is \"just\" removing the point -- no point is NOT returned.\n * * Use `back ()` to get the last x,y assembled into a `Point2d `\n */\n public pop() {\n if (this._xyInUse > 0)\n this._xyInUse--;\n }\n /**\n * Test if index is valid for an xy (point or vector) within this array\n * @param index xy index to test.\n */\n public isIndexValid(index: number): boolean {\n if (index >= this._xyInUse || index < 0)\n return false;\n return true;\n }\n /**\n * Clear all xy data, but leave capacity unchanged.\n */\n public clear() {\n this._xyInUse = 0;\n }\n /**\n * Get a point by index, strongly typed as a Point2d. This is unchecked. Use atPoint2dIndex to have validity test.\n * @param pointIndex index to access\n * @param result optional result\n */\n public getPoint2dAtUncheckedPointIndex(pointIndex: number, result?: Point2d): Point2d {\n const index = 2 * pointIndex;\n return Point2d.create(this._data[index], this._data[index + 1], result);\n }\n\n /**\n * Get x coordinate by point index, with no index checking\n * @param pointIndex index to access\n */\n public override getXAtUncheckedPointIndex(pointIndex: number): number {\n return this._data[2 * pointIndex];\n }\n\n /**\n * Get y coordinate by point index, with no index checking\n * @param pointIndex index to access\n */\n public override getYAtUncheckedPointIndex(pointIndex: number): number {\n return this._data[2 * pointIndex + 1];\n }\n\n /**\n * Gather all points as a Point2d[]\n */\n public getPoint2dArray(): Point2d[] {\n const n = 2 * this._xyInUse;\n const result = [];\n const data = this._data;\n for (let i = 0; i < n; i += 2)\n result.push(Point2d.create(data[i], data[i + 1]));\n return result;\n }\n\n /** copy xy into strongly typed Point2d */\n public override getPoint2dAtCheckedPointIndex(pointIndex: number, result?: Point2d): Point2d | undefined {\n if (this.isIndexValid(pointIndex)) {\n const index = 2 * pointIndex;\n return Point2d.create(this._data[index], this._data[index + 1], result);\n }\n return undefined;\n }\n\n /** copy xy into strongly typed Vector2d */\n public override getVector2dAtCheckedVectorIndex(vectorIndex: number, result?: Vector2d): Vector2d | undefined {\n if (this.isIndexValid(vectorIndex)) {\n const index = 2 * vectorIndex;\n return Vector2d.create(this._data[index], this._data[index + 1], result);\n }\n return undefined;\n }\n\n /**\n * Read coordinates from source array, place them at index within this array.\n * @param destIndex point index where coordinates are to be placed in this array\n * @param source source array\n * @param sourceIndex point index in source array\n * @returns true if destIndex and sourceIndex are both valid.\n */\n public transferFromGrowableXYArray(destIndex: number, source: GrowableXYArray, sourceIndex: number): boolean {\n if (this.isIndexValid(destIndex) && source.isIndexValid(sourceIndex)) {\n const i = destIndex * 2;\n const j = sourceIndex * 2;\n this._data[i] = source._data[j];\n this._data[i + 1] = source._data[j + 1];\n return true;\n }\n return false;\n }\n\n /**\n * push coordinates from the source array to the end of this array.\n * @param source source array\n * @param sourceIndex xy index within the source. If undefined, push entire contents of source\n * @returns number of points pushed.\n */\n public pushFromGrowableXYArray(source: GrowableXYArray, sourceIndex?: number): number {\n // full array push . . .\n if (sourceIndex === undefined) {\n const numXYAdd = source.length;\n this.ensureCapacity(this.length + numXYAdd, false);\n this.copyData(source._data, numXYAdd, this.length);\n this._xyInUse += numXYAdd;\n return numXYAdd;\n }\n // single point push . . .\n if (source.isIndexValid(sourceIndex)) {\n const j = sourceIndex * 2;\n this.pushXY(source._data[j], source._data[j + 1]);\n return 1;\n }\n return 0;\n }\n\n /**\n * * Compute a point at fractional coordinate between points i and j of source\n * * push onto this array.\n */\n public pushInterpolatedFromGrowableXYArray(source: GrowableXYArray, i: number, fraction: number, j: number) {\n if (source.isIndexValid(i) && source.isIndexValid(j)) {\n const fraction0 = 1.0 - fraction;\n const data = source._data;\n i = 2 * i;\n j = 2 * j;\n this.pushXY(\n fraction0 * data[i] + fraction * data[j],\n fraction0 * data[i + 1] + fraction * data[j + 1]);\n }\n }\n\n /**\n * Create an array of xy points from source xyz points.\n * @param source source array of xyz\n * @param transform optional transform to apply to xyz points.\n * @param dest optional result.\n */\n public static createFromGrowableXYZArray(source: GrowableXYZArray, transform?: Transform, dest?: GrowableXYArray) {\n const numPoints = source.length;\n if (!dest)\n dest = new GrowableXYArray(numPoints);\n else {\n dest.ensureCapacity(numPoints, false);\n dest.clear();\n }\n if (transform) {\n const packedXYZ = source.float64Data();\n const nDouble = 3 * numPoints;\n let x, y, z;\n for (let i = 0; i < nDouble; i += 3) {\n x = packedXYZ[i];\n y = packedXYZ[i + 1];\n z = packedXYZ[i + 2];\n dest.pushXY(transform.multiplyComponentXYZ(0, x, y, z), transform.multiplyComponentXYZ(1, x, y, z));\n }\n } else {\n dest.pushAllXYAndZ(source);\n }\n return dest;\n }\n /**\n * Return the first point, or undefined if the array is empty.\n */\n public front(result?: Point2d): Point2d | undefined {\n if (this._xyInUse === 0) return undefined;\n return this.getPoint2dAtUncheckedPointIndex(0, result);\n }\n /**\n * Return the last point, or undefined if the array is empty.\n */\n public back(result?: Point2d): Point2d | undefined {\n if (this._xyInUse < 1) return undefined;\n return this.getPoint2dAtUncheckedPointIndex(this._xyInUse - 1, result);\n }\n /**\n * Set the coordinates of a single point.\n * @param pointIndex index of point to set\n * @param value coordinates to set\n */\n public setAtCheckedPointIndex(pointIndex: number, value: XAndY): boolean {\n if (!this.isIndexValid(pointIndex))\n return false;\n const index = pointIndex * 2;\n this._data[index] = value.x;\n this._data[index + 1] = value.y;\n return true;\n }\n /**\n * Set the coordinates of a single point given as coordinates.\n * @param pointIndex index of point to set\n * @param x x coordinate\n * @param y y coordinate\n */\n public setXYAtCheckedPointIndex(pointIndex: number, x: number, y: number): boolean {\n if (!this.isIndexValid(pointIndex))\n return false;\n const index = pointIndex * 2;\n this._data[index] = x;\n this._data[index + 1] = y;\n return true;\n }\n /**\n * Set the coordinates of a single point given as coordinates.\n * @deprecated in 3.x. Use setXYAtCheckedPointIndex instead\n */\n public setXYZAtCheckedPointIndex(pointIndex: number, x: number, y: number): boolean {\n return this.setXYAtCheckedPointIndex(pointIndex, x, y);\n }\n\n /**\n * Copy all points into a simple array of Point3d with given z.\n */\n public getPoint3dArray(z: number = 0): Point3d[] {\n const n = 2 * this._xyInUse;\n const result = [];\n const data = this._data;\n for (let i = 0; i < n; i += 2)\n result.push(Point3d.create(data[i], data[i + 1], z));\n return result;\n }\n /** reverse the order of points. */\n public reverseInPlace() {\n const n = this.length;\n let j0, j1;\n let a;\n const data = this._data;\n for (let i0 = 0, i1 = n - 1; i0 < i1; i0++, i1--) {\n j0 = 2 * i0;\n j1 = 2 * i1;\n a = data[j0]; data[j0] = data[j1]; data[j1] = a;\n j0++;\n j1++;\n a = data[j0]; data[j0] = data[j1]; data[j1] = a;\n }\n }\n\n /** multiply each point by the transform, replace values. */\n public multiplyTransformInPlace(transform: Transform) {\n const data = this._data;\n const nDouble = this.float64Length;\n const coffs = transform.matrix.coffs;\n const origin = transform.origin;\n const x0 = origin.x;\n const y0 = origin.y;\n let x = 0;\n let y = 0;\n for (let i = 0; i + 1 < nDouble; i += 2) {\n x = data[i];\n y = data[i + 1];\n data[i] = coffs[0] * x + coffs[1] * y + x0;\n data[i + 1] = coffs[3] * x + coffs[4] * y + y0;\n }\n }\n\n /** multiply each xy (as a vector) by matrix, replace values. */\n public multiplyMatrix3dInPlace(matrix: Matrix3d) {\n const data = this._data;\n const nDouble = this.float64Length;\n const coffs = matrix.coffs;\n let x = 0;\n let y = 0;\n for (let i = 0; i + 1 < nDouble; i += 2) {\n x = data[i];\n y = data[i + 1];\n data[i] = coffs[0] * x + coffs[1] * y;\n data[i + 1] = coffs[3] * x + coffs[4] * y;\n }\n }\n\n /** multiply each point by the transform, replace values. */\n public tryTransformInverseInPlace(transform: Transform): boolean {\n const data = this._data;\n const nDouble = this.float64Length;\n const matrix = transform.matrix;\n matrix.computeCachedInverse(true);\n const coffs = matrix.inverseCoffs;\n if (!coffs)\n return false;\n const origin = transform.origin;\n const x0 = origin.x;\n const y0 = origin.y;\n let x = 0;\n let y = 0;\n for (let i = 0; i + 1 < nDouble; i += 2) {\n x = data[i] - x0;\n y = data[i + 1] - y0;\n data[i] = coffs[0] * x + coffs[1] * y;\n data[i + 1] = coffs[3] * x + coffs[4] * y;\n }\n return true;\n }\n /** Extend a `Range2d`, optionally transforming the points. */\n public extendRange(rangeToExtend: Range2d, transform?: Transform) {\n const numDouble = this.float64Length;\n const data = this._data;\n if (transform) {\n for (let i = 0; i + 1 < numDouble; i += 2)\n rangeToExtend.extendTransformedXY(transform, data[i], data[i + 1]);\n } else {\n for (let i = 0; i + 1 < numDouble; i += 2)\n rangeToExtend.extendXY(data[i], data[i + 1]);\n\n }\n }\n /** sum the lengths of segments between points. */\n public sumLengths(): number {\n let sum = 0.0;\n const n = 2 * (this._xyInUse - 1); // Length already takes into account what specifically is in use\n const data = this._data;\n for (let i = 0; i < n; i += 2) sum += Geometry.hypotenuseXY(\n data[i + 2] - data[i],\n data[i + 3] - data[i + 1]);\n return sum;\n }\n /**\n * Multiply each x,y by the scale factor.\n * @param factor\n */\n public scaleInPlace(factor: number) {\n if (this._data) {\n const numFloat = this.float64Length;\n for (let i = 0; i < numFloat; i++)\n this._data[i] = this._data[i] * factor;\n }\n }\n /** Compute a point at fractional coordinate between points i and j */\n public interpolate(i: number, fraction: number, j: number, result?: Point2d): Point2d | undefined {\n if (this.isIndexValid(i) && this.isIndexValid(j)) {\n const fraction0 = 1.0 - fraction;\n const data = this._data;\n i = 2 * i;\n j = 2 * j;\n return Point2d.create(\n fraction0 * data[i] + fraction * data[j],\n fraction0 * data[i + 1] + fraction * data[j + 1], result);\n }\n return undefined;\n }\n\n /** Sum the signed areas of the projection to xy plane */\n public areaXY(): number {\n let area = 0.0;\n const n = 2 * this._xyInUse; // float count !!\n if (n > 4) {\n const x0 = this._data[n - 2];\n const y0 = this._data[n - 1];\n let dx1 = this._data[0] - x0;\n let dy1 = this._data[1] - y0;\n let dx2 = 0;\n let dy2 = 0;\n for (let i = 2; i < n; i += 2, dx1 = dx2, dy1 = dy2) {\n dx2 = this._data[i] - x0;\n dy2 = this._data[i + 1] - y0;\n area += Geometry.crossProductXYXY(dx1, dy1, dx2, dy2);\n }\n }\n return 0.5 * area;\n }\n\n /** Compute a vector from index origin i to indexed target j */\n public override vectorIndexIndex(i: number, j: number, result?: Vector2d): Vector2d | undefined {\n if (!this.isIndexValid(i) || !this.isIndexValid(j))\n return undefined;\n const data = this._data;\n i = 2 * i;\n j = 2 * j;\n return Vector2d.create(data[j] - data[i], data[j + 1] - data[i + 1], result);\n }\n\n /** Compute a vector from origin to indexed target j */\n public override vectorXAndYIndex(origin: XAndY, j: number, result?: Vector2d): Vector2d | undefined {\n if (this.isIndexValid(j)) {\n const data = this._data;\n j = 2 * j;\n return Vector2d.create(\n data[j] - origin.x,\n data[j + 1] - origin.y, result);\n }\n return undefined;\n }\n\n /** Compute the cross product of vectors from from indexed origin to indexed targets i and j */\n public override crossProductIndexIndexIndex(originIndex: number, targetAIndex: number, targetBIndex: number): number | undefined {\n if (this.isIndexValid(originIndex) && this.isIndexValid(targetAIndex) && this.isIndexValid(targetBIndex)) {\n const i = originIndex * 2;\n const j = targetAIndex * 2;\n const k = targetBIndex * 2;\n const data = this._data;\n return Geometry.crossProductXYXY(\n data[j] - data[i], data[j + 1] - data[i + 1],\n data[k] - data[i], data[k + 1] - data[i + 1]);\n }\n return undefined;\n }\n\n /** Compute the cross product of vectors from from origin to indexed targets i and j */\n public override crossProductXAndYIndexIndex(origin: XAndY, targetAIndex: number, targetBIndex: number): number | undefined {\n if (this.isIndexValid(targetAIndex) && this.isIndexValid(targetBIndex)) {\n const j = targetAIndex * 2;\n const k = targetBIndex * 2;\n const data = this._data;\n return Geometry.crossProductXYXY(\n data[j] - origin.x, data[j + 1] - origin.y,\n data[k] - origin.x, data[k + 1] - origin.y);\n }\n return undefined;\n }\n\n /** Return the distance between two points in the array. */\n public distance(i: number, j: number): number | undefined {\n if (this.isIndexValid(i) && this.isIndexValid(j)) {\n const i0 = 2 * i;\n const j0 = 2 * j;\n return Geometry.hypotenuseXY(\n this._data[j0] - this._data[i0],\n this._data[j0 + 1] - this._data[i0 + 1]);\n }\n return undefined;\n }\n /** Return the distance between an array point and the input point. */\n public distanceIndexToPoint(i: number, spacePoint: Point2d): number | undefined {\n if (this.isIndexValid(i)) {\n const i0 = 2 * i;\n return Geometry.hypotenuseXY(\n spacePoint.x - this._data[i0],\n spacePoint.y - this._data[i0 + 1]);\n }\n return undefined;\n }\n /** Test for nearly equal arrays. */\n public static isAlmostEqual(dataA: GrowableXYArray | undefined, dataB: GrowableXYArray | undefined): boolean {\n if (dataA && dataB) {\n if (dataA.length !== dataB.length)\n return false;\n for (let i = 0; i < dataA.length; i++)\n if (!dataA.getPoint2dAtUncheckedPointIndex(i).isAlmostEqual(dataB.getPoint2dAtUncheckedPointIndex(i)))\n return false;\n return true;\n }\n // if both are null it is equal, otherwise unequal\n return (!dataA && !dataB);\n }\n\n /** Return an array of block indices sorted per compareLexicalBlock function */\n public sortIndicesLexical(): Uint32Array {\n const n = this._xyInUse;\n // let numCompare = 0;\n const result = new Uint32Array(n);\n for (let i = 0; i < n; i++) result[i] = i;\n result.sort(\n (blockIndexA: number, blockIndexB: number) => {\n // numCompare++;\n return this.compareLexicalBlock(blockIndexA, blockIndexB);\n });\n // console.log (n, numCompare);\n return result;\n }\n\n /** compare two blocks in simple lexical order. */\n public compareLexicalBlock(ia: number, ib: number): number {\n let ax = 0;\n let bx = 0;\n for (let i = 0; i < 2; i++) {\n ax = this._data[ia * 2 + i];\n bx = this._data[ib * 2 + i];\n if (ax > bx) return 1;\n if (ax < bx) return -1;\n }\n return ia - ib; // so original order is maintained among duplicates !!!!\n }\n\n /** Access a single double at offset within a block. This has no index checking. */\n public component(pointIndex: number, componentIndex: number): number {\n return this._data[2 * pointIndex + componentIndex];\n }\n /** Toleranced equality test */\n public isAlmostEqual(other: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): boolean {\n const numXY = this._xyInUse;\n if (other._xyInUse !== numXY)\n return false;\n const dataA = this._data;\n const dataB = other._data;\n for (let i = 0; i < 2 * numXY; i++) {\n if (Math.abs(dataA[i] - dataB[i]) > tolerance)\n return false;\n }\n return true;\n }\n}\n"]}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { PlaneAltitudeEvaluator } from "../Geometry";
|
|
5
5
|
import { Matrix4d } from "../geometry4d/Matrix4d";
|
|
6
|
-
import { MultiLineStringDataVariant } from "
|
|
7
|
-
import { IndexedReadWriteXYZCollection } from "./IndexedXYZCollection";
|
|
6
|
+
import { IndexedReadWriteXYZCollection, MultiLineStringDataVariant } from "./IndexedXYZCollection";
|
|
8
7
|
import { Matrix3d } from "./Matrix3d";
|
|
9
8
|
import { Plane3dByOriginAndUnitNormal } from "./Plane3dByOriginAndUnitNormal";
|
|
10
9
|
import { Point2d } from "./Point2dVector2d";
|
|
@@ -91,7 +90,7 @@ export declare class GrowableXYZArray extends IndexedReadWriteXYZCollection {
|
|
|
91
90
|
push(toPush: XYAndZ): void;
|
|
92
91
|
/** push all points of an array */
|
|
93
92
|
pushAll(points: Point3d[]): void;
|
|
94
|
-
/** Push points from variant sources.
|
|
93
|
+
/** Push copies of points from variant sources.
|
|
95
94
|
* Valid inputs are:
|
|
96
95
|
* * Point2d
|
|
97
96
|
* * Point3d
|