@itwin/core-geometry 5.2.0-dev.8 → 5.3.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -1
- package/lib/cjs/Geometry.d.ts +30 -10
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +74 -10
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.d.ts +19 -6
- package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js +21 -5
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.d.ts +3 -3
- package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +6 -6
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.d.ts +2 -2
- package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js +4 -6
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.d.ts +27 -17
- package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js +17 -7
- package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.d.ts +19 -6
- package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js +17 -2
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.d.ts +14 -1
- package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +21 -3
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +14 -11
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +23 -16
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +22 -5
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts +27 -17
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +61 -35
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +1 -0
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +1 -0
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +8 -7
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.d.ts +51 -1
- package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
- package/lib/cjs/curve/CurveOps.js +97 -3
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +4 -4
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +8 -8
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +6 -2
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +12 -7
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +9 -4
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +10 -5
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +2 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +4 -4
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js +21 -18
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +30 -50
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +2 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +6 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +6 -2
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +5 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js +0 -3
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +6 -2
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +12 -3
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts +2 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +14 -18
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts +18 -2
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js +37 -4
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +1 -0
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.d.ts +8 -0
- package/lib/cjs/geometry3d/PointStreaming.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js +18 -2
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +18 -9
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +53 -26
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts +14 -3
- package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js +20 -4
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +34 -32
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js +28 -21
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.d.ts +16 -6
- package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js +28 -4
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js +3 -4
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +1 -1
- package/lib/cjs/geometry3d/Transform.js +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.d.ts +12 -1
- package/lib/cjs/geometry3d/XYZProps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.js +17 -2
- package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.d.ts +16 -0
- package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js +26 -0
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js +5 -9
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/SmallSystem.d.ts +13 -7
- package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
- package/lib/cjs/numerics/SmallSystem.js +13 -7
- package/lib/cjs/numerics/SmallSystem.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts +1 -3
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js +2 -6
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +25 -6
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +59 -8
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.d.ts +2 -0
- package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js +7 -3
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +8 -10
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +9 -12
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts +2 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js +2 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +38 -12
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +91 -23
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +20 -11
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js +43 -39
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/Merging.d.ts +7 -4
- package/lib/cjs/topology/Merging.d.ts.map +1 -1
- package/lib/cjs/topology/Merging.js +16 -11
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/Triangulation.d.ts +13 -11
- package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
- package/lib/cjs/topology/Triangulation.js +40 -36
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/Voronoi.d.ts +195 -0
- package/lib/cjs/topology/Voronoi.d.ts.map +1 -0
- package/lib/cjs/topology/Voronoi.js +700 -0
- package/lib/cjs/topology/Voronoi.js.map +1 -0
- package/lib/cjs/topology/XYParitySearchContext.d.ts +1 -1
- package/lib/cjs/topology/XYParitySearchContext.d.ts.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Geometry.d.ts +30 -10
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +74 -10
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.d.ts +19 -6
- package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js +21 -5
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts +3 -3
- package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js +6 -6
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.d.ts +2 -2
- package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js +4 -6
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.d.ts +27 -17
- package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js +17 -7
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.d.ts +19 -6
- package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPlane.js +17 -2
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.d.ts +14 -1
- package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +21 -3
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +14 -11
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +23 -16
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +22 -5
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +27 -17
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +61 -35
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +1 -0
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +1 -0
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +8 -7
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.d.ts +51 -1
- package/lib/esm/curve/CurveOps.d.ts.map +1 -1
- package/lib/esm/curve/CurveOps.js +98 -4
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +4 -4
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +8 -8
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +6 -2
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +12 -7
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +9 -4
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +10 -5
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +2 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +4 -4
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js +21 -18
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +30 -50
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +2 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +6 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +6 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +5 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js +0 -3
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +6 -2
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +12 -3
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts +2 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +14 -18
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +1 -1
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.d.ts +18 -2
- package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js +37 -4
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +1 -0
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.d.ts +8 -0
- package/lib/esm/geometry3d/PointStreaming.d.ts.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js +18 -2
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +18 -9
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +53 -26
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts +14 -3
- package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js +20 -4
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +34 -32
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js +28 -21
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.d.ts +16 -6
- package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js +28 -4
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js +3 -4
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +1 -1
- package/lib/esm/geometry3d/Transform.js +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/XYZProps.d.ts +12 -1
- package/lib/esm/geometry3d/XYZProps.d.ts.map +1 -1
- package/lib/esm/geometry3d/XYZProps.js +16 -1
- package/lib/esm/geometry3d/XYZProps.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.d.ts +16 -0
- package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js +26 -0
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js +5 -9
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/SmallSystem.d.ts +13 -7
- package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
- package/lib/esm/numerics/SmallSystem.js +13 -7
- package/lib/esm/numerics/SmallSystem.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts +1 -3
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js +2 -6
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +25 -6
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +59 -8
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.d.ts +2 -0
- package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js +7 -3
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +8 -10
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js +9 -12
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.d.ts +2 -1
- package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js +2 -1
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +38 -12
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +92 -24
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +20 -11
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js +43 -39
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/Merging.d.ts +7 -4
- package/lib/esm/topology/Merging.d.ts.map +1 -1
- package/lib/esm/topology/Merging.js +17 -12
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/Triangulation.d.ts +13 -11
- package/lib/esm/topology/Triangulation.d.ts.map +1 -1
- package/lib/esm/topology/Triangulation.js +40 -36
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/Voronoi.d.ts +195 -0
- package/lib/esm/topology/Voronoi.d.ts.map +1 -0
- package/lib/esm/topology/Voronoi.js +696 -0
- package/lib/esm/topology/Voronoi.js.map +1 -0
- package/lib/esm/topology/XYParitySearchContext.d.ts +1 -1
- package/lib/esm/topology/XYParitySearchContext.d.ts.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -38,7 +38,7 @@ class MultiChainCollector {
|
|
|
38
38
|
_chains;
|
|
39
39
|
/** Largest gap distance to close. */
|
|
40
40
|
_gapTolerance;
|
|
41
|
-
/** End point snap tolerance
|
|
41
|
+
/** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */
|
|
42
42
|
_snapTolerance;
|
|
43
43
|
/** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */
|
|
44
44
|
_planeTolerance;
|
|
@@ -47,8 +47,8 @@ class MultiChainCollector {
|
|
|
47
47
|
_xyzWork0;
|
|
48
48
|
_xyzWork1;
|
|
49
49
|
/** Initialize with an empty array of chains.
|
|
50
|
-
* @param gapTolerance tolerance for calling endpoints identical
|
|
51
|
-
* @param planeTolerance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
|
|
50
|
+
* @param gapTolerance distance tolerance for calling endpoints identical
|
|
51
|
+
* @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
|
|
52
52
|
*/
|
|
53
53
|
constructor(gapTolerance = Geometry_1.Geometry.smallMetricDistance, planeTolerance) {
|
|
54
54
|
this._chains = [];
|
|
@@ -59,19 +59,19 @@ class MultiChainCollector {
|
|
|
59
59
|
/**
|
|
60
60
|
* Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz
|
|
61
61
|
* @param xyz endpoint to check
|
|
62
|
-
* @param
|
|
62
|
+
* @param distanceTol absolute distance tolerance for equating endpoints
|
|
63
63
|
* @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.
|
|
64
64
|
*/
|
|
65
|
-
findAnyChainToConnect(xyz,
|
|
65
|
+
findAnyChainToConnect(xyz, distanceTol, exceptChainIndex = -1) {
|
|
66
66
|
for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {
|
|
67
67
|
if (exceptChainIndex === chainIndexA)
|
|
68
68
|
continue;
|
|
69
69
|
const chain = this._chains[chainIndexA];
|
|
70
70
|
this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);
|
|
71
|
-
if (this._xyzWork1.isAlmostEqual(xyz,
|
|
71
|
+
if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))
|
|
72
72
|
return { chainIndex: chainIndexA, atEnd: true };
|
|
73
73
|
this._xyzWork1 = chain[0].startPoint(this._xyzWork1);
|
|
74
|
-
if (this._xyzWork1.isAlmostEqual(xyz,
|
|
74
|
+
if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))
|
|
75
75
|
return { chainIndex: chainIndexA, atEnd: false };
|
|
76
76
|
}
|
|
77
77
|
return undefined;
|
|
@@ -168,17 +168,20 @@ class MultiChainCollector {
|
|
|
168
168
|
* * If a "nearby" connection is possible, insert the candidate in the chain and force endpoint match.
|
|
169
169
|
* * Otherwise start a new chain.
|
|
170
170
|
*/
|
|
171
|
-
attachPrimitiveToAnyChain(candidate,
|
|
172
|
-
if (candidate) {
|
|
171
|
+
attachPrimitiveToAnyChain(candidate, distanceTol) {
|
|
172
|
+
if (candidate.curveLength() < distanceTol) {
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
173
176
|
this._xyzWork0 = candidate.startPoint(this._xyzWork0);
|
|
174
|
-
let connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
177
|
+
let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);
|
|
175
178
|
if (connect) {
|
|
176
179
|
if (connect.atEnd) {
|
|
177
180
|
const chain = this._chains[connect.chainIndex];
|
|
178
181
|
const index0 = chain.length - 1;
|
|
179
182
|
this._chains[connect.chainIndex].push(candidate);
|
|
180
183
|
MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);
|
|
181
|
-
this.searchAndMergeChainIndex(connect.chainIndex,
|
|
184
|
+
this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
|
|
182
185
|
return true;
|
|
183
186
|
}
|
|
184
187
|
else {
|
|
@@ -186,13 +189,13 @@ class MultiChainCollector {
|
|
|
186
189
|
const chain = this._chains[connect.chainIndex];
|
|
187
190
|
chain.splice(0, 0, candidate);
|
|
188
191
|
MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);
|
|
189
|
-
this.searchAndMergeChainIndex(connect.chainIndex,
|
|
192
|
+
this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
|
|
190
193
|
return true;
|
|
191
194
|
}
|
|
192
195
|
}
|
|
193
196
|
else {
|
|
194
197
|
this._xyzWork0 = candidate.endPoint(this._xyzWork0);
|
|
195
|
-
connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
198
|
+
connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);
|
|
196
199
|
if (connect) {
|
|
197
200
|
if (connect.atEnd) {
|
|
198
201
|
candidate.reverseInPlace();
|
|
@@ -200,14 +203,14 @@ class MultiChainCollector {
|
|
|
200
203
|
const index0 = chain.length - 1;
|
|
201
204
|
this._chains[connect.chainIndex].push(candidate);
|
|
202
205
|
MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);
|
|
203
|
-
this.searchAndMergeChainIndex(connect.chainIndex,
|
|
206
|
+
this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
|
|
204
207
|
return true;
|
|
205
208
|
}
|
|
206
209
|
else {
|
|
207
210
|
const chain = this._chains[connect.chainIndex];
|
|
208
211
|
chain.splice(0, 0, candidate);
|
|
209
212
|
MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);
|
|
210
|
-
this.searchAndMergeChainIndex(connect.chainIndex,
|
|
213
|
+
this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
|
|
211
214
|
return true;
|
|
212
215
|
}
|
|
213
216
|
}
|
|
@@ -244,13 +247,13 @@ class MultiChainCollector {
|
|
|
244
247
|
p.reverseInPlace();
|
|
245
248
|
}
|
|
246
249
|
/** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */
|
|
247
|
-
searchAndMergeChainIndex(chainIndex,
|
|
250
|
+
searchAndMergeChainIndex(chainIndex, distanceTol) {
|
|
248
251
|
// ASSUME valid index of non-empty chain
|
|
249
252
|
const chain = this._chains[chainIndex];
|
|
250
253
|
const lastIndexInChain = chain.length - 1;
|
|
251
254
|
this._xyzWork0 = chain[0].startPoint(this._xyzWork0);
|
|
252
255
|
// try start with any other chain
|
|
253
|
-
let connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
256
|
+
let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);
|
|
254
257
|
if (connect) {
|
|
255
258
|
if (!connect.atEnd)
|
|
256
259
|
this.reverseChain(connect.chainIndex);
|
|
@@ -259,7 +262,7 @@ class MultiChainCollector {
|
|
|
259
262
|
}
|
|
260
263
|
// try end with any other chain
|
|
261
264
|
this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);
|
|
262
|
-
connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
265
|
+
connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);
|
|
263
266
|
if (connect) {
|
|
264
267
|
if (connect.atEnd)
|
|
265
268
|
this.reverseChain(connect.chainIndex);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.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 { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\nimport { Arc3d } from \"../Arc3d\";\nimport { BagOfCurves, CurveCollection } from \"../CurveCollection\";\nimport { CurveCurve } from \"../CurveCurve\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { AnyChain, AnyCurve } from \"../CurveTypes\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop } from \"../Loop\";\nimport { Path } from \"../Path\";\nimport { RegionOps } from \"../RegionOps\";\nimport { StrokeOptions } from \"../StrokeOptions\";\n\n/**\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\n * * The caller makes a sequence of calls to announce individual primitives.\n * * This collector (unlike the simpler [[ChainCollectorContext]]) expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\n * * When all curves have been announced, the call to `grabResult` restructures the various active chains into Paths (and optionally, Loops).\n * * Chain formation is dependent upon input fragment order, as a greedy algorithm is employed.\n * * Usage pattern is\n * * initialization: `context = new MultiChainCollector(gapTol, planeTol)`\n * * many times:\n * * `context.captureCurve(anyCurve)`\n * * `context.captureCurvePrimitive(primitive)`\n * * end: `result = context.grabResult(makeLoopIfClosed)`\n * @internal\n */\nexport class MultiChainCollector {\n /** Accumulated chains. */\n private _chains: CurvePrimitive[][];\n /** Largest gap distance to close. */\n private _gapTolerance: number;\n /** End point snap tolerance (assumed to be as tight or tighter than gapTolerance). */\n private _snapTolerance: number;\n /** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */\n private _planeTolerance: number | undefined;\n\n private static _staticPointA: Point3d;\n private static _staticPointB: Point3d;\n private _xyzWork0?: Point3d;\n private _xyzWork1?: Point3d;\n\n /** Initialize with an empty array of chains.\n * @param gapTolerance tolerance for calling endpoints identical\n * @param planeTolerance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.\n */\n public constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance?: number) {\n this._chains = [];\n this._gapTolerance = gapTolerance;\n this._snapTolerance = Geometry.smallMetricDistance;\n this._planeTolerance = planeTolerance;\n }\n /**\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\n * @param xyz endpoint to check\n * @param tolerance absolute distance tolerance for equating endpoints\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\n */\n private findAnyChainToConnect(xyz: Point3d, tolerance: number, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\n if (exceptChainIndex === chainIndexA)\n continue;\n const chain = this._chains[chainIndexA];\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\n return { chainIndex: chainIndexA, atEnd: true };\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\n return { chainIndex: chainIndexA, atEnd: false };\n }\n return undefined;\n }\n /**\n * Insert a single curve primitive into the active chains.\n * * The primitive is captured (not cloned)\n * * The primitive may be reversed in place\n * @param candidate curve to add to the context\n */\n public captureCurvePrimitive(candidate: CurvePrimitive) {\n if (this._snapTolerance < this._gapTolerance) {\n if (this.attachPrimitiveToAnyChain(candidate, this._snapTolerance))\n return;\n }\n if (this.attachPrimitiveToAnyChain(candidate, this._gapTolerance))\n return;\n this._chains.push([candidate]);\n }\n /**\n * Insert any curve into the collection.\n * * This recurses into Path, Loop, BagOfCurves etc\n * * All primitives are captured, and may be reversed in place.\n * @param candidate curve to add to the context\n */\n public captureCurve(candidate: AnyCurve) {\n if (candidate instanceof CurvePrimitive)\n this.captureCurvePrimitive(candidate);\n else if (candidate instanceof CurveCollection) {\n for (const c of candidate.children)\n this.captureCurve(c);\n }\n }\n /** If allowed by the geometry type, move an endpoint. */\n private static simpleEndPointMove(curve: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\n if (curve instanceof (LineSegment3d)) {\n if (atEnd) {\n curve.point1Ref.setFrom(to);\n } else {\n curve.point0Ref.setFrom(to);\n }\n return true;\n } else if (curve instanceof LineString3d && curve.numPoints() > 0) {\n const i = atEnd ? curve.numPoints() - 1 : 0;\n curve.packedPoints.setAtCheckedPointIndex(i, to);\n return true;\n }\n return false;\n }\n /**\n * Try to move the end of curve0 and/or the start of curve1 to a common point.\n * * All z-coordinates are ignored.\n * @param curve0 first curve, assumed to end close to the start of curve1\n * @param curve1 second curve, assumed to start close to the end of curve0\n * @param gapTolerance max distance to move a curve start/end point\n * @returns whether curve start/end point(s) moved\n */\n private static moveHeadOrTail(curve0: CurvePrimitive, curve1: CurvePrimitive, gapTolerance: number): boolean {\n const xyz0 = curve0.endPoint();\n const xyz1 = curve1.startPoint();\n const minShift = Geometry.smallMetricDistance * 0.001;\n const d01 = xyz0.distanceXY(xyz1);\n if (d01 < minShift)\n return false;\n // try lines and linestrings\n if (d01 < gapTolerance) {\n if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))\n return true;\n }\n // try other primitive types\n const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);\n const shiftFactor = 5.0;\n for (const pair of intersections) {\n const detail0 = pair.detailA;\n const detail1 = pair.detailB;\n const distance0 = detail0.point.distanceXY(xyz0);\n const distance1 = detail1.point.distanceXY(xyz1);\n if (distance0 < shiftFactor * gapTolerance && distance1 < shiftFactor * gapTolerance) {\n if (curve0 instanceof Arc3d && curve1 instanceof Arc3d) {\n const radians0End = curve0.sweep.fractionToRadians(detail0.fraction);\n curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);\n const radians1Start = curve1.sweep.fractionToRadians(detail1.fraction);\n curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);\n return true;\n }\n // TODO: other combinations of types\n }\n }\n return false;\n }\n /** Announce a curve primitive\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\n * * Otherwise start a new chain.\n */\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive, tolerance: number): boolean {\n if (candidate) {\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\n if (connect) {\n if (connect.atEnd) {\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\n return true;\n } else {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\n return true;\n }\n } else {\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\n if (connect) {\n if (connect.atEnd) {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\n return true;\n } else {\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\n return true;\n }\n }\n }\n }\n return false;\n }\n /**\n * Merge two entries in the chain array.\n * * Move each primitive from chainB to the end of chainA.\n * * Clear chainB.\n * * Move the final chain to chainB index.\n * * Decrement the array length.\n * @param chainIndexA index of chainA\n * @param chainIndexB index of chainB\n */\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\n const chainA = this._chains[chainIndexA];\n const chainB = this._chains[chainIndexB];\n for (const p of chainB) {\n chainA.push(p);\n }\n chainB.length = 0; // chainIndexB is unused\n const lastChainIndex = this._chains.length - 1;\n if (chainIndexB !== lastChainIndex)\n this._chains[chainIndexB] = this._chains[lastChainIndex];\n this._chains.pop();\n }\n /** Reverse the curve chain in place. */\n private reverseChain(chainIndex: number) {\n const chain = this._chains[chainIndex];\n chain.reverse();\n for (const p of chain)\n p.reverseInPlace();\n }\n /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */\n private searchAndMergeChainIndex(chainIndex: number, tolerance: number): void {\n // ASSUME valid index of non-empty chain\n const chain = this._chains[chainIndex];\n const lastIndexInChain = chain.length - 1;\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\n // try start with any other chain\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\n if (connect) {\n if (!connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\n return;\n }\n // try end with any other chain\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\n if (connect) {\n if (connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\n return;\n }\n }\n /**\n * Convert an array of curve primitives into the simplest possible strongly typed curve structure.\n * @param curves input array, assembled correctly into a single contiguous path, captured by returned object\n * @param makeLoopIfClosed whether to return a Loop from physically closed coplanar curves, otherwise Path\n * @return Loop or Path if multiple curves; the primitive if only one curve; undefined if no curves\n */\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\n if (curves.length === 0)\n return undefined;\n if (makeLoopIfClosed) {\n const primitive0 = curves[0];\n const primitiveN = curves[curves.length - 1];\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n if (MultiChainCollector.moveHeadOrTail(primitiveN, primitive0, this._gapTolerance)) {\n // get the corrected coordinates\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n }\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB, this._gapTolerance)) {\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\n if (localToWorld) {\n const worldToLocal = localToWorld.inverse();\n if (worldToLocal) {\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\n if (this._planeTolerance !== undefined && range.zLength() <= this._planeTolerance) {\n return Loop.createArray(curves);\n }\n }\n }\n return Path.createArray(curves);\n }\n }\n if (curves.length === 1)\n return curves[0];\n return Path.createArray(curves);\n }\n /** Stroke the curve chain to a line string, de-duplicate the points. */\n private chainToLineString3d(chain: CurvePrimitive[], options?: StrokeOptions): LineString3d | undefined {\n if (chain.length === 0)\n return undefined;\n const linestring = LineString3d.create();\n for (const curve of chain)\n curve.emitStrokes(linestring, options);\n linestring.removeDuplicatePoints(this._gapTolerance);\n return linestring;\n }\n /** Return the collected results, structured as the simplest possible type. */\n public grabResult(makeLoopIfClosed: boolean = false): AnyChain | undefined {\n const chains = this._chains;\n if (chains.length === 0)\n return undefined;\n if (chains.length === 1)\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\n const bag = BagOfCurves.create();\n for (const chain of chains) {\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\n bag.tryAddChild(q);\n }\n return bag;\n }\n /**\n * Return chains as individual calls to announceChain.\n * * Does not use planeTolerance.\n */\n public announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void {\n const chains = this._chains;\n if (chains.length === 1) {\n const ls = this.chainToLineString3d(chains[0], options);\n if (ls)\n announceChain(ls);\n } else if (chains.length > 1) {\n for (const chain of chains) {\n const ls = this.chainToLineString3d(chain, options);\n if (ls)\n announceChain(ls);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.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 { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\nimport { Arc3d } from \"../Arc3d\";\nimport { BagOfCurves, CurveCollection } from \"../CurveCollection\";\nimport { CurveCurve } from \"../CurveCurve\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { AnyChain, AnyCurve } from \"../CurveTypes\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop } from \"../Loop\";\nimport { Path } from \"../Path\";\nimport { RegionOps } from \"../RegionOps\";\nimport { StrokeOptions } from \"../StrokeOptions\";\n\n/**\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\n * * The caller makes a sequence of calls to announce individual primitives.\n * * This collector (unlike the simpler [[ChainCollectorContext]]) expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\n * * When all curves have been announced, the call to `grabResult` restructures the various active chains into Paths (and optionally, Loops).\n * * Chain formation is dependent upon input fragment order, as a greedy algorithm is employed.\n * * Usage pattern is\n * * initialization: `context = new MultiChainCollector(gapTol, planeTol)`\n * * many times:\n * * `context.captureCurve(anyCurve)`\n * * `context.captureCurvePrimitive(primitive)`\n * * end: `result = context.grabResult(makeLoopIfClosed)`\n * @internal\n */\nexport class MultiChainCollector {\n /** Accumulated chains. */\n private _chains: CurvePrimitive[][];\n /** Largest gap distance to close. */\n private _gapTolerance: number;\n /** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */\n private _snapTolerance: number;\n /** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */\n private _planeTolerance: number | undefined;\n\n private static _staticPointA: Point3d;\n private static _staticPointB: Point3d;\n private _xyzWork0?: Point3d;\n private _xyzWork1?: Point3d;\n\n /** Initialize with an empty array of chains.\n * @param gapTolerance distance tolerance for calling endpoints identical\n * @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.\n */\n public constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance?: number) {\n this._chains = [];\n this._gapTolerance = gapTolerance;\n this._snapTolerance = Geometry.smallMetricDistance;\n this._planeTolerance = planeTolerance;\n }\n /**\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\n * @param xyz endpoint to check\n * @param distanceTol absolute distance tolerance for equating endpoints\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\n */\n private findAnyChainToConnect(xyz: Point3d, distanceTol: number, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\n if (exceptChainIndex === chainIndexA)\n continue;\n const chain = this._chains[chainIndexA];\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))\n return { chainIndex: chainIndexA, atEnd: true };\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))\n return { chainIndex: chainIndexA, atEnd: false };\n }\n return undefined;\n }\n /**\n * Insert a single curve primitive into the active chains.\n * * The primitive is captured (not cloned)\n * * The primitive may be reversed in place\n * @param candidate curve to add to the context\n */\n public captureCurvePrimitive(candidate: CurvePrimitive) {\n if (this._snapTolerance < this._gapTolerance) {\n if (this.attachPrimitiveToAnyChain(candidate, this._snapTolerance))\n return;\n }\n if (this.attachPrimitiveToAnyChain(candidate, this._gapTolerance))\n return;\n this._chains.push([candidate]);\n }\n /**\n * Insert any curve into the collection.\n * * This recurses into Path, Loop, BagOfCurves etc\n * * All primitives are captured, and may be reversed in place.\n * @param candidate curve to add to the context\n */\n public captureCurve(candidate: AnyCurve) {\n if (candidate instanceof CurvePrimitive)\n this.captureCurvePrimitive(candidate);\n else if (candidate instanceof CurveCollection) {\n for (const c of candidate.children)\n this.captureCurve(c);\n }\n }\n /** If allowed by the geometry type, move an endpoint. */\n private static simpleEndPointMove(curve: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\n if (curve instanceof (LineSegment3d)) {\n if (atEnd) {\n curve.point1Ref.setFrom(to);\n } else {\n curve.point0Ref.setFrom(to);\n }\n return true;\n } else if (curve instanceof LineString3d && curve.numPoints() > 0) {\n const i = atEnd ? curve.numPoints() - 1 : 0;\n curve.packedPoints.setAtCheckedPointIndex(i, to);\n return true;\n }\n return false;\n }\n /**\n * Try to move the end of curve0 and/or the start of curve1 to a common point.\n * * All z-coordinates are ignored.\n * @param curve0 first curve, assumed to end close to the start of curve1\n * @param curve1 second curve, assumed to start close to the end of curve0\n * @param gapTolerance max distance to move a curve start/end point\n * @returns whether curve start/end point(s) moved\n */\n private static moveHeadOrTail(curve0: CurvePrimitive, curve1: CurvePrimitive, gapTolerance: number): boolean {\n const xyz0 = curve0.endPoint();\n const xyz1 = curve1.startPoint();\n const minShift = Geometry.smallMetricDistance * 0.001;\n const d01 = xyz0.distanceXY(xyz1);\n if (d01 < minShift)\n return false;\n // try lines and linestrings\n if (d01 < gapTolerance) {\n if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))\n return true;\n }\n // try other primitive types\n const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);\n const shiftFactor = 5.0;\n for (const pair of intersections) {\n const detail0 = pair.detailA;\n const detail1 = pair.detailB;\n const distance0 = detail0.point.distanceXY(xyz0);\n const distance1 = detail1.point.distanceXY(xyz1);\n if (distance0 < shiftFactor * gapTolerance && distance1 < shiftFactor * gapTolerance) {\n if (curve0 instanceof Arc3d && curve1 instanceof Arc3d) {\n const radians0End = curve0.sweep.fractionToRadians(detail0.fraction);\n curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);\n const radians1Start = curve1.sweep.fractionToRadians(detail1.fraction);\n curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);\n return true;\n }\n // TODO: other combinations of types\n }\n }\n return false;\n }\n /** Announce a curve primitive\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\n * * Otherwise start a new chain.\n */\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive, distanceTol: number): boolean {\n if (candidate.curveLength() < distanceTol) {\n return true;\n } else {\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\n let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);\n if (connect) {\n if (connect.atEnd) {\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\n return true;\n } else {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\n return true;\n }\n } else {\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);\n if (connect) {\n if (connect.atEnd) {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\n return true;\n } else {\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\n return true;\n }\n }\n }\n }\n return false;\n }\n /**\n * Merge two entries in the chain array.\n * * Move each primitive from chainB to the end of chainA.\n * * Clear chainB.\n * * Move the final chain to chainB index.\n * * Decrement the array length.\n * @param chainIndexA index of chainA\n * @param chainIndexB index of chainB\n */\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\n const chainA = this._chains[chainIndexA];\n const chainB = this._chains[chainIndexB];\n for (const p of chainB) {\n chainA.push(p);\n }\n chainB.length = 0; // chainIndexB is unused\n const lastChainIndex = this._chains.length - 1;\n if (chainIndexB !== lastChainIndex)\n this._chains[chainIndexB] = this._chains[lastChainIndex];\n this._chains.pop();\n }\n /** Reverse the curve chain in place. */\n private reverseChain(chainIndex: number) {\n const chain = this._chains[chainIndex];\n chain.reverse();\n for (const p of chain)\n p.reverseInPlace();\n }\n /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */\n private searchAndMergeChainIndex(chainIndex: number, distanceTol: number): void {\n // ASSUME valid index of non-empty chain\n const chain = this._chains[chainIndex];\n const lastIndexInChain = chain.length - 1;\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\n // try start with any other chain\n let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);\n if (connect) {\n if (!connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\n return;\n }\n // try end with any other chain\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);\n if (connect) {\n if (connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\n return;\n }\n }\n /**\n * Convert an array of curve primitives into the simplest possible strongly typed curve structure.\n * @param curves input array, assembled correctly into a single contiguous path, captured by returned object\n * @param makeLoopIfClosed whether to return a Loop from physically closed coplanar curves, otherwise Path\n * @return Loop or Path if multiple curves; the primitive if only one curve; undefined if no curves\n */\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\n if (curves.length === 0)\n return undefined;\n if (makeLoopIfClosed) {\n const primitive0 = curves[0];\n const primitiveN = curves[curves.length - 1];\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n if (MultiChainCollector.moveHeadOrTail(primitiveN, primitive0, this._gapTolerance)) {\n // get the corrected coordinates\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n }\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB, this._gapTolerance)) {\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\n if (localToWorld) {\n const worldToLocal = localToWorld.inverse();\n if (worldToLocal) {\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\n if (this._planeTolerance !== undefined && range.zLength() <= this._planeTolerance) {\n return Loop.createArray(curves);\n }\n }\n }\n return Path.createArray(curves);\n }\n }\n if (curves.length === 1)\n return curves[0];\n return Path.createArray(curves);\n }\n /** Stroke the curve chain to a line string, de-duplicate the points. */\n private chainToLineString3d(chain: CurvePrimitive[], options?: StrokeOptions): LineString3d | undefined {\n if (chain.length === 0)\n return undefined;\n const linestring = LineString3d.create();\n for (const curve of chain)\n curve.emitStrokes(linestring, options);\n linestring.removeDuplicatePoints(this._gapTolerance);\n return linestring;\n }\n /** Return the collected results, structured as the simplest possible type. */\n public grabResult(makeLoopIfClosed: boolean = false): AnyChain | undefined {\n const chains = this._chains;\n if (chains.length === 0)\n return undefined;\n if (chains.length === 1)\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\n const bag = BagOfCurves.create();\n for (const chain of chains) {\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\n bag.tryAddChild(q);\n }\n return bag;\n }\n /**\n * Return chains as individual calls to announceChain.\n * * Does not use planeTolerance.\n */\n public announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void {\n const chains = this._chains;\n if (chains.length === 1) {\n const ls = this.chainToLineString3d(chains[0], options);\n if (ls)\n announceChain(ls);\n } else if (chains.length > 1) {\n for (const chain of chains) {\n const ls = this.chainToLineString3d(chain, options);\n if (ls)\n announceChain(ls);\n }\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolygonOffsetContext.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,OAAO,EAAY,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"PolygonOffsetContext.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,OAAO,EAAY,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AA6Y/B;;;GAGG;AACH,qBAAa,wBAAwB;IACnC,2BAA2B;;IAE3B,OAAO,CAAC,MAAM,CAAC,UAAU,CAAqB;IAC9C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAqB;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAE3C,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAgBlC;;;;;;;;;;OAUG;IACI,4BAA4B,CACjC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,GAAG,YAAY,GACnF,UAAU,GAAG,SAAS;CA6C1B;AAED;;;GAGG;AACH,qBAAa,2BAA2B;IACtC,2BAA2B;;IAE3B;;;;;;OAMG;WACW,eAAe,CAC3B,EAAE,EAAE,cAAc,GAAG,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,GAC7F,cAAc,GAAG,SAAS;IAS7B;;;;;;;OAOG;WACW,6BAA6B,CACzC,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,GAAG,aAAa,GACrE,cAAc,GAAG,cAAc,EAAE,GAAG,SAAS;IAehD;;;;;;;OAOG;WACW,sBAAsB,CAClC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,uBAAuB,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,GAClF,eAAe,GAAG,SAAS;CAsD/B"}
|
|
@@ -300,7 +300,7 @@ class Joint {
|
|
|
300
300
|
this.fraction0 = 1.0;
|
|
301
301
|
}
|
|
302
302
|
else if (this.curve0 && this.curve1) { // joints at the middle of the chain
|
|
303
|
-
if (this.curve0.endPoint().isAlmostEqualXY(this.curve1.startPoint())) { // joint
|
|
303
|
+
if (this.curve0.endPoint().isAlmostEqualXY(this.curve1.startPoint())) { // joint at shared endpoint
|
|
304
304
|
this.fraction0 = 1.0;
|
|
305
305
|
this.fraction1 = 0.0;
|
|
306
306
|
this.flexure = JointMode.Trim;
|
|
@@ -348,16 +348,12 @@ class Joint {
|
|
|
348
348
|
* @param start
|
|
349
349
|
*/
|
|
350
350
|
static removeDegeneratePrimitives(start, options, maxTest) {
|
|
351
|
-
/*
|
|
352
|
-
if (Checker.noisy.PolygonOffset)
|
|
353
|
-
GeometryCoreTestIO.consoleLog("\nENTER removeDegenerates");
|
|
354
|
-
*/
|
|
355
351
|
let jointA = start;
|
|
356
352
|
let numRemoved = 0;
|
|
357
|
-
const maxRemove = 1;
|
|
358
353
|
let numTest = 0;
|
|
359
354
|
if (jointA) {
|
|
360
355
|
while (jointA !== undefined && numTest++ < maxTest) {
|
|
356
|
+
// each iteration looks at the two curves f, g on either side of jointB
|
|
361
357
|
const jointB = jointA.nextJoint;
|
|
362
358
|
if (jointA
|
|
363
359
|
&& jointB
|
|
@@ -365,61 +361,42 @@ class Joint {
|
|
|
365
361
|
&& jointB.nextJoint
|
|
366
362
|
&& jointA.fraction1 !== undefined
|
|
367
363
|
&& jointB.fraction0 !== undefined) {
|
|
364
|
+
// f0 and f1 are fractions on primitive f, between jointA and jointB.
|
|
368
365
|
const f0 = jointA.fraction1;
|
|
369
366
|
const f1 = jointB.fraction0;
|
|
367
|
+
// g0 and g1 are fractions on primitive g, between jointB and jointC.
|
|
370
368
|
const g0 = jointB.fraction1;
|
|
371
369
|
const g1 = jointB.nextJoint.fraction0;
|
|
372
|
-
// f0 and f1 are fractions on the single primitive between these joints.
|
|
373
|
-
/*
|
|
374
|
-
if (Checker.noisy.PolygonOffset) {
|
|
375
|
-
GeometryCoreTestIO.consoleLog("joint candidate");
|
|
376
|
-
GeometryCoreTestIO.consoleLog(prettyPrint(jointA.shallowExtract()));
|
|
377
|
-
GeometryCoreTestIO.consoleLog(prettyPrint(jointB.shallowExtract()));
|
|
378
|
-
GeometryCoreTestIO.consoleLog("FRACTIONS ", { fA1: f0, fB0: f1 });
|
|
379
|
-
}
|
|
380
|
-
*/
|
|
381
370
|
const eliminateF = f0 >= f1 || f0 > 1.0;
|
|
382
371
|
const eliminateG = (g0 !== undefined && g0 > 1.0) || (g0 !== undefined && g1 !== undefined && g0 >= g1);
|
|
383
|
-
if (eliminateF && eliminateG) {
|
|
372
|
+
if (eliminateF && eliminateG) { // collapse jointA, jointB, and jointC into a new joint
|
|
384
373
|
const jointC = jointB.nextJoint;
|
|
385
374
|
const newJoint = new Joint(jointA.curve0, jointC.curve1, undefined);
|
|
386
375
|
Joint.link(jointA.previousJoint, newJoint);
|
|
387
376
|
Joint.link(newJoint, jointC.nextJoint);
|
|
388
377
|
newJoint.annotateJointMode(options);
|
|
389
|
-
newJoint.previousJoint
|
|
378
|
+
if (newJoint.previousJoint)
|
|
379
|
+
newJoint.previousJoint.annotateJointMode(options);
|
|
390
380
|
if (newJoint.nextJoint)
|
|
391
381
|
newJoint.nextJoint.annotateJointMode(options);
|
|
392
|
-
|
|
393
|
-
if (
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
}
|
|
397
|
-
*/
|
|
382
|
+
numRemoved += 2;
|
|
383
|
+
if (jointA === start || jointB === start || jointC === start)
|
|
384
|
+
start = newJoint;
|
|
385
|
+
jointA = newJoint;
|
|
398
386
|
}
|
|
399
|
-
else if (eliminateF) {
|
|
387
|
+
else if (eliminateF) { // collapse jointA and jointB into a new joint
|
|
400
388
|
const newJoint = new Joint(jointA.curve0, jointB.curve1, undefined);
|
|
401
389
|
Joint.link(jointA.previousJoint, newJoint);
|
|
402
390
|
Joint.link(newJoint, jointB.nextJoint);
|
|
403
391
|
newJoint.annotateJointMode(options);
|
|
404
|
-
newJoint.previousJoint
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
GeometryCoreTestIO.consoleLog(" NEW JOINT");
|
|
409
|
-
GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));
|
|
410
|
-
}
|
|
411
|
-
*/
|
|
392
|
+
if (newJoint.previousJoint)
|
|
393
|
+
newJoint.previousJoint.annotateJointMode(options);
|
|
394
|
+
if (newJoint.nextJoint)
|
|
395
|
+
newJoint.nextJoint.annotateJointMode(options);
|
|
412
396
|
numRemoved++;
|
|
413
|
-
if (jointA === start)
|
|
397
|
+
if (jointA === start || jointB === start)
|
|
414
398
|
start = newJoint;
|
|
415
399
|
jointA = newJoint;
|
|
416
|
-
if (numRemoved >= maxRemove) {
|
|
417
|
-
/*
|
|
418
|
-
if (Checker.noisy.PolygonOffset)
|
|
419
|
-
GeometryCoreTestIO.consoleLog(" EXIT removeDegenerates at maxRemove\n");
|
|
420
|
-
*/
|
|
421
|
-
return { newStart: start, numJointRemoved: numRemoved };
|
|
422
|
-
}
|
|
423
400
|
}
|
|
424
401
|
}
|
|
425
402
|
jointA = jointA.nextJoint;
|
|
@@ -498,12 +475,6 @@ class PolygonWireOffsetContext {
|
|
|
498
475
|
joint0 = state.newStart;
|
|
499
476
|
if (state.numJointRemoved === 0)
|
|
500
477
|
break;
|
|
501
|
-
/*
|
|
502
|
-
if (Checker.noisy.PolygonOffset) {
|
|
503
|
-
GeometryCoreTestIO.consoleLog(" POST REMOVE DEGENERATES " + state.numJointRemoved);
|
|
504
|
-
Joint.visitJointsOnChain(joint0, (joint: Joint) => { GeometryCoreTestIO.consoleLog(prettyPrint(joint.shallowExtract())); return true; });
|
|
505
|
-
}
|
|
506
|
-
*/
|
|
507
478
|
}
|
|
508
479
|
const chain = LineString3d_1.LineString3d.create();
|
|
509
480
|
Joint.collectStrokesFromChain(joint0, chain, numPoints); // compute offset corners (by extension/trim)
|
|
@@ -576,7 +547,7 @@ class CurveChainWireOffsetContext {
|
|
|
576
547
|
const wrap = curves instanceof Loop_1.Loop;
|
|
577
548
|
const offsetOptions = OffsetOptions_1.OffsetOptions.create(offsetDistanceOrOptions);
|
|
578
549
|
const simpleOffsets = [];
|
|
579
|
-
|
|
550
|
+
// traverse primitives (children of curves) and create simple offsets of each primitive as an array
|
|
580
551
|
for (const c of curves.children) {
|
|
581
552
|
const c1 = CurveChainWireOffsetContext.createSingleOffsetPrimitiveXY(c, offsetOptions);
|
|
582
553
|
if (c1 === undefined) {
|
|
@@ -592,7 +563,7 @@ class CurveChainWireOffsetContext {
|
|
|
592
563
|
}
|
|
593
564
|
}
|
|
594
565
|
}
|
|
595
|
-
|
|
566
|
+
// create joints between array elements to make offsets as a linked list (joint0)
|
|
596
567
|
let fragment0;
|
|
597
568
|
let newJoint;
|
|
598
569
|
let previousJoint;
|
|
@@ -611,10 +582,19 @@ class CurveChainWireOffsetContext {
|
|
|
611
582
|
}
|
|
612
583
|
if (joint0 && previousJoint && curves instanceof Loop_1.Loop)
|
|
613
584
|
Joint.link(previousJoint, joint0);
|
|
614
|
-
|
|
585
|
+
// annotateChain sets some of the joint attributes (including how to extend curves or fill the gap between curves)
|
|
615
586
|
const numOffset = simpleOffsets.length;
|
|
616
587
|
Joint.annotateChain(joint0, offsetOptions.jointOptions, numOffset);
|
|
617
|
-
|
|
588
|
+
if (joint0) {
|
|
589
|
+
// make limited passes through the Joint chain until no self-intersections are removed
|
|
590
|
+
for (let pass = 0; pass++ < 5;) {
|
|
591
|
+
const state = Joint.removeDegeneratePrimitives(joint0, offsetOptions.jointOptions, numOffset);
|
|
592
|
+
joint0 = state.newStart;
|
|
593
|
+
if (state.numJointRemoved === 0)
|
|
594
|
+
break;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
// turn the Joint linked list into a CurveCollection. trimming is done in collectCurvesFromChain
|
|
618
598
|
const outputCurves = [];
|
|
619
599
|
Joint.collectCurvesFromChain(joint0, outputCurves, numOffset);
|
|
620
600
|
return RegionOps_1.RegionOps.createLoopPathOrBagOfCurves(outputCurves, wrap, true);
|