@itwin/core-geometry 4.2.0-dev.9 → 4.3.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -1
- package/lib/cjs/Geometry.d.ts +4 -4
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +2 -2
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.d.ts +4 -3
- package/lib/cjs/clipping/AlternatingConvexClipTree.d.ts.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.d.ts +4 -3
- package/lib/cjs/clipping/BooleanClipNode.d.ts.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.d.ts +2 -1
- package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.d.ts +17 -11
- package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +14 -8
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.d.ts +6 -5
- package/lib/cjs/clipping/ClipVector.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipVector.js +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +3 -2
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/core-geometry.d.ts +1 -3
- package/lib/cjs/core-geometry.d.ts.map +1 -1
- package/lib/cjs/core-geometry.js +1 -3
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +4 -4
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +93 -91
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +171 -152
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +19 -19
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +20 -22
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.d.ts +47 -30
- package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurve.js +81 -46
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.d.ts +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +17 -5
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +14 -2
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.d.ts +1 -1
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +1 -2
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +2 -2
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.d.ts +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/{CurveChain.d.ts → CurveTypes.d.ts} +6 -6
- package/lib/cjs/curve/CurveTypes.d.ts.map +1 -0
- package/lib/cjs/curve/{CurveChain.js → CurveTypes.js} +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -0
- package/lib/cjs/curve/CurveWireMomentsXYZ.d.ts +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.d.ts +3 -3
- package/lib/cjs/curve/ParityRegion.d.ts.map +1 -1
- package/lib/cjs/curve/ParityRegion.js +2 -2
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts +3 -2
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +2 -2
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.d.ts +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.d.ts +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.d.ts +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.d.ts +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +54 -5
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +154 -3
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.d.ts +20 -11
- package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js +22 -11
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.d.ts +3 -3
- package/lib/cjs/curve/UnionRegion.d.ts.map +1 -1
- package/lib/cjs/curve/UnionRegion.js +2 -2
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +2 -2
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +233 -0
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -0
- package/lib/cjs/curve/{CurveCurveCloseApproachXY.js → internalContexts/CurveCurveCloseApproachXY.js} +299 -202
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -0
- package/lib/{esm/curve → cjs/curve/internalContexts}/CurveCurveIntersectXY.d.ts +45 -51
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -0
- package/lib/cjs/curve/{CurveCurveIntersectXY.js → internalContexts/CurveCurveIntersectXY.js} +104 -115
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -0
- package/lib/cjs/curve/{CurveCurveIntersectXYZ.d.ts → internalContexts/CurveCurveIntersectXYZ.d.ts} +18 -18
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -0
- package/lib/cjs/curve/{CurveCurveIntersectXYZ.js → internalContexts/CurveCurveIntersectXYZ.js} +134 -108
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -0
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.d.ts +2 -2
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js +9 -5
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.d.ts +1 -0
- package/lib/cjs/geometry3d/BarycentricTriangle.d.ts.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js +1 -0
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts +28 -11
- package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +57 -45
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.d.ts +15 -26
- package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js +23 -32
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +0 -8
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +0 -16
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +4 -4
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +12 -0
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +3 -6
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -2
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +0 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +2 -2
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +2 -3
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +1 -1
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js +1 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts +3 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js +4 -3
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.d.ts +2 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.d.ts.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.d.ts +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Transform.js +4 -6
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/geometry4d/Map4d.d.ts +14 -8
- package/lib/cjs/geometry4d/Map4d.d.ts.map +1 -1
- package/lib/cjs/geometry4d/Map4d.js +38 -16
- package/lib/cjs/geometry4d/Map4d.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js +4 -2
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/geometry4d/Point4d.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.d.ts +2 -2
- package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
- package/lib/cjs/numerics/Polynomials.js +2 -2
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +18 -6
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +55 -25
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.d.ts +16 -7
- package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js +38 -7
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.d.ts +5 -39
- package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js +7 -41
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +10 -8
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +64 -18
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts +6 -0
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js +68 -2
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.d.ts +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.d.ts +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.d.ts +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SweepContour.d.ts +35 -26
- package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
- package/lib/cjs/solid/SweepContour.js +84 -100
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +29 -11
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +45 -26
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.d.ts +2 -2
- package/lib/cjs/topology/HalfEdgeMarkSet.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js +4 -4
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/Merging.d.ts +3 -0
- package/lib/cjs/topology/Merging.d.ts.map +1 -1
- package/lib/cjs/topology/Merging.js +19 -5
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/Triangulation.d.ts +15 -7
- package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
- package/lib/cjs/topology/Triangulation.js +89 -47
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/esm/Geometry.d.ts +4 -4
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +2 -2
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.d.ts +4 -3
- package/lib/esm/clipping/AlternatingConvexClipTree.d.ts.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.d.ts +4 -3
- package/lib/esm/clipping/BooleanClipNode.d.ts.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.d.ts +2 -1
- package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.d.ts +17 -11
- package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +14 -8
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.d.ts +6 -5
- package/lib/esm/clipping/ClipVector.d.ts.map +1 -1
- package/lib/esm/clipping/ClipVector.js +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +3 -2
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/core-geometry.d.ts +1 -3
- package/lib/esm/core-geometry.d.ts.map +1 -1
- package/lib/esm/core-geometry.js +1 -3
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +4 -4
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +93 -91
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +171 -152
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +19 -19
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +19 -20
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.d.ts +47 -30
- package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurve.js +81 -46
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts +1 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +17 -5
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +12 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.d.ts +1 -1
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +1 -2
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +2 -2
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.d.ts +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/{CurveChain.d.ts → CurveTypes.d.ts} +6 -6
- package/lib/esm/curve/CurveTypes.d.ts.map +1 -0
- package/lib/esm/curve/{CurveChain.js → CurveTypes.js} +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -0
- package/lib/esm/curve/CurveWireMomentsXYZ.d.ts +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/ParityRegion.d.ts +3 -3
- package/lib/esm/curve/ParityRegion.d.ts.map +1 -1
- package/lib/esm/curve/ParityRegion.js +2 -2
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts +3 -2
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.d.ts +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.d.ts +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.d.ts +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.d.ts +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +54 -5
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +153 -3
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.d.ts +20 -11
- package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/esm/curve/StrokeOptions.js +22 -11
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.d.ts +3 -3
- package/lib/esm/curve/UnionRegion.d.ts.map +1 -1
- package/lib/esm/curve/UnionRegion.js +2 -2
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +2 -2
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +233 -0
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -0
- package/lib/esm/curve/{CurveCurveCloseApproachXY.js → internalContexts/CurveCurveCloseApproachXY.js} +299 -202
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -0
- package/lib/{cjs/curve → esm/curve/internalContexts}/CurveCurveIntersectXY.d.ts +45 -51
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -0
- package/lib/esm/curve/{CurveCurveIntersectXY.js → internalContexts/CurveCurveIntersectXY.js} +103 -113
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -0
- package/lib/esm/curve/{CurveCurveIntersectXYZ.d.ts → internalContexts/CurveCurveIntersectXYZ.d.ts} +18 -18
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -0
- package/lib/esm/curve/{CurveCurveIntersectXYZ.js → internalContexts/CurveCurveIntersectXYZ.js} +134 -108
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -0
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.d.ts +2 -2
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js +9 -5
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.d.ts +1 -0
- package/lib/esm/geometry3d/BarycentricTriangle.d.ts.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js +1 -0
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts +28 -11
- package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +57 -45
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.d.ts +15 -26
- package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js +23 -32
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +0 -8
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +0 -16
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +4 -4
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +12 -0
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +3 -6
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -2
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +0 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +2 -2
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +2 -3
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +1 -1
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js +1 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts +3 -1
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js +4 -3
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.d.ts +2 -1
- package/lib/esm/geometry3d/ReusableObjectCache.d.ts.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.d.ts +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
- package/lib/esm/geometry3d/Transform.js +4 -6
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/geometry4d/Map4d.d.ts +14 -8
- package/lib/esm/geometry4d/Map4d.d.ts.map +1 -1
- package/lib/esm/geometry4d/Map4d.js +38 -16
- package/lib/esm/geometry4d/Map4d.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js +4 -2
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/geometry4d/Point4d.js.map +1 -1
- package/lib/esm/numerics/Polynomials.d.ts +2 -2
- package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
- package/lib/esm/numerics/Polynomials.js +2 -2
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +18 -6
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +55 -25
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.d.ts +16 -7
- package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js +38 -7
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.d.ts +5 -39
- package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js +7 -41
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +10 -8
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +64 -18
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.d.ts +6 -0
- package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js +68 -2
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/solid/LinearSweep.d.ts +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.d.ts +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.d.ts +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SweepContour.d.ts +35 -26
- package/lib/esm/solid/SweepContour.d.ts.map +1 -1
- package/lib/esm/solid/SweepContour.js +84 -100
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +29 -11
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +45 -26
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.d.ts +2 -2
- package/lib/esm/topology/HalfEdgeMarkSet.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js +2 -2
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/Merging.d.ts +3 -0
- package/lib/esm/topology/Merging.d.ts.map +1 -1
- package/lib/esm/topology/Merging.js +19 -5
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/Triangulation.d.ts +15 -7
- package/lib/esm/topology/Triangulation.d.ts.map +1 -1
- package/lib/esm/topology/Triangulation.js +89 -47
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/package.json +4 -4
- package/lib/cjs/curve/CurveChain.d.ts.map +0 -1
- package/lib/cjs/curve/CurveChain.js.map +0 -1
- package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts +0 -175
- package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts.map +0 -1
- package/lib/cjs/curve/CurveCurveCloseApproachXY.js.map +0 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +0 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.js.map +0 -1
- package/lib/cjs/curve/CurveCurveIntersectXYZ.d.ts.map +0 -1
- package/lib/cjs/curve/CurveCurveIntersectXYZ.js.map +0 -1
- package/lib/esm/curve/CurveChain.d.ts.map +0 -1
- package/lib/esm/curve/CurveChain.js.map +0 -1
- package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts +0 -175
- package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts.map +0 -1
- package/lib/esm/curve/CurveCurveCloseApproachXY.js.map +0 -1
- package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +0 -1
- package/lib/esm/curve/CurveCurveIntersectXY.js.map +0 -1
- package/lib/esm/curve/CurveCurveIntersectXYZ.d.ts.map +0 -1
- package/lib/esm/curve/CurveCurveIntersectXYZ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Graph.js","sourceRoot":"","sources":["../../../src/topology/Graph.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\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { Point2d, Vector2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XAndY, XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { MaskManager } from \"./MaskManager\";\r\n// import { GraphChecker } from \"../test/topology/Graph.test\";\r\n/* eslint-disable @typescript-eslint/no-this-alias */\r\n// cspell:word CONSTU\r\n// cspell:word CONSTV\r\n// cspell:word USEAM\r\n// cspell:word VSEAM\r\n/**\r\n * * Each node of the graph has a mask member.\r\n * * The mask member is a number which is used as set of single bit boolean values.\r\n * * Particular meanings of the various bits are HIGHLY application dependent.\r\n * * The EXTERIOR mask bit is widely used to mark nodes that are \"outside\" the active areas\r\n * * The PRIMARY_EDGE bit is widely used to indicate linework created directly from input data, hence protected from triangle edge flipping.\r\n * * The BOUNDARY bit is widely used to indicate that crossing this edge is a transition from outside to inside.\r\n * * VISITED is used locally in many searches.\r\n * * Never use VISITED unless the search logic is highly self contained.\r\n * @internal\r\n */\r\nexport enum HalfEdgeMask {\r\n /** Mask commonly set consistently around exterior faces.\r\n * * A boundary edge with interior to one side, exterior to the other will have EXTERIOR only on the outside.\r\n * * An an edge inserted \"within a purely exterior face\" can have EXTERIOR on both sides.\r\n * * An interior edge (such as added during triangulation) will have no EXTERIOR bits.\r\n */\r\n EXTERIOR = 0x00000001,\r\n /** Mask commonly set (on both sides) of original geometry edges that are transition from outside from to inside.\r\n * * At the moment of creating an edge from primary user boundary loop coordinates, the fact that an edge is BOUNDARY is often clear even though\r\n * there is uncertainty about which side should be EXTERIOR.\r\n */\r\n BOUNDARY_EDGE = 0x00000002,\r\n // REMARK: Various mask names are COMMENTED here for reference to native legacy code.\r\n // CONSTU_MASK = 0x00000004,\r\n // CONSTV_MASK = 0x00000008,\r\n // USEAM_MASK = 0x00000010,\r\n // VSEAM_MASK = 0x00000020,\r\n // BOUNDARY_VERTEX_MASK = 0x00000040,\r\n // PRIMARY_VERTEX_MASK = 0x00000080,\r\n // DIRECTED_EDGE_MASK = 0x00000100,\r\n /** Mask commonly set (on both sides) of original geometry edges, but NOT indicating that the edge is certainly a boundary between outside and inside.\r\n * * For instance, if geometry is provided as stray sticks (not loops), it can be marked PRIMARY_EDGE but neither BOUNDARY_EDGE nor EXTERIOR_EDGE\r\n */\r\n PRIMARY_EDGE = 0x00000004,\r\n\r\n /** Mask used for low level searches to identify previously-visited nodes */\r\n VISITED = 0x0000010,\r\n\r\n /** Mask applied to triangles by earcut triangulator */\r\n TRIANGULATED_FACE = 0x00000100,\r\n /** mask applied in a face with 2 edges. */\r\n NULL_FACE = 0x00000200,\r\n\r\n /** no mask bits */\r\n NULL_MASK = 0x00000000,\r\n /** The \"upper 12 \" bits of 32 bit integer. */\r\n ALL_GRAB_DROP_MASKS = 0xffF00000, // 12 masks reserved for grab/drop.\r\n /** all mask bits */\r\n ALL_MASK = 0xFFFFFFFF,\r\n // informal convention on preassigned mask bit numbers:\r\n // byte0 (EXTERIOR, BOUNDARY_EDGE, PRIMARY_EDGE) -- edge properties\r\n // byte1 (VISITED, VISIT_A, WORK_MASK0, WORK_MASK1) -- temp masks for algorithms.\r\n // byte2 (TRIANGULATED_FACE, NULL_FACE) -- face properties.\r\n\r\n}\r\n\r\n/** function signature for function of one node with no return type restrictions\r\n * @internal\r\n */\r\nexport type NodeFunction = (node: HalfEdge) => any;\r\n/** function signature for function of one node, returning a number\r\n * @internal\r\n */\r\nexport type NodeToNumberFunction = (node: HalfEdge) => number;\r\n/** function signature for function of one node, returning a boolean\r\n * @internal\r\n */\r\nexport type HalfEdgeToBooleanFunction = (node: HalfEdge) => boolean;\r\n/** function signature for function of a node and a mask, returning a number\r\n * @internal\r\n */\r\nexport type HalfEdgeAndMaskToBooleanFunction = (node: HalfEdge, mask: HalfEdgeMask) => boolean;\r\n/** function signature for function of a graph and a node, returning a boolean\r\n * @internal\r\n */\r\nexport type GraphNodeFunction = (graph: HalfEdgeGraph, node: HalfEdge) => boolean;\r\n/** Non-topological data members in a half edge.\r\n * These are not part of adjacency and masking logic.\r\n*/\r\n/** member fields for a half edge (which is also commonly called a node)\r\n * @internal\r\n */\r\nexport interface HalfEdgeUserData {\r\n /** Vertex x coordinate */\r\n x: number;\r\n /** Vertex y coordinate */\r\n y: number;\r\n /** Vertex z coordinate */\r\n z: number;\r\n /** angle used for sort-around-vertex */\r\n sortAngle?: number; // used in sorting around vertex.\r\n /** numeric value for application-specific tagging (e.g. sorting) */\r\n sortData?: number;\r\n /** application-specific data for the edge identifier.\r\n * * edge split operations are expected to copy this to new sub-edges.\r\n */\r\n edgeTag?: any;\r\n /** application-specific data for the face loop\r\n * * edge split operations are expected to copy this to new sub-edges.\r\n */\r\n faceTag?: any;\r\n}\r\n/**\r\n *\r\n * * A HalfEdge is \"one side of an edge\" in a structure of faces, edges and vertices. From a node there are navigational links to:\r\n * ** \"faceSuccessor\" -- the next half edge in a loop around a face.\r\n * ** \"facePredecessor\" -- the previous half edge in a loop around a face.\r\n * ** \"edgeMate\" -- the node's partner on the other side of the edge.\r\n * * The next, prev, and mate are the essential connectivity. Additional node content is for application-specific\r\n * uses. The most useful ones are:\r\n * ** x,y -- coordinates in the xy plane\r\n * ** z -- z coordinate. This is normally ignored during planar setup, but used for output.\r\n * ** buffer -- a integer value manipulated as individual bits.\r\n * * In properly connected planar graph, interior face loops are counterclockwise. But that property (along with\r\n * expected masking) is a result of extensive validation of inputs, and is not true in intermediate phases\r\n * of graph manipulation.\r\n * @internal\r\n */\r\nexport class HalfEdge implements HalfEdgeUserData {\r\n /** Vertex index in some parent object's numbering. */\r\n public i: number;\r\n /** bitmask bits, used to mark nodes as part of a triangle(idx 0) or visited when flipping(idx 1) */\r\n public maskBits: number;\r\n /** Vertex x coordinate */\r\n public x: number;\r\n /** Vertex y coordinate */\r\n public y: number;\r\n /** Vertex z coordinate */\r\n public z: number;\r\n /** angle used for sort-around-vertex */\r\n public sortAngle?: number; // used in sorting around vertex.\r\n /** numeric value for application-specific tagging (e.g. sorting) */\r\n public sortData?: number;\r\n /** application-specific data for the edge identifier.\r\n * * edge split operations are expected to copy this to new sub-edges.\r\n */\r\n public edgeTag?: any;\r\n /** application-specific data for the face loop\r\n * * edge split operations are expected to copy this to new sub-edges.\r\n */\r\n public faceTag?: any;\r\n private _id: any; // immutable id useful for debugging.\r\n /** id assigned sequentially during construction --- useful for debugging. */\r\n public get id() { return this._id; }\r\n private _facePredecessor: HalfEdge;\r\n private _faceSuccessor: HalfEdge;\r\n private _edgeMate: HalfEdge;\r\n /** previous half edge \"around the face\"\r\n */\r\n public get facePredecessor(): HalfEdge { return this._facePredecessor; }\r\n /** next half edge \"around the face\" */\r\n public get faceSuccessor(): HalfEdge { return this._faceSuccessor; }\r\n /** Half edge on the other side of this edge.\r\n */\r\n public get edgeMate(): HalfEdge { return this._edgeMate; }\r\n /** Take numStep face steps and return y coordinate\r\n * * positive steps are through faceSuccessor\r\n * * negative steps are through facePredecessor\r\n */\r\n public faceStepY(numStep: number): number {\r\n let node: HalfEdge = this;\r\n if (numStep > 0)\r\n for (let i = 0; i < numStep; i++) node = node.faceSuccessor;\r\n else if (numStep < 0)\r\n for (let i = 0; i > numStep; i--) node = node.facePredecessor;\r\n return node.y;\r\n }\r\n /**\r\n * * Create 2 half edges.\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * @returns Returns the reference to the first half edge created\r\n */\r\n public static createHalfEdgePair(heArray: HalfEdge[] | undefined): HalfEdge {\r\n const a = new HalfEdge();\r\n const b = new HalfEdge();\r\n if (heArray) {\r\n heArray.push(a);\r\n heArray.push(b);\r\n }\r\n\r\n HalfEdge.setFaceLinks(a, b);\r\n HalfEdge.setFaceLinks(b, a);\r\n HalfEdge.setEdgeMates(a, b);\r\n return a;\r\n }\r\n\r\n /**\r\n * * Create 2 half edges.\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * * Properties x,y,z,i are inserted in each\r\n * @returns Returns the reference to the first half edge created\r\n */\r\n public static createHalfEdgePairWithCoordinates(\r\n xA: number = 0,\r\n yA: number = 0,\r\n zA: number = 0,\r\n iA: number = 0,\r\n xB: number = 0,\r\n yB: number = 0,\r\n zB: number = 0,\r\n iB: number = 0,\r\n heArray: HalfEdge[] | undefined): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePair(heArray);\r\n const b = a._edgeMate;\r\n a.x = xA; a.y = yA; a.z = zA; a.i = iA;\r\n b.x = xB; b.y = yB; b.z = zB; b.i = iB;\r\n return a;\r\n }\r\n /**\r\n * * set heA <==> heB pointer relation through heA._faceSuccessor and heB._facePredecessor\r\n * * This changes heA._faceSuccessor and heB._facePredecessor, but not heA._facePredecessor and heB._faceSuccessor.\r\n * * this must always be done with another call to reestablish the entire double-linked list.\r\n */\r\n private static setFaceLinks(heA: HalfEdge, heB: HalfEdge) {\r\n heA._faceSuccessor = heB;\r\n heB._facePredecessor = heA;\r\n }\r\n /**\r\n * * set heA <==> heB pointer relation edgeMate\r\n */\r\n private static setEdgeMates(heA: HalfEdge, heB: HalfEdge) {\r\n heA._edgeMate = heB;\r\n heB._edgeMate = heA;\r\n }\r\n\r\n /**\r\n * * Create a new vertex within the edge from base.\r\n * * Insert it \"within\" the base edge.\r\n * * This requires two new half edges.\r\n * * if the base is undefined, create a single-edge loop.\r\n * * This (unlike pinch) breaks the edgeMate pairing of the base edge.\r\n * * This preserves xyz and i properties at all existing vertices.\r\n * * on each side, if edgeTag is present it is copied to the new edge.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public static splitEdge(baseA: undefined | HalfEdge,\r\n xA: number = 0, yA: number = 0, zA: number = 0, iA: number = 0, heArray: HalfEdge[] | undefined): HalfEdge {\r\n const newA = new HalfEdge(xA, yA, zA, iA);\r\n const newB = new HalfEdge(xA, yA, zA, iA);\r\n if (heArray) {\r\n heArray.push(newA);\r\n heArray.push(newB);\r\n }\r\n\r\n if (baseA === undefined) {\r\n newA._faceSuccessor = newA._facePredecessor = newA;\r\n newB._faceSuccessor = newB._facePredecessor = newB;\r\n HalfEdge.setEdgeMates(newA, newB);\r\n } else {\r\n const nextA = baseA._faceSuccessor;\r\n const mateA = baseA._edgeMate;\r\n const vPredA = mateA._faceSuccessor;\r\n HalfEdge.setFaceLinks(newA, nextA);\r\n HalfEdge.setFaceLinks(baseA, newA);\r\n HalfEdge.setFaceLinks(mateA, newB);\r\n HalfEdge.setFaceLinks(newB, vPredA);\r\n HalfEdge.setEdgeMates(newA, mateA);\r\n HalfEdge.setEdgeMates(newB, baseA);\r\n this.transferEdgeProperties(baseA, newA);\r\n this.transferEdgeProperties(mateA, newB);\r\n }\r\n return newA;\r\n }\r\n /**\r\n * * Create a new sliver face \"inside\" an existing edge.\r\n * * Insert it \"within\" the base edge.\r\n * * This requires two new half edges.\r\n * * if the base is undefined, create a single-edge loop.\r\n * * This (unlike pinch) breaks the edgeMate pairing of the base edge.\r\n * * This preserves xyz and i properties at all existing vertices.\r\n * * The two new half edges are a sliver face (via their predecessor and successor)\r\n * * Each new edge mates to one existing edge.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public static splitEdgeCreateSliverFace(\r\n baseA: HalfEdge,\r\n heArray: HalfEdge[] | undefined): HalfEdge {\r\n // raw edges ...\r\n const newA = new HalfEdge();\r\n const newB = new HalfEdge();\r\n const baseB = baseA.edgeMate;\r\n if (heArray) {\r\n heArray.push(newA);\r\n heArray.push(newB);\r\n }\r\n newA._faceSuccessor = newA._facePredecessor = newB;\r\n newB._faceSuccessor = newB._facePredecessor = newA;\r\n // newA is in vertex loop with baseA etc.\r\n // newA mates to baseB\r\n HalfEdge.setEdgeMates(newA, baseB);\r\n HalfEdge.setEdgeMates(newB, baseA);\r\n newA.copyDataFrom(baseA, true, true, false, false);\r\n newB.copyDataFrom(baseB, true, true, false, false);\r\n return newA;\r\n }\r\n\r\n private static _edgePropertyMasks: HalfEdgeMask[] = [HalfEdgeMask.BOUNDARY_EDGE, HalfEdgeMask.EXTERIOR, HalfEdgeMask.PRIMARY_EDGE, HalfEdgeMask.NULL_FACE];\r\n /**\r\n * Copy \"edge based\" content of fromNode to toNode\r\n * * edgeTag\r\n * * masks in _edgePropertyMasks: EXTERIOR, BOUNDARY_EDGE, NULL_FACE, PRIMARY_EDGE\r\n * @param fromNode\r\n * @param toNode\r\n */\r\n public static transferEdgeProperties(fromNode: HalfEdge, toNode: HalfEdge) {\r\n toNode.edgeTag = fromNode.edgeTag;\r\n for (const mask of this._edgePropertyMasks) {\r\n if (fromNode.getMask(mask))\r\n toNode.setMask(mask);\r\n else\r\n toNode.clearMask(mask);\r\n }\r\n }\r\n private static _totalNodesCreated = 0;\r\n public constructor(x: number = 0, y: number = 0, z: number = 0, i: number = 0) {\r\n this._id = HalfEdge._totalNodesCreated++;\r\n this.i = i;\r\n this.maskBits = 0x00000000;\r\n this.x = x;\r\n this.y = y;\r\n this.z = z;\r\n // Explicit init to undefined is important for performance here\r\n this.sortAngle = undefined;\r\n this.sortData = undefined;\r\n this.edgeTag = undefined;\r\n this.faceTag = undefined;\r\n // Always created in pairs, init here to make TS compiler and JS runtime happy\r\n this._facePredecessor = this;\r\n this._faceSuccessor = this;\r\n this._edgeMate = this;\r\n }\r\n\r\n /**\r\n * Return the next outbound half edge around this vertex in the CCW direction\r\n */\r\n public get vertexSuccessor(): HalfEdge { return this.facePredecessor.edgeMate; }\r\n /**\r\n * Return the next outbound half edge around this vertex in the CW direction\r\n */\r\n public get vertexPredecessor(): HalfEdge { return this.edgeMate.faceSuccessor; }\r\n /**\r\n * Set mask bits on this HalfEdge\r\n * @param mask mask to apply\r\n */\r\n public setMask(mask: HalfEdgeMask) { this.maskBits |= mask; }\r\n /**\r\n * Get mask bits from this HalfEdge\r\n * @param mask mask to query\r\n */\r\n public getMask(mask: HalfEdgeMask): number { return (this.maskBits & mask); }\r\n /**\r\n * Clear mask bits from this HalfEdge\r\n * @param mask mask to clear\r\n */\r\n public clearMask(mask: HalfEdgeMask) { this.maskBits &= ~mask; }\r\n /**\r\n * Set a mask at all nodes around a vertex.\r\n * @param mask mask to apply to the half edges around this HalfEdge's vertex loop\r\n */\r\n public setMaskAroundVertex(mask: HalfEdgeMask) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.setMask(mask);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n }\r\n\r\n /**\r\n * Set x,y,z at all nodes around a vertex.\r\n * @param mask mask to apply to the half edges around this HalfEdge's vertex loop\r\n */\r\n public setXYZAroundVertex(x: number, y: number, z: number) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.x = x; node.y = y; node.z = z;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n }\r\n /**\r\n * Apply a mask to all edges around a face.\r\n * @param mask mask to apply to the half edges around this HalfEdge's face loop\r\n */\r\n public setMaskAroundFace(mask: HalfEdgeMask) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.setMask(mask);\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n\r\n /**\r\n * Apply a mask to both sides of an edge.\r\n * @param mask mask to apply to this edge and its `edgeMate`\r\n */\r\n public setMaskAroundEdge(mask: HalfEdgeMask) {\r\n this.setMask(mask);\r\n this.edgeMate.setMask(mask);\r\n }\r\n\r\n /**\r\n * Apply a mask to both sides of an edge.\r\n * @param mask mask to apply to this edge and its `edgeMate`\r\n */\r\n public clearMaskAroundEdge(mask: HalfEdgeMask) {\r\n this.clearMask(mask);\r\n this.edgeMate.clearMask(mask);\r\n }\r\n\r\n /** Returns the number of edges around this face. */\r\n public countEdgesAroundFace(): number {\r\n let count = 0;\r\n let node: HalfEdge = this;\r\n do {\r\n count++;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return count;\r\n }\r\n\r\n /** Return true if other is in the vertex loop around this. */\r\n public findAroundVertex(other: HalfEdge): boolean {\r\n let node: HalfEdge = this;\r\n do {\r\n if (node === other)\r\n return true;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return false;\r\n }\r\n\r\n /** Return true if other is in the face loop around this. */\r\n public findAroundFace(other: HalfEdge): boolean {\r\n let node: HalfEdge = this;\r\n do {\r\n if (node === other)\r\n return true;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return false;\r\n }\r\n\r\n /**\r\n * @return whether the mask is set (or unset) on all nodes of the face loop\r\n */\r\n public isMaskedAroundFace(mask: HalfEdgeMask, value: boolean = true): boolean {\r\n let node: HalfEdge = this;\r\n if (value) {\r\n do {\r\n if (!node.isMaskSet(mask))\r\n return false;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n } else {\r\n do {\r\n if (node.isMaskSet(mask))\r\n return false;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Apply a edgeTag and mask to all edges around a face.\r\n * optionally apply it to all edge mates.\r\n * @param edgeTag tag to apply\r\n * @param bothSides If true, also apply the tag to the mates around the face.\r\n */\r\n public setMaskAndEdgeTagAroundFace(mask: HalfEdgeMask, tag: any, applyToMate: boolean = false) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.setMask(mask);\r\n node.edgeTag = tag;\r\n if (applyToMate) {\r\n const mate = node.edgeMate;\r\n mate.edgeTag = tag;\r\n mate.setMask(mask);\r\n }\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n\r\n /** Returns the number of edges around vertex. */\r\n public countEdgesAroundVertex(): number {\r\n let count = 0;\r\n let node: HalfEdge = this;\r\n do {\r\n count++;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return count;\r\n }\r\n\r\n /** Returns the number of nodes found with the given mask value around this vertex loop. */\r\n public countMaskAroundFace(mask: HalfEdgeMask, value: boolean = true): number {\r\n let count = 0;\r\n let node: HalfEdge = this;\r\n if (value) {\r\n do {\r\n if (node.isMaskSet(mask)) count++;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n } else {\r\n do {\r\n if (!node.isMaskSet(mask)) count++;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n return count;\r\n }\r\n\r\n /** Returns the number of nodes found with the given mask value around this vertex loop. */\r\n public countMaskAroundVertex(mask: HalfEdgeMask, value: boolean = true): number {\r\n let count = 0;\r\n let node: HalfEdge = this;\r\n if (value) {\r\n do {\r\n if (node.isMaskSet(mask)) count++;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n } else {\r\n do {\r\n if (!node.isMaskSet(mask)) count++;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n }\r\n return count;\r\n }\r\n\r\n /** Returns the first node with given mask value around this vertex loop. */\r\n public findMaskAroundVertex(mask: HalfEdgeMask, value: boolean = true): HalfEdge | undefined {\r\n let node: HalfEdge = this;\r\n do {\r\n if (node.isMaskSet(mask) === value)\r\n return node;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return undefined;\r\n }\r\n\r\n /** Returns the first node with given mask value around this face loop. */\r\n public findMaskAroundFace(mask: HalfEdgeMask, value: boolean = true): HalfEdge | undefined {\r\n let node: HalfEdge = this;\r\n do {\r\n if (node.isMaskSet(mask) === value)\r\n return node;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return undefined;\r\n }\r\n /** Returns the first node with given mask value on this edge (i.e. examining this and this.mate) */\r\n public findMaskAroundEdge(mask: HalfEdgeMask, value: boolean = true): HalfEdge | undefined {\r\n if (this.isMaskSet(mask) === value)\r\n return this;\r\n const mate = this.edgeMate;\r\n if (mate.isMaskSet(mask) === value)\r\n return mate;\r\n return undefined;\r\n }\r\n\r\n /** Set a mask, and return prior value.\r\n * @param mask mask to apply\r\n */\r\n public testAndSetMask(mask: HalfEdgeMask): number {\r\n const oldMask = this.maskBits & mask;\r\n this.maskBits |= mask;\r\n return oldMask;\r\n }\r\n /**\r\n * Set (copy) the this.x, this.y, this.z from node.x, node.y, node.z\r\n * @param node node containing xyz\r\n */\r\n public setXYZFrom(node: HalfEdge) {\r\n this.x = node.x;\r\n this.y = node.y;\r\n this.z = node.z;\r\n }\r\n\r\n /**\r\n * Set (copy) the this.x, this.y, this.z from xyz.x, xyz.y, xyz.z\r\n * @param node source with x,y,z properties\r\n */\r\n public setXYZ(xyz: XYAndZ) {\r\n this.x = xyz.x;\r\n this.y = xyz.y;\r\n this.z = xyz.z;\r\n }\r\n /**\r\n * Test if mask bits are set in the node's bitMask.\r\n * @return Return true (as a simple boolean, not a mask) if any bits of the mask parameter match bits of the node's bitMask\r\n */\r\n public isMaskSet(mask: HalfEdgeMask): boolean { return (this.maskBits & mask) !== 0; }\r\n\r\n /** (static!) method to test if a mask is set on a node.\r\n * This is used as filter in searches.\r\n * @returns true iff `node.isMaskSet (mask)`\r\n */\r\n public static filterIsMaskOn(node: HalfEdge, mask: HalfEdgeMask): boolean {\r\n return node.isMaskSet(mask);\r\n }\r\n /** (static!) method to test if a mask is set on a node.\r\n * This is used as filter in searches.\r\n * @returns true iff `!node.isMaskSet (mask)`\r\n */\r\n public static filterIsMaskOff(node: HalfEdge, mask: HalfEdgeMask): boolean {\r\n return !node.isMaskSet(mask);\r\n }\r\n\r\n /**\r\n * Create an edge with initial id,x,y at each end.\r\n * @param id0 id for first node\r\n * @param x0 x coordinate for first node\r\n * @param y0 y coordinate for first node\r\n * @param id1 id for second node\r\n * @param x1 x coordinate for second node\r\n * @param y1 y coordinate for second node\r\n */\r\n public static createEdgeXYXY(id0: any, x0: number, y0: number, id1: any, x1: number, y1: number): HalfEdge {\r\n const node0 = new HalfEdge(x0, y0);\r\n const node1 = new HalfEdge(x1, y1);\r\n node0._faceSuccessor = node0._facePredecessor = node0._edgeMate = node1;\r\n node1._faceSuccessor = node1._facePredecessor = node1._edgeMate = node0;\r\n node0._id = id0;\r\n node1._id = id1;\r\n return node0;\r\n }\r\n\r\n /** \"pinch\" ...\r\n *\r\n * * is the universal manipulator for manipulating a node's next and prev pointers\r\n * * swaps face predecessors of nodeA and nodeB.\r\n * * is its own inverse.\r\n * * if nodeA, nodeB are in different face loops, the loops join to one loop.\r\n * * if nodeA, nodeB are in the same face loop, the loop splits into two loops.\r\n */\r\n public static pinch(nodeA: HalfEdge, nodeB: HalfEdge) {\r\n if (nodeA !== nodeB) {\r\n const predA = nodeA._facePredecessor;\r\n const predB = nodeB._facePredecessor;\r\n nodeB._facePredecessor = predA;\r\n nodeA._facePredecessor = predB;\r\n predB._faceSuccessor = nodeA;\r\n predA._faceSuccessor = nodeB;\r\n }\r\n }\r\n\r\n /**\r\n * Pinch this half edge out of its base vertex loop.\r\n * @return the surviving HalfEdge in the vertex loop, or undefined if the instance HalfEdge is already dangling\r\n */\r\n public yankFromVertexLoop(): HalfEdge | undefined {\r\n const other = this.edgeMate.faceSuccessor;\r\n if (other === this)\r\n return undefined;\r\n HalfEdge.pinch(this, other);\r\n return other;\r\n }\r\n\r\n /** Turn all pointers to undefined so garbage collector can reuse the object.\r\n * This is to be called only by a Graph object that is being decommissioned.\r\n */\r\n public decommission() {\r\n (this._facePredecessor as any) = undefined;\r\n (this._faceSuccessor as any) = undefined;\r\n (this._edgeMate as any) = undefined;\r\n }\r\n\r\n /** Return the node. This identity function is useful as the NodeFunction in collector methods. */\r\n public static nodeToSelf(node: HalfEdge): any { return node; }\r\n /** Return the id of a node. Useful for collector methods. */\r\n public static nodeToId(node: HalfEdge): any { return node.id; }\r\n /** Return the id of a node.Useful for collector methods. */\r\n public static nodeToIdString(node: HalfEdge): any { return node.id.toString(); }\r\n\r\n /** Return the [id, [x,y]] of a node. Useful for collector methods. */\r\n public static nodeToIdMaskXY(node: HalfEdge): { id: any, mask: any, xy: number[] } {\r\n return { id: node.id, mask: HalfEdge.nodeToMaskString(node), xy: [node.x, node.y] };\r\n }\r\n /** Return the [id, [x,y]] of a node. Useful for collector methods. */\r\n public static nodeToIdXYString(node: HalfEdge): string {\r\n const s = `${node.id.toString()}+${HalfEdge.nodeToMaskString(node)}[${node.x},${node.y}]`;\r\n return s;\r\n }\r\n\r\n /** Return the [id, [x,y],z] of a node. Useful for collector methods. */\r\n public static nodeToIdXYZString(node: HalfEdge): string {\r\n return `[${node.id.toString()}: ${node.x},${node.y},${node.z}]`;\r\n }\r\n\r\n /** Create a string representation of the mask\r\n * * Null mask is empty string.\r\n * * Appended characters B,P,X for Boundary, Primary, Exterior mask bits.\r\n */\r\n public static nodeToMaskString(node: HalfEdge): string {\r\n let s = \"\";\r\n if (node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE)) s += \"B\";\r\n if (node.isMaskSet(HalfEdgeMask.PRIMARY_EDGE)) s += \"P\";\r\n if (node.isMaskSet(HalfEdgeMask.EXTERIOR)) s += \"X\";\r\n if (node.isMaskSet(HalfEdgeMask.NULL_FACE)) s += \"N\";\r\n return s;\r\n }\r\n /** Return [x,y] with coordinates of node */\r\n public static nodeToXY(node: HalfEdge): number[] { return [node.x, node.y]; }\r\n /** Return Vector2d to face successor, with only xy coordinates */\r\n public vectorToFaceSuccessorXY(result?: Vector2d): Vector2d {\r\n return Vector2d.create(this.faceSuccessor.x - this.x, this.faceSuccessor.y - this.y, result);\r\n }\r\n /** Return Vector3d to face successor */\r\n public vectorToFaceSuccessor(result?: Vector3d): Vector3d {\r\n const other = this.faceSuccessor;\r\n return Vector3d.create(\r\n other.x - this.x,\r\n other.y - this.y,\r\n other.z - this.z,\r\n result);\r\n }\r\n /** Return Vector3d to face successor */\r\n public vectorToFacePredecessor(result?: Vector3d): Vector3d {\r\n const other = this.facePredecessor;\r\n return Vector3d.create(\r\n other.x - this.x,\r\n other.y - this.y,\r\n other.z - this.z,\r\n result);\r\n }\r\n /** test if spaceNode is in the sector at sectorNode */\r\n public static isNodeVisibleInSector(spaceNode: HalfEdge, sectorNode: HalfEdge): boolean {\r\n // remark: fussy details ported from native code.\r\n // The obscure cases seemed \"unlikely\" at first. But preexisting unit tests for triangulation pinged just about everything.\r\n // So it really matters to do the \"0\" cases this way.\r\n // (As usual, hard coded zero is suspect, but it seems to work nicely in the discrete decisions.)\r\n if (sectorNode.vertexSuccessor === sectorNode)\r\n return true;\r\n const successor = sectorNode.faceSuccessor;\r\n const predecessor = sectorNode.facePredecessor;\r\n const successorCross = this.crossProductXYToTargets(sectorNode, successor, spaceNode);\r\n const predecessorCross = this.crossProductXYToTargets(predecessor, sectorNode, spaceNode);\r\n // simplest case: two positives\r\n if (successorCross > 0.0 && predecessorCross > 0.0)\r\n return true;\r\n\r\n const sectorCross = this.crossProductXYToTargets(predecessor, sectorNode, successor);\r\n\r\n if (predecessorCross <= 0.0 && successorCross <= 0.0) {\r\n if (predecessorCross === 0.0 && successorCross === 0.0 && sectorCross === 0.0) {\r\n /* Everything is on a line.*/\r\n /* If the sector is a degenerate face, nodeP can only be\r\n in if it is the other node in the degenerate face.\r\n */\r\n if (predecessor === successor && sectorNode.vertexSuccessor !== sectorNode)\r\n return spaceNode === successor;\r\n /* Sector is 360 degrees. Call it in only if vector from predP\r\n to sectorP points forward to nodeP.\r\n */\r\n return HalfEdge.dotProductNodeToNodeVectorsXY(predecessor, sectorNode, sectorNode, spaceNode) > 0.0;\r\n\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (sectorCross === 0.0 && predecessorCross !== 0.0 && successorCross !== 0.0) {\r\n // The incoming and outgoing edges at the sector are identical direction.\r\n // We have to decide if this node is inside the degenerate face (i.e. a geometrically empty sector)\r\n // or outside (i.e. a nearly complete sector).\r\n // In the inside case, the face is just two nodes.\r\n // Exact equality for zero is ok because cross product should be using identical\r\n // coordinates in subtracted terms. (All furrow eyebrows in unison ....)\r\n return predecessor !== successor;\r\n }\r\n return sectorCross < 0.0;\r\n }\r\n\r\n }\r\n\r\n /** Returns Return cross product (2d) of vectors from baseA to targetA and baseB to targetB */\r\n public static crossProductXYToTargets(base: HalfEdge, targetA: HalfEdge, targetB: HalfEdge): number {\r\n return Geometry.crossProductXYXY(\r\n targetA.x - base.x, targetA.y - base.y,\r\n targetB.x - base.x, targetB.y - base.y);\r\n }\r\n\r\n /** Returns Return dot product (2d) of vectors along two edges. */\r\n public static dotProductNodeToNodeVectorsXY(baseA: HalfEdge, targetA: HalfEdge, baseB: HalfEdge, targetB: HalfEdge): number {\r\n return Geometry.dotProductXYXY(\r\n targetA.x - baseA.x, targetA.y - baseA.y,\r\n targetB.x - baseB.x, targetB.y - baseB.y);\r\n }\r\n\r\n /** Return cross product (2d) of vectors from nodeA to nodeB and nodeB to nodeC\r\n */\r\n public static crossProductXYAlongChain(nodeA: HalfEdge, nodeB: HalfEdge, nodeC: HalfEdge): number {\r\n return Geometry.crossProductXYXY(\r\n nodeB.x - nodeA.x, nodeB.y - nodeA.y,\r\n nodeC.x - nodeB.x, nodeC.y - nodeB.y);\r\n }\r\n\r\n /**\r\n * @return whether the sector represented by the 2D vectors from nodeA to nodeB and nodeB to nodeC is convex.\r\n */\r\n public static isSectorConvex(nodeA: HalfEdge, nodeB: HalfEdge, nodeC: HalfEdge): boolean {\r\n const cross = HalfEdge.crossProductXYAlongChain(nodeA, nodeB, nodeC);\r\n if (cross > 0.0)\r\n return true;\r\n if (cross < 0.0)\r\n return false;\r\n return HalfEdge.dotProductNodeToNodeVectorsXY(nodeA, nodeB, nodeB, nodeC) > 0.0;\r\n }\r\n\r\n /**\r\n * @return whether the sector of the face is convex.\r\n */\r\n // eslint-disable-next-line @itwin/prefer-get\r\n public isSectorConvex(): boolean {\r\n return HalfEdge.isSectorConvex(this.facePredecessor, this, this.faceSuccessor);\r\n }\r\n\r\n /**\r\n * @return whether the face is convex.\r\n */\r\n // eslint-disable-next-line @itwin/prefer-get\r\n public isFaceConvex(): boolean {\r\n let node: HalfEdge = this;\r\n do {\r\n if (!node.isSectorConvex())\r\n return false;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return true;\r\n }\r\n\r\n /**\r\n * Isolate the edge from the graph by yanking each end from its vertex loop.\r\n */\r\n public isolateEdge() {\r\n const mate = this.edgeMate;\r\n this.yankFromVertexLoop();\r\n mate.yankFromVertexLoop();\r\n }\r\n\r\n /**\r\n * @return whether this edge is isolated from the rest of the graph.\r\n */\r\n public get isIsolatedEdge() {\r\n return this === this.vertexSuccessor && this.edgeMate === this.edgeMate.vertexSuccessor;\r\n }\r\n\r\n /** Return true if `this` is lexically below `other`, comparing y first then x. */\r\n public belowYX(other: HalfEdge): boolean {\r\n // Check y's\r\n // if (!Geometry.isSameCoordinate(a.y, b.y))\r\n\r\n if (this.y < other.y)\r\n return true;\r\n if (this.y > other.y)\r\n return false;\r\n // same y.\r\n // Check x's\r\n if (this.x < other.x)\r\n return true;\r\n return false;\r\n }\r\n /** Returns Returns true if the node does NOT have Mask.EXTERIOR_MASK set. */\r\n public static testNodeMaskNotExterior(node: HalfEdge) { return !node.isMaskSet(HalfEdgeMask.EXTERIOR); }\r\n\r\n /** Returns Returns true if the node does NOT have Mask.EXTERIOR_MASK set. */\r\n public static testMateMaskExterior(node: HalfEdge) { return node.edgeMate.isMaskSet(HalfEdgeMask.EXTERIOR); }\r\n\r\n /** Returns radians between this edge and its face predecessor edge, using all three coordinates x,y,z and given normal to resolve sweep direction.\r\n * * The returned angle is positive, i.e. may be larger than PI radians.\r\n */\r\n public static sectorSweepRadiansXYZ(node: HalfEdge, normal: Vector3d): number {\r\n const nodeB = node.faceSuccessor;\r\n const nodeC = node.facePredecessor;\r\n return Angle.orientedRadiansBetweenVectorsXYZ(\r\n nodeB.x - node.x, nodeB.y - node.y, nodeB.z - node.z,\r\n nodeC.x - node.x, nodeC.y - node.y, nodeC.z - node.z,\r\n normal.x, normal.y, normal.z, true);\r\n }\r\n\r\n /** Returns Returns true if the face has positive area in xy parts. */\r\n public static testFacePositiveAreaXY(node: HalfEdge) {\r\n return node.countEdgesAroundFace() > 2 && node.signedFaceArea() > 0.0;\r\n }\r\n\r\n /** Return true if x and y coordinates of this and other are exactly equal */\r\n public isEqualXY(other: XAndY | HalfEdge): boolean {\r\n return this.x === other.x && this.y === other.y;\r\n }\r\n\r\n /** Return distance between xy coordinates of this and other node */\r\n public distanceXY(other: HalfEdge): number {\r\n return Geometry.distanceXYXY(this.x, this.y, other.x, other.y);\r\n }\r\n\r\n /** Return distance between xyz coordinates of this and other node */\r\n public distanceXYZ(other: HalfEdge): number {\r\n return Geometry.distanceXYZXYZ(this.x, this.y, this.z, other.x, other.y, other.z);\r\n }\r\n /**\r\n *\r\n * * Evaluate f(node) at each node around a face loop.\r\n * * Collect the function values.\r\n * @returns Return the array of function values.\r\n */\r\n public collectAroundFace(f?: NodeFunction): any[] {\r\n const nodes = [];\r\n let node: HalfEdge = this;\r\n do {\r\n nodes.push(f ? f(node) : node);\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return nodes;\r\n }\r\n /**\r\n * search around a vertex for nodes that have a specified mask setting.\r\n * @param vertexSeed first node to search\r\n * @param mask target mask\r\n * @param value target value for mask on half edges.\r\n * @param collectedNodes optional array to be cleared and receive masked nodes\r\n */\r\n public collectMaskedEdgesAroundVertex(\r\n mask: HalfEdgeMask,\r\n value: boolean = true,\r\n result?: HalfEdge[]): HalfEdge[] {\r\n if (result === undefined)\r\n result = [];\r\n else\r\n result.length = 0;\r\n let node: HalfEdge = this;\r\n do {\r\n if (node.isMaskSet(mask) === value)\r\n result.push(node);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return result;\r\n }\r\n\r\n /**\r\n *\r\n * * Evaluate f(node) at each outbound node around this node's vertex loop.\r\n * * Collect the function values.\r\n * @returns Return the array of function values.\r\n */\r\n public collectAroundVertex(f?: NodeFunction): any[] {\r\n const nodes = [];\r\n let node: HalfEdge = this;\r\n do {\r\n nodes.push(f ? f(node) : node);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return nodes;\r\n }\r\n\r\n /**\r\n *\r\n * * Evaluate f(node) at each node around a face loop.\r\n * * Sum the function values\r\n * @returns Return the sum\r\n */\r\n public sumAroundFace(f: NodeToNumberFunction): number {\r\n let node: HalfEdge = this;\r\n let sum = 0;\r\n do {\r\n sum += f(node);\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return sum;\r\n }\r\n\r\n /**\r\n *\r\n * * Evaluate f(node) at each outbound node around this node's vertex loop.\r\n * * Sum the function values\r\n * @returns Return the sum\r\n */\r\n public sumAroundVertex(f: NodeToNumberFunction): number {\r\n let node: HalfEdge = this;\r\n let sum = 0;\r\n do {\r\n sum += f(node);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return sum;\r\n }\r\n /** For all the nodes in the face loop of the given node, clear out the mask given */\r\n public clearMaskAroundFace(mask: HalfEdgeMask) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.clearMask(mask);\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n\r\n /** For all the nodes in the vertex loop of the given node, clear out the mask given */\r\n public clearMaskAroundVertex(mask: HalfEdgeMask) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.clearMask(mask);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n }\r\n /** Returns the signed sum of xy areas of triangles from first node to edges.\r\n *\r\n * * A positive area is counterclockwise.\r\n * * A negative area is clockwise.\r\n */\r\n public signedFaceArea(): number {\r\n let sum = 0;\r\n // sum area of trapezoids.\r\n // * the formula in the loop gives twice the area (because it does nto average the y values).\r\n // * this is fixed up at the end by a single multiply by 0.5\r\n // * individual trapezoid heights are measured from y at the start node to keep area values numerical smaller.\r\n const y0 = this.y;\r\n let dy0 = 0.0;\r\n let dy1 = 0.0;\r\n let x0 = this.x;\r\n let x1;\r\n let node1;\r\n let node0: HalfEdge = this;\r\n do {\r\n node1 = node0.faceSuccessor;\r\n x1 = node1.x;\r\n dy1 = node1.y - y0;\r\n sum += (x0 - x1) * (dy0 + dy1);\r\n x0 = x1;\r\n dy0 = dy1;\r\n node0 = node1;\r\n } while (node0 !== this);\r\n return 0.5 * sum;\r\n }\r\n /**\r\n * interpolate xy coordinates between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n * @param result xy coordinates\r\n */\r\n public fractionToPoint2d(fraction: number, result?: Point2d): Point2d {\r\n const node1 = this.faceSuccessor;\r\n return Point2d.create(\r\n this.x + (node1.x - this.x) * fraction,\r\n this.y + (node1.y - this.y) * fraction,\r\n result);\r\n }\r\n /**\r\n * interpolate xy coordinates between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n * @param result xy coordinates\r\n */\r\n public fractionToPoint3d(fraction: number, result?: Point3d): Point3d {\r\n const node1 = this.faceSuccessor;\r\n return Point3d.create(\r\n this.x + (node1.x - this.x) * fraction,\r\n this.y + (node1.y - this.y) * fraction,\r\n this.z + (node1.z - this.z) * fraction,\r\n result);\r\n }\r\n /**\r\n * * interpolate xy coordinates at fractionAlong between this node and its face successor.\r\n * * shift to left by fractionPerpendicular\r\n * @param fraction fractional position along this edge.\r\n * @param result xy coordinates\r\n */\r\n public fractionAlongAndPerpendicularToPoint2d(fractionAlong: number, fractionPerpendicular: number, result?: Point2d): Point2d {\r\n const node1 = this.faceSuccessor;\r\n const dx = node1.x - this.x;\r\n const dy = node1.y - this.y;\r\n return Point2d.create(\r\n this.x + dx * fractionAlong - dy * fractionPerpendicular,\r\n this.y + dy * fractionAlong + dx * fractionPerpendicular,\r\n result);\r\n }\r\n\r\n /**\r\n * return the 3d coordinates at this half edge base\r\n */\r\n public getPoint3d(result?: Point3d): Point3d {\r\n return Point3d.create(this.x, this.y, this.z, result);\r\n }\r\n /**\r\n * return the 2d coordinates at this half edge base\r\n */\r\n public getPoint2d(result?: Point2d): Point2d {\r\n return Point2d.create(this.x, this.y, result);\r\n }\r\n /**\r\n * return a 3d vector from start to end of this half edge.\r\n */\r\n public getVector3dAlongEdge(result?: Vector3d): Vector3d {\r\n const nodeB = this.faceSuccessor;\r\n return Vector3d.create(nodeB.x - this.x, nodeB.y - this.y, nodeB.z - this.z, result);\r\n }\r\n\r\n /**\r\n * return a 2d vector from start to end of this half edge\r\n */\r\n public getVector2dAlongEdge(result?: Vector2d): Vector2d {\r\n const nodeB = this.faceSuccessor;\r\n return Vector2d.create(nodeB.x - this.x, nodeB.y - this.y, result);\r\n }\r\n /**\r\n * Return the interpolated x coordinate between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n */\r\n public fractionToX(fraction: number): number {\r\n const node1 = this.faceSuccessor;\r\n return this.x + (node1.x - this.x) * fraction;\r\n }\r\n /**\r\n * Return the interpolated y coordinate between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n */\r\n public fractionToY(fraction: number): number {\r\n const node1 = this.faceSuccessor;\r\n return this.y + (node1.y - this.y) * fraction;\r\n }\r\n\r\n /**\r\n * Return the interpolated z coordinate between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n */\r\n public fractionToZ(fraction: number): number {\r\n const node1 = this.faceSuccessor;\r\n return this.z + (node1.z - this.z) * fraction;\r\n }\r\n /**\r\n * * Compute fractional coordinates of the intersection of edges from given base nodes\r\n * * If parallel or colinear, return undefined.\r\n * * If (possibly extended) lines intersect, return the fractions of intersection as x,y in the result.\r\n * @param nodeA0 Base node of edge A\r\n * @param nodeB0 Base node of edge B\r\n * @param result optional preallocated result\r\n */\r\n public static transverseIntersectionFractions(nodeA0: HalfEdge, nodeB0: HalfEdge, result?: Vector2d): Vector2d | undefined {\r\n const nodeA1 = nodeA0.faceSuccessor;\r\n const nodeB1 = nodeB0.faceSuccessor;\r\n if (!result)\r\n result = Vector2d.create();\r\n if (SmallSystem.linearSystem2d(\r\n nodeA1.x - nodeA0.x, nodeB0.x - nodeB1.x,\r\n nodeA1.y - nodeA0.y, nodeB0.y - nodeB1.y,\r\n nodeB0.x - nodeA0.x, nodeB0.y - nodeA0.y,\r\n result))\r\n return result;\r\n return undefined;\r\n }\r\n /**\r\n * * Compute fractional coordinates of the intersection of a horizontal line with an edge.\r\n * * If the edge is horizontal with (approximate) identical y, return the node.\r\n * * If the edge is horizontal with different y, return undefined.\r\n * * If the edge is not horizontal, return the fractional position (possibly outside 0..1) of the intersection.\r\n * @param node0 Base node of edge\r\n */\r\n public static horizontalScanFraction(node0: HalfEdge, y: number): number | undefined | HalfEdge {\r\n const node1 = node0.faceSuccessor;\r\n const dy = node1.y - node0.y;\r\n if (Geometry.isSameCoordinate(y, node0.y) && Geometry.isSameCoordinate(y, node1.y))\r\n return node0;\r\n if (Geometry.isSameCoordinate(dy, 0.0))\r\n return undefined;\r\n return Geometry.conditionalDivideFraction(y - node0.y, dy);\r\n }\r\n\r\n /**\r\n * * Compute fractional coordinates of the intersection of a horizontal line with an edge.\r\n * * If the edge is horizontal return undefined (no test for horizontal at y!!!)\r\n * * If the edge is not horizontal and y is between its end y's, return the fraction\r\n * @param node0 Base node of edge\r\n */\r\n public static horizontalScanFraction01(node0: HalfEdge, y: number): number | undefined {\r\n const node1 = node0.faceSuccessor;\r\n const dy = node1.y - node0.y;\r\n if (Geometry.isSameCoordinate(y, node0.y) && Geometry.isSameCoordinate(y, node1.y))\r\n return undefined;\r\n if (Geometry.isSameCoordinate(dy, 0.0))\r\n return undefined;\r\n const fraction = Geometry.conditionalDivideFraction(y - node0.y, dy);\r\n if (fraction !== undefined && fraction >= 0.0 && fraction <= 1.0)\r\n return fraction;\r\n return undefined;\r\n }\r\n /**\r\n * Copy various data from source to this.\r\n * @param source other half edge.\r\n * @param XYZ copy simple coordinates\r\n * @param copyVertexData true to copy data belonging to the vertex. (i.e. the \"i\" member)\r\n * @param copyVertexData true to copy data belonging to the edge. (i.e. call transferEdgeData)\r\n * @param copyFaceData true to copy faceTag\r\n */\r\n public copyDataFrom(source: HalfEdge, copyXYZ: boolean, copyVertexData: boolean, copyEdgeData: boolean, copyFaceData: boolean) {\r\n if (copyXYZ) {\r\n this.x = source.x;\r\n this.y = source.y;\r\n this.z = source.z;\r\n }\r\n if (copyVertexData) {\r\n this.i = source.i;\r\n }\r\n if (copyEdgeData) {\r\n HalfEdge.transferEdgeProperties(source, this);\r\n this.edgeTag = source.edgeTag;\r\n }\r\n if (copyFaceData) {\r\n this.faceTag = source.faceTag;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A HalfEdgeGraph has:\r\n * * An array of (pointers to ) HalfEdge objects.\r\n * * A pool of masks for grab/drop use by algorithms.\r\n * @internal\r\n */\r\nexport class HalfEdgeGraph {\r\n /** Simple array with pointers to all the half edges in the graph. */\r\n public allHalfEdges: HalfEdge[];\r\n private _maskManager: MaskManager;\r\n private _numNodesCreated = 0;\r\n public constructor() {\r\n this.allHalfEdges = [];\r\n this._maskManager = MaskManager.create(HalfEdgeMask.ALL_GRAB_DROP_MASKS)!;\r\n }\r\n /** Ask for a mask (from the graph's free pool.) for caller's use.\r\n * * Optionally clear the mask throughout the graph.\r\n */\r\n public grabMask(clearInAllHalfEdges: boolean = true): HalfEdgeMask {\r\n const mask = this._maskManager.grabMask();\r\n if (clearInAllHalfEdges) {\r\n this.clearMask(mask);\r\n }\r\n return mask;\r\n }\r\n /**\r\n * Return `mask` to the free pool.\r\n */\r\n public dropMask(mask: HalfEdgeMask) { this._maskManager.dropMask(mask); }\r\n /**\r\n * * Create 2 half edges forming 2 vertices, 1 edge, and 1 face\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * * The two edges are added to the graph's HalfEdge set\r\n * @returns Return pointer to the first half edge created.\r\n */\r\n public createEdgeXYZXYZ(\r\n xA: number = 0,\r\n yA: number = 0,\r\n zA: number = 0,\r\n iA: number = 0,\r\n xB: number = 0,\r\n yB: number = 0,\r\n zB: number = 0,\r\n iB: number = 0): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(xA, yA, zA, iA, xB, yB, zB, iB, this.allHalfEdges);\r\n return a;\r\n }\r\n /**\r\n * * Create 2 half edges forming 2 vertices, 1 edge, and 1 face\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * * The two edges are added to the graph's HalfEdge set\r\n * * Coordinates are set to zero.\r\n * * ids are installed in the two half edges.\r\n * @returns Return pointer to the first half edge created. (This has idA as its id.)\r\n */\r\n public createEdgeIdId(iA: number = 0, iB: number = 0): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(0.0, 0.0, 0.0, iA, 0.0, 0.0, 0.0, iB, this.allHalfEdges);\r\n return a;\r\n }\r\n /**\r\n * * create an edge from coordinates x,y,z to (the tail of) an existing half edge.\r\n * @returns Return pointer to the half edge with tail at x,y,z\r\n */\r\n public createEdgeXYZHalfEdge(\r\n xA: number = 0,\r\n yA: number = 0,\r\n zA: number = 0,\r\n iA: number = 0,\r\n node: HalfEdge,\r\n iB: number = 0): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(xA, yA, zA, iA, node.x, node.y, node.z, iB, this.allHalfEdges);\r\n const b = a.faceSuccessor;\r\n HalfEdge.pinch(node, b);\r\n return a;\r\n }\r\n /**\r\n * * create an edge from coordinates x,y,z to (the tail of) an existing half edge.\r\n * @returns Return pointer to the half edge with tail at x,y,z\r\n */\r\n public createEdgeHalfEdgeHalfEdge(\r\n nodeA: HalfEdge,\r\n idA: number,\r\n nodeB: HalfEdge,\r\n idB: number = 0): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(nodeA.x, nodeA.y, nodeA.z, idA, nodeB.x, nodeB.y, nodeB.z, idB, this.allHalfEdges);\r\n const b = a.faceSuccessor;\r\n HalfEdge.pinch(nodeA, a);\r\n HalfEdge.pinch(nodeB, b);\r\n return a;\r\n }\r\n\r\n /**\r\n * * Create 2 half edges forming 2 vertices, 1 edge, and 1 face\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * * The two edges are added to the graph's HalfEdge set\r\n * @returns Return pointer to the first half edge created.\r\n */\r\n public createEdgeXYAndZ(xyz0: XYAndZ, id0: number, xyz1: XYAndZ, id1: number): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(xyz0.x, xyz0.y, xyz0.z, id0, xyz1.x, xyz1.y, xyz1.z, id1, this.allHalfEdges);\r\n return a;\r\n }\r\n\r\n /**\r\n * * Insert a vertex in the edge beginning at base.\r\n * * this creates two half edges.\r\n * * The base of the new edge is 'after' the (possibly undefined) start node in its face loop.\r\n * * The existing mate retains its base xyz and i properties but is no longer the mate of base.\r\n * * The base and existing mate each become mates with a new half edge.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public splitEdge(base: undefined | HalfEdge,\r\n xA: number = 0, yA: number = 0, zA: number = 0, iA: number = 0): HalfEdge {\r\n const he = HalfEdge.splitEdge(base, xA, yA, zA, iA, this.allHalfEdges);\r\n return he;\r\n }\r\n\r\n /**\r\n * * Create a sliver face \"within\" an edge.\r\n * * this creates two half edges.\r\n * * The existing edges both stay in their same face loops and retain coordinates and i value.\r\n * * Each existing edge's mate is a new edge (rather than original mate)\r\n * * Coordinates are copied to the new edges at respective vertices.\r\n * * New faceTag and edgeTag undefined.\r\n * * i members are copied around their respective vertices.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public splitEdgeCreateSliverFace(base: HalfEdge): HalfEdge {\r\n const he = HalfEdge.splitEdgeCreateSliverFace(base, this.allHalfEdges);\r\n return he;\r\n }\r\n\r\n /**\r\n * * Insert a vertex in the edge beginning at base, with coordinates specified as a fraction along the existing edge.\r\n * * this creates two half edges.\r\n * * The base of the new edge is 'after' the (possibly undefined) start node in its face loop.\r\n * * The existing mate retains its base xyz and i properties but is no longer the mate of base.\r\n * * The base and existing mate each become mates with a new half edge.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public splitEdgeAtFraction(base: HalfEdge, fraction: number): HalfEdge {\r\n const he = HalfEdge.splitEdge(base, base.fractionToX(fraction), base.fractionToY(fraction), base.fractionToZ(fraction), 0, this.allHalfEdges);\r\n return he;\r\n }\r\n /** This is a destructor-like action that eliminates all interconnection among the graph's nodes.\r\n * After this is called the graph is unusable.\r\n */\r\n public decommission() {\r\n for (const node of this.allHalfEdges) { node.decommission(); }\r\n this.allHalfEdges.length = 0;\r\n (this.allHalfEdges as any) = undefined;\r\n }\r\n /** create two nodes of a new edge.\r\n * @returns Return one of the two nodes, which the caller may consider as the start of the edge.\r\n */\r\n public addEdgeXY(x0: number, y0: number, x1: number, y1: number): HalfEdge {\r\n const baseNode = HalfEdge.createEdgeXYXY(this._numNodesCreated, x0, y0, this._numNodesCreated + 1, x1, y1);\r\n this._numNodesCreated += 2;\r\n this.allHalfEdges.push(baseNode);\r\n this.allHalfEdges.push(baseNode.faceSuccessor);\r\n return baseNode;\r\n\r\n }\r\n /** Clear selected bits in all nodes of the graph. */\r\n public clearMask(mask: HalfEdgeMask) {\r\n for (const node of this.allHalfEdges)\r\n node.maskBits &= ~mask;\r\n }\r\n /** Set selected bits in all nodes of the graph. */\r\n public setMask(mask: HalfEdgeMask) {\r\n for (const node of this.allHalfEdges)\r\n node.maskBits |= mask;\r\n }\r\n /** toggle selected bits in all nodes of the graph. */\r\n public reverseMask(mask: HalfEdgeMask) {\r\n for (const node of this.allHalfEdges) {\r\n node.maskBits ^= mask;\r\n }\r\n }\r\n /**\r\n * Return the number of nodes that have a specified mask bit set.\r\n * @param mask mask to count\r\n */\r\n public countMask(mask: HalfEdgeMask): number {\r\n let n = 0;\r\n for (const node of this.allHalfEdges)\r\n if (node.isMaskSet(mask))\r\n n++;\r\n return n;\r\n }\r\n /** Return an array LineSegment3d.\r\n * * The array has one segment per edge\r\n * * The coordinates are taken from a node and its face successor.\r\n * * On each edge, the line segment start at the HalfEdge with lower id than its edgeMate.\r\n */\r\n public collectSegments(): LineSegment3d[] {\r\n const segments: LineSegment3d[] = [];\r\n for (const node of this.allHalfEdges) {\r\n if (node.id < node.edgeMate.id)\r\n segments.push(LineSegment3d.create(Point3d.create(node.x, node.y), Point3d.create(node.faceSuccessor.x, node.faceSuccessor.y)));\r\n }\r\n return segments;\r\n }\r\n\r\n /** Returns the number of vertex loops in a graph structure */\r\n public countVertexLoops(): number {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n let count = 0;\r\n this.announceVertexLoops((_graph: HalfEdgeGraph, _seed: HalfEdge) => { count++; return true; });\r\n return count;\r\n }\r\n\r\n /** Returns the number of face loops */\r\n public countFaceLoops(): number {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n let count = 0;\r\n this.announceFaceLoops((_graph: HalfEdgeGraph, _seed: HalfEdge) => { count++; return true; });\r\n return count;\r\n }\r\n /**\r\n * Returns the number of face loops satisfying a filter function with mask argument.\r\n *\r\n */\r\n public countFaceLoopsWithMaskFilter(filter: HalfEdgeAndMaskToBooleanFunction, mask: HalfEdgeMask): number {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n let count = 0;\r\n this.announceFaceLoops((_graph: HalfEdgeGraph, seed: HalfEdge) => {\r\n if (filter(seed, mask))\r\n count++;\r\n return true;\r\n });\r\n return count;\r\n }\r\n\r\n /** Returns an array of nodes, where each node represents a starting point of a face loop.\r\n */\r\n public collectFaceLoops(): HalfEdge[] {\r\n const returnArray: HalfEdge[] = [];\r\n this.announceFaceLoops(\r\n (_graph: HalfEdgeGraph, node: HalfEdge) => { returnArray.push(node); return true; });\r\n return returnArray;\r\n }\r\n\r\n /** Returns an array of nodes, where each node represents a starting point of a vertex loop.\r\n */\r\n public collectVertexLoops(): HalfEdge[] {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n const returnArray: HalfEdge[] = [];\r\n\r\n for (const node of this.allHalfEdges) {\r\n if (node.getMask(HalfEdgeMask.VISITED))\r\n continue;\r\n returnArray.push(node);\r\n node.setMaskAroundVertex(HalfEdgeMask.VISITED);\r\n }\r\n return returnArray;\r\n }\r\n\r\n /**\r\n * * Visit each facet of the graph once.\r\n * * Call the announceFace function\r\n * * continue search if announceFace(graph, node) returns true\r\n * * terminate search if announce face (graph, node) returns false\r\n * @param announceFace function to apply at one node of each face.\r\n */\r\n public announceFaceLoops(announceFace: GraphNodeFunction) {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n for (const node of this.allHalfEdges) {\r\n if (node.getMask(HalfEdgeMask.VISITED))\r\n continue;\r\n node.setMaskAroundFace(HalfEdgeMask.VISITED);\r\n if (!announceFace(this, node))\r\n break;\r\n }\r\n }\r\n /**\r\n * * Visit each edge of the graph once.\r\n * * Call the announceEdge function.\r\n * * the edge mate will NOT appear in an announceEdge call.\r\n * * continue search if announceEdge(graph, node) returns true\r\n * * terminate search if announceEdge (graph, node) returns false\r\n * @param announceEdge function to apply at one node of each edge.\r\n */\r\n public announceEdges(announceEdge: GraphNodeFunction) {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n for (const node of this.allHalfEdges) {\r\n if (node.getMask(HalfEdgeMask.VISITED))\r\n continue;\r\n const mate = node.edgeMate;\r\n node.setMask(HalfEdgeMask.VISITED);\r\n mate.setMask(HalfEdgeMask.VISITED);\r\n if (!announceEdge(this, node))\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * * Visit each vertex loop of the graph once.\r\n * * Call the announceVertex function\r\n * * continue search if announceVertex(graph, node) returns true\r\n * * terminate search if announce vertex (graph, node) returns false\r\n * @param announceVertex function to apply at one node of each face.\r\n */\r\n public announceVertexLoops(announceVertex: GraphNodeFunction) {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n for (const node of this.allHalfEdges) {\r\n if (node.getMask(HalfEdgeMask.VISITED))\r\n continue;\r\n node.setMaskAroundVertex(HalfEdgeMask.VISITED);\r\n if (!announceVertex(this, node))\r\n break;\r\n }\r\n }\r\n /**\r\n * * Visit each half edge (node) of the graph once.\r\n * * Call the announceNode function\r\n * * continue search if announceNode(graph, node) returns true\r\n * * terminate search if announce face (graph, node) returns false\r\n * @param announceNode function to apply at one node of each face.\r\n */\r\n public announceNodes(announceNode: GraphNodeFunction) {\r\n for (const node of this.allHalfEdges) {\r\n if (!announceNode(this, node))\r\n break;\r\n }\r\n }\r\n\r\n /** Return the number of nodes in the graph */\r\n public countNodes(): number { return this.allHalfEdges.length; }\r\n /** Apply transform to the xyz coordinates in the graph. */\r\n public transformInPlace(transform: Transform) {\r\n for (const node of this.allHalfEdges) {\r\n transform.multiplyXYAndZInPlace(node);\r\n }\r\n }\r\n /**\r\n * disconnect and delete all nodes that satisfy a filter condition.\r\n * @param deleteThisNode returns true to delete the corresponding edge. Should act symmetrically on the edgeMate.\r\n * @returns the number of nodes deleted (twice the number of deleted edges).\r\n */\r\n public yankAndDeleteEdges(deleteThisNode: NodeFunction): number {\r\n const numTotal = this.allHalfEdges.length;\r\n let numAccepted = 0;\r\n for (let i = 0; i < numTotal; i++) {\r\n const candidate = this.allHalfEdges[i];\r\n if (!deleteThisNode(candidate)) {\r\n this.allHalfEdges[numAccepted++] = candidate;\r\n } else\r\n candidate.isolateEdge();\r\n }\r\n const numDeleted = numTotal - numAccepted;\r\n this.allHalfEdges.length = numAccepted;\r\n return numDeleted;\r\n }\r\n\r\n /**\r\n * Delete all isolated edges.\r\n * @return the number of nodes deleted (twice the number of deleted edges).\r\n */\r\n public deleteIsolatedEdges(): number {\r\n const numTotal = this.allHalfEdges.length;\r\n let numAccepted = 0;\r\n for (let i = 0; i < numTotal; i++) {\r\n const candidate = this.allHalfEdges[i];\r\n if (!candidate.isIsolatedEdge) {\r\n this.allHalfEdges[numAccepted++] = candidate;\r\n }\r\n }\r\n const numDeleted = numTotal - numAccepted;\r\n this.allHalfEdges.length = numAccepted;\r\n return numDeleted;\r\n }\r\n\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Graph.js","sourceRoot":"","sources":["../../../src/topology/Graph.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\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { Point2d, Vector2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XAndY, XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { MaskManager } from \"./MaskManager\";\r\n// import { GraphChecker } from \"../test/topology/Graph.test\";\r\n/* eslint-disable @typescript-eslint/no-this-alias */\r\n// cspell:word CONSTU\r\n// cspell:word CONSTV\r\n// cspell:word USEAM\r\n// cspell:word VSEAM\r\n/**\r\n * * Each node of the graph has a mask member.\r\n * * The mask member is a number which is used as set of single bit boolean values.\r\n * * Particular meanings of the various bits are HIGHLY application dependent.\r\n * * The EXTERIOR mask bit is widely used to mark nodes that are \"outside\" the active areas\r\n * * The PRIMARY_EDGE bit is widely used to indicate linework created directly from input data, hence protected from triangle edge flipping.\r\n * * The BOUNDARY bit is widely used to indicate that crossing this edge is a transition from outside to inside.\r\n * * VISITED is used locally in many searches.\r\n * * Never use VISITED unless the search logic is highly self contained.\r\n * @internal\r\n */\r\nexport enum HalfEdgeMask {\r\n /** Mask commonly set consistently around exterior faces.\r\n * * A boundary edge with interior to one side, exterior to the other will have EXTERIOR only on the outside.\r\n * * An an edge inserted \"within a purely exterior face\" can have EXTERIOR on both sides.\r\n * * An interior edge (such as added during triangulation) will have no EXTERIOR bits.\r\n */\r\n EXTERIOR = 0x00000001,\r\n /** Mask commonly set (on both sides) of original geometry edges that are transition from outside from to inside.\r\n * * At the moment of creating an edge from primary user boundary loop coordinates, the fact that an edge is BOUNDARY is often clear even though\r\n * there is uncertainty about which side should be EXTERIOR.\r\n */\r\n BOUNDARY_EDGE = 0x00000002,\r\n // REMARK: Various mask names are COMMENTED here for reference to native legacy code.\r\n // CONSTU_MASK = 0x00000004,\r\n // CONSTV_MASK = 0x00000008,\r\n // USEAM_MASK = 0x00000010,\r\n // VSEAM_MASK = 0x00000020,\r\n // BOUNDARY_VERTEX_MASK = 0x00000040,\r\n // PRIMARY_VERTEX_MASK = 0x00000080,\r\n // DIRECTED_EDGE_MASK = 0x00000100,\r\n /** Mask commonly set (on both sides) of original geometry edges, but NOT indicating that the edge is certainly a boundary between outside and inside.\r\n * * For instance, if geometry is provided as stray sticks (not loops), it can be marked PRIMARY_EDGE but neither BOUNDARY_EDGE nor EXTERIOR_EDGE\r\n */\r\n PRIMARY_EDGE = 0x00000004,\r\n\r\n /** Mask used for low level searches to identify previously-visited nodes */\r\n VISITED = 0x0000010,\r\n\r\n /** Mask applied to triangles by earcut triangulator */\r\n TRIANGULATED_FACE = 0x00000100,\r\n /** mask applied in a face with 2 edges. */\r\n NULL_FACE = 0x00000200,\r\n\r\n /** no mask bits */\r\n NULL_MASK = 0x00000000,\r\n /** The \"upper 12 \" bits of 32 bit integer. */\r\n ALL_GRAB_DROP_MASKS = 0xffF00000, // 12 masks reserved for grab/drop.\r\n /** all mask bits */\r\n ALL_MASK = 0xFFFFFFFF,\r\n // informal convention on preassigned mask bit numbers:\r\n // byte0 (EXTERIOR, BOUNDARY_EDGE, PRIMARY_EDGE) -- edge properties\r\n // byte1 (VISITED, VISIT_A, WORK_MASK0, WORK_MASK1) -- temp masks for algorithms.\r\n // byte2 (TRIANGULATED_FACE, NULL_FACE) -- face properties.\r\n\r\n}\r\n\r\n/** function signature for function of one node with no return type restrictions\r\n * @internal\r\n */\r\nexport type NodeFunction = (node: HalfEdge) => any;\r\n/** function signature for function of one node, returning a number\r\n * @internal\r\n */\r\nexport type NodeToNumberFunction = (node: HalfEdge) => number;\r\n/** function signature for function of one node, returning a boolean\r\n * @internal\r\n */\r\nexport type HalfEdgeToBooleanFunction = (node: HalfEdge) => boolean;\r\n/** function signature for function of a node and a mask, returning a number\r\n * @internal\r\n */\r\nexport type HalfEdgeAndMaskToBooleanFunction = (node: HalfEdge, mask: HalfEdgeMask) => boolean;\r\n/** function signature for function of a graph and a node, returning a boolean\r\n * @internal\r\n */\r\nexport type GraphNodeFunction = (graph: HalfEdgeGraph, node: HalfEdge) => boolean;\r\n/** Non-topological data members in a half edge.\r\n * These are not part of adjacency and masking logic.\r\n*/\r\n/** member fields for a half edge (which is also commonly called a node)\r\n * @internal\r\n */\r\nexport interface HalfEdgeUserData {\r\n /** Vertex x coordinate */\r\n x: number;\r\n /** Vertex y coordinate */\r\n y: number;\r\n /** Vertex z coordinate */\r\n z: number;\r\n /** angle used for sort-around-vertex */\r\n sortAngle?: number; // used in sorting around vertex.\r\n /** numeric value for application-specific tagging (e.g. sorting) */\r\n sortData?: number;\r\n /** application-specific data for the edge identifier.\r\n * * edge split operations are expected to copy this to new sub-edges.\r\n */\r\n edgeTag?: any;\r\n /** application-specific data for the face loop\r\n * * edge split operations are expected to copy this to new sub-edges.\r\n */\r\n faceTag?: any;\r\n}\r\n/**\r\n *\r\n * * A HalfEdge is \"one side of an edge\" in a structure of faces, edges and vertices. From a node there are navigational links to:\r\n * ** \"faceSuccessor\" -- the next half edge in a loop around a face.\r\n * ** \"facePredecessor\" -- the previous half edge in a loop around a face.\r\n * ** \"edgeMate\" -- the node's partner on the other side of the edge.\r\n * * The next, prev, and mate are the essential connectivity. Additional node content is for application-specific\r\n * uses. The most useful ones are:\r\n * ** x,y -- coordinates in the xy plane\r\n * ** z -- z coordinate. This is normally ignored during planar setup, but used for output.\r\n * ** buffer -- a integer value manipulated as individual bits.\r\n * * In properly connected planar graph, interior face loops are counterclockwise. But that property (along with\r\n * expected masking) is a result of extensive validation of inputs, and is not true in intermediate phases\r\n * of graph manipulation.\r\n * @internal\r\n */\r\nexport class HalfEdge implements HalfEdgeUserData {\r\n /** Vertex index in some parent object's numbering. */\r\n public i: number;\r\n /** bitmask bits, used to mark nodes as part of a triangle(idx 0) or visited when flipping(idx 1) */\r\n public maskBits: number;\r\n /** Vertex x coordinate */\r\n public x: number;\r\n /** Vertex y coordinate */\r\n public y: number;\r\n /** Vertex z coordinate */\r\n public z: number;\r\n /** angle used for sort-around-vertex */\r\n public sortAngle?: number; // used in sorting around vertex.\r\n /** numeric value for application-specific tagging (e.g. sorting) */\r\n public sortData?: number;\r\n /** application-specific data for the edge identifier.\r\n * * edge split operations are expected to copy this to new sub-edges.\r\n */\r\n public edgeTag?: any;\r\n /** application-specific data for the face loop\r\n * * edge split operations are expected to copy this to new sub-edges.\r\n */\r\n public faceTag?: any;\r\n private _id: any; // immutable id useful for debugging.\r\n /** id assigned sequentially during construction --- useful for debugging. */\r\n public get id() { return this._id; }\r\n private _facePredecessor: HalfEdge;\r\n private _faceSuccessor: HalfEdge;\r\n private _edgeMate: HalfEdge;\r\n /** previous half edge \"around the face\"\r\n */\r\n public get facePredecessor(): HalfEdge { return this._facePredecessor; }\r\n /** next half edge \"around the face\" */\r\n public get faceSuccessor(): HalfEdge { return this._faceSuccessor; }\r\n /** Half edge on the other side of this edge.\r\n */\r\n public get edgeMate(): HalfEdge { return this._edgeMate; }\r\n /** Take numStep face steps and return y coordinate\r\n * * positive steps are through faceSuccessor\r\n * * negative steps are through facePredecessor\r\n */\r\n public faceStepY(numStep: number): number {\r\n let node: HalfEdge = this;\r\n if (numStep > 0)\r\n for (let i = 0; i < numStep; i++) node = node.faceSuccessor;\r\n else if (numStep < 0)\r\n for (let i = 0; i > numStep; i--) node = node.facePredecessor;\r\n return node.y;\r\n }\r\n /**\r\n * * Create 2 half edges.\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * @returns Returns the reference to the first half edge created\r\n */\r\n public static createHalfEdgePair(heArray: HalfEdge[] | undefined): HalfEdge {\r\n const a = new HalfEdge();\r\n const b = new HalfEdge();\r\n if (heArray) {\r\n heArray.push(a);\r\n heArray.push(b);\r\n }\r\n\r\n HalfEdge.setFaceLinks(a, b);\r\n HalfEdge.setFaceLinks(b, a);\r\n HalfEdge.setEdgeMates(a, b);\r\n return a;\r\n }\r\n\r\n /**\r\n * * Create 2 half edges.\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * * Properties x,y,z,i are inserted in each\r\n * @returns Returns the reference to the first half edge created\r\n */\r\n public static createHalfEdgePairWithCoordinates(\r\n xA: number = 0,\r\n yA: number = 0,\r\n zA: number = 0,\r\n iA: number = 0,\r\n xB: number = 0,\r\n yB: number = 0,\r\n zB: number = 0,\r\n iB: number = 0,\r\n heArray: HalfEdge[] | undefined): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePair(heArray);\r\n const b = a._edgeMate;\r\n a.x = xA; a.y = yA; a.z = zA; a.i = iA;\r\n b.x = xB; b.y = yB; b.z = zB; b.i = iB;\r\n return a;\r\n }\r\n /**\r\n * * set heA <==> heB pointer relation through heA._faceSuccessor and heB._facePredecessor\r\n * * This changes heA._faceSuccessor and heB._facePredecessor, but not heA._facePredecessor and heB._faceSuccessor.\r\n * * this must always be done with another call to reestablish the entire double-linked list.\r\n */\r\n private static setFaceLinks(heA: HalfEdge, heB: HalfEdge) {\r\n heA._faceSuccessor = heB;\r\n heB._facePredecessor = heA;\r\n }\r\n /**\r\n * * set heA <==> heB pointer relation edgeMate\r\n */\r\n private static setEdgeMates(heA: HalfEdge, heB: HalfEdge) {\r\n heA._edgeMate = heB;\r\n heB._edgeMate = heA;\r\n }\r\n\r\n /**\r\n * * Create a new vertex within the edge from base.\r\n * * Insert it \"within\" the base edge.\r\n * * This requires two new half edges.\r\n * * if the base is undefined, create a single-edge loop.\r\n * * This (unlike pinch) breaks the edgeMate pairing of the base edge.\r\n * * This preserves xyz and i properties at all existing vertices.\r\n * * on each side, if edgeTag is present it is copied to the new edge.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public static splitEdge(baseA: undefined | HalfEdge,\r\n xA: number = 0, yA: number = 0, zA: number = 0, iA: number = 0, heArray: HalfEdge[] | undefined): HalfEdge {\r\n const newA = new HalfEdge(xA, yA, zA, iA);\r\n const newB = new HalfEdge(xA, yA, zA, iA);\r\n if (heArray) {\r\n heArray.push(newA);\r\n heArray.push(newB);\r\n }\r\n\r\n if (baseA === undefined) {\r\n newA._faceSuccessor = newA._facePredecessor = newA;\r\n newB._faceSuccessor = newB._facePredecessor = newB;\r\n HalfEdge.setEdgeMates(newA, newB);\r\n } else {\r\n const nextA = baseA._faceSuccessor;\r\n const mateA = baseA._edgeMate;\r\n const vPredA = mateA._faceSuccessor;\r\n HalfEdge.setFaceLinks(newA, nextA);\r\n HalfEdge.setFaceLinks(baseA, newA);\r\n HalfEdge.setFaceLinks(mateA, newB);\r\n HalfEdge.setFaceLinks(newB, vPredA);\r\n HalfEdge.setEdgeMates(newA, mateA);\r\n HalfEdge.setEdgeMates(newB, baseA);\r\n this.transferEdgeProperties(baseA, newA);\r\n this.transferEdgeProperties(mateA, newB);\r\n }\r\n return newA;\r\n }\r\n /**\r\n * * Create a new sliver face \"inside\" an existing edge.\r\n * * Insert it \"within\" the base edge.\r\n * * This requires two new half edges.\r\n * * if the base is undefined, create a single-edge loop.\r\n * * This (unlike pinch) breaks the edgeMate pairing of the base edge.\r\n * * This preserves xyz and i properties at all existing vertices.\r\n * * The two new half edges are a sliver face (via their predecessor and successor)\r\n * * Each new edge mates to one existing edge.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public static splitEdgeCreateSliverFace(\r\n baseA: HalfEdge,\r\n heArray: HalfEdge[] | undefined): HalfEdge {\r\n // raw edges ...\r\n const newA = new HalfEdge();\r\n const newB = new HalfEdge();\r\n const baseB = baseA.edgeMate;\r\n if (heArray) {\r\n heArray.push(newA);\r\n heArray.push(newB);\r\n }\r\n newA._faceSuccessor = newA._facePredecessor = newB;\r\n newB._faceSuccessor = newB._facePredecessor = newA;\r\n // newA is in vertex loop with baseA etc.\r\n // newA mates to baseB\r\n HalfEdge.setEdgeMates(newA, baseB);\r\n HalfEdge.setEdgeMates(newB, baseA);\r\n newA.copyDataFrom(baseA, true, true, false, false);\r\n newB.copyDataFrom(baseB, true, true, false, false);\r\n return newA;\r\n }\r\n\r\n private static _edgePropertyMasks: HalfEdgeMask[] = [HalfEdgeMask.BOUNDARY_EDGE, HalfEdgeMask.EXTERIOR, HalfEdgeMask.PRIMARY_EDGE, HalfEdgeMask.NULL_FACE];\r\n /**\r\n * Copy \"edge based\" content of fromNode to toNode\r\n * * edgeTag\r\n * * masks in _edgePropertyMasks: EXTERIOR, BOUNDARY_EDGE, NULL_FACE, PRIMARY_EDGE\r\n * @param fromNode\r\n * @param toNode\r\n */\r\n public static transferEdgeProperties(fromNode: HalfEdge, toNode: HalfEdge) {\r\n toNode.edgeTag = fromNode.edgeTag;\r\n for (const mask of this._edgePropertyMasks) {\r\n if (fromNode.getMask(mask))\r\n toNode.setMask(mask);\r\n else\r\n toNode.clearMask(mask);\r\n }\r\n }\r\n private static _totalNodesCreated = 0;\r\n public constructor(x: number = 0, y: number = 0, z: number = 0, i: number = 0) {\r\n this._id = HalfEdge._totalNodesCreated++;\r\n this.i = i;\r\n this.maskBits = 0x00000000;\r\n this.x = x;\r\n this.y = y;\r\n this.z = z;\r\n // Explicit init to undefined is important for performance here\r\n this.sortAngle = undefined;\r\n this.sortData = undefined;\r\n this.edgeTag = undefined;\r\n this.faceTag = undefined;\r\n // Always created in pairs, init here to make TS compiler and JS runtime happy\r\n this._facePredecessor = this;\r\n this._faceSuccessor = this;\r\n this._edgeMate = this;\r\n }\r\n\r\n /**\r\n * Return the next outbound half edge around this vertex in the CCW direction\r\n */\r\n public get vertexSuccessor(): HalfEdge { return this.facePredecessor.edgeMate; }\r\n /**\r\n * Return the next outbound half edge around this vertex in the CW direction\r\n */\r\n public get vertexPredecessor(): HalfEdge { return this.edgeMate.faceSuccessor; }\r\n /**\r\n * Set mask bits on this HalfEdge\r\n * @param mask mask to apply\r\n */\r\n public setMask(mask: HalfEdgeMask) { this.maskBits |= mask; }\r\n /**\r\n * Get mask bits from this HalfEdge\r\n * @param mask mask to query\r\n */\r\n public getMask(mask: HalfEdgeMask): number { return (this.maskBits & mask); }\r\n /**\r\n * Clear mask bits from this HalfEdge\r\n * @param mask mask to clear\r\n */\r\n public clearMask(mask: HalfEdgeMask) { this.maskBits &= ~mask; }\r\n /**\r\n * Set a mask at all nodes around a vertex.\r\n * @param mask mask to apply to the half edges around this HalfEdge's vertex loop\r\n */\r\n public setMaskAroundVertex(mask: HalfEdgeMask) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.setMask(mask);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n }\r\n\r\n /**\r\n * Set x,y,z at all nodes around a vertex.\r\n * @param mask mask to apply to the half edges around this HalfEdge's vertex loop\r\n */\r\n public setXYZAroundVertex(x: number, y: number, z: number) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.x = x; node.y = y; node.z = z;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n }\r\n /**\r\n * Apply a mask to all edges around a face.\r\n * @param mask mask to apply to the half edges around this HalfEdge's face loop\r\n */\r\n public setMaskAroundFace(mask: HalfEdgeMask) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.setMask(mask);\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n\r\n /**\r\n * Apply a mask to both sides of an edge.\r\n * @param mask mask to apply to this edge and its `edgeMate`\r\n */\r\n public setMaskAroundEdge(mask: HalfEdgeMask) {\r\n this.setMask(mask);\r\n this.edgeMate.setMask(mask);\r\n }\r\n\r\n /**\r\n * Clear a mask on both sides of an edge.\r\n * @param mask mask to clear on this edge and its `edgeMate`\r\n */\r\n public clearMaskAroundEdge(mask: HalfEdgeMask) {\r\n this.clearMask(mask);\r\n this.edgeMate.clearMask(mask);\r\n }\r\n\r\n /** Returns the number of edges around this face. */\r\n public countEdgesAroundFace(): number {\r\n let count = 0;\r\n let node: HalfEdge = this;\r\n do {\r\n count++;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return count;\r\n }\r\n\r\n /** Return true if other is in the vertex loop around this. */\r\n public findAroundVertex(other: HalfEdge): boolean {\r\n let node: HalfEdge = this;\r\n do {\r\n if (node === other)\r\n return true;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return false;\r\n }\r\n\r\n /** Return true if other is in the face loop around this. */\r\n public findAroundFace(other: HalfEdge): boolean {\r\n let node: HalfEdge = this;\r\n do {\r\n if (node === other)\r\n return true;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return false;\r\n }\r\n\r\n /**\r\n * @return whether the mask is set (or unset) on all nodes of the face loop\r\n */\r\n public isMaskedAroundFace(mask: HalfEdgeMask, value: boolean = true): boolean {\r\n let node: HalfEdge = this;\r\n if (value) {\r\n do {\r\n if (!node.isMaskSet(mask))\r\n return false;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n } else {\r\n do {\r\n if (node.isMaskSet(mask))\r\n return false;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Apply a edgeTag and mask to all edges around a face.\r\n * optionally apply it to all edge mates.\r\n * @param edgeTag tag to apply\r\n * @param bothSides If true, also apply the tag to the mates around the face.\r\n */\r\n public setMaskAndEdgeTagAroundFace(mask: HalfEdgeMask, tag: any, applyToMate: boolean = false) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.setMask(mask);\r\n node.edgeTag = tag;\r\n if (applyToMate) {\r\n const mate = node.edgeMate;\r\n mate.edgeTag = tag;\r\n mate.setMask(mask);\r\n }\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n\r\n /** Returns the number of edges around vertex. */\r\n public countEdgesAroundVertex(): number {\r\n let count = 0;\r\n let node: HalfEdge = this;\r\n do {\r\n count++;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return count;\r\n }\r\n\r\n /** Returns the number of nodes found with the given mask value around this vertex loop. */\r\n public countMaskAroundFace(mask: HalfEdgeMask, value: boolean = true): number {\r\n let count = 0;\r\n let node: HalfEdge = this;\r\n if (value) {\r\n do {\r\n if (node.isMaskSet(mask)) count++;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n } else {\r\n do {\r\n if (!node.isMaskSet(mask)) count++;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n return count;\r\n }\r\n\r\n /** Returns the number of nodes found with the given mask value around this vertex loop. */\r\n public countMaskAroundVertex(mask: HalfEdgeMask, value: boolean = true): number {\r\n let count = 0;\r\n let node: HalfEdge = this;\r\n if (value) {\r\n do {\r\n if (node.isMaskSet(mask)) count++;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n } else {\r\n do {\r\n if (!node.isMaskSet(mask)) count++;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n }\r\n return count;\r\n }\r\n\r\n /** Returns the first node with given mask value around this vertex loop. */\r\n public findMaskAroundVertex(mask: HalfEdgeMask, value: boolean = true): HalfEdge | undefined {\r\n let node: HalfEdge = this;\r\n do {\r\n if (node.isMaskSet(mask) === value)\r\n return node;\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return undefined;\r\n }\r\n\r\n /** Returns the first node with given mask value around this face loop. */\r\n public findMaskAroundFace(mask: HalfEdgeMask, value: boolean = true): HalfEdge | undefined {\r\n let node: HalfEdge = this;\r\n do {\r\n if (node.isMaskSet(mask) === value)\r\n return node;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return undefined;\r\n }\r\n /** Returns the first node with given mask value on this edge (i.e. examining this and this.mate) */\r\n public findMaskAroundEdge(mask: HalfEdgeMask, value: boolean = true): HalfEdge | undefined {\r\n if (this.isMaskSet(mask) === value)\r\n return this;\r\n const mate = this.edgeMate;\r\n if (mate.isMaskSet(mask) === value)\r\n return mate;\r\n return undefined;\r\n }\r\n\r\n /** Set a mask, and return prior value.\r\n * @param mask mask to apply\r\n */\r\n public testAndSetMask(mask: HalfEdgeMask): number {\r\n const oldMask = this.maskBits & mask;\r\n this.maskBits |= mask;\r\n return oldMask;\r\n }\r\n /**\r\n * Set (copy) the this.x, this.y, this.z from node.x, node.y, node.z\r\n * @param node node containing xyz\r\n */\r\n public setXYZFrom(node: HalfEdge) {\r\n this.x = node.x;\r\n this.y = node.y;\r\n this.z = node.z;\r\n }\r\n\r\n /**\r\n * Set (copy) the this.x, this.y, this.z from xyz.x, xyz.y, xyz.z\r\n * @param node source with x,y,z properties\r\n */\r\n public setXYZ(xyz: XYAndZ) {\r\n this.x = xyz.x;\r\n this.y = xyz.y;\r\n this.z = xyz.z;\r\n }\r\n /**\r\n * Test if mask bits are set in the node's bitMask.\r\n * @return Return true (as a simple boolean, not a mask) if any bits of the mask parameter match bits of the node's bitMask\r\n */\r\n public isMaskSet(mask: HalfEdgeMask): boolean { return (this.maskBits & mask) !== 0; }\r\n\r\n /** (static!) method to test if a mask is set on a node.\r\n * This is used as filter in searches.\r\n * @returns true iff `node.isMaskSet (mask)`\r\n */\r\n public static filterIsMaskOn(node: HalfEdge, mask: HalfEdgeMask): boolean {\r\n return node.isMaskSet(mask);\r\n }\r\n /** (static!) method to test if a mask is set on a node.\r\n * This is used as filter in searches.\r\n * @returns true iff `!node.isMaskSet (mask)`\r\n */\r\n public static filterIsMaskOff(node: HalfEdge, mask: HalfEdgeMask): boolean {\r\n return !node.isMaskSet(mask);\r\n }\r\n\r\n /**\r\n * Create an edge with initial id,x,y at each end.\r\n * @param id0 id for first node\r\n * @param x0 x coordinate for first node\r\n * @param y0 y coordinate for first node\r\n * @param id1 id for second node\r\n * @param x1 x coordinate for second node\r\n * @param y1 y coordinate for second node\r\n */\r\n public static createEdgeXYXY(id0: any, x0: number, y0: number, id1: any, x1: number, y1: number): HalfEdge {\r\n const node0 = new HalfEdge(x0, y0);\r\n const node1 = new HalfEdge(x1, y1);\r\n node0._faceSuccessor = node0._facePredecessor = node0._edgeMate = node1;\r\n node1._faceSuccessor = node1._facePredecessor = node1._edgeMate = node0;\r\n node0._id = id0;\r\n node1._id = id1;\r\n return node0;\r\n }\r\n\r\n /** \"pinch\" ...\r\n *\r\n * * is the universal manipulator for manipulating a node's next and prev pointers\r\n * * swaps face predecessors of nodeA and nodeB.\r\n * * is its own inverse.\r\n * * if nodeA, nodeB are in different face loops, the loops join to one loop.\r\n * * if nodeA, nodeB are in the same face loop, the loop splits into two loops.\r\n */\r\n public static pinch(nodeA: HalfEdge, nodeB: HalfEdge) {\r\n if (nodeA !== nodeB) {\r\n const predA = nodeA._facePredecessor;\r\n const predB = nodeB._facePredecessor;\r\n nodeB._facePredecessor = predA;\r\n nodeA._facePredecessor = predB;\r\n predB._faceSuccessor = nodeA;\r\n predA._faceSuccessor = nodeB;\r\n }\r\n }\r\n\r\n /**\r\n * Pinch this half edge out of its base vertex loop.\r\n * @return the surviving HalfEdge in the vertex loop, or undefined if the instance HalfEdge is already dangling\r\n */\r\n public yankFromVertexLoop(): HalfEdge | undefined {\r\n const other = this.edgeMate.faceSuccessor;\r\n if (other === this)\r\n return undefined;\r\n HalfEdge.pinch(this, other);\r\n return other;\r\n }\r\n\r\n /** Turn all pointers to undefined so garbage collector can reuse the object.\r\n * This is to be called only by a Graph object that is being decommissioned.\r\n */\r\n public decommission() {\r\n (this._facePredecessor as any) = undefined;\r\n (this._faceSuccessor as any) = undefined;\r\n (this._edgeMate as any) = undefined;\r\n }\r\n\r\n /** Return the node. This identity function is useful as the NodeFunction in collector methods. */\r\n public static nodeToSelf(node: HalfEdge): any { return node; }\r\n /** Return the id of a node. Useful for collector methods. */\r\n public static nodeToId(node: HalfEdge): any { return node.id; }\r\n /** Return the id of a node.Useful for collector methods. */\r\n public static nodeToIdString(node: HalfEdge): any { return node.id.toString(); }\r\n\r\n /** Return the [id, [x,y]] of a node. Useful for collector methods. */\r\n public static nodeToIdMaskXY(node: HalfEdge): { id: any, mask: any, xy: number[] } {\r\n return { id: node.id, mask: HalfEdge.nodeToMaskString(node), xy: [node.x, node.y] };\r\n }\r\n /** Return the [id, [x,y]] of a node. Useful for collector methods. */\r\n public static nodeToIdXYString(node: HalfEdge): string {\r\n const s = `${node.id.toString()}+${HalfEdge.nodeToMaskString(node)}[${node.x},${node.y}]`;\r\n return s;\r\n }\r\n\r\n /** Return the [id, [x,y],z] of a node. Useful for collector methods. */\r\n public static nodeToIdXYZString(node: HalfEdge): string {\r\n return `[${node.id.toString()}: ${node.x},${node.y},${node.z}]`;\r\n }\r\n\r\n /** Create a string representation of the mask\r\n * * Null mask is empty string.\r\n * * Appended characters B,P,X for Boundary, Primary, Exterior mask bits.\r\n */\r\n public static nodeToMaskString(node: HalfEdge): string {\r\n let s = \"\";\r\n if (node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE)) s += \"B\";\r\n if (node.isMaskSet(HalfEdgeMask.PRIMARY_EDGE)) s += \"P\";\r\n if (node.isMaskSet(HalfEdgeMask.EXTERIOR)) s += \"X\";\r\n if (node.isMaskSet(HalfEdgeMask.NULL_FACE)) s += \"N\";\r\n return s;\r\n }\r\n /** Return [x,y] with coordinates of node */\r\n public static nodeToXY(node: HalfEdge): number[] { return [node.x, node.y]; }\r\n /** Return Vector2d to face successor, with only xy coordinates */\r\n public vectorToFaceSuccessorXY(result?: Vector2d): Vector2d {\r\n return Vector2d.create(this.faceSuccessor.x - this.x, this.faceSuccessor.y - this.y, result);\r\n }\r\n /** Return Vector3d to face successor */\r\n public vectorToFaceSuccessor(result?: Vector3d): Vector3d {\r\n const other = this.faceSuccessor;\r\n return Vector3d.create(\r\n other.x - this.x,\r\n other.y - this.y,\r\n other.z - this.z,\r\n result);\r\n }\r\n /** Return Vector3d to face successor */\r\n public vectorToFacePredecessor(result?: Vector3d): Vector3d {\r\n const other = this.facePredecessor;\r\n return Vector3d.create(\r\n other.x - this.x,\r\n other.y - this.y,\r\n other.z - this.z,\r\n result);\r\n }\r\n /** test if spaceNode is in the sector at sectorNode */\r\n public static isNodeVisibleInSector(spaceNode: HalfEdge, sectorNode: HalfEdge): boolean {\r\n // remark: fussy details ported from native code.\r\n // The obscure cases seemed \"unlikely\" at first. But preexisting unit tests for triangulation pinged just about everything.\r\n // So it really matters to do the \"0\" cases this way.\r\n // (As usual, hard coded zero is suspect, but it seems to work nicely in the discrete decisions.)\r\n if (sectorNode.vertexSuccessor === sectorNode)\r\n return true;\r\n const successor = sectorNode.faceSuccessor;\r\n const predecessor = sectorNode.facePredecessor;\r\n const successorCross = this.crossProductXYToTargets(sectorNode, successor, spaceNode);\r\n const predecessorCross = this.crossProductXYToTargets(predecessor, sectorNode, spaceNode);\r\n // simplest case: two positives\r\n if (successorCross > 0.0 && predecessorCross > 0.0)\r\n return true;\r\n\r\n const sectorCross = this.crossProductXYToTargets(predecessor, sectorNode, successor);\r\n\r\n if (predecessorCross <= 0.0 && successorCross <= 0.0) {\r\n if (predecessorCross === 0.0 && successorCross === 0.0 && sectorCross === 0.0) {\r\n /* Everything is on a line.*/\r\n /* If the sector is a degenerate face, nodeP can only be\r\n in if it is the other node in the degenerate face.\r\n */\r\n if (predecessor === successor && sectorNode.vertexSuccessor !== sectorNode)\r\n return spaceNode === successor;\r\n /* Sector is 360 degrees. Call it in only if vector from predP\r\n to sectorP points forward to nodeP.\r\n */\r\n return HalfEdge.dotProductNodeToNodeVectorsXY(predecessor, sectorNode, sectorNode, spaceNode) > 0.0;\r\n\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (sectorCross === 0.0 && predecessorCross !== 0.0 && successorCross !== 0.0) {\r\n // The incoming and outgoing edges at the sector are identical direction.\r\n // We have to decide if this node is inside the degenerate face (i.e. a geometrically empty sector)\r\n // or outside (i.e. a nearly complete sector).\r\n // In the inside case, the face is just two nodes.\r\n // Exact equality for zero is ok because cross product should be using identical\r\n // coordinates in subtracted terms. (All furrow eyebrows in unison ....)\r\n return predecessor !== successor;\r\n }\r\n return sectorCross < 0.0;\r\n }\r\n\r\n }\r\n\r\n /** Returns Return cross product (2d) of vectors from baseA to targetA and baseB to targetB */\r\n public static crossProductXYToTargets(base: HalfEdge, targetA: HalfEdge, targetB: HalfEdge): number {\r\n return Geometry.crossProductXYXY(\r\n targetA.x - base.x, targetA.y - base.y,\r\n targetB.x - base.x, targetB.y - base.y);\r\n }\r\n\r\n /** Returns Return dot product (2d) of vectors along two edges. */\r\n public static dotProductNodeToNodeVectorsXY(baseA: HalfEdge, targetA: HalfEdge, baseB: HalfEdge, targetB: HalfEdge): number {\r\n return Geometry.dotProductXYXY(\r\n targetA.x - baseA.x, targetA.y - baseA.y,\r\n targetB.x - baseB.x, targetB.y - baseB.y);\r\n }\r\n\r\n /** Return cross product (2d) of vectors from nodeA to nodeB and nodeB to nodeC\r\n */\r\n public static crossProductXYAlongChain(nodeA: HalfEdge, nodeB: HalfEdge, nodeC: HalfEdge): number {\r\n return Geometry.crossProductXYXY(\r\n nodeB.x - nodeA.x, nodeB.y - nodeA.y,\r\n nodeC.x - nodeB.x, nodeC.y - nodeB.y);\r\n }\r\n\r\n /**\r\n * Compute whether the sector defined by the chain of nodes is convex.\r\n * * This computation ignores z-coordinates and connectivity, so the nodes are not required to be in the same face loop.\r\n * @param nodeA the first node in the chain, nominally the face predecessor of nodeB\r\n * @param nodeB the second node in the chain; the node at the sector vertex\r\n * @param nodeC the third node in the chain, nominally the face successor of nodeB\r\n * @param signedAreaTol optional signed area tolerance to use in test for parallel vectors.\r\n * Typically this is a fraction of the sector's face's signed area. We can't compute area here, so if undefined, zero tolerance is used.\r\n * @returns true iff the sector is convex\r\n */\r\n public static isSectorConvex(nodeA: HalfEdge, nodeB: HalfEdge, nodeC: HalfEdge, signedAreaTol: number = 0): boolean {\r\n const signedSectorArea = 0.5 * HalfEdge.crossProductXYAlongChain(nodeA, nodeB, nodeC);\r\n signedAreaTol = signedAreaTol ?? 0.0;\r\n if (Math.abs(signedSectorArea) <= Math.abs(signedAreaTol)) {\r\n // the sector vectors are nearly parallel or antiparallel; only the former is deemed convex.\r\n return HalfEdge.dotProductNodeToNodeVectorsXY(nodeA, nodeB, nodeB, nodeC) > 0.0;\r\n }\r\n return signedSectorArea > -signedAreaTol; // call it convex even if we are a little bit on the other side of zero\r\n }\r\n\r\n /**\r\n * Compute whether the sector at this node is convex.\r\n * * This computation ignores z-coordinates.\r\n * @param signedAreaTol optional signed area tolerance to use in test for parallel vectors.\r\n * If undefined, a fraction ([[Geometry.smallMetricDistanceSquared]]) of the computed signed area is used.\r\n * Pass zero to skip toleranced computation.\r\n * @returns true iff the sector is convex and its two edges are not antiparallel.\r\n */\r\n public isSectorConvex(signedAreaTol?: number): boolean {\r\n if (signedAreaTol === undefined)\r\n signedAreaTol = Geometry.smallMetricDistanceSquared * this.signedFaceArea();\r\n return HalfEdge.isSectorConvex(this.facePredecessor, this, this.faceSuccessor, signedAreaTol);\r\n }\r\n\r\n /**\r\n * Compute whether this face is convex.\r\n * * This computation ignores z-coordinates.\r\n * @param tolerance optional relative tolerance to use in test for parallel vectors.\r\n * Default value is [[Geometry.smallMetricDistanceSquared]].\r\n * Pass zero to skip toleranced computation.\r\n * @returns true iff this face is convex.\r\n */\r\n public isFaceConvex(tolerance: number = Geometry.smallMetricDistanceSquared): boolean {\r\n let node: HalfEdge = this;\r\n const signedAreaTol = tolerance > 0.0 ? tolerance * node.signedFaceArea() : 0.0;\r\n do {\r\n if (!node.isSectorConvex(signedAreaTol))\r\n return false;\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return true;\r\n }\r\n\r\n /**\r\n * Isolate the edge from the graph by yanking each end from its vertex loop.\r\n */\r\n public isolateEdge() {\r\n const mate = this.edgeMate;\r\n this.yankFromVertexLoop();\r\n mate.yankFromVertexLoop();\r\n }\r\n\r\n /**\r\n * @return whether this edge is isolated from the rest of the graph.\r\n */\r\n public get isIsolatedEdge() {\r\n return this === this.vertexSuccessor && this.edgeMate === this.edgeMate.vertexSuccessor;\r\n }\r\n\r\n /** Return true if `this` is lexically below `other`, comparing y first then x. */\r\n public belowYX(other: HalfEdge): boolean {\r\n // Check y's\r\n // if (!Geometry.isSameCoordinate(a.y, b.y))\r\n\r\n if (this.y < other.y)\r\n return true;\r\n if (this.y > other.y)\r\n return false;\r\n // same y.\r\n // Check x's\r\n if (this.x < other.x)\r\n return true;\r\n return false;\r\n }\r\n /** Returns Returns true if the node does NOT have Mask.EXTERIOR_MASK set. */\r\n public static testNodeMaskNotExterior(node: HalfEdge) { return !node.isMaskSet(HalfEdgeMask.EXTERIOR); }\r\n\r\n /** Returns Returns true if the edge mate has Mask.EXTERIOR_MASK set. */\r\n public static testMateMaskExterior(node: HalfEdge) { return node.edgeMate.isMaskSet(HalfEdgeMask.EXTERIOR); }\r\n\r\n /** Returns radians between this edge and its face predecessor edge, using all three coordinates x,y,z and given normal to resolve sweep direction.\r\n * * The returned angle is positive, i.e. may be larger than PI radians.\r\n */\r\n public static sectorSweepRadiansXYZ(node: HalfEdge, normal: Vector3d): number {\r\n const nodeB = node.faceSuccessor;\r\n const nodeC = node.facePredecessor;\r\n return Angle.orientedRadiansBetweenVectorsXYZ(\r\n nodeB.x - node.x, nodeB.y - node.y, nodeB.z - node.z,\r\n nodeC.x - node.x, nodeC.y - node.y, nodeC.z - node.z,\r\n normal.x, normal.y, normal.z, true);\r\n }\r\n\r\n /** Returns Returns true if the face has positive area in xy parts. */\r\n public static testFacePositiveAreaXY(node: HalfEdge) {\r\n return node.countEdgesAroundFace() > 2 && node.signedFaceArea() > 0.0;\r\n }\r\n\r\n /** Return true if x and y coordinates of this and other are exactly equal */\r\n public isEqualXY(other: XAndY | HalfEdge): boolean {\r\n return this.x === other.x && this.y === other.y;\r\n }\r\n\r\n /** Return distance between xy coordinates of this and other node */\r\n public distanceXY(other: HalfEdge): number {\r\n return Geometry.distanceXYXY(this.x, this.y, other.x, other.y);\r\n }\r\n\r\n /** Return distance between xyz coordinates of this and other node */\r\n public distanceXYZ(other: HalfEdge): number {\r\n return Geometry.distanceXYZXYZ(this.x, this.y, this.z, other.x, other.y, other.z);\r\n }\r\n /**\r\n *\r\n * * Evaluate f(node) at each node around a face loop.\r\n * * Collect the function values.\r\n * @returns Return the array of function values.\r\n */\r\n public collectAroundFace(f?: NodeFunction): any[] {\r\n const nodes = [];\r\n let node: HalfEdge = this;\r\n do {\r\n nodes.push(f ? f(node) : node);\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return nodes;\r\n }\r\n /**\r\n * search around a vertex for nodes that have a specified mask setting.\r\n * @param vertexSeed first node to search\r\n * @param mask target mask\r\n * @param value target value for mask on half edges.\r\n * @param collectedNodes optional array to be cleared and receive masked nodes\r\n */\r\n public collectMaskedEdgesAroundVertex(\r\n mask: HalfEdgeMask,\r\n value: boolean = true,\r\n result?: HalfEdge[]): HalfEdge[] {\r\n if (result === undefined)\r\n result = [];\r\n else\r\n result.length = 0;\r\n let node: HalfEdge = this;\r\n do {\r\n if (node.isMaskSet(mask) === value)\r\n result.push(node);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return result;\r\n }\r\n\r\n /**\r\n *\r\n * * Evaluate f(node) at each outbound node around this node's vertex loop.\r\n * * Collect the function values.\r\n * @returns Return the array of function values.\r\n */\r\n public collectAroundVertex(f?: NodeFunction): any[] {\r\n const nodes = [];\r\n let node: HalfEdge = this;\r\n do {\r\n nodes.push(f ? f(node) : node);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return nodes;\r\n }\r\n\r\n /**\r\n *\r\n * * Evaluate f(node) at each node around a face loop.\r\n * * Sum the function values\r\n * @returns Return the sum\r\n */\r\n public sumAroundFace(f: NodeToNumberFunction): number {\r\n let node: HalfEdge = this;\r\n let sum = 0;\r\n do {\r\n sum += f(node);\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n return sum;\r\n }\r\n\r\n /**\r\n *\r\n * * Evaluate f(node) at each outbound node around this node's vertex loop.\r\n * * Sum the function values\r\n * @returns Return the sum\r\n */\r\n public sumAroundVertex(f: NodeToNumberFunction): number {\r\n let node: HalfEdge = this;\r\n let sum = 0;\r\n do {\r\n sum += f(node);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n return sum;\r\n }\r\n /** For all the nodes in the face loop of the given node, clear out the mask given */\r\n public clearMaskAroundFace(mask: HalfEdgeMask) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.clearMask(mask);\r\n node = node.faceSuccessor;\r\n } while (node !== this);\r\n }\r\n\r\n /** For all the nodes in the vertex loop of the given node, clear out the mask given */\r\n public clearMaskAroundVertex(mask: HalfEdgeMask) {\r\n let node: HalfEdge = this;\r\n do {\r\n node.clearMask(mask);\r\n node = node.vertexSuccessor;\r\n } while (node !== this);\r\n }\r\n /**\r\n * Compute the signed sum of xy areas of triangles from first node to edges.\r\n * * A positive area is counterclockwise.\r\n * * A negative area is clockwise.\r\n * @returns signed area of this node's face\r\n */\r\n public signedFaceArea(): number {\r\n let sum = 0;\r\n // sum area of trapezoids.\r\n // * the formula in the loop gives twice the area (because it does not average the y values).\r\n // * this is fixed up at the end by a single multiply by 0.5\r\n // * individual trapezoid heights are measured from y at the start node to keep area values numerical smaller.\r\n const y0 = this.y;\r\n let dy0 = 0.0;\r\n let dy1 = 0.0;\r\n let x0 = this.x;\r\n let x1;\r\n let node1;\r\n let node0: HalfEdge = this;\r\n do {\r\n node1 = node0.faceSuccessor;\r\n x1 = node1.x;\r\n dy1 = node1.y - y0;\r\n sum += (x0 - x1) * (dy0 + dy1);\r\n x0 = x1;\r\n dy0 = dy1;\r\n node0 = node1;\r\n } while (node0 !== this);\r\n return 0.5 * sum;\r\n }\r\n /**\r\n * interpolate xy coordinates between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n * @param result xy coordinates\r\n */\r\n public fractionToPoint2d(fraction: number, result?: Point2d): Point2d {\r\n const node1 = this.faceSuccessor;\r\n return Point2d.create(\r\n this.x + (node1.x - this.x) * fraction,\r\n this.y + (node1.y - this.y) * fraction,\r\n result);\r\n }\r\n /**\r\n * interpolate xy coordinates between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n * @param result xy coordinates\r\n */\r\n public fractionToPoint3d(fraction: number, result?: Point3d): Point3d {\r\n const node1 = this.faceSuccessor;\r\n return Point3d.create(\r\n this.x + (node1.x - this.x) * fraction,\r\n this.y + (node1.y - this.y) * fraction,\r\n this.z + (node1.z - this.z) * fraction,\r\n result);\r\n }\r\n /**\r\n * * interpolate xy coordinates at fractionAlong between this node and its face successor.\r\n * * shift to left by fractionPerpendicular\r\n * @param fraction fractional position along this edge.\r\n * @param result xy coordinates\r\n */\r\n public fractionAlongAndPerpendicularToPoint2d(fractionAlong: number, fractionPerpendicular: number, result?: Point2d): Point2d {\r\n const node1 = this.faceSuccessor;\r\n const dx = node1.x - this.x;\r\n const dy = node1.y - this.y;\r\n return Point2d.create(\r\n this.x + dx * fractionAlong - dy * fractionPerpendicular,\r\n this.y + dy * fractionAlong + dx * fractionPerpendicular,\r\n result);\r\n }\r\n\r\n /**\r\n * return the 3d coordinates at this half edge base\r\n */\r\n public getPoint3d(result?: Point3d): Point3d {\r\n return Point3d.create(this.x, this.y, this.z, result);\r\n }\r\n /**\r\n * return the 2d coordinates at this half edge base\r\n */\r\n public getPoint2d(result?: Point2d): Point2d {\r\n return Point2d.create(this.x, this.y, result);\r\n }\r\n /**\r\n * return a 3d vector from start to end of this half edge.\r\n */\r\n public getVector3dAlongEdge(result?: Vector3d): Vector3d {\r\n const nodeB = this.faceSuccessor;\r\n return Vector3d.create(nodeB.x - this.x, nodeB.y - this.y, nodeB.z - this.z, result);\r\n }\r\n\r\n /**\r\n * return a 2d vector from start to end of this half edge\r\n */\r\n public getVector2dAlongEdge(result?: Vector2d): Vector2d {\r\n const nodeB = this.faceSuccessor;\r\n return Vector2d.create(nodeB.x - this.x, nodeB.y - this.y, result);\r\n }\r\n /**\r\n * Return the interpolated x coordinate between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n */\r\n public fractionToX(fraction: number): number {\r\n const node1 = this.faceSuccessor;\r\n return this.x + (node1.x - this.x) * fraction;\r\n }\r\n /**\r\n * Return the interpolated y coordinate between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n */\r\n public fractionToY(fraction: number): number {\r\n const node1 = this.faceSuccessor;\r\n return this.y + (node1.y - this.y) * fraction;\r\n }\r\n\r\n /**\r\n * Return the interpolated z coordinate between this node and its face successor.\r\n * @param fraction fractional position along this edge.\r\n */\r\n public fractionToZ(fraction: number): number {\r\n const node1 = this.faceSuccessor;\r\n return this.z + (node1.z - this.z) * fraction;\r\n }\r\n /**\r\n * * Compute fractional coordinates of the intersection of edges from given base nodes\r\n * * If parallel or colinear, return undefined.\r\n * * If (possibly extended) lines intersect, return the fractions of intersection as x,y in the result.\r\n * @param nodeA0 Base node of edge A\r\n * @param nodeB0 Base node of edge B\r\n * @param result optional preallocated result\r\n */\r\n public static transverseIntersectionFractions(nodeA0: HalfEdge, nodeB0: HalfEdge, result?: Vector2d): Vector2d | undefined {\r\n const nodeA1 = nodeA0.faceSuccessor;\r\n const nodeB1 = nodeB0.faceSuccessor;\r\n if (!result)\r\n result = Vector2d.create();\r\n if (SmallSystem.linearSystem2d(\r\n nodeA1.x - nodeA0.x, nodeB0.x - nodeB1.x,\r\n nodeA1.y - nodeA0.y, nodeB0.y - nodeB1.y,\r\n nodeB0.x - nodeA0.x, nodeB0.y - nodeA0.y,\r\n result))\r\n return result;\r\n return undefined;\r\n }\r\n /**\r\n * * Compute fractional coordinates of the intersection of a horizontal line with an edge.\r\n * * If the edge is horizontal with (approximate) identical y, return the node.\r\n * * If the edge is horizontal with different y, return undefined.\r\n * * If the edge is not horizontal, return the fractional position (possibly outside 0..1) of the intersection.\r\n * @param node0 Base node of edge\r\n */\r\n public static horizontalScanFraction(node0: HalfEdge, y: number): number | undefined | HalfEdge {\r\n const node1 = node0.faceSuccessor;\r\n const dy = node1.y - node0.y;\r\n if (Geometry.isSameCoordinate(y, node0.y) && Geometry.isSameCoordinate(y, node1.y))\r\n return node0;\r\n if (Geometry.isSameCoordinate(dy, 0.0))\r\n return undefined;\r\n return Geometry.conditionalDivideFraction(y - node0.y, dy);\r\n }\r\n\r\n /**\r\n * * Compute fractional coordinates of the intersection of a horizontal line with an edge.\r\n * * If the edge is horizontal return undefined (no test for horizontal at y!!!)\r\n * * If the edge is not horizontal and y is between its end y's, return the fraction\r\n * @param node0 Base node of edge\r\n */\r\n public static horizontalScanFraction01(node0: HalfEdge, y: number): number | undefined {\r\n const node1 = node0.faceSuccessor;\r\n const dy = node1.y - node0.y;\r\n if (Geometry.isSameCoordinate(y, node0.y) && Geometry.isSameCoordinate(y, node1.y))\r\n return undefined;\r\n if (Geometry.isSameCoordinate(dy, 0.0))\r\n return undefined;\r\n const fraction = Geometry.conditionalDivideFraction(y - node0.y, dy);\r\n if (fraction !== undefined && fraction >= 0.0 && fraction <= 1.0)\r\n return fraction;\r\n return undefined;\r\n }\r\n /**\r\n * Copy various data from source to this.\r\n * @param source other half edge.\r\n * @param XYZ copy simple coordinates\r\n * @param copyVertexData true to copy data belonging to the vertex. (i.e. the \"i\" member)\r\n * @param copyVertexData true to copy data belonging to the edge. (i.e. call transferEdgeData)\r\n * @param copyFaceData true to copy faceTag\r\n */\r\n public copyDataFrom(source: HalfEdge, copyXYZ: boolean, copyVertexData: boolean, copyEdgeData: boolean, copyFaceData: boolean) {\r\n if (copyXYZ) {\r\n this.x = source.x;\r\n this.y = source.y;\r\n this.z = source.z;\r\n }\r\n if (copyVertexData) {\r\n this.i = source.i;\r\n }\r\n if (copyEdgeData) {\r\n HalfEdge.transferEdgeProperties(source, this);\r\n this.edgeTag = source.edgeTag;\r\n }\r\n if (copyFaceData) {\r\n this.faceTag = source.faceTag;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A HalfEdgeGraph has:\r\n * * An array of (pointers to ) HalfEdge objects.\r\n * * A pool of masks for grab/drop use by algorithms.\r\n * @internal\r\n */\r\nexport class HalfEdgeGraph {\r\n /** Simple array with pointers to all the half edges in the graph. */\r\n public allHalfEdges: HalfEdge[];\r\n private _maskManager: MaskManager;\r\n private _numNodesCreated = 0;\r\n public constructor() {\r\n this.allHalfEdges = [];\r\n this._maskManager = MaskManager.create(HalfEdgeMask.ALL_GRAB_DROP_MASKS)!;\r\n }\r\n /** Ask for a mask (from the graph's free pool.) for caller's use.\r\n * * Optionally clear the mask throughout the graph.\r\n */\r\n public grabMask(clearInAllHalfEdges: boolean = true): HalfEdgeMask {\r\n const mask = this._maskManager.grabMask();\r\n if (clearInAllHalfEdges) {\r\n this.clearMask(mask);\r\n }\r\n return mask;\r\n }\r\n /**\r\n * Return `mask` to the free pool.\r\n */\r\n public dropMask(mask: HalfEdgeMask) { this._maskManager.dropMask(mask); }\r\n /**\r\n * * Create 2 half edges forming 2 vertices, 1 edge, and 1 face\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * * The two edges are added to the graph's HalfEdge set\r\n * @returns Return pointer to the first half edge created.\r\n */\r\n public createEdgeXYZXYZ(\r\n xA: number = 0,\r\n yA: number = 0,\r\n zA: number = 0,\r\n iA: number = 0,\r\n xB: number = 0,\r\n yB: number = 0,\r\n zB: number = 0,\r\n iB: number = 0): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(xA, yA, zA, iA, xB, yB, zB, iB, this.allHalfEdges);\r\n return a;\r\n }\r\n /**\r\n * * Create 2 half edges forming 2 vertices, 1 edge, and 1 face\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * * The two edges are added to the graph's HalfEdge set\r\n * * Coordinates are set to zero.\r\n * * ids are installed in the two half edges.\r\n * @returns Return pointer to the first half edge created. (This has idA as its id.)\r\n */\r\n public createEdgeIdId(iA: number = 0, iB: number = 0): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(0.0, 0.0, 0.0, iA, 0.0, 0.0, 0.0, iB, this.allHalfEdges);\r\n return a;\r\n }\r\n /**\r\n * * create an edge from coordinates x,y,z to (the tail of) an existing half edge.\r\n * @returns Return pointer to the half edge with tail at x,y,z\r\n */\r\n public createEdgeXYZHalfEdge(\r\n xA: number = 0,\r\n yA: number = 0,\r\n zA: number = 0,\r\n iA: number = 0,\r\n node: HalfEdge,\r\n iB: number = 0): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(xA, yA, zA, iA, node.x, node.y, node.z, iB, this.allHalfEdges);\r\n const b = a.faceSuccessor;\r\n HalfEdge.pinch(node, b);\r\n return a;\r\n }\r\n /**\r\n * * create an edge from coordinates x,y,z to (the tail of) an existing half edge.\r\n * @returns Return pointer to the half edge with tail at x,y,z\r\n */\r\n public createEdgeHalfEdgeHalfEdge(\r\n nodeA: HalfEdge,\r\n idA: number,\r\n nodeB: HalfEdge,\r\n idB: number = 0): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(nodeA.x, nodeA.y, nodeA.z, idA, nodeB.x, nodeB.y, nodeB.z, idB, this.allHalfEdges);\r\n const b = a.faceSuccessor;\r\n HalfEdge.pinch(nodeA, a);\r\n HalfEdge.pinch(nodeB, b);\r\n return a;\r\n }\r\n\r\n /**\r\n * * Create 2 half edges forming 2 vertices, 1 edge, and 1 face\r\n * * The two edges are joined as edgeMate pair.\r\n * * The two edges are a 2-half-edge face loop in both the faceSuccessor and facePredecessor directions.\r\n * * The two edges are added to the graph's HalfEdge set\r\n * @returns Return pointer to the first half edge created.\r\n */\r\n public createEdgeXYAndZ(xyz0: XYAndZ, id0: number, xyz1: XYAndZ, id1: number): HalfEdge {\r\n const a = HalfEdge.createHalfEdgePairWithCoordinates(xyz0.x, xyz0.y, xyz0.z, id0, xyz1.x, xyz1.y, xyz1.z, id1, this.allHalfEdges);\r\n return a;\r\n }\r\n\r\n /**\r\n * * Insert a vertex in the edge beginning at base.\r\n * * this creates two half edges.\r\n * * The base of the new edge is 'after' the (possibly undefined) start node in its face loop.\r\n * * The existing mate retains its base xyz and i properties but is no longer the mate of base.\r\n * * The base and existing mate each become mates with a new half edge.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public splitEdge(base: undefined | HalfEdge,\r\n xA: number = 0, yA: number = 0, zA: number = 0, iA: number = 0): HalfEdge {\r\n const he = HalfEdge.splitEdge(base, xA, yA, zA, iA, this.allHalfEdges);\r\n return he;\r\n }\r\n\r\n /**\r\n * * Create a sliver face \"within\" an edge.\r\n * * this creates two half edges.\r\n * * The existing edges both stay in their same face loops and retain coordinates and i value.\r\n * * Each existing edge's mate is a new edge (rather than original mate)\r\n * * Coordinates are copied to the new edges at respective vertices.\r\n * * New faceTag and edgeTag undefined.\r\n * * i members are copied around their respective vertices.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public splitEdgeCreateSliverFace(base: HalfEdge): HalfEdge {\r\n const he = HalfEdge.splitEdgeCreateSliverFace(base, this.allHalfEdges);\r\n return he;\r\n }\r\n\r\n /**\r\n * * Insert a vertex in the edge beginning at base, with coordinates specified as a fraction along the existing edge.\r\n * * this creates two half edges.\r\n * * The base of the new edge is 'after' the (possibly undefined) start node in its face loop.\r\n * * The existing mate retains its base xyz and i properties but is no longer the mate of base.\r\n * * The base and existing mate each become mates with a new half edge.\r\n * @returns Returns the reference to the half edge created.\r\n */\r\n public splitEdgeAtFraction(base: HalfEdge, fraction: number): HalfEdge {\r\n const he = HalfEdge.splitEdge(base, base.fractionToX(fraction), base.fractionToY(fraction), base.fractionToZ(fraction), 0, this.allHalfEdges);\r\n return he;\r\n }\r\n /** This is a destructor-like action that eliminates all interconnection among the graph's nodes.\r\n * After this is called the graph is unusable.\r\n */\r\n public decommission() {\r\n for (const node of this.allHalfEdges) { node.decommission(); }\r\n this.allHalfEdges.length = 0;\r\n (this.allHalfEdges as any) = undefined;\r\n }\r\n /** create two nodes of a new edge.\r\n * @returns Return one of the two nodes, which the caller may consider as the start of the edge.\r\n */\r\n public addEdgeXY(x0: number, y0: number, x1: number, y1: number): HalfEdge {\r\n const baseNode = HalfEdge.createEdgeXYXY(this._numNodesCreated, x0, y0, this._numNodesCreated + 1, x1, y1);\r\n this._numNodesCreated += 2;\r\n this.allHalfEdges.push(baseNode);\r\n this.allHalfEdges.push(baseNode.faceSuccessor);\r\n return baseNode;\r\n\r\n }\r\n /** Clear selected bits in all nodes of the graph. */\r\n public clearMask(mask: HalfEdgeMask) {\r\n for (const node of this.allHalfEdges)\r\n node.maskBits &= ~mask;\r\n }\r\n /** Set selected bits in all nodes of the graph. */\r\n public setMask(mask: HalfEdgeMask) {\r\n for (const node of this.allHalfEdges)\r\n node.maskBits |= mask;\r\n }\r\n /** toggle selected bits in all nodes of the graph. */\r\n public reverseMask(mask: HalfEdgeMask) {\r\n for (const node of this.allHalfEdges) {\r\n node.maskBits ^= mask;\r\n }\r\n }\r\n /**\r\n * Return the number of nodes that have a specified mask bit set.\r\n * @param mask mask to count\r\n */\r\n public countMask(mask: HalfEdgeMask): number {\r\n let n = 0;\r\n for (const node of this.allHalfEdges)\r\n if (node.isMaskSet(mask))\r\n n++;\r\n return n;\r\n }\r\n /** Return an array LineSegment3d.\r\n * * The array has one segment per edge\r\n * * The coordinates are taken from a node and its face successor.\r\n * * On each edge, the line segment start at the HalfEdge with lower id than its edgeMate.\r\n */\r\n public collectSegments(): LineSegment3d[] {\r\n const segments: LineSegment3d[] = [];\r\n for (const node of this.allHalfEdges) {\r\n if (node.id < node.edgeMate.id)\r\n segments.push(LineSegment3d.create(Point3d.create(node.x, node.y), Point3d.create(node.faceSuccessor.x, node.faceSuccessor.y)));\r\n }\r\n return segments;\r\n }\r\n\r\n /** Returns the number of vertex loops in a graph structure */\r\n public countVertexLoops(): number {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n let count = 0;\r\n this.announceVertexLoops((_graph: HalfEdgeGraph, _seed: HalfEdge) => { count++; return true; });\r\n return count;\r\n }\r\n\r\n /** Returns the number of face loops */\r\n public countFaceLoops(): number {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n let count = 0;\r\n this.announceFaceLoops((_graph: HalfEdgeGraph, _seed: HalfEdge) => { count++; return true; });\r\n return count;\r\n }\r\n /**\r\n * Returns the number of face loops satisfying a filter function with mask argument.\r\n *\r\n */\r\n public countFaceLoopsWithMaskFilter(filter: HalfEdgeAndMaskToBooleanFunction, mask: HalfEdgeMask): number {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n let count = 0;\r\n this.announceFaceLoops((_graph: HalfEdgeGraph, seed: HalfEdge) => {\r\n if (filter(seed, mask))\r\n count++;\r\n return true;\r\n });\r\n return count;\r\n }\r\n\r\n /** Returns an array of nodes, where each node represents a starting point of a face loop.\r\n */\r\n public collectFaceLoops(): HalfEdge[] {\r\n const returnArray: HalfEdge[] = [];\r\n this.announceFaceLoops(\r\n (_graph: HalfEdgeGraph, node: HalfEdge) => { returnArray.push(node); return true; });\r\n return returnArray;\r\n }\r\n\r\n /** Returns an array of nodes, where each node represents a starting point of a vertex loop.\r\n */\r\n public collectVertexLoops(): HalfEdge[] {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n const returnArray: HalfEdge[] = [];\r\n\r\n for (const node of this.allHalfEdges) {\r\n if (node.getMask(HalfEdgeMask.VISITED))\r\n continue;\r\n returnArray.push(node);\r\n node.setMaskAroundVertex(HalfEdgeMask.VISITED);\r\n }\r\n return returnArray;\r\n }\r\n\r\n /**\r\n * * Visit each facet of the graph once.\r\n * * Call the announceFace function\r\n * * continue search if announceFace(graph, node) returns true\r\n * * terminate search if announce face (graph, node) returns false\r\n * @param announceFace function to apply at one node of each face.\r\n */\r\n public announceFaceLoops(announceFace: GraphNodeFunction) {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n for (const node of this.allHalfEdges) {\r\n if (node.getMask(HalfEdgeMask.VISITED))\r\n continue;\r\n node.setMaskAroundFace(HalfEdgeMask.VISITED);\r\n if (!announceFace(this, node))\r\n break;\r\n }\r\n }\r\n /**\r\n * * Visit each edge of the graph once.\r\n * * Call the announceEdge function.\r\n * * the edge mate will NOT appear in an announceEdge call.\r\n * * continue search if announceEdge(graph, node) returns true\r\n * * terminate search if announceEdge (graph, node) returns false\r\n * @param announceEdge function to apply at one node of each edge.\r\n */\r\n public announceEdges(announceEdge: GraphNodeFunction) {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n for (const node of this.allHalfEdges) {\r\n if (node.getMask(HalfEdgeMask.VISITED))\r\n continue;\r\n const mate = node.edgeMate;\r\n node.setMask(HalfEdgeMask.VISITED);\r\n mate.setMask(HalfEdgeMask.VISITED);\r\n if (!announceEdge(this, node))\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * * Visit each vertex loop of the graph once.\r\n * * Call the announceVertex function\r\n * * continue search if announceVertex(graph, node) returns true\r\n * * terminate search if announce vertex (graph, node) returns false\r\n * @param announceVertex function to apply at one node of each face.\r\n */\r\n public announceVertexLoops(announceVertex: GraphNodeFunction) {\r\n this.clearMask(HalfEdgeMask.VISITED);\r\n for (const node of this.allHalfEdges) {\r\n if (node.getMask(HalfEdgeMask.VISITED))\r\n continue;\r\n node.setMaskAroundVertex(HalfEdgeMask.VISITED);\r\n if (!announceVertex(this, node))\r\n break;\r\n }\r\n }\r\n /**\r\n * * Visit each half edge (node) of the graph once.\r\n * * Call the announceNode function\r\n * * continue search if announceNode(graph, node) returns true\r\n * * terminate search if announce face (graph, node) returns false\r\n * @param announceNode function to apply at one node of each face.\r\n */\r\n public announceNodes(announceNode: GraphNodeFunction) {\r\n for (const node of this.allHalfEdges) {\r\n if (!announceNode(this, node))\r\n break;\r\n }\r\n }\r\n\r\n /** Return the number of nodes in the graph */\r\n public countNodes(): number { return this.allHalfEdges.length; }\r\n /** Apply transform to the xyz coordinates in the graph. */\r\n public transformInPlace(transform: Transform) {\r\n for (const node of this.allHalfEdges) {\r\n transform.multiplyXYAndZInPlace(node);\r\n }\r\n }\r\n /**\r\n * disconnect and delete all nodes that satisfy a filter condition.\r\n * @param deleteThisNode returns true to delete the corresponding edge. Should act symmetrically on the edgeMate.\r\n * @returns the number of nodes deleted (twice the number of deleted edges).\r\n */\r\n public yankAndDeleteEdges(deleteThisNode: NodeFunction): number {\r\n const numTotal = this.allHalfEdges.length;\r\n let numAccepted = 0;\r\n for (let i = 0; i < numTotal; i++) {\r\n const candidate = this.allHalfEdges[i];\r\n if (!deleteThisNode(candidate))\r\n this.allHalfEdges[numAccepted++] = candidate;\r\n else\r\n candidate.yankFromVertexLoop(); // ASSUME callback symmetry so we eventually yank the mate!\r\n }\r\n const numDeleted = numTotal - numAccepted;\r\n this.allHalfEdges.length = numAccepted;\r\n return numDeleted;\r\n }\r\n\r\n /**\r\n * Delete all isolated edges.\r\n * @return the number of nodes deleted (twice the number of deleted edges).\r\n */\r\n public deleteIsolatedEdges(): number {\r\n const numTotal = this.allHalfEdges.length;\r\n let numAccepted = 0;\r\n for (let i = 0; i < numTotal; i++) {\r\n const candidate = this.allHalfEdges[i];\r\n if (!candidate.isIsolatedEdge) {\r\n this.allHalfEdges[numAccepted++] = candidate;\r\n }\r\n }\r\n const numDeleted = numTotal - numAccepted;\r\n this.allHalfEdges.length = numAccepted;\r\n return numDeleted;\r\n }\r\n\r\n}\r\n"]}
|
|
@@ -120,13 +120,13 @@ export declare abstract class AbstractHalfEdgeGraphMarkSet {
|
|
|
120
120
|
* AbstractHalfEdgeGraphMarkSet specialized to manage the masks on individual half edges
|
|
121
121
|
* @internal
|
|
122
122
|
*/
|
|
123
|
-
export declare class
|
|
123
|
+
export declare class MarkedHalfEdgeSet extends AbstractHalfEdgeGraphMarkSet {
|
|
124
124
|
constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask);
|
|
125
125
|
/** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.
|
|
126
126
|
* * Returns undefined if unable to get a mask for the graph.
|
|
127
127
|
* * Undefined return can only happen if the caller is failing to return grabbed masks.
|
|
128
128
|
*/
|
|
129
|
-
static create(graph: HalfEdgeGraph):
|
|
129
|
+
static create(graph: HalfEdgeGraph): MarkedHalfEdgeSet | undefined;
|
|
130
130
|
/**
|
|
131
131
|
* * Set mask on candidate's edge.
|
|
132
132
|
* * This overrides the base class implementation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgeMarkSet.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgeMarkSet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEhE;;GAEG;AACH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8BAAsB,4BAA4B;IAChD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAa;IAChC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC;IAE9B,SAAS,aAAa,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY;IAM9D;;;OAGG;IACI,KAAK;IAKZ;;;OAGG;IACI,SAAS,IAAI,MAAM;IAO1B;;;;OAIG;IACI,gBAAgB,IAAI,MAAM;IAGjC,+CAA+C;IAC/C,IAAW,KAAK,IAAI,aAAa,CAAwB;IAEzD,uDAAuD;IAChD,QAAQ;IAKf,uEAAuE;IACvE,IAAW,IAAI,IAAI,YAAY,CAAuB;IAEtD,4FAA4F;IAC5F,SAAS,CAAC,YAAY,IAAI,QAAQ,GAAG,SAAS;IAS9C;;;;;OAKG;IACI,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAStD;;;;;;;OAOG;IACI,QAAQ,CAAC,SAAS,EAAE,QAAQ;IAOnC;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO;IAGrD;;;;;;;;OAQG;IACI,aAAa,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO;IAMlD;;;;OAIG;IACI,kBAAkB,IAAI,QAAQ,GAAG,SAAS;IASjD;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI;IAExE;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI;IAC1E;;;;OAIG;aACa,6BAA6B,CAAC,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM;IACtF,+CAA+C;IACxC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC;IACtD;;;OAGG;IACI,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAQ1C;;;OAGG;IACI,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;CAO7C;AAED;;;GAGG;AACH,qBAAa,
|
|
1
|
+
{"version":3,"file":"HalfEdgeMarkSet.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgeMarkSet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MarkedVertexSet = exports.MarkedFaceSet = exports.MarkedEdgeSet = exports.
|
|
3
|
+
exports.MarkedVertexSet = exports.MarkedFaceSet = exports.MarkedEdgeSet = exports.MarkedHalfEdgeSet = exports.AbstractHalfEdgeGraphMarkSet = void 0;
|
|
4
4
|
/*---------------------------------------------------------------------------------------------
|
|
5
5
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
6
6
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
@@ -177,7 +177,7 @@ exports.AbstractHalfEdgeGraphMarkSet = AbstractHalfEdgeGraphMarkSet;
|
|
|
177
177
|
* AbstractHalfEdgeGraphMarkSet specialized to manage the masks on individual half edges
|
|
178
178
|
* @internal
|
|
179
179
|
*/
|
|
180
|
-
class
|
|
180
|
+
class MarkedHalfEdgeSet extends AbstractHalfEdgeGraphMarkSet {
|
|
181
181
|
constructor(graph, mask) {
|
|
182
182
|
super(graph, mask);
|
|
183
183
|
}
|
|
@@ -189,7 +189,7 @@ class MarkedHalfEdgeSt extends AbstractHalfEdgeGraphMarkSet {
|
|
|
189
189
|
const mask = graph.grabMask();
|
|
190
190
|
if (mask === Graph_1.HalfEdgeMask.NULL_MASK)
|
|
191
191
|
return undefined;
|
|
192
|
-
return new
|
|
192
|
+
return new MarkedHalfEdgeSet(graph, mask);
|
|
193
193
|
}
|
|
194
194
|
/**
|
|
195
195
|
* * Set mask on candidate's edge.
|
|
@@ -217,7 +217,7 @@ class MarkedHalfEdgeSt extends AbstractHalfEdgeGraphMarkSet {
|
|
|
217
217
|
return 1;
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
-
exports.
|
|
220
|
+
exports.MarkedHalfEdgeSet = MarkedHalfEdgeSet;
|
|
221
221
|
/**
|
|
222
222
|
* AbstractHalfEdgeGraphMarkSet specialized to manage the mask on both sides of edges.
|
|
223
223
|
* @internal
|