@itwin/core-geometry 5.5.0-dev.4 → 5.5.0-dev.5
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/lib/cjs/Geometry.d.ts +7 -0
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +9 -0
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +2 -1
- 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 +4 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js +14 -4
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.d.ts +2 -0
- package/lib/cjs/bspline/BezierCurve3dH.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js +19 -3
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.d.ts +8 -2
- package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js +10 -4
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js +4 -4
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.d.ts +0 -3
- package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js +9 -2
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.d.ts +59 -9
- package/lib/cjs/clipping/ClipPrimitive.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js +124 -55
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipVector.js +12 -8
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +0 -2
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +19 -18
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.d.ts +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.d.ts.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js +4 -5
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.d.ts +0 -1
- package/lib/cjs/core-geometry.d.ts.map +1 -1
- package/lib/cjs/core-geometry.js +0 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.js +2 -2
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +12 -4
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +52 -33
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +13 -6
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +13 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +12 -4
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +14 -5
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +5 -4
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +7 -4
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +25 -16
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +90 -72
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Path.d.ts +0 -3
- package/lib/cjs/curve/Path.d.ts.map +1 -1
- package/lib/cjs/curve/Path.js +9 -2
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +25 -31
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.d.ts +7 -1
- package/lib/cjs/curve/Query/StrokeCountChain.d.ts.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js +27 -36
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js +7 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +8 -5
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +6 -6
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js +4 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +6 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +5 -21
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +29 -73
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +55 -13
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +238 -110
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +1 -4
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +9 -9
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +11 -14
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +18 -18
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts +7 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.d.ts +19 -7
- package/lib/cjs/geometry3d/Ellipsoid.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js +26 -11
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js +11 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts +5 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js +11 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +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 +49 -8
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +90 -37
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +100 -3
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +125 -0
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +10 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +53 -34
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts +49 -2
- package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js +67 -9
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +24 -32
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +147 -180
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +5 -5
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js +13 -3
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts +0 -3
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js +5 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.d.ts +2 -2
- package/lib/cjs/geometry3d/SortablePolygon.d.ts.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js +14 -18
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +8 -0
- package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Transform.js +15 -9
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.d.ts +4 -2
- package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js +6 -4
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/Newton.d.ts +3 -1
- package/lib/cjs/numerics/Newton.d.ts.map +1 -1
- package/lib/cjs/numerics/Newton.js +5 -1
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/polyface/AuxData.d.ts +1 -4
- package/lib/cjs/polyface/AuxData.d.ts.map +1 -1
- package/lib/cjs/polyface/AuxData.js +5 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js +3 -3
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js +14 -16
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +84 -28
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +277 -217
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.d.ts +4 -3
- package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js +11 -4
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- 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 +9 -7
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js +3 -2
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +2 -2
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +14 -12
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.d.ts +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js +10 -6
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js +4 -3
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +3 -5
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.d.ts +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js +4 -8
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.d.ts.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js +1 -0
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.d.ts.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js +37 -7
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.d.ts +4 -4
- package/lib/cjs/serialization/BGFBWriter.d.ts.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js +24 -40
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js +9 -3
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.d.ts +0 -3
- package/lib/cjs/serialization/SerializationHelpers.d.ts.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js +16 -7
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.d.ts +2 -2
- package/lib/cjs/solid/Box.d.ts.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.d.ts +3 -2
- package/lib/cjs/solid/Cone.d.ts.map +1 -1
- package/lib/cjs/solid/Cone.js +4 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.d.ts +1 -1
- package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
- package/lib/cjs/solid/LinearSweep.js +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.d.ts.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js +1 -3
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.d.ts +4 -3
- package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.d.ts +4 -4
- package/lib/cjs/topology/ChainMerge.d.ts.map +1 -1
- package/lib/cjs/topology/ChainMerge.js +11 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +2 -0
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +5 -0
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js +2 -0
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +23 -16
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.d.ts +20 -9
- package/lib/cjs/topology/HalfEdgePositionDetail.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js +17 -13
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js +3 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts +6 -2
- package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js +41 -35
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.d.ts +7 -3
- package/lib/cjs/topology/MaskManager.d.ts.map +1 -1
- package/lib/cjs/topology/MaskManager.js +10 -4
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.d.ts.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/Triangulation.d.ts +2 -1
- package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
- package/lib/cjs/topology/Triangulation.js +12 -7
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/esm/Geometry.d.ts +7 -0
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +9 -0
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js +2 -1
- 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 +4 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js +14 -4
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.d.ts +2 -0
- package/lib/esm/bspline/BezierCurve3dH.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js +19 -3
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.d.ts +8 -2
- package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js +10 -4
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js +4 -4
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.d.ts +0 -3
- package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPlane.js +9 -2
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.d.ts +59 -9
- package/lib/esm/clipping/ClipPrimitive.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js +124 -55
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.d.ts.map +1 -1
- package/lib/esm/clipping/ClipVector.js +12 -8
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +0 -2
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +20 -19
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.d.ts +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.d.ts.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js +4 -5
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.d.ts +0 -1
- package/lib/esm/core-geometry.d.ts.map +1 -1
- package/lib/esm/core-geometry.js +0 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.js +2 -2
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +12 -4
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +53 -34
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +13 -6
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
- package/lib/esm/curve/CurveFactory.js +13 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +12 -4
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +14 -5
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +5 -4
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +7 -4
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +25 -16
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +90 -72
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Path.d.ts +0 -3
- package/lib/esm/curve/Path.d.ts.map +1 -1
- package/lib/esm/curve/Path.js +9 -2
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +25 -31
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.d.ts +7 -1
- package/lib/esm/curve/Query/StrokeCountChain.d.ts.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js +27 -36
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js +7 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +8 -5
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +6 -6
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js +4 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +6 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +5 -21
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +29 -73
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +55 -13
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +239 -111
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +1 -4
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +9 -9
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +11 -14
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +18 -18
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts +7 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.d.ts +19 -7
- package/lib/esm/geometry3d/Ellipsoid.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js +26 -11
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js +11 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.d.ts +5 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js +11 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +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 +49 -8
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +90 -37
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +100 -3
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +125 -0
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +10 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +53 -34
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts +49 -2
- package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js +67 -9
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +24 -32
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +147 -180
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +5 -5
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js +13 -3
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts +0 -3
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js +5 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.d.ts +2 -2
- package/lib/esm/geometry3d/SortablePolygon.d.ts.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js +14 -18
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +8 -0
- package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
- package/lib/esm/geometry3d/Transform.js +15 -9
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.d.ts +4 -2
- package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js +6 -4
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/Newton.d.ts +3 -1
- package/lib/esm/numerics/Newton.d.ts.map +1 -1
- package/lib/esm/numerics/Newton.js +5 -1
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/polyface/AuxData.d.ts +1 -4
- package/lib/esm/polyface/AuxData.d.ts.map +1 -1
- package/lib/esm/polyface/AuxData.js +5 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js +3 -3
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js +14 -16
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +84 -28
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +277 -217
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.d.ts +4 -3
- package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js +11 -4
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- 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 +9 -7
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js +3 -2
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js +2 -2
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +14 -12
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.d.ts +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js +10 -6
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js +4 -3
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +3 -5
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.d.ts +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js +4 -8
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.d.ts.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js +1 -0
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.d.ts.map +1 -1
- package/lib/esm/serialization/BGFBReader.js +37 -7
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.d.ts +4 -4
- package/lib/esm/serialization/BGFBWriter.d.ts.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js +24 -40
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js +9 -3
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.d.ts +0 -3
- package/lib/esm/serialization/SerializationHelpers.d.ts.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js +16 -7
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.d.ts +2 -2
- package/lib/esm/solid/Box.d.ts.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.d.ts +3 -2
- package/lib/esm/solid/Cone.d.ts.map +1 -1
- package/lib/esm/solid/Cone.js +4 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.d.ts +1 -1
- package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
- package/lib/esm/solid/LinearSweep.js +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.d.ts.map +1 -1
- package/lib/esm/solid/RotationalSweep.js +1 -3
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/TorusPipe.d.ts +4 -3
- package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.d.ts +4 -4
- package/lib/esm/topology/ChainMerge.d.ts.map +1 -1
- package/lib/esm/topology/ChainMerge.js +11 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +2 -0
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +5 -0
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js +2 -0
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js +23 -16
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.d.ts +20 -9
- package/lib/esm/topology/HalfEdgePositionDetail.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js +17 -13
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js +4 -2
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.d.ts +6 -2
- package/lib/esm/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js +41 -35
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.d.ts +7 -3
- package/lib/esm/topology/MaskManager.d.ts.map +1 -1
- package/lib/esm/topology/MaskManager.js +10 -4
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.d.ts.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/Triangulation.d.ts +2 -1
- package/lib/esm/topology/Triangulation.d.ts.map +1 -1
- package/lib/esm/topology/Triangulation.js +12 -7
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/package.json +3 -3
- package/lib/cjs/serialization/GeometrySamples.d.ts +0 -705
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +0 -1
- package/lib/cjs/serialization/GeometrySamples.js +0 -2433
- package/lib/cjs/serialization/GeometrySamples.js.map +0 -1
- package/lib/esm/serialization/GeometrySamples.d.ts +0 -705
- package/lib/esm/serialization/GeometrySamples.d.ts.map +0 -1
- package/lib/esm/serialization/GeometrySamples.js +0 -2428
- package/lib/esm/serialization/GeometrySamples.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePositionDetail.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePositionDetail.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { HalfEdge } from \"./Graph\";\r\n\r\n/** Enumeration of categorization of \"where\" a HalfEdgePositionDetail is sitting in the graph. */\r\nexport enum HalfEdgeTopo {\r\n /** No known position. */\r\n None = 0,\r\n /** Sitting at a vertex, reached by a ray in this sector. */\r\n Vertex = 1,\r\n /** Sitting on an edge. */\r\n Edge = 2,\r\n /** Face point (before hitting barrier edge). */\r\n Face = 3,\r\n /**\r\n * Exterior point (after hitting barrier edge at fraction).\r\n * Fraction is 0 if exterior point \"in sweep around exterior corner\".\r\n */\r\n ExteriorFace = 4\r\n}\r\n/**\r\n * Description of a generalized position within a graph, categorized as:\r\n * * \"at a certain node around a vertex\"\r\n * * \"at a fractional position along an edge\"\r\n * * \"within a face\"\r\n */\r\nexport class HalfEdgePositionDetail {\r\n /** The relevant node. */\r\n private _node?: HalfEdge;\r\n /** The current coordinates. */\r\n public x: number;\r\n public y: number;\r\n public z: number;\r\n /** Fractional position along edge. Only defined if the topo tag is `HalfEdgeTopo.Edge`. */\r\n private _edgeFraction?: number;\r\n /** Enumeration of status vertex, edge, or face status. */\r\n private _topo: HalfEdgeTopo;\r\n /** First data tag. */\r\n private _iTag?: number;\r\n /** Second data tag. */\r\n private _dTag?: number;\r\n /** Special case for point on edge or vertex but target beyond and exterior. */\r\n private _isExteriorTarget?: boolean;\r\n /**\r\n * Constructor.\r\n * * The point is CAPTURED (static `create` methods normally clone their inputs).\r\n */\r\n private constructor(\r\n node: HalfEdge | undefined,\r\n x: number, y: number, z: number,\r\n topo: HalfEdgeTopo,\r\n edgeFraction?: number,\r\n iTag?: number,\r\n dTag?: number,\r\n isExteriorTarget?: boolean,\r\n ) {\r\n this._node = node;\r\n this.x = x; this.y = y; this.z = z;\r\n this._topo = topo;\r\n this._edgeFraction = edgeFraction;\r\n this._iTag = iTag;\r\n this._dTag = dTag;\r\n this._isExteriorTarget = isExteriorTarget;\r\n }\r\n /** Copy (clones of) all data from other. */\r\n public setFrom(other: HalfEdgePositionDetail) {\r\n this._node = other._node;\r\n this.x = other.x;\r\n this.y = other.y;\r\n this.z = other.z;\r\n this._topo = other._topo;\r\n this._edgeFraction = other._edgeFraction;\r\n this._iTag = other._iTag;\r\n this._dTag = other._dTag;\r\n }\r\n /** Reset to null topo state. */\r\n public resetAsUnknown() {\r\n this._node = undefined;\r\n this._topo = HalfEdgeTopo.None;\r\n }\r\n /** Create with null data. */\r\n public static create(): HalfEdgePositionDetail {\r\n const detail = new HalfEdgePositionDetail(undefined, 0, 0, 0, HalfEdgeTopo.None);\r\n return detail;\r\n }\r\n public getITag(): number | undefined {\r\n return this._iTag;\r\n }\r\n public setITag(value: number): void {\r\n this._iTag = value;\r\n }\r\n public getDTag(): number | undefined {\r\n return this._dTag;\r\n }\r\n public setDTag(value: number): void {\r\n this._dTag = value;\r\n }\r\n public getTopo(): HalfEdgeTopo {\r\n return this._topo;\r\n }\r\n /** Create with node, fraction along edge, marked as \"HalfEdgeTopo.Edge\". Compute interpolated xyz on the edge. */\r\n public static createEdgeAtFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\r\n const node1 = node.faceSuccessor;\r\n const x = Geometry.interpolate(node.x, edgeFraction, node1.x);\r\n const y = Geometry.interpolate(node.y, edgeFraction, node1.y);\r\n const z = Geometry.interpolate(node.z, edgeFraction, node1.z);\r\n return new HalfEdgePositionDetail(node, x, y, z, HalfEdgeTopo.Edge, edgeFraction);\r\n }\r\n /**\r\n * Reassign contents so this instance becomes a face hit.\r\n * @param node new node value. If missing, current node is left unchanged.\r\n * @param xyz new coordinates. if missing, current coordinates are left unchanged.\r\n */\r\n public resetAsFace(node?: HalfEdge, xyz?: XYAndZ): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Face;\r\n if (node)\r\n this._node = node;\r\n if (xyz) {\r\n this.x = xyz.x;\r\n this.y = xyz.y;\r\n this.z = xyz.z;\r\n }\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /** Reassign contents so this instance has dTag but no node or HalfEdgeTopo. */\r\n public resetAsUndefinedWithTag(dTag: number): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.None;\r\n this._dTag = 0;\r\n this._iTag = 0;\r\n this._dTag = dTag;\r\n this._node = undefined;\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /**\r\n * Reassign contents so this instance becomes an edge hit.\r\n * @param node new node value.\r\n * @param edgeFraction new edge fraction. xyz is recomputed from this edge and its face successor.\r\n */\r\n public resetAtEdgeAndFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Edge;\r\n this._node = node;\r\n const nodeB = node.faceSuccessor;\r\n this._edgeFraction = edgeFraction;\r\n this.x = Geometry.interpolate(node.x, edgeFraction, nodeB.x);\r\n this.y = Geometry.interpolate(node.y, edgeFraction, nodeB.y);\r\n this.z = Geometry.interpolate(node.z, edgeFraction, nodeB.z);\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /**\r\n * Create at a node.\r\n * * Take xyz from the node.\r\n */\r\n public static createVertex(node: HalfEdge): HalfEdgePositionDetail {\r\n return new HalfEdgePositionDetail(node, node.x, node.y, node.z, HalfEdgeTopo.Vertex);\r\n }\r\n /** Mark as \"HalfEdgeTopo.Vertex\". */\r\n public resetAsVertex(node: HalfEdge): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Vertex;\r\n this._node = node;\r\n this._edgeFraction = 0.0;\r\n this.setXYZFromNode(node);\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /** Set the flag for an exterior relationship to target. */\r\n public setIsExteriorTarget(isExterior: boolean | undefined) {\r\n this._isExteriorTarget = isExterior;\r\n }\r\n /** Copy x,y,z from the node to this instance local values. */\r\n public setXYZFromNode(node: HalfEdge) {\r\n this.x = node.x;\r\n this.y = node.y;\r\n this.z = node.z;\r\n }\r\n /** Return the (possibly undefined) edge fraction. */\r\n public get edgeFraction(): number | undefined {\r\n return this._edgeFraction;\r\n }\r\n /**\r\n * Property access for the flag for an exterior relationship to target.\r\n * * undefined flag is returned as false.\r\n */\r\n public get isExteriorTarget(): boolean {\r\n return this._isExteriorTarget !== undefined ? this._isExteriorTarget : false;\r\n }\r\n /** Return true if this detail is marked as being within a face. */\r\n public get isFace(): boolean {\r\n return this._topo === HalfEdgeTopo.Face;\r\n }\r\n /** Return true if this detail is marked as being within an edge. */\r\n public get isEdge(): boolean {\r\n return this._topo === HalfEdgeTopo.Edge;\r\n }\r\n /** Return true if this detail is marked as being at a vertex. */\r\n public get isVertex(): boolean {\r\n return this._topo === HalfEdgeTopo.Vertex;\r\n }\r\n /** Return true if this detail has no vertex, edge, or face qualifier. */\r\n public get isUnclassified(): boolean {\r\n return this._topo === HalfEdgeTopo.None;\r\n }\r\n /** Return the node reference from this detail */\r\n public get node(): HalfEdge | undefined {\r\n return this._node;\r\n }\r\n /** Return the (clone of, or optional filled in result) coordinates from this detail. */\r\n public clonePoint(result?: Point3d): Point3d {\r\n return Point3d.create(this.x, this.y, this.z, result);\r\n }\r\n /*\r\n // If candidateKey is less than resultKey, replace resultPos and resultKey\r\n // by the candidate data.\r\n public updateMinimizer(\r\n HalfEdgePositionDetail & resultPos, number & resultKey,\r\n : HalfEdgePositionDetail & candidatePos, candidateKey: number\r\n ): boolean {\r\n if (candidateKey < resultKey) {\r\n resultKey = candidateKey;\r\n resultPos = candidatePos;\r\n return true;\r\n }\r\n return false;\r\n }\r\n */\r\n public isAtXY(x: number, y: number): boolean {\r\n return this._topo !== HalfEdgeTopo.None && Geometry.isSameCoordinate(this.x, x) && Geometry.isSameCoordinate(this.y, y);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"HalfEdgePositionDetail.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePositionDetail.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { HalfEdge } from \"./Graph\";\r\n\r\n/** Enumeration of categorization of \"where\" a HalfEdgePositionDetail is sitting in the graph. */\r\nexport enum HalfEdgeTopo {\r\n /** No known position. */\r\n None = 0,\r\n /** Sitting at a vertex, reached by a ray in this sector. */\r\n Vertex = 1,\r\n /** Sitting on an edge. */\r\n Edge = 2,\r\n /** Face point (before hitting barrier edge). */\r\n Face = 3,\r\n /**\r\n * Exterior point (after hitting barrier edge at fraction).\r\n * Fraction is 0 if exterior point \"in sweep around exterior corner\".\r\n */\r\n ExteriorFace = 4\r\n}\r\n/**\r\n * Description of a generalized position within a graph, categorized as:\r\n * * \"at a certain node around a vertex\"\r\n * * \"at a fractional position along an edge\"\r\n * * \"within a face\"\r\n * @internal\r\n */\r\nexport class HalfEdgePositionDetail {\r\n /** The relevant node. */\r\n private _node?: HalfEdge;\r\n /** The current coordinates. */\r\n public x: number;\r\n public y: number;\r\n public z: number;\r\n /** Fractional position along edge. Only defined if the topo tag is `HalfEdgeTopo.Edge`. */\r\n private _edgeFraction?: number;\r\n /** Enumeration of status vertex, edge, or face status. */\r\n private _topo: HalfEdgeTopo;\r\n /** First data tag. */\r\n private _iTag?: number;\r\n /** Second data tag. */\r\n private _dTag?: number;\r\n /** Special case for point on edge or vertex but target beyond and exterior. */\r\n private _isExteriorTarget?: boolean;\r\n /**\r\n * Constructor.\r\n * * The point is CAPTURED (static `create` methods normally clone their inputs).\r\n */\r\n private constructor(\r\n node: HalfEdge | undefined,\r\n x: number, y: number, z: number,\r\n topo: HalfEdgeTopo,\r\n edgeFraction?: number,\r\n iTag?: number,\r\n dTag?: number,\r\n isExteriorTarget?: boolean,\r\n ) {\r\n this._node = node;\r\n this.x = x; this.y = y; this.z = z;\r\n this._topo = topo;\r\n this._edgeFraction = edgeFraction;\r\n this._iTag = iTag;\r\n this._dTag = dTag;\r\n this._isExteriorTarget = isExteriorTarget;\r\n }\r\n /** Copy (clones of) all data from other. */\r\n public setFrom(other: HalfEdgePositionDetail) {\r\n this._node = other._node;\r\n this.x = other.x;\r\n this.y = other.y;\r\n this.z = other.z;\r\n this._topo = other._topo;\r\n this._edgeFraction = other._edgeFraction;\r\n this._iTag = other._iTag;\r\n this._dTag = other._dTag;\r\n }\r\n /** Reset to null topo state. */\r\n public resetAsUnknown() {\r\n this._node = undefined;\r\n this._topo = HalfEdgeTopo.None;\r\n }\r\n /** Create with null data. */\r\n public static create(): HalfEdgePositionDetail {\r\n const detail = new HalfEdgePositionDetail(undefined, 0, 0, 0, HalfEdgeTopo.None);\r\n return detail;\r\n }\r\n public get iTag(): number | undefined {\r\n return this._iTag;\r\n }\r\n public set iTag(value: number) {\r\n this._iTag = value;\r\n }\r\n public get dTag(): number | undefined {\r\n return this._dTag;\r\n }\r\n public set dTag(value: number) {\r\n this._dTag = value;\r\n }\r\n public hasDTag(): this is { get dTag(): number } {\r\n return this._dTag !== undefined;\r\n }\r\n public get topo(): HalfEdgeTopo {\r\n return this._topo;\r\n }\r\n /** Create with node, fraction along edge, marked as \"HalfEdgeTopo.Edge\". Compute interpolated xyz on the edge. */\r\n public static createEdgeAtFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\r\n const node1 = node.faceSuccessor;\r\n const x = Geometry.interpolate(node.x, edgeFraction, node1.x);\r\n const y = Geometry.interpolate(node.y, edgeFraction, node1.y);\r\n const z = Geometry.interpolate(node.z, edgeFraction, node1.z);\r\n return new HalfEdgePositionDetail(node, x, y, z, HalfEdgeTopo.Edge, edgeFraction);\r\n }\r\n /**\r\n * Reassign contents so this instance becomes a face hit.\r\n * @param node new node value. If missing, current node is left unchanged.\r\n * @param xyz new coordinates. if missing, current coordinates are left unchanged.\r\n */\r\n public resetAsFace(node?: HalfEdge, xyz?: XYAndZ): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Face;\r\n if (node)\r\n this._node = node;\r\n if (xyz) {\r\n this.x = xyz.x;\r\n this.y = xyz.y;\r\n this.z = xyz.z;\r\n }\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /** Reassign contents so this instance has dTag but no node or HalfEdgeTopo. */\r\n public resetAsUndefinedWithTag(dTag: number): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.None;\r\n this._dTag = 0;\r\n this._iTag = 0;\r\n this._dTag = dTag;\r\n this._node = undefined;\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /**\r\n * Reassign contents so this instance becomes an edge hit.\r\n * @param node new node value.\r\n * @param edgeFraction new edge fraction. xyz is recomputed from this edge and its face successor.\r\n */\r\n public resetAtEdgeAndFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Edge;\r\n this._node = node;\r\n const nodeB = node.faceSuccessor;\r\n this._edgeFraction = edgeFraction;\r\n this.x = Geometry.interpolate(node.x, edgeFraction, nodeB.x);\r\n this.y = Geometry.interpolate(node.y, edgeFraction, nodeB.y);\r\n this.z = Geometry.interpolate(node.z, edgeFraction, nodeB.z);\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /**\r\n * Create at a node.\r\n * * Take xyz from the node.\r\n */\r\n public static createVertex(node: HalfEdge): HalfEdgePositionDetail {\r\n return new HalfEdgePositionDetail(node, node.x, node.y, node.z, HalfEdgeTopo.Vertex);\r\n }\r\n /** Mark as \"HalfEdgeTopo.Vertex\". */\r\n public resetAsVertex(node: HalfEdge): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Vertex;\r\n this._node = node;\r\n this._edgeFraction = 0.0;\r\n this.setXYZFromNode(node);\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /** Set the flag for an exterior relationship to target. */\r\n public setIsExteriorTarget(isExterior: boolean | undefined) {\r\n this._isExteriorTarget = isExterior;\r\n }\r\n /** Copy x,y,z from the node to this instance local values. */\r\n public setXYZFromNode(node: HalfEdge) {\r\n this.x = node.x;\r\n this.y = node.y;\r\n this.z = node.z;\r\n }\r\n /** Return the (possibly undefined) edge fraction. */\r\n public get edgeFraction(): number | undefined {\r\n return this._edgeFraction;\r\n }\r\n /**\r\n * Property access for the flag for an exterior relationship to target.\r\n * * undefined flag is returned as false.\r\n */\r\n public get isExteriorTarget(): boolean {\r\n return this._isExteriorTarget !== undefined ? this._isExteriorTarget : false;\r\n }\r\n /** Return true if this detail is marked as being within a face. */\r\n public isFace(): this is { get node() : HalfEdge } {\r\n return this._topo === HalfEdgeTopo.Face && this._node !== undefined;\r\n }\r\n /** Return true if this detail is marked as being within an edge. */\r\n public isEdge(): this is { get node() : HalfEdge, get edgeFraction() : number } {\r\n return this._topo === HalfEdgeTopo.Edge && this._node !== undefined && this._edgeFraction !== undefined;\r\n }\r\n /** Return true if this detail is marked as being at a vertex. */\r\n public isVertex(): this is { get node() : HalfEdge } {\r\n return this._topo === HalfEdgeTopo.Vertex && this._node !== undefined;\r\n }\r\n /** Return true if this detail has no vertex, edge, or face qualifier. */\r\n public get isUnclassified(): boolean {\r\n return this._topo === HalfEdgeTopo.None;\r\n }\r\n /** Return the node reference from this detail */\r\n public get node(): HalfEdge | undefined {\r\n return this._node;\r\n }\r\n /** Return the (clone of, or optional filled in result) coordinates from this detail. */\r\n public clonePoint(result?: Point3d): Point3d {\r\n return Point3d.create(this.x, this.y, this.z, result);\r\n }\r\n /*\r\n // If candidateKey is less than resultKey, replace resultPos and resultKey\r\n // by the candidate data.\r\n public updateMinimizer(\r\n HalfEdgePositionDetail & resultPos, number & resultKey,\r\n : HalfEdgePositionDetail & candidatePos, candidateKey: number\r\n ): boolean {\r\n if (candidateKey < resultKey) {\r\n resultKey = candidateKey;\r\n resultPos = candidatePos;\r\n return true;\r\n }\r\n return false;\r\n }\r\n */\r\n public isAtXY(x: number, y: number, tolerance: number = Geometry.smallMetricDistance): boolean {\r\n return this._topo !== HalfEdgeTopo.None && Geometry.isSameCoordinateXY(this.x, this.y, x, y, tolerance);\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePriorityQueue.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgePriorityQueue.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"HalfEdgePriorityQueue.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgePriorityQueue.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,EAAU,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC;;;;;;;;GAQG;AACH,qBAAa,qCAAqC;IACzC,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,WAAW,EAAE,QAAQ,EAAE,CAAC;gBAE7B,OAAO,GAAE,iBAAiB,CAAC,QAAQ,CAAqD;IAI1F,qEAAqE;IAC9D,eAAe,IAAI,QAAQ,GAAG,SAAS;IAQ9C;;;;OAIG;IACI,oBAAoB,CAAC,CAAC,EAAE,MAAM;IAQrC;;;;OAIG;IACI,6BAA6B,CAAC,CAAC,EAAE,MAAM;CAiB/C"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
/** @packageDocumentation
|
|
6
6
|
* @module Topology
|
|
7
7
|
*/
|
|
8
|
-
import { PriorityQueue } from "@itwin/core-bentley";
|
|
8
|
+
import { assert, PriorityQueue } from "@itwin/core-bentley";
|
|
9
9
|
import { HalfEdgeGraphOps } from "./Merging";
|
|
10
10
|
/**
|
|
11
11
|
* * Combination of a priority queue of HalfEdges with
|
|
@@ -28,6 +28,7 @@ export class HalfEdgePriorityQueueWithPartnerArray {
|
|
|
28
28
|
if (this.priorityQueue.isEmpty)
|
|
29
29
|
return undefined;
|
|
30
30
|
const x = this.priorityQueue.pop();
|
|
31
|
+
assert(x !== undefined, "expect defined because we just checked queue length");
|
|
31
32
|
this.activeEdges.push(x);
|
|
32
33
|
return x;
|
|
33
34
|
}
|
|
@@ -38,8 +39,9 @@ export class HalfEdgePriorityQueueWithPartnerArray {
|
|
|
38
39
|
*/
|
|
39
40
|
popArrayToArrayIndex(i) {
|
|
40
41
|
const n = this.activeEdges.length;
|
|
41
|
-
if (i < n) {
|
|
42
|
+
if (0 <= i && i < n - 1 && n > 0) { // index must not point to last entry, which is about to disappear
|
|
42
43
|
const x = this.activeEdges.pop();
|
|
44
|
+
assert(x !== undefined, "expect defined because we just checked array length");
|
|
43
45
|
this.activeEdges[i] = x;
|
|
44
46
|
}
|
|
45
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePriorityQueue.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePriorityQueue.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH,OAAO,EAAqB,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"HalfEdgePriorityQueue.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePriorityQueue.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH,OAAO,EAAE,MAAM,EAAqB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,OAAO,qCAAqC;IACzC,aAAa,CAA0B;IACvC,WAAW,CAAa;IAC/B,YACE,UAAuC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IACD,qEAAqE;IAC9D,eAAe;QACpB,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO;YAC5B,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,KAAK,SAAS,EAAE,qDAAqD,CAAC,CAAC;QAC/E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IACD;;;;OAIG;IACI,oBAAoB,CAAC,CAAS;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,kEAAkE;YACpG,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;YACjC,MAAM,CAAC,CAAC,KAAK,SAAS,EAAE,qDAAqD,CAAC,CAAC;YAC/E,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD;;;;OAIG;IACI,6BAA6B,CAAC,CAAS;QAC5C,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACZ,+BAA+B;gBAC/B,IAAI,OAAO,GAAG,CAAC;oBACb,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,mBAAmB;YACrB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC;IACpC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\nimport { assert, OrderedComparator, PriorityQueue } from \"@itwin/core-bentley\";\r\nimport { HalfEdge } from \"./Graph\";\r\nimport { HalfEdgeGraphOps } from \"./Merging\";\r\n\r\n/**\r\n * * Combination of a priority queue of HalfEdges with\r\n * * Additional \"active\" array to carry edges that have been removed from the queue but are still to be\r\n * inspected (possibly many times)\r\n * * The priority queue default sort is Y-then-X lexical sort.\r\n * * Caller has direct access to the queue and array.\r\n * * Methods are added here only to do things that involve both the queue and the array.\r\n * @internal\r\n */\r\nexport class HalfEdgePriorityQueueWithPartnerArray {\r\n public priorityQueue: PriorityQueue<HalfEdge>;\r\n public activeEdges: HalfEdge[];\r\n public constructor(\r\n compare: OrderedComparator<HalfEdge> = (a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b)) {\r\n this.priorityQueue = new PriorityQueue(compare);\r\n this.activeEdges = [];\r\n }\r\n /** Read a member from the queue and transfer to the active array. */\r\n public popQueueToArray(): HalfEdge | undefined {\r\n if (this.priorityQueue.isEmpty)\r\n return undefined;\r\n const x = this.priorityQueue.pop();\r\n assert(x !== undefined, \"expect defined because we just checked queue length\");\r\n this.activeEdges.push(x);\r\n return x;\r\n }\r\n /** Pop the last entry and put it back as replacement for current entry at index i.\r\n * * Effectively remove active member at index i\r\n * * The array order is changed.\r\n * * constant time.\r\n */\r\n public popArrayToArrayIndex(i: number) {\r\n const n = this.activeEdges.length;\r\n if (0 <= i && i < n - 1 && n > 0) { // index must not point to last entry, which is about to disappear\r\n const x = this.activeEdges.pop();\r\n assert(x !== undefined, \"expect defined because we just checked array length\");\r\n this.activeEdges[i] = x;\r\n }\r\n }\r\n /**\r\n * * Scan the active array.\r\n * * remove edges whose top y is below y\r\n * * (pack all remaining ones back towards the beginning)\r\n */\r\n public removeArrayMembersWithY1Below(y: number) {\r\n let numKeep = 0;\r\n const n = this.activeEdges.length;\r\n for (let i = 0; i < n; i++) {\r\n const q = this.activeEdges[i];\r\n const yB = q.faceSuccessor.y;\r\n if (yB >= y) {\r\n // copy [i] forward to [target]\r\n if (numKeep < i)\r\n this.activeEdges[numKeep] = q;\r\n numKeep++;\r\n } else {\r\n // let it go by !!!\r\n }\r\n }\r\n this.activeEdges.length = numKeep;\r\n }\r\n}\r\n"]}
|
|
@@ -37,9 +37,13 @@ export declare class InsertAndRetriangulateContext {
|
|
|
37
37
|
private _edgeSet;
|
|
38
38
|
private _searcher;
|
|
39
39
|
private _tolerance;
|
|
40
|
+
/** Constructor. NOTE: graph is assumed to have a free mask available. */
|
|
40
41
|
private constructor();
|
|
41
|
-
/**
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Create a new context referencing the graph.
|
|
44
|
+
* @return `undefined` if graph has no free mask available
|
|
45
|
+
*/
|
|
46
|
+
static create(graph: HalfEdgeGraph, tolerance?: number): InsertAndRetriangulateContext | undefined;
|
|
43
47
|
/** Query the (pointer to) the graph in the context. */
|
|
44
48
|
get graph(): HalfEdgeGraph;
|
|
45
49
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InsertAndRetriangulateContext.d.ts","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAIxD,OAAO,EAAY,aAAa,EAAgB,MAAM,SAAS,CAAC;AAGhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;GAGG;AACH,oBAAY,sBAAsB;IAChC,gGAAgG;IAChG,MAAM,IAAA;IACN,4EAA4E;IAC5E,OAAO,IAAA;IACP;;;OAGG;IACH,eAAe,IAAA;IACf;;;OAGG;IACH,gBAAgB,IAAA;CACjB;AAED;;;;;;;GAOG;AACH,qBAAa,6BAA6B;IACxC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAAS;IAE3B,
|
|
1
|
+
{"version":3,"file":"InsertAndRetriangulateContext.d.ts","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAIxD,OAAO,EAAY,aAAa,EAAgB,MAAM,SAAS,CAAC;AAGhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;GAGG;AACH,oBAAY,sBAAsB;IAChC,gGAAgG;IAChG,MAAM,IAAA;IACN,4EAA4E;IAC5E,OAAO,IAAA;IACP;;;OAGG;IACH,eAAe,IAAA;IACf;;;OAGG;IACH,gBAAgB,IAAA;CACjB;AAED;;;;;;;GAOG;AACH,qBAAa,6BAA6B;IACxC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAAS;IAE3B,yEAAyE;IACzE,OAAO;IAQP;;;MAGE;WACY,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,GAAE,MAAqC,GAAG,6BAA6B,GAAG,SAAS;IAGvI,uDAAuD;IACvD,IAAW,KAAK,IAAI,aAAa,CAEhC;IACD;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAenC,qDAAqD;IAC9C,KAAK;IAGZ,kEAAkE;IAClE,IAAW,eAAe,2BAEzB;IACD,0DAA0D;IACnD,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB;IAiCzE,kDAAkD;IAC3C,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB;IAanE;;;;MAIE;IACK,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAM/D,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;IAqBzB,sGAAsG;IACtG,OAAO,CAAC,iBAAiB;IA4BzB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;;;;;OAMG;IACI,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,GAAG,OAAO;IAgCxF;;;;;;OAMG;IACI,WAAW,CAChB,cAAc,EAAE,sBAAsB,EACtC,MAAM,EAAE,OAAO,EACf,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,OAAO,GACxD,OAAO;CAsFX"}
|
|
@@ -50,15 +50,21 @@ export class InsertAndRetriangulateContext {
|
|
|
50
50
|
_edgeSet;
|
|
51
51
|
_searcher;
|
|
52
52
|
_tolerance;
|
|
53
|
+
/** Constructor. NOTE: graph is assumed to have a free mask available. */
|
|
53
54
|
constructor(graph, tolerance) {
|
|
54
55
|
this._graph = graph;
|
|
55
|
-
|
|
56
|
+
const edgeSet = MarkedEdgeSet.create(graph);
|
|
57
|
+
assert(edgeSet !== undefined, "expect defined; the only caller ensures graph has free mask");
|
|
58
|
+
this._edgeSet = edgeSet;
|
|
56
59
|
this._searcher = HalfEdgePositionDetail.create();
|
|
57
60
|
this._tolerance = tolerance;
|
|
58
61
|
}
|
|
59
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* Create a new context referencing the graph.
|
|
64
|
+
* @return `undefined` if graph has no free mask available
|
|
65
|
+
*/
|
|
60
66
|
static create(graph, tolerance = Geometry.smallMetricDistance) {
|
|
61
|
-
return new InsertAndRetriangulateContext(graph, tolerance);
|
|
67
|
+
return graph.hasFreeMask ? new InsertAndRetriangulateContext(graph, tolerance) : undefined;
|
|
62
68
|
}
|
|
63
69
|
/** Query the (pointer to) the graph in the context. */
|
|
64
70
|
get graph() {
|
|
@@ -94,7 +100,7 @@ export class InsertAndRetriangulateContext {
|
|
|
94
100
|
/** Linear search for the nearest graph edge or vertex. */
|
|
95
101
|
searchForNearestEdgeOrVertex(xyz) {
|
|
96
102
|
const position = HalfEdgePositionDetail.create();
|
|
97
|
-
position.
|
|
103
|
+
position.dTag = Number.MAX_VALUE;
|
|
98
104
|
const xyzC = Point3d.create();
|
|
99
105
|
let fractionC;
|
|
100
106
|
let distanceC;
|
|
@@ -104,22 +110,22 @@ export class InsertAndRetriangulateContext {
|
|
|
104
110
|
if (fractionC !== undefined) {
|
|
105
111
|
if (fractionC > 1.0) {
|
|
106
112
|
distanceC = xyz.distanceXY(nodeB);
|
|
107
|
-
if (distanceC < position.
|
|
113
|
+
if (distanceC < position.dTag) {
|
|
108
114
|
position.resetAsVertex(nodeB);
|
|
109
|
-
position.
|
|
115
|
+
position.dTag = distanceC;
|
|
110
116
|
}
|
|
111
117
|
}
|
|
112
118
|
else if (fractionC < 0.0) {
|
|
113
119
|
distanceC = xyz.distanceXY(nodeA);
|
|
114
|
-
if (distanceC < position.
|
|
120
|
+
if (distanceC < position.dTag) {
|
|
115
121
|
position.resetAsVertex(nodeA);
|
|
116
|
-
position.
|
|
122
|
+
position.dTag = distanceC;
|
|
117
123
|
}
|
|
118
124
|
}
|
|
119
125
|
else {
|
|
120
126
|
nodeA.fractionToPoint3d(fractionC, xyzC);
|
|
121
127
|
distanceC = xyz.distanceXY(xyzC);
|
|
122
|
-
if (distanceC < position.
|
|
128
|
+
if (distanceC < position.dTag) {
|
|
123
129
|
position.resetAtEdgeAndFraction(nodeA, fractionC);
|
|
124
130
|
}
|
|
125
131
|
}
|
|
@@ -130,13 +136,13 @@ export class InsertAndRetriangulateContext {
|
|
|
130
136
|
/** Linear search for the nearest graph vertex. */
|
|
131
137
|
searchForNearestVertex(xyz) {
|
|
132
138
|
const position = HalfEdgePositionDetail.create();
|
|
133
|
-
position.
|
|
139
|
+
position.dTag = Number.MAX_VALUE;
|
|
134
140
|
let distanceA;
|
|
135
141
|
for (const nodeA of this._graph.allHalfEdges) {
|
|
136
142
|
distanceA = xyz.distanceXY(nodeA);
|
|
137
|
-
if (distanceA < position.
|
|
143
|
+
if (distanceA < position.dTag) {
|
|
138
144
|
position.resetAsVertex(nodeA);
|
|
139
|
-
position.
|
|
145
|
+
position.dTag = distanceA;
|
|
140
146
|
}
|
|
141
147
|
}
|
|
142
148
|
return position;
|
|
@@ -154,7 +160,7 @@ export class InsertAndRetriangulateContext {
|
|
|
154
160
|
}
|
|
155
161
|
/** Reclassify the current interior face hit if it is too close to an edge of the face. */
|
|
156
162
|
reclassifyFaceHit(point) {
|
|
157
|
-
if (undefined === this._searcher.node || !this._searcher.isFace || this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR))
|
|
163
|
+
if (undefined === this._searcher.node || !this._searcher.isFace() || this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR))
|
|
158
164
|
return false;
|
|
159
165
|
const pointXY = Point3d.create(point.x, point.y);
|
|
160
166
|
const face = this._searcher.node.collectAroundFace((node) => {
|
|
@@ -176,7 +182,7 @@ export class InsertAndRetriangulateContext {
|
|
|
176
182
|
}
|
|
177
183
|
/** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */
|
|
178
184
|
reclassifyEdgeHit(point) {
|
|
179
|
-
if (undefined === this._searcher.node || !this._searcher.isEdge || this._searcher.node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE))
|
|
185
|
+
if (undefined === this._searcher.node || !this._searcher.isEdge() || this._searcher.node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE))
|
|
180
186
|
return false;
|
|
181
187
|
const pointXY = Point3d.create(point.x, point.y);
|
|
182
188
|
const superFace = [];
|
|
@@ -233,7 +239,7 @@ export class InsertAndRetriangulateContext {
|
|
|
233
239
|
// adjacent to the hull.
|
|
234
240
|
if (!this.reclassifyFaceHit(point))
|
|
235
241
|
this.reclassifyEdgeHit(point);
|
|
236
|
-
if (this._searcher.isFace) {
|
|
242
|
+
if (this._searcher.isFace()) {
|
|
237
243
|
// insert point into the graph if it lies in an interior face
|
|
238
244
|
if (!this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR)) {
|
|
239
245
|
const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);
|
|
@@ -242,7 +248,7 @@ export class InsertAndRetriangulateContext {
|
|
|
242
248
|
this._searcher.resetAsVertex(newNode);
|
|
243
249
|
}
|
|
244
250
|
}
|
|
245
|
-
else if (this._searcher.isEdge) {
|
|
251
|
+
else if (this._searcher.isEdge()) {
|
|
246
252
|
// insert point into the graph by splitting its containing edge
|
|
247
253
|
const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction);
|
|
248
254
|
const newB = newA.vertexPredecessor;
|
|
@@ -252,7 +258,7 @@ export class InsertAndRetriangulateContext {
|
|
|
252
258
|
Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);
|
|
253
259
|
this._searcher.resetAsVertex(newA);
|
|
254
260
|
}
|
|
255
|
-
else if (this._searcher.isVertex) {
|
|
261
|
+
else if (this._searcher.isVertex()) {
|
|
256
262
|
// no need to insert point as there's already a vertex there, but maybe update its z-coord
|
|
257
263
|
this.updateZAroundVertex(this._searcher.node, point, newZWins);
|
|
258
264
|
}
|
|
@@ -267,7 +273,7 @@ export class InsertAndRetriangulateContext {
|
|
|
267
273
|
*/
|
|
268
274
|
moveToPoint(movingPosition, target, announcer) {
|
|
269
275
|
const psc = PointSearchContext.create(this._tolerance);
|
|
270
|
-
movingPosition.
|
|
276
|
+
movingPosition.iTag = 0;
|
|
271
277
|
if (movingPosition.isUnclassified) {
|
|
272
278
|
moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, HalfEdgeMask.NULL_MASK);
|
|
273
279
|
if (movingPosition.isUnclassified)
|
|
@@ -275,16 +281,16 @@ export class InsertAndRetriangulateContext {
|
|
|
275
281
|
}
|
|
276
282
|
let trap = 0;
|
|
277
283
|
const ray = Ray3d.createXAxis();
|
|
278
|
-
for (; movingPosition.
|
|
284
|
+
for (; movingPosition.iTag === 0 && trap < 2;) {
|
|
279
285
|
if (announcer !== undefined) {
|
|
280
286
|
const continueSearch = announcer(movingPosition);
|
|
281
287
|
if (!continueSearch)
|
|
282
288
|
break;
|
|
283
289
|
}
|
|
284
|
-
if (!psc.setSearchRay(movingPosition, target, ray))
|
|
290
|
+
if (!psc.setSearchRay(movingPosition, target, ray))
|
|
285
291
|
return false;
|
|
286
|
-
|
|
287
|
-
|
|
292
|
+
assert(ray.a !== undefined, "expect defined by successful return of setSearchRay");
|
|
293
|
+
if (movingPosition.isFace()) {
|
|
288
294
|
const lastBefore = HalfEdgePositionDetail.create();
|
|
289
295
|
const firstAfter = HalfEdgePositionDetail.create();
|
|
290
296
|
const rc = psc.reAimAroundFace(movingPosition.node, ray, ray.a, lastBefore, firstAfter);
|
|
@@ -296,28 +302,28 @@ export class InsertAndRetriangulateContext {
|
|
|
296
302
|
}
|
|
297
303
|
case RayClassification.TargetOnVertex: {
|
|
298
304
|
movingPosition.setFrom(lastBefore);
|
|
299
|
-
movingPosition.
|
|
305
|
+
movingPosition.iTag = 1;
|
|
300
306
|
break;
|
|
301
307
|
}
|
|
302
308
|
case RayClassification.TargetOnEdge: {
|
|
303
309
|
movingPosition.setFrom(lastBefore);
|
|
304
|
-
movingPosition.
|
|
310
|
+
movingPosition.iTag = 1;
|
|
305
311
|
break;
|
|
306
312
|
}
|
|
307
313
|
case RayClassification.Bracket: {
|
|
308
314
|
movingPosition.resetAsFace(lastBefore.node, target);
|
|
309
|
-
movingPosition.
|
|
315
|
+
movingPosition.iTag = 1;
|
|
310
316
|
break;
|
|
311
317
|
}
|
|
312
318
|
case RayClassification.TargetBefore: { // do we ever get here?
|
|
313
319
|
movingPosition.resetAsFace(movingPosition.node, target);
|
|
314
|
-
movingPosition.
|
|
320
|
+
movingPosition.iTag = 1;
|
|
315
321
|
break;
|
|
316
322
|
}
|
|
317
323
|
case RayClassification.TargetAfter: {
|
|
318
324
|
if (movingPosition.node === lastBefore.node
|
|
319
|
-
&& movingPosition.isFace
|
|
320
|
-
&& (lastBefore.isEdge || lastBefore.isVertex)) {
|
|
325
|
+
&& movingPosition.isFace()
|
|
326
|
+
&& (lastBefore.isEdge() || lastBefore.isVertex())) {
|
|
321
327
|
trap++;
|
|
322
328
|
}
|
|
323
329
|
else {
|
|
@@ -328,30 +334,30 @@ export class InsertAndRetriangulateContext {
|
|
|
328
334
|
}
|
|
329
335
|
}
|
|
330
336
|
}
|
|
331
|
-
else if (movingPosition.isEdge) {
|
|
337
|
+
else if (movingPosition.isEdge()) {
|
|
332
338
|
psc.reAimFromEdge(movingPosition, ray, ray.a);
|
|
333
339
|
if (movingPosition.isUnclassified)
|
|
334
340
|
break;
|
|
335
341
|
}
|
|
336
|
-
else if (movingPosition.isVertex) {
|
|
342
|
+
else if (movingPosition.isVertex()) {
|
|
337
343
|
psc.reAimFromVertex(movingPosition, ray, ray.a);
|
|
338
344
|
if (movingPosition.isUnclassified)
|
|
339
345
|
break;
|
|
340
346
|
}
|
|
341
347
|
}
|
|
342
|
-
if (movingPosition.isAtXY(target.x, target.y))
|
|
348
|
+
if (movingPosition.isAtXY(target.x, target.y, this._tolerance))
|
|
343
349
|
return true;
|
|
344
350
|
if (trap > 1) {
|
|
345
|
-
//
|
|
351
|
+
// Ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.
|
|
346
352
|
// This happens only when the target point is exterior (heavy triangulation use cases start with a convex
|
|
347
|
-
// hull and only do interior intersections, so case only happens in contrived unit tests so far
|
|
348
|
-
// What to mark? Leave it as is, but mark as exterior target
|
|
353
|
+
// hull and only do interior intersections, so this case only happens in contrived unit tests so far).
|
|
354
|
+
// What to mark? Leave it as is, but mark as exterior target.
|
|
349
355
|
if (movingPosition.node !== undefined) {
|
|
350
356
|
movingPosition.setIsExteriorTarget(true);
|
|
351
357
|
}
|
|
352
358
|
return false;
|
|
353
359
|
}
|
|
354
|
-
|
|
360
|
+
assert(trap > 1, "Murky. Should never get here. Has never been hit in unit tests.");
|
|
355
361
|
return false;
|
|
356
362
|
}
|
|
357
363
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry, PolygonLocation } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { SmallSystem } from \"../numerics/SmallSystem\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\nimport { Triangulator } from \"./Triangulation\";\r\n\r\n/**\r\n * Options for setting the z-coordinate of a vertex in the triangulation when a point with the same xy is inserted.\r\n * @internal\r\n */\r\nexport enum InsertedVertexZOptions {\r\n /** The point's z-coordinate is ignored, and the existing vertex's z-coordinate is unchanged. */\r\n Ignore,\r\n /** The point's z-coordinate replaces the existing vertex's z-coordinate. */\r\n Replace,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is larger.\r\n */\r\n ReplaceIfLarger,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is smaller.\r\n */\r\n ReplaceIfSmaller,\r\n}\r\n\r\n/**\r\n * Context for repeated insertion of new points in a graph.\r\n * * Initial graph should have clean outer boundary (e.g., as typically marked with `HalfEdgeMask.EXTERIOR` and\r\n * `HalfEdgeMask.BOUNDARY_EDGE`).\r\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\r\n * can reuse that position as start for walking to the new point.\r\n * @internal\r\n */\r\nexport class InsertAndRetriangulateContext {\r\n private _graph: HalfEdgeGraph;\r\n private _edgeSet: MarkedEdgeSet;\r\n private _searcher: HalfEdgePositionDetail;\r\n private _tolerance: number;\r\n\r\n private constructor(graph: HalfEdgeGraph, tolerance: number) {\r\n this._graph = graph;\r\n this._edgeSet = MarkedEdgeSet.create(graph)!;\r\n this._searcher = HalfEdgePositionDetail.create();\r\n this._tolerance = tolerance;\r\n }\r\n /** Create a new context referencing the graph. */\r\n public static create(graph: HalfEdgeGraph, tolerance: number = Geometry.smallMetricDistance) {\r\n return new InsertAndRetriangulateContext(graph, tolerance);\r\n }\r\n /** Query the (pointer to) the graph in the context. */\r\n public get graph(): HalfEdgeGraph {\r\n return this._graph;\r\n }\r\n /**\r\n * Walk face from edgeNode. Insert new edges back to start node from all except immediate successor and predecessor.\r\n * Insert all new nodes and nodes of the existing face in edgeSet.\r\n */\r\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\r\n const numNode = centralNode.countEdgesAroundFace();\r\n if (numNode < 4 || centralNode.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return;\r\n this._edgeSet.addAroundFace(centralNode);\r\n const numEdge = numNode - 3;\r\n let farNode = centralNode.faceSuccessor;\r\n let nearNode = centralNode;\r\n for (let i = 0; i < numEdge; i++) {\r\n farNode = farNode.faceSuccessor;\r\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\r\n farNode = nearNode.faceSuccessor;\r\n this._edgeSet.addToSet(nearNode);\r\n }\r\n }\r\n /** Reset the \"current\" position to unknown state. */\r\n public reset() {\r\n this._searcher = HalfEdgePositionDetail.create();\r\n }\r\n /** Return a (reference to!) the current position in the graph. */\r\n public get currentPosition() {\r\n return this._searcher;\r\n }\r\n /** Linear search for the nearest graph edge or vertex. */\r\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n const xyzC = Point3d.create();\r\n let fractionC;\r\n let distanceC;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n const nodeB = nodeA.faceSuccessor;\r\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\r\n if (fractionC !== undefined) {\r\n if (fractionC > 1.0) {\r\n distanceC = xyz.distanceXY(nodeB);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeB);\r\n position.setDTag(distanceC);\r\n }\r\n } else if (fractionC < 0.0) {\r\n distanceC = xyz.distanceXY(nodeA);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceC);\r\n }\r\n } else {\r\n nodeA.fractionToPoint3d(fractionC, xyzC);\r\n\r\n distanceC = xyz.distanceXY(xyzC);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAtEdgeAndFraction(nodeA, fractionC);\r\n }\r\n }\r\n }\r\n }\r\n return position;\r\n }\r\n /** Linear search for the nearest graph vertex. */\r\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n let distanceA;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n distanceA = xyz.distanceXY(nodeA);\r\n if (distanceA < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceA);\r\n }\r\n }\r\n return position;\r\n }\r\n /**\r\n * Reset the \"current\" position to a vertex nearest the target point.\r\n * @param xyz target point\r\n * @param searchEdgesToo reset to nearest vertex or edge\r\n */\r\n public resetSearch(xyz: Point3d, searchEdgesToo: boolean): void {\r\n if (searchEdgesToo)\r\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\r\n else\r\n this._searcher = this.searchForNearestVertex(xyz);\r\n }\r\n /** Reclassify the current interior face hit if it is too close to an edge of the face. */\r\n private reclassifyFaceHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isFace || this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const face = this._searcher.node.collectAroundFace((node: HalfEdge) => {\r\n const xy = Point3d.create(node.x, node.y);\r\n (xy as any).node = node; // decorate the point with the node\r\n return xy;\r\n });\r\n const detail = PolygonOps.closestPointOnBoundary(face, pointXY, this._tolerance);\r\n assert(detail.code === PolygonLocation.OnPolygonEdgeInterior);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = face[detail.closestEdgeIndex].node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */\r\n private reclassifyEdgeHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isEdge || this._searcher.node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const superFace: Point3d[] = [];\r\n for (let n = this._searcher.node.faceSuccessor; n !== this._searcher.node; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the left face\r\n superFace.push(xy);\r\n }\r\n for (let n = this._searcher.node.vertexPredecessor; n !== this._searcher.node.edgeMate; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the right face\r\n superFace.push(xy);\r\n }\r\n const detail = PolygonOps.closestPointOnBoundary(superFace, pointXY, this._tolerance);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = (superFace[detail.closestEdgeIndex] as any).node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.code === PolygonLocation.OnPolygonVertex) // can happen if superFace is non-concave (e.g., a dart)\r\n this._searcher.resetAsVertex(vertex);\r\n else if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /**\r\n * Given a point that was just inserted into the graph at the given node, apply the z-coordinate rule around\r\n * the vertex loop.\r\n */\r\n private updateZAroundVertex(node: HalfEdge, point: Point3d, zOption: InsertedVertexZOptions): void {\r\n if (InsertedVertexZOptions.Ignore === zOption)\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfLarger === zOption) && (point.z <= node.z))\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfSmaller === zOption) && (point.z >= node.z))\r\n return;\r\n // only replace z; preserving xy preserves convexity of the hull\r\n node.setXYZAroundVertex(node.x, node.y, point.z);\r\n }\r\n /**\r\n * Insert a new point into the graph and retriangulate.\r\n * @param point the coordinates of the node to be inserted.\r\n * @param newZWins rule governing when `point.z` should override the z-coordinate of an existing vertex with the\r\n * same x and y.\r\n * @returns true if and only if the point didn't need to be inserted or was successfully inserted.\r\n */\r\n public insertAndRetriangulate(point: Point3d, newZWins: InsertedVertexZOptions): boolean {\r\n this.moveToPoint(this._searcher, point);\r\n if (this._searcher.node === undefined)\r\n return false;\r\n // Try to avoid skinny triangles. If we iterated, this could get out of control (e.g., inserting point into a fan).\r\n // Limiting to one reclassification ensures the hit doesn't move more than tol and reduces skinny triangles\r\n // adjacent to the hull.\r\n if (!this.reclassifyFaceHit(point))\r\n this.reclassifyEdgeHit(point);\r\n if (this._searcher.isFace) {\r\n // insert point into the graph if it lies in an interior face\r\n if (!this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);\r\n this.retriangulateFromBaseVertex(newNode);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newNode);\r\n }\r\n } else if (this._searcher.isEdge) {\r\n // insert point into the graph by splitting its containing edge\r\n const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction!);\r\n const newB = newA.vertexPredecessor;\r\n this.updateZAroundVertex(newA, point, InsertedVertexZOptions.Replace); // always replace\r\n this.retriangulateFromBaseVertex(newA);\r\n this.retriangulateFromBaseVertex(newB);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newA);\r\n } else if (this._searcher.isVertex) {\r\n // no need to insert point as there's already a vertex there, but maybe update its z-coord\r\n this.updateZAroundVertex(this._searcher.node, point, newZWins);\r\n }\r\n return true;\r\n }\r\n /**\r\n * Advance movingPosition to a face, edge, or vertex position detail that contains `target`.\r\n * @param movingPosition input seed for search, updated on return.\r\n * @param target point to search for containing topology in the graph.\r\n * @param announcer optional callback invoked during search loop; return false to end search.\r\n * @returns true if search was successful.\r\n */\r\n public moveToPoint(\r\n movingPosition: HalfEdgePositionDetail,\r\n target: Point3d,\r\n announcer?: (position: HalfEdgePositionDetail) => boolean,\r\n ): boolean {\r\n const psc = PointSearchContext.create(this._tolerance);\r\n movingPosition.setITag(0);\r\n if (movingPosition.isUnclassified) {\r\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, HalfEdgeMask.NULL_MASK);\r\n if (movingPosition.isUnclassified)\r\n return false;\r\n }\r\n let trap = 0;\r\n const ray = Ray3d.createXAxis();\r\n for (; movingPosition.getITag() === 0 && trap < 2;) {\r\n if (announcer !== undefined) {\r\n const continueSearch = announcer(movingPosition);\r\n if (!continueSearch)\r\n break;\r\n }\r\n if (!psc.setSearchRay(movingPosition, target, ray)) {\r\n return false;\r\n } else if (movingPosition.isFace) {\r\n const lastBefore = HalfEdgePositionDetail.create();\r\n const firstAfter = HalfEdgePositionDetail.create();\r\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\r\n // reAimAroundFace returns lots of cases in `lastBefore`\r\n switch (rc) {\r\n case RayClassification.NoHits: {\r\n movingPosition.resetAsUnknown();\r\n break;\r\n }\r\n case RayClassification.TargetOnVertex: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetOnEdge: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.Bracket: {\r\n movingPosition.resetAsFace(lastBefore.node, target);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetBefore: { // do we ever get here?\r\n movingPosition.resetAsFace(movingPosition.node, target);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetAfter: {\r\n if (movingPosition.node === lastBefore.node\r\n && movingPosition.isFace\r\n && (lastBefore.isEdge || lastBefore.isVertex)) {\r\n trap++;\r\n } else {\r\n trap = 0;\r\n }\r\n movingPosition.setFrom(lastBefore);\r\n break;\r\n }\r\n }\r\n } else if (movingPosition.isEdge) {\r\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n } else if (movingPosition.isVertex) {\r\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n }\r\n }\r\n if (movingPosition.isAtXY(target.x, target.y))\r\n return true;\r\n if (trap > 1) {\r\n // ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.\r\n // This happens only when the target point is exterior (heavy triangulation use cases start with a convex\r\n // hull and only do interior intersections, so case only happens in contrived unit tests so far\r\n // What to mark? Leave it as is, but mark as exterior target\r\n if (movingPosition.node !== undefined) {\r\n movingPosition.setIsExteriorTarget(true);\r\n }\r\n return false;\r\n }\r\n // murky here; should never be hit. Has never been hit in unit tests.\r\n return false;\r\n }\r\n}\r\n/** Set `position` to a random unmasked edge at the specified fraction. */\r\nfunction moveToAnyUnmaskedEdge(\r\n graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask,\r\n): boolean {\r\n for (const candidate of graph.allHalfEdges) {\r\n if (!candidate.isMaskSet(skipMask)) {\r\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry, PolygonLocation } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { SmallSystem } from \"../numerics/SmallSystem\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\nimport { Triangulator } from \"./Triangulation\";\r\n\r\n/**\r\n * Options for setting the z-coordinate of a vertex in the triangulation when a point with the same xy is inserted.\r\n * @internal\r\n */\r\nexport enum InsertedVertexZOptions {\r\n /** The point's z-coordinate is ignored, and the existing vertex's z-coordinate is unchanged. */\r\n Ignore,\r\n /** The point's z-coordinate replaces the existing vertex's z-coordinate. */\r\n Replace,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is larger.\r\n */\r\n ReplaceIfLarger,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is smaller.\r\n */\r\n ReplaceIfSmaller,\r\n}\r\n\r\n/**\r\n * Context for repeated insertion of new points in a graph.\r\n * * Initial graph should have clean outer boundary (e.g., as typically marked with `HalfEdgeMask.EXTERIOR` and\r\n * `HalfEdgeMask.BOUNDARY_EDGE`).\r\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\r\n * can reuse that position as start for walking to the new point.\r\n * @internal\r\n */\r\nexport class InsertAndRetriangulateContext {\r\n private _graph: HalfEdgeGraph;\r\n private _edgeSet: MarkedEdgeSet;\r\n private _searcher: HalfEdgePositionDetail;\r\n private _tolerance: number;\r\n\r\n /** Constructor. NOTE: graph is assumed to have a free mask available. */\r\n private constructor(graph: HalfEdgeGraph, tolerance: number) {\r\n this._graph = graph;\r\n const edgeSet = MarkedEdgeSet.create(graph);\r\n assert(edgeSet !== undefined, \"expect defined; the only caller ensures graph has free mask\");\r\n this._edgeSet = edgeSet;\r\n this._searcher = HalfEdgePositionDetail.create();\r\n this._tolerance = tolerance;\r\n }\r\n /**\r\n * Create a new context referencing the graph.\r\n * @return `undefined` if graph has no free mask available\r\n */\r\n public static create(graph: HalfEdgeGraph, tolerance: number = Geometry.smallMetricDistance): InsertAndRetriangulateContext | undefined {\r\n return graph.hasFreeMask ? new InsertAndRetriangulateContext(graph, tolerance) : undefined;\r\n }\r\n /** Query the (pointer to) the graph in the context. */\r\n public get graph(): HalfEdgeGraph {\r\n return this._graph;\r\n }\r\n /**\r\n * Walk face from edgeNode. Insert new edges back to start node from all except immediate successor and predecessor.\r\n * Insert all new nodes and nodes of the existing face in edgeSet.\r\n */\r\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\r\n const numNode = centralNode.countEdgesAroundFace();\r\n if (numNode < 4 || centralNode.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return;\r\n this._edgeSet.addAroundFace(centralNode);\r\n const numEdge = numNode - 3;\r\n let farNode = centralNode.faceSuccessor;\r\n let nearNode = centralNode;\r\n for (let i = 0; i < numEdge; i++) {\r\n farNode = farNode.faceSuccessor;\r\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\r\n farNode = nearNode.faceSuccessor;\r\n this._edgeSet.addToSet(nearNode);\r\n }\r\n }\r\n /** Reset the \"current\" position to unknown state. */\r\n public reset() {\r\n this._searcher = HalfEdgePositionDetail.create();\r\n }\r\n /** Return a (reference to!) the current position in the graph. */\r\n public get currentPosition() {\r\n return this._searcher;\r\n }\r\n /** Linear search for the nearest graph edge or vertex. */\r\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.dTag = Number.MAX_VALUE;\r\n const xyzC = Point3d.create();\r\n let fractionC;\r\n let distanceC;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n const nodeB = nodeA.faceSuccessor;\r\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\r\n if (fractionC !== undefined) {\r\n if (fractionC > 1.0) {\r\n distanceC = xyz.distanceXY(nodeB);\r\n if (distanceC < position.dTag) {\r\n position.resetAsVertex(nodeB);\r\n position.dTag = distanceC;\r\n }\r\n } else if (fractionC < 0.0) {\r\n distanceC = xyz.distanceXY(nodeA);\r\n if (distanceC < position.dTag) {\r\n position.resetAsVertex(nodeA);\r\n position.dTag = distanceC;\r\n }\r\n } else {\r\n nodeA.fractionToPoint3d(fractionC, xyzC);\r\n distanceC = xyz.distanceXY(xyzC);\r\n if (distanceC < position.dTag) {\r\n position.resetAtEdgeAndFraction(nodeA, fractionC);\r\n }\r\n }\r\n }\r\n }\r\n return position;\r\n }\r\n /** Linear search for the nearest graph vertex. */\r\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.dTag = Number.MAX_VALUE;\r\n let distanceA;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n distanceA = xyz.distanceXY(nodeA);\r\n if (distanceA < position.dTag) {\r\n position.resetAsVertex(nodeA);\r\n position.dTag = distanceA;\r\n }\r\n }\r\n return position;\r\n }\r\n /**\r\n * Reset the \"current\" position to a vertex nearest the target point.\r\n * @param xyz target point\r\n * @param searchEdgesToo reset to nearest vertex or edge\r\n */\r\n public resetSearch(xyz: Point3d, searchEdgesToo: boolean): void {\r\n if (searchEdgesToo)\r\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\r\n else\r\n this._searcher = this.searchForNearestVertex(xyz);\r\n }\r\n /** Reclassify the current interior face hit if it is too close to an edge of the face. */\r\n private reclassifyFaceHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isFace() || this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const face = this._searcher.node.collectAroundFace((node: HalfEdge) => {\r\n const xy = Point3d.create(node.x, node.y);\r\n (xy as any).node = node; // decorate the point with the node\r\n return xy;\r\n });\r\n const detail = PolygonOps.closestPointOnBoundary(face, pointXY, this._tolerance);\r\n assert(detail.code === PolygonLocation.OnPolygonEdgeInterior);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = face[detail.closestEdgeIndex].node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */\r\n private reclassifyEdgeHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isEdge() || this._searcher.node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const superFace: Point3d[] = [];\r\n for (let n = this._searcher.node.faceSuccessor; n !== this._searcher.node; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the left face\r\n superFace.push(xy);\r\n }\r\n for (let n = this._searcher.node.vertexPredecessor; n !== this._searcher.node.edgeMate; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the right face\r\n superFace.push(xy);\r\n }\r\n const detail = PolygonOps.closestPointOnBoundary(superFace, pointXY, this._tolerance);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = (superFace[detail.closestEdgeIndex] as any).node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.code === PolygonLocation.OnPolygonVertex) // can happen if superFace is non-concave (e.g., a dart)\r\n this._searcher.resetAsVertex(vertex);\r\n else if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /**\r\n * Given a point that was just inserted into the graph at the given node, apply the z-coordinate rule around\r\n * the vertex loop.\r\n */\r\n private updateZAroundVertex(node: HalfEdge, point: Point3d, zOption: InsertedVertexZOptions): void {\r\n if (InsertedVertexZOptions.Ignore === zOption)\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfLarger === zOption) && (point.z <= node.z))\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfSmaller === zOption) && (point.z >= node.z))\r\n return;\r\n // only replace z; preserving xy preserves convexity of the hull\r\n node.setXYZAroundVertex(node.x, node.y, point.z);\r\n }\r\n /**\r\n * Insert a new point into the graph and retriangulate.\r\n * @param point the coordinates of the node to be inserted.\r\n * @param newZWins rule governing when `point.z` should override the z-coordinate of an existing vertex with the\r\n * same x and y.\r\n * @returns true if and only if the point didn't need to be inserted or was successfully inserted.\r\n */\r\n public insertAndRetriangulate(point: Point3d, newZWins: InsertedVertexZOptions): boolean {\r\n this.moveToPoint(this._searcher, point);\r\n if (this._searcher.node === undefined)\r\n return false;\r\n // Try to avoid skinny triangles. If we iterated, this could get out of control (e.g., inserting point into a fan).\r\n // Limiting to one reclassification ensures the hit doesn't move more than tol and reduces skinny triangles\r\n // adjacent to the hull.\r\n if (!this.reclassifyFaceHit(point))\r\n this.reclassifyEdgeHit(point);\r\n if (this._searcher.isFace()) {\r\n // insert point into the graph if it lies in an interior face\r\n if (!this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);\r\n this.retriangulateFromBaseVertex(newNode);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newNode);\r\n }\r\n } else if (this._searcher.isEdge()) {\r\n // insert point into the graph by splitting its containing edge\r\n const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction);\r\n const newB = newA.vertexPredecessor;\r\n this.updateZAroundVertex(newA, point, InsertedVertexZOptions.Replace); // always replace\r\n this.retriangulateFromBaseVertex(newA);\r\n this.retriangulateFromBaseVertex(newB);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newA);\r\n } else if (this._searcher.isVertex()) {\r\n // no need to insert point as there's already a vertex there, but maybe update its z-coord\r\n this.updateZAroundVertex(this._searcher.node, point, newZWins);\r\n }\r\n return true;\r\n }\r\n /**\r\n * Advance movingPosition to a face, edge, or vertex position detail that contains `target`.\r\n * @param movingPosition input seed for search, updated on return.\r\n * @param target point to search for containing topology in the graph.\r\n * @param announcer optional callback invoked during search loop; return false to end search.\r\n * @returns true if search was successful.\r\n */\r\n public moveToPoint(\r\n movingPosition: HalfEdgePositionDetail,\r\n target: Point3d,\r\n announcer?: (position: HalfEdgePositionDetail) => boolean,\r\n ): boolean {\r\n const psc = PointSearchContext.create(this._tolerance);\r\n movingPosition.iTag = 0;\r\n if (movingPosition.isUnclassified) {\r\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, HalfEdgeMask.NULL_MASK);\r\n if (movingPosition.isUnclassified)\r\n return false;\r\n }\r\n let trap = 0;\r\n const ray = Ray3d.createXAxis();\r\n for (; movingPosition.iTag === 0 && trap < 2;) {\r\n if (announcer !== undefined) {\r\n const continueSearch = announcer(movingPosition);\r\n if (!continueSearch)\r\n break;\r\n }\r\n if (!psc.setSearchRay(movingPosition, target, ray))\r\n return false;\r\n assert(ray.a !== undefined, \"expect defined by successful return of setSearchRay\");\r\n if (movingPosition.isFace()) {\r\n const lastBefore = HalfEdgePositionDetail.create();\r\n const firstAfter = HalfEdgePositionDetail.create();\r\n const rc = psc.reAimAroundFace(movingPosition.node, ray, ray.a, lastBefore, firstAfter);\r\n // reAimAroundFace returns lots of cases in `lastBefore`\r\n switch (rc) {\r\n case RayClassification.NoHits: {\r\n movingPosition.resetAsUnknown();\r\n break;\r\n }\r\n case RayClassification.TargetOnVertex: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.iTag = 1;\r\n break;\r\n }\r\n case RayClassification.TargetOnEdge: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.iTag = 1;\r\n break;\r\n }\r\n case RayClassification.Bracket: {\r\n movingPosition.resetAsFace(lastBefore.node, target);\r\n movingPosition.iTag = 1;\r\n break;\r\n }\r\n case RayClassification.TargetBefore: { // do we ever get here?\r\n movingPosition.resetAsFace(movingPosition.node, target);\r\n movingPosition.iTag = 1;\r\n break;\r\n }\r\n case RayClassification.TargetAfter: {\r\n if (movingPosition.node === lastBefore.node\r\n && movingPosition.isFace()\r\n && (lastBefore.isEdge() || lastBefore.isVertex())) {\r\n trap++;\r\n } else {\r\n trap = 0;\r\n }\r\n movingPosition.setFrom(lastBefore);\r\n break;\r\n }\r\n }\r\n } else if (movingPosition.isEdge()) {\r\n psc.reAimFromEdge(movingPosition, ray, ray.a);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n } else if (movingPosition.isVertex()) {\r\n psc.reAimFromVertex(movingPosition, ray, ray.a);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n }\r\n }\r\n if (movingPosition.isAtXY(target.x, target.y, this._tolerance))\r\n return true;\r\n if (trap > 1) {\r\n // Ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.\r\n // This happens only when the target point is exterior (heavy triangulation use cases start with a convex\r\n // hull and only do interior intersections, so this case only happens in contrived unit tests so far).\r\n // What to mark? Leave it as is, but mark as exterior target.\r\n if (movingPosition.node !== undefined) {\r\n movingPosition.setIsExteriorTarget(true);\r\n }\r\n return false;\r\n }\r\n assert(trap > 1, \"Murky. Should never get here. Has never been hit in unit tests.\");\r\n return false;\r\n }\r\n}\r\n/** Set `position` to a random unmasked edge at the specified fraction. */\r\nfunction moveToAnyUnmaskedEdge(\r\n graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask,\r\n): boolean {\r\n for (const candidate of graph.allHalfEdges) {\r\n if (!candidate.isMaskSet(skipMask)) {\r\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module Topology
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* Methods to "grab and drop" mask bits.
|
|
5
|
+
* Methods to "grab and drop" mask bits from a 32-bit field.
|
|
6
6
|
* * Caller code (e.g. HalfEdgeGraph) initializes with a block of bits to be managed.
|
|
7
7
|
* * Callers borrow and return masks with "grabMask" and "dropMask".
|
|
8
8
|
* * Callers must exercise grab/drop balance discipline.
|
|
@@ -20,13 +20,17 @@ export declare class MaskManager {
|
|
|
20
20
|
private constructor();
|
|
21
21
|
/**
|
|
22
22
|
* Create a MaskManager.
|
|
23
|
-
* Typical use: MaskManager.create(
|
|
24
|
-
* * This makes bits
|
|
23
|
+
* Typical use: MaskManager.create(0xFFF00000)
|
|
24
|
+
* * This makes bits 20 through 31 available to be borrowed, with lower bits reserved for fixed usage.
|
|
25
|
+
* @param freeMasks mask with bits set to be available for grab/drop.
|
|
26
|
+
* @returns undefined if `freeMasks` has none of the bits [0,31] set.
|
|
25
27
|
*/
|
|
26
28
|
static create(freeMasks: number): MaskManager | undefined;
|
|
27
29
|
/** Find a mask bit that is not "in use" in order to borrow that mask. */
|
|
28
30
|
grabMask(): number;
|
|
29
31
|
/** Return the borrowed mask so it is not "in use" anymore. */
|
|
30
32
|
dropMask(mask: number): void;
|
|
33
|
+
/** Whether there is a mask bit still available to grab. */
|
|
34
|
+
get hasFreeMask(): boolean;
|
|
31
35
|
}
|
|
32
36
|
//# sourceMappingURL=MaskManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaskManager.d.ts","sourceRoot":"","sources":["../../../src/topology/MaskManager.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B;;;;OAIG;IACH,OAAO;IAKP
|
|
1
|
+
{"version":3,"file":"MaskManager.d.ts","sourceRoot":"","sources":["../../../src/topology/MaskManager.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B;;;;OAIG;IACH,OAAO;IAKP;;;;;;OAMG;WACW,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAehE,yEAAyE;IAClE,QAAQ,IAAI,MAAM;IASzB,8DAA8D;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM;IAI5B,2DAA2D;IAC3D,IAAW,WAAW,IAAI,OAAO,CAEhC;CACF"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @module Topology
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
|
-
* Methods to "grab and drop" mask bits.
|
|
9
|
+
* Methods to "grab and drop" mask bits from a 32-bit field.
|
|
10
10
|
* * Caller code (e.g. HalfEdgeGraph) initializes with a block of bits to be managed.
|
|
11
11
|
* * Callers borrow and return masks with "grabMask" and "dropMask".
|
|
12
12
|
* * Callers must exercise grab/drop balance discipline.
|
|
@@ -28,8 +28,10 @@ export class MaskManager {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Create a MaskManager.
|
|
31
|
-
* Typical use: MaskManager.create(
|
|
32
|
-
* * This makes bits
|
|
31
|
+
* Typical use: MaskManager.create(0xFFF00000)
|
|
32
|
+
* * This makes bits 20 through 31 available to be borrowed, with lower bits reserved for fixed usage.
|
|
33
|
+
* @param freeMasks mask with bits set to be available for grab/drop.
|
|
34
|
+
* @returns undefined if `freeMasks` has none of the bits [0,31] set.
|
|
33
35
|
*/
|
|
34
36
|
static create(freeMasks) {
|
|
35
37
|
// look for first bit up to bit 31
|
|
@@ -48,7 +50,7 @@ export class MaskManager {
|
|
|
48
50
|
}
|
|
49
51
|
/** Find a mask bit that is not "in use" in order to borrow that mask. */
|
|
50
52
|
grabMask() {
|
|
51
|
-
if (this.
|
|
53
|
+
if (!this.hasFreeMask)
|
|
52
54
|
return 0;
|
|
53
55
|
let mask = this._firstFreeMask;
|
|
54
56
|
while (!(mask & this._freeMasks))
|
|
@@ -61,5 +63,9 @@ export class MaskManager {
|
|
|
61
63
|
mask &= this._originalFreeMasks; // prevent "drop" of mask that is not in the pool.
|
|
62
64
|
this._freeMasks |= mask;
|
|
63
65
|
}
|
|
66
|
+
/** Whether there is a mask bit still available to grab. */
|
|
67
|
+
get hasFreeMask() {
|
|
68
|
+
return this._freeMasks !== 0;
|
|
69
|
+
}
|
|
64
70
|
}
|
|
65
71
|
//# sourceMappingURL=MaskManager.js.map
|