@itwin/core-geometry 5.0.0-dev.4 → 5.0.0-dev.40
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 +29 -1
- package/lib/cjs/Constant.js +17 -17
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.js +35 -35
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js +18 -21
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/KnotVector.js +2 -2
- package/lib/cjs/bspline/KnotVector.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js +2 -2
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js +1 -1
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +3 -3
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts +40 -8
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +80 -22
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +4 -4
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +16 -2
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +33 -2
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.d.ts +87 -53
- package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +213 -135
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +12 -8
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +34 -13
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.d.ts +12 -6
- package/lib/cjs/curve/Loop.d.ts.map +1 -1
- package/lib/cjs/curve/Loop.js +12 -6
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.d.ts +8 -6
- package/lib/cjs/curve/Query/CylindricalRange.d.ts.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js +13 -9
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.d.ts +4 -4
- package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js +1 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +5 -5
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +13 -13
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js +5 -5
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js +29 -23
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +4 -4
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +2 -2
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js +16 -16
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.d.ts +14 -8
- package/lib/cjs/geometry3d/BarycentricTriangle.d.ts.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js +17 -8
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +4 -4
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts +2 -0
- package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js +4 -0
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +32 -10
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +54 -16
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +13 -2
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +24 -10
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +11 -8
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +36 -34
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js +2 -2
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +6 -6
- package/lib/cjs/geometry3d/Point3dVector3d.js +6 -6
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js +5 -5
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +12 -6
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +117 -70
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +3 -3
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts +9 -5
- package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js +9 -5
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.js +4 -4
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry4d/MomentData.d.ts +72 -73
- package/lib/cjs/geometry4d/MomentData.d.ts.map +1 -1
- package/lib/cjs/geometry4d/MomentData.js +62 -64
- package/lib/cjs/geometry4d/MomentData.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js +13 -13
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/PascalCoefficients.js +1 -1
- package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
- package/lib/cjs/numerics/PolarData.js +1 -1
- package/lib/cjs/numerics/PolarData.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.d.ts +5 -5
- package/lib/cjs/numerics/Polynomials.js +32 -32
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/numerics/Quadrature.js +20 -20
- package/lib/cjs/numerics/Quadrature.js.map +1 -1
- package/lib/cjs/polyface/AuxData.d.ts +2 -2
- package/lib/cjs/polyface/AuxData.d.ts.map +1 -1
- package/lib/cjs/polyface/AuxData.js +11 -3
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/BoxTopology.js +67 -67
- package/lib/cjs/polyface/BoxTopology.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js +2 -2
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts +27 -20
- package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js +56 -30
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +2 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +2 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts +3 -5
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js +6 -13
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +14 -7
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +59 -64
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.d.ts +13 -3
- package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js +26 -9
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +2 -2
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +11 -10
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js +5 -5
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js +22 -22
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts +5 -5
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js +112 -112
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/solid/Box.d.ts +9 -3
- package/lib/cjs/solid/Box.d.ts.map +1 -1
- package/lib/cjs/solid/Box.js +10 -5
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.d.ts +3 -2
- package/lib/cjs/solid/Cone.d.ts.map +1 -1
- package/lib/cjs/solid/Cone.js +3 -3
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.d.ts +9 -3
- package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
- package/lib/cjs/solid/LinearSweep.js +9 -4
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.d.ts +15 -4
- package/lib/cjs/solid/RotationalSweep.d.ts.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js +20 -7
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.d.ts +35 -26
- package/lib/cjs/solid/RuledSweep.d.ts.map +1 -1
- package/lib/cjs/solid/RuledSweep.js +41 -28
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.d.ts +12 -11
- package/lib/cjs/solid/SolidPrimitive.d.ts.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.js +8 -5
- package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
- package/lib/cjs/solid/Sphere.d.ts +17 -7
- package/lib/cjs/solid/Sphere.d.ts.map +1 -1
- package/lib/cjs/solid/Sphere.js +22 -16
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.d.ts +25 -16
- package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
- package/lib/cjs/solid/SweepContour.js +25 -16
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.d.ts +8 -2
- package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
- package/lib/cjs/solid/TorusPipe.js +9 -5
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js +4 -4
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.js +5 -5
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js +2 -2
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/Triangulation.js +11 -11
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/esm/Constant.js +17 -17
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.js +35 -35
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js +18 -21
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js +2 -2
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js +2 -2
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.js +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +3 -3
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +40 -8
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +80 -22
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +4 -4
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +16 -2
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +33 -2
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts +87 -53
- package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
- package/lib/esm/curve/CurveFactory.js +213 -135
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +12 -8
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +34 -13
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.d.ts +12 -6
- package/lib/esm/curve/Loop.d.ts.map +1 -1
- package/lib/esm/curve/Loop.js +12 -6
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.d.ts +8 -6
- package/lib/esm/curve/Query/CylindricalRange.d.ts.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js +13 -9
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.d.ts +4 -4
- package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/esm/curve/StrokeOptions.js +1 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +5 -5
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +13 -13
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js +5 -5
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js +29 -23
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +4 -4
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +2 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js +16 -16
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.d.ts +14 -8
- package/lib/esm/geometry3d/BarycentricTriangle.d.ts.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js +17 -8
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +4 -4
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.d.ts +2 -0
- package/lib/esm/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js +4 -0
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +32 -10
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +54 -16
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +13 -2
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +24 -10
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +11 -8
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +36 -34
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js +2 -2
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +6 -6
- package/lib/esm/geometry3d/Point3dVector3d.js +6 -6
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js +5 -5
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +12 -6
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +117 -70
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +3 -3
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts +9 -5
- package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js +9 -5
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.js +4 -4
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry4d/MomentData.d.ts +72 -73
- package/lib/esm/geometry4d/MomentData.d.ts.map +1 -1
- package/lib/esm/geometry4d/MomentData.js +62 -64
- package/lib/esm/geometry4d/MomentData.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js +13 -13
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/PascalCoefficients.js +1 -1
- package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
- package/lib/esm/numerics/PolarData.js +1 -1
- package/lib/esm/numerics/PolarData.js.map +1 -1
- package/lib/esm/numerics/Polynomials.d.ts +5 -5
- package/lib/esm/numerics/Polynomials.js +32 -32
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/numerics/Quadrature.js +20 -20
- package/lib/esm/numerics/Quadrature.js.map +1 -1
- package/lib/esm/polyface/AuxData.d.ts +2 -2
- package/lib/esm/polyface/AuxData.d.ts.map +1 -1
- package/lib/esm/polyface/AuxData.js +11 -3
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/BoxTopology.js +67 -67
- package/lib/esm/polyface/BoxTopology.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js +2 -2
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.d.ts +27 -20
- package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js +56 -30
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +2 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js +2 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts +3 -5
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js +6 -13
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +14 -7
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +60 -65
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.d.ts +13 -3
- package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js +26 -9
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +2 -2
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +11 -10
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js +5 -5
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js +22 -22
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.d.ts +5 -5
- package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js +112 -112
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/solid/Box.d.ts +9 -3
- package/lib/esm/solid/Box.d.ts.map +1 -1
- package/lib/esm/solid/Box.js +10 -5
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.d.ts +3 -2
- package/lib/esm/solid/Cone.d.ts.map +1 -1
- package/lib/esm/solid/Cone.js +3 -3
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.d.ts +9 -3
- package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
- package/lib/esm/solid/LinearSweep.js +9 -4
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.d.ts +15 -4
- package/lib/esm/solid/RotationalSweep.d.ts.map +1 -1
- package/lib/esm/solid/RotationalSweep.js +20 -7
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.d.ts +35 -26
- package/lib/esm/solid/RuledSweep.d.ts.map +1 -1
- package/lib/esm/solid/RuledSweep.js +41 -28
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SolidPrimitive.d.ts +12 -11
- package/lib/esm/solid/SolidPrimitive.d.ts.map +1 -1
- package/lib/esm/solid/SolidPrimitive.js +8 -5
- package/lib/esm/solid/SolidPrimitive.js.map +1 -1
- package/lib/esm/solid/Sphere.d.ts +17 -7
- package/lib/esm/solid/Sphere.d.ts.map +1 -1
- package/lib/esm/solid/Sphere.js +22 -16
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.d.ts +25 -16
- package/lib/esm/solid/SweepContour.d.ts.map +1 -1
- package/lib/esm/solid/SweepContour.js +25 -16
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.d.ts +8 -2
- package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
- package/lib/esm/solid/TorusPipe.js +9 -5
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js +4 -4
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.js +5 -5
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js +2 -2
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/Triangulation.js +11 -11
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgeGraphSpineContext.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgeGraphSpineContext.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F;;GAEG;AACH,0CAAuC;AACvC,mCAAgE;AAChE,mEAAkE;AAClE,uCAA+C;AAC/C,mDAA+C;AAC/C,qDAAyD;AACzD,+DAAgF;AAChF,+CAA4C;AAC5C,iBAAiB;AACjB,+BAA+B;AAC/B,iCAAiC;AACjC,qCAAqC;AAErC,SAAS,aAAa,CAAC,CAAS;IAC9B,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,yBAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,SAAS,cAAc,CAAC,CAAS;IAC/B,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,0BAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,8EAA8E;AAC9E,MAAM,WAAW;IAGf,IAAW,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAExC,YAAmB,IAAc,EAAE,CAAS;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACd,CAAC;IACM,MAAM,CAAC,cAAc,CAAC,KAAkB,EAAE,KAAkB,IAAY,OAAO,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;CAC7G;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAa,yBAAyB;IAMpC,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C;;;OAGG;IACH;QACE,IAAI,CAAC,WAAW,GAAG,IAAI,qBAAa,EAAE,CAAC;QACvC,iEAAiE;QACjE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,kEAAkE;IAC1D,OAAO,CAAC,MAAmB,EAAE,IAAa,EAAE,IAAa;QAC/D,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAEO,aAAa,CAAC,YAAsB,EAC1C,KAAiB,EACjB,MAAiB;QACjB,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC;QAC3C,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC;eAChD,YAAY,CAAC,oBAAoB,EAAE,KAAK,CAAC;eACzC,YAAY,CAAC,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACxB,MAAM,CAAC,IAAI,CAAC,yBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iCAAiC;IACjC,oEAAoE;IACpE,gCAAgC;IACxB,eAAe,CAAC,aAAuB;QAE7C,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,0BAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,0BAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,0BAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,0BAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAErD,MAAM,YAAY,GAAG,0BAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,0BAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3D,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC;YACrB,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC;YACrB,MAAM,OAAO,GAAG,YAAY,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACxE,MAAM,OAAO,GAAG,YAAY,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACxE,MAAM,OAAO,GAAG,YAAY,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACxE,MAAM,OAAO,GAAG,YAAY,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YAExE,MAAM,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YACnD,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,CAAC;QAED,OAAO,MAAM,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED,uCAAuC;IACvC,4FAA4F;IACpF,2BAA2B,CAAC,IAAe;QAEjD,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAK,0BAA0B;QAC/D,MAAM,iBAAiB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAG,sEAAsE;QACpH,mBAAmB;QACnB,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,QAAQ,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAEjC,qBAAqB;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,UAAU,CAAC,CAAC,CAAC,GAAG,0BAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAI,iBAAiB;YACjF,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;QAED,mDAAmD;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,iBAAiB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,iBAAiB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QAEhC,IAAI,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACzC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;QACnB,MAAM,KAAK,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,IAAI,QAAQ,CAAC;QACb,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,iEAAiE;YACjE,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACpC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,MAAM,cAAc,GAAG,0BAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChF,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;gBAC1E,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ;oBACrB,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC;gBACzB,SAAS,GAAG,QAAQ,CAAC;gBACrB,SAAS,GAAG,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAEO,OAAO,CAAC,EAAY;QAE1B,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;QACvB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAEO,sBAAsB,CAAC,IAAY;QAEzC,MAAM,UAAU,GAAkB,EAAE,CAAC;QACrC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,IAAI;gBACV,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAE5E,IAAI,GAAG,CAAC;QACR,OAAO,SAAS,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YACpB,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;YACvB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;mBACzB,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACjB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,gEAAgE;IACxD,OAAO,CAAC,IAAa,EAAE,IAAa,EAAE,IAAa,EAAE,IAAa,EAAE,QAAgB;QAE1F,MAAM,QAAQ,GAAG,0BAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,0BAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,0BAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;QACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IACxE,CAAC;IAED,iDAAiD;IACjD,gDAAgD;IAChD,uCAAuC;IACvC,0DAA0D;IAC1D,0CAA0C;IAC1C,oCAAoC;IAC5B,6BAA6B,CAAC,eAAuB,EAAE,mBAA2B;QAExF,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;YAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;YAC5B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oBAAY,CAAC,QAAQ,CAAC;mBACjC,CAAC,EAAE,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC,CAAG,4BAA4B;mBACtE,CAAC,EAAE,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC,CAAG,4BAA4B;mBACtE,EAAE,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC;mBACtC,EAAE,CAAC,aAAa,KAAK,EAAE,EAC1B,CAAC;gBACD,MAAM,QAAQ,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC;gBAC3C,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBACtE,uDAAuD;gBACvD,IAAI,gBAAgB,GAAG,mBAAmB,EAAE,CAAC,CAAC,wCAAwC;oBACpF,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACzC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC1C,MAAM,CAAC,GAAG,mBAAQ,CAAC,yBAAyB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACrD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;wBAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;wBAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;wBAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;wBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;wBACvC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;4BAC1D,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;4BACvD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;4BACtE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;4BACnB,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;4BAC9C,MAAM,EAAE,CAAC;wBACX,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,mBAAmB,CACzB,KAAe,EACf,MAAmB,EACnB,gBAAyB;IACzB,oEAAoE;IACpE,aAAsB;IACtB,iFAAiF;IACjF,oBAA6B;QAE7B,IAAI,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAC5B,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAC7C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAc,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC,CAAC;YACpE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC;gBAC9C,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;;gBAE7B,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;YAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;YAC/B,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QAED,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,WAAW,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC3C,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE;gBAC1C,IAAI,gBAAgB;oBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE;gBAC1C,IAAI,aAAa;oBACf,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,2CAA2C;gBAC3C,IAAI,gBAAgB;oBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,yFAAyF;gBACzF,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAChC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC;2BACvC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC;wBACxC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;aAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,gBAAgB;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,aAAa;gBACf,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,uBAAuB,CAC7B,KAAe,EAAE,MAAmB,EACpC,gBAAyB,EACzB,aAAsB;QAEtB,IAAI,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,yBAAO,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,UAAU,GAAc,EAAE,CAAC;QACjC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,GAAG,CAAC;YACF,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;YAClC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACtB,IAAI,WAAW,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpD,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBACrB,WAAW,EAAE,CAAC;gBACd,YAAY,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,CAAC,CAAC;YACnB,CAAC;YACD,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC,EAAE,CAAC;QACN,CAAC,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE;QAE9D,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrD,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,WAAW,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAEpC,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,kBAAkB;YAClB,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,gBAAgB;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,aAAa,IAAI,YAAY,IAAI,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,KAAgB,EAAE,OAAgB;QACnD,IAAI,UAAU,EAAE,OAAO,CAAC;QACxB,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC7C,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACpC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YAClC,KAAK,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC,CAAC;YAC1C,KAAK,CAAC,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC,CAAC;YAC1C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,gBAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,IAAI,OAAO,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YAC9D,gBAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IACD;;;;OAIG;IACK,cAAc,CAAC,YAA0B;QAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YAClC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBACvC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;oBAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;oBAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;wBACjE,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;wBAC9B,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAGD;;;;OAIG;IACI,mBAAmB,CAAC,cAAuB,IAAI,EAAE,kBAA0B,GAAG;QAEnF,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,MAAM,oBAAoB,GAAG,GAAG,CAAC;QACjC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,4BAAkB,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,4BAAkB,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,IAAI,sCAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,QAAQ,CAAC,eAAe,CAAC,yBAAyB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,IAAI,sCAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;QACxE,IAAI,WAAW,EAAE,CAAC;YAChB,yCAAmB,CAAC,iDAAiD,CAAC,IAAI,CAAC,KAAK,EAC9E,IAAI,wCAAkB,CAAC,oBAAY,CAAC,aAAa,CAAC,EAAE,oBAAY,CAAC,QAAQ,CAAC,CAAC;YAC7E,IAAI,CAAC,cAAc,CAAC,oBAAY,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,4BAAY,CAAC,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,4BAAY,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvC,OAAO,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,6BAA6B,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YAC1F,IAAI,OAAO,IAAI,CAAC;gBACd,MAAM;YACR,4BAAY,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,qDAAqD;IACrD,sDAAsD;IACtD,gDAAgD;IAChD;;;;;;OAMG;IACI,aAAa,CAAC,mBAA4B,IAAI,EAAE,gBAAyB,IAAI,EAAE,uBAAgC,IAAI;QACxH,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAChC,CAAC,MAAqB,EAAE,QAAkB,EAAE,EAAE;YAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7C,IAAI,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,CAAC;gBACtF,CAAC;qBAAM,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,CAAC,EAAE,CAAC;gBAC/G,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACL,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;OAWG;IACI,2BAA2B,CAAC,gBAAyB,EAAE,WAAkB,aAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QAErG,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,gBAAgB,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAC3B,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;;AAlfH,8DAmfC;AAlFgB,sCAAY,GAAG,IAAI,CAAC;AACpB,sCAAY,GAAG,KAAK,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Topology\n */\nimport { Geometry } from \"../Geometry\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { HalfEdgeGraphMerge } from \"./Merging\";\nimport { Triangulator } from \"./Triangulation\";\nimport { RegularizationContext } from \"./RegularizeFace\";\nimport { HalfEdgeGraphSearch, HalfEdgeMaskTester } from \"./HalfEdgeGraphSearch\";\nimport { Angle } from \"../geometry3d/Angle\";\n// cSpell:disable\n// const sSpineRelTol = 1.0e-8;\n// const sSpineGraphAbsTol = 0.0;\n// const sSpineGraphRelTol = 1.0e-10;\n\nfunction createNPoints(n: number): Point3d[] {\n const points = [];\n for (let i = 0; i < n; i++)\n points.push(Point3d.create(0, 0, 0));\n return points;\n}\nfunction createNVectors(n: number): Vector3d[] {\n const points = [];\n for (let i = 0; i < n; i++)\n points.push(Vector3d.create(0, 0, 0));\n return points;\n}\n// Local struct to pair a graph node with a double as a sort key for std::sort\nclass NodeSortKey {\n private _a: number;\n private _node: HalfEdge;\n public get node() { return this._node; }\n\n public constructor(node: HalfEdge, b: number) {\n this._node = node;\n this._a = b;\n }\n public static compareForSort(dataA: NodeSortKey, dataB: NodeSortKey): number { return dataA._a - dataB._a; }\n}\n\n/**\n * Context manager to hold a vu graph and do spine operations\n *\n * Spine calculations determine both (a) a \"skeletal\" network of linework that follows the interior\n * path through within the boundaries, and (b) a block decomposition into quads and triangles.\n *\n * Usage pattern:\n * ```\n * const sc = new HalfEdgeGraphSpineContext();\n * // Data setup ....\n * foreach polygon or polyline\n * {\n * sc.InsertEdges (edgePoints, bClosed)\n * }\n * // Analysis steps ...\n * * bParity = true to treat the data as a \"polygon\". The interior is determined by parity rules\n * and the triangulation and spine are only constructed \"inside\"\n * * bParity = false if \"all\" spaces are to be triangulated and spined.\n * * minSplitRadians -- suggested value 0.3. If this value is large, it will encourage add internal\n * * edges from a vertex to an edge 'across' the polygon even if it creates small angles.\n * * minDiagonalAngle -- suggested value 1.0. If this value is large (up to about 1.5 as max) it favors\n * * using triangles to navigate turns. If it is small, it favors using skewed quadrilaterals.\n * sc.TriangulateForSpine (bParity, minSplitRadians)\n * sc.MarkBoxes (true, minDiagonalAngle);\n * edges = sc.GetSpineEdges ();\n * ```\n * @internal\n */\nexport class HalfEdgeGraphSpineContext {\n /** The Evolving graph */\n private _spineGraph: HalfEdgeGraph;\n /** mask marking edges that have been paired into quads */\n private _diagonalMask: HalfEdgeMask;\n private _boxMask: HalfEdgeMask;\n public get graph() { return this._spineGraph; }\n /**\n * Create a context with an empty graph.\n * * Reserve masks for specialized markup.\n */\n public constructor() {\n this._spineGraph = new HalfEdgeGraph();\n // vu_setTol (_spineGraph, sSpineGraphAbsTol, sSpineGraphRelTol);\n this._diagonalMask = this._spineGraph.grabMask();\n this._boxMask = this._spineGraph.grabMask();\n }\n\n /**\n * Release resources to the graph.\n */\n public teardown() {\n this._spineGraph.dropMask(this._diagonalMask);\n this._spineGraph.dropMask(this._boxMask);\n this._spineGraph.decommission();\n }\n\n // an edge (as new bvector<DPoint3d> at back, with cloned points>\n private addEdge(xyzOut: Point3d[][], xyzA: Point3d, xyzB: Point3d) {\n const newArray = [];\n newArray.push(xyzA.clone());\n newArray.push(xyzB.clone());\n xyzOut.push(newArray);\n }\n\n private getBoxCorners(diagonalNode: HalfEdge,\n nodes: HalfEdge[],\n points: Point3d[]): boolean {\n const diagonalMate = diagonalNode.edgeMate;\n nodes.length = 0;\n points.length = 0;\n if (!diagonalNode.getMask(HalfEdgeMask.BOUNDARY_EDGE)\n && diagonalNode.countEdgesAroundFace() === 3\n && diagonalMate.countEdgesAroundFace() === 3) {\n const nodeA = diagonalMate.faceSuccessor;\n nodes.push(nodeA);\n nodes.push(nodeA.faceSuccessor);\n const nodeB = diagonalNode.faceSuccessor;\n nodes.push(nodeB);\n nodes.push(nodeB.faceSuccessor);\n for (let i = 0; i < 4; i++)\n points.push(Point3d.create(nodes[i].x, nodes[i].y));\n return true;\n }\n return false;\n }\n\n // Compute bisectors of the quad.\n // function key is the smaller absolute angle between the bisectors.\n // (pi/2 is max possible value).\n private diagonalKeyFunc(pDiagonalNode: HalfEdge): number {\n\n const nodes: HalfEdge[] = [];\n const points: Point3d[] = [];\n if (this.getBoxCorners(pDiagonalNode, nodes, points)) {\n const xyzA = points[0];\n const xyzB = points[1];\n const xyzC = points[2];\n const xyzD = points[3];\n const xyzAB = xyzA.interpolate(0.5, xyzB);\n const xyzBC = xyzB.interpolate(0.5, xyzC);\n const xyzCD = xyzC.interpolate(0.5, xyzD);\n const xyzDA = xyzD.interpolate(0.5, xyzA);\n\n const vectorAB = Vector3d.createStartEnd(xyzA, xyzB);\n const vectorBC = Vector3d.createStartEnd(xyzB, xyzC);\n const vectorCD = Vector3d.createStartEnd(xyzC, xyzD);\n const vectorDA = Vector3d.createStartEnd(xyzD, xyzA);\n\n const vectorABToCD = Vector3d.createStartEnd(xyzCD, xyzAB);\n const vectorBCToDA = Vector3d.createStartEnd(xyzDA, xyzBC);\n vectorABToCD.z = 0.0;\n vectorBCToDA.z = 0.0;\n const thetaAB = vectorABToCD.smallerUnorientedAngleTo(vectorAB).radians;\n const thetaBC = vectorBCToDA.smallerUnorientedAngleTo(vectorBC).radians;\n const thetaCD = vectorABToCD.smallerUnorientedAngleTo(vectorCD).radians;\n const thetaDA = vectorBCToDA.smallerUnorientedAngleTo(vectorDA).radians;\n\n const alpha = thetaAB < thetaCD ? thetaAB : thetaCD;\n const beta = thetaBC < thetaDA ? thetaBC : thetaDA;\n return alpha < beta ? alpha : beta;\n }\n\n return Number.NEGATIVE_INFINITY;\n }\n\n // Select a branch point in a triangle.\n // This may be the centroid or the midpoint of an edge joining midpoints of a pair of edges.\n private selectTriangleInteriorPoint(pXYZ: Point3d[]): Point3d {\n\n const xyz = createNPoints(6);\n const xyzMid = createNPoints(6); // Midpoints of each edge.\n const interiorCandidate = createNPoints(4); // for i in {012}, [i] is midpoint of midpoint[i+1] and midpoint[i+2].\n // [3] is centroid.\n const edgeVector = createNVectors(6);\n const centroid = Point3d.create();\n for (let i = 0; i < 3; i++) {\n xyz[i] = xyz[i + 3] = pXYZ[i];\n centroid.addInPlace(xyz[i]);\n }\n centroid.scaleInPlace(1.0 / 3.0);\n\n // Edge midpoints ...\n for (let i = 0; i < 3; i++) {\n xyzMid[i] = xyz[i].interpolate(0.5, xyz[i + 1]);\n xyzMid[i + 3] = xyzMid[i];\n edgeVector[i] = Vector3d.createStartEnd(xyz[i], xyz[i + 1]); // use wraparound\n edgeVector[i + 3] = edgeVector[i];\n }\n\n // Midpoints of midpoint-to-midpoint connections ..\n for (let i = 0; i < 3; i++) {\n const i1 = i + 1;\n const i2 = i + 2;\n interiorCandidate[i] = xyzMid[i1].interpolate(0.5, xyzMid[i2]);\n }\n\n interiorCandidate[3] = centroid;\n\n let bestAngle = Number.NEGATIVE_INFINITY;\n let bestIndex = -1;\n const theta: number[] = [0, 0, 0];\n let thetaMin;\n for (let k: number = 0; k < 4; k++) {\n // Measure angles from edge midpoints towards interior candidate.\n thetaMin = Number.POSITIVE_INFINITY;\n for (let i: number = 0; i < 3; i++) {\n const edgeToInterior = Vector3d.createStartEnd(xyzMid[i], interiorCandidate[k]);\n theta[i] = edgeVector[i].smallerUnorientedAngleTo(edgeToInterior).radians;\n if (theta[i] < thetaMin)\n thetaMin = theta[i];\n }\n if (thetaMin > bestAngle) {\n bestAngle = thetaMin;\n bestIndex = k;\n }\n }\n return interiorCandidate[bestIndex];\n }\n\n private markBox(pA: HalfEdge): void {\n\n const pB = pA.edgeMate;\n pA.setMask(this._diagonalMask);\n pB.setMask(this._diagonalMask);\n pA.setMaskAroundFace(this._boxMask);\n pB.setMaskAroundFace(this._boxMask);\n }\n\n private setSortedDiagonalMasks(minA: number): number {\n\n const candidates: NodeSortKey[] = [];\n let numDiagonal = 0;\n for (const node of this._spineGraph.allHalfEdges) {\n const b = this.diagonalKeyFunc(node);\n if (b > minA)\n candidates.push(new NodeSortKey(node, b));\n }\n\n candidates.sort((dataA, dataB) => NodeSortKey.compareForSort(dataA, dataB));\n\n let key;\n while (undefined !== (key = candidates.pop())) {\n const pA = key.node;\n const pB = pA.edgeMate;\n if (!pA.getMask(this._boxMask)\n && !pB.getMask(this._boxMask)) {\n this.markBox(pA);\n numDiagonal++;\n }\n }\n return numDiagonal;\n }\n\n /// <param name=\"xyzA\">Vertex whose angle is being split</param>\n private splitOK(xyzA: Point3d, xyzB: Point3d, xyzQ: Point3d, xyzC: Point3d, minAngle: number): boolean {\n\n const vectorAB = Vector3d.createStartEnd(xyzA, xyzB);\n const vectorAQ = Vector3d.createStartEnd(xyzA, xyzQ);\n const vectorAC = Vector3d.createStartEnd(xyzA, xyzC);\n const angleBAQ = vectorAB.angleToXY(vectorAQ).radians;\n const angleQAC = vectorAQ.angleToXY(vectorAC).radians;\n return Math.abs(angleBAQ) > minAngle && Math.abs(angleQAC) > minAngle;\n }\n\n // Search a triangulation for vertices which have\n // (a) pre-split angle greater than 90 degrees\n // (b) the opposite edge is a boundary.\n // (c) each post split angle is less than minSplitRadians\n // Drop a perpenedicular to that boundary.\n // return the number of edges added.\n private addPerpendicularsToBoundaries(minSplitRadians: number, minCandidateRadians: number): number {\n\n let numAdd = 0;\n for (const pA of this._spineGraph.allHalfEdges) {\n const pB = pA.faceSuccessor;\n const pC = pB.faceSuccessor;\n if (!pA.getMask(HalfEdgeMask.EXTERIOR)\n && !pA.getMask(HalfEdgeMask.BOUNDARY_EDGE) // ?? prevent deep recursion\n && !pC.getMask(HalfEdgeMask.BOUNDARY_EDGE) // ?? prevent deep recursion\n && pB.getMask(HalfEdgeMask.BOUNDARY_EDGE)\n && pC.faceSuccessor === pA\n ) {\n const vectorAB = pA.getVector2dAlongEdge();\n const vectorBC = pB.getVector2dAlongEdge();\n const vectorCA = pC.getVector2dAlongEdge();\n const candidateRadians = Math.PI - vectorCA.angleTo(vectorAB).radians;\n // const candidateDot = vectorCA.DotProduct (vectorAB);\n if (candidateRadians > minCandidateRadians) { // vectorCA.DotProduct (vectorAB) > 0.0)\n const bb = vectorBC.dotProduct(vectorBC);\n const ba = -vectorBC.dotProduct(vectorAB);\n const s = Geometry.conditionalDivideFraction(ba, bb);\n if (s !== undefined && s > 0.0 && s < 1.0) {\n const xyzA = pA.getPoint3d();\n const xyzB = pB.getPoint3d();\n const xyzC = pC.getPoint3d();\n const xyzE = xyzB.interpolate(s, xyzC);\n if (this.splitOK(xyzA, xyzB, xyzE, xyzC, minSplitRadians)) {\n const pE = this._spineGraph.splitEdgeAtFraction(pB, s);\n const pA1 = this._spineGraph.createEdgeHalfEdgeHalfEdge(pA, 0, pE, 0);\n pA1.setXYZFrom(pA);\n pE.setXYZAroundVertex(xyzE.x, xyzE.y, xyzE.z);\n numAdd++;\n }\n }\n }\n }\n }\n return numAdd;\n }\n\n private getSpineEdgesInQuad(\n pFace: HalfEdge,\n xyzOut: Point3d[][],\n bIncludeInterior: boolean,\n // true to include the edge to boundary when the qued is a dead end.\n bIncludeFinal: boolean,\n // true to include the two adjacent edges to boundary if the quad is at a corner.\n bIncludeCornerSpokes: boolean): boolean {\n\n if (pFace.countEdgesAroundFace() !== 4)\n return false;\n const pNode: HalfEdge[] = [];\n const xyz = createNPoints(8);\n const midpoint = createNPoints(8);\n pNode[0] = pNode[4] = pFace;\n pNode[1] = pNode[5] = pNode[0].faceSuccessor;\n pNode[2] = pNode[6] = pNode[1].faceSuccessor;\n pNode[3] = pNode[7] = pNode[2].faceSuccessor;\n let numBoundary = 0;\n let numInterior = 0;\n const iBoundary: number[] = [];\n const iInterior: number[] = [];\n const bIsBoundary: boolean[] = [];\n const centroid = Point3d.create();\n for (let i: number = 0; i < 4; i++) {\n bIsBoundary[i] = 0 !== pNode[i].getMask(HalfEdgeMask.BOUNDARY_EDGE);\n if (pNode[i].getMask(HalfEdgeMask.BOUNDARY_EDGE))\n iBoundary[numBoundary++] = i;\n else\n iInterior[numInterior++] = i;\n xyz[i] = pNode[i].getPoint3d();\n xyz[i + 4] = xyz[i];\n centroid.addInPlace(xyz[i]);\n }\n for (let i: number = 0; i < 4; i++) {\n midpoint[i] = xyz[i].interpolate(0.5, xyz[i + 1]);\n midpoint[i + 4] = midpoint[i];\n }\n\n centroid.scaleInPlace(0.25);\n if (numBoundary === 0 || numBoundary === 1) {\n for (let i: number = 0; i < numInterior; i++)\n if (bIncludeInterior)\n this.addEdge(xyzOut, midpoint[iInterior[i]], centroid);\n } else if (numBoundary === 4) {\n for (let i: number = 0; i < numBoundary; i++)\n if (bIncludeFinal)\n this.addEdge(xyzOut, midpoint[i], centroid);\n } else if (numBoundary === 2) {\n if (iInterior[1] === iInterior[0] + 2) {\n // Spine enters one end, exits the other ..\n if (bIncludeInterior)\n this.addEdge(xyzOut, midpoint[iInterior[0]], midpoint[iInterior[1]]);\n } else {\n // Block sits as exterior corner. Let the two spines continue to their opposite faces ..\n for (let i: number = 0; i < 4; i++)\n if ((bIsBoundary[i] && bIncludeCornerSpokes)\n || (!bIsBoundary[i] && bIncludeInterior))\n this.addEdge(xyzOut, midpoint[i], centroid);\n }\n } else if (numBoundary === 3) {\n if (bIncludeInterior)\n this.addEdge(xyzOut, midpoint[iInterior[0]], centroid);\n if (bIncludeFinal)\n this.addEdge(xyzOut, centroid, midpoint[iInterior[0] + 2]);\n }\n return true;\n }\n\n private getSpineEdgesInTriangle(\n pFace: HalfEdge, xyzOut: Point3d[][],\n bIncludeInterior: boolean,\n bIncludeFinal: boolean): boolean {\n\n if (pFace.countEdgesAroundFace() !== 3)\n return false;\n let n = 0;\n const xyzMidpoint = createNPoints(6);\n const xyz = createNPoints(6);\n const xyzCentroid = Point3d.createZero();\n const isBoundary: boolean[] = [];\n let numBoundary = 0;\n let lastBoundary = -1;\n let lastInterior = -1;\n let currentEdge = pFace;\n do {\n xyz[n] = currentEdge.getPoint3d();\n xyzCentroid.addInPlace(xyz[n]);\n isBoundary[n] = false;\n if (currentEdge.getMask(HalfEdgeMask.BOUNDARY_EDGE)) {\n isBoundary[n] = true;\n numBoundary++;\n lastBoundary = n;\n } else {\n lastInterior = n;\n }\n xyz[n + 3] = xyz[n];\n isBoundary[n + 3] = isBoundary[n];\n n++;\n } while ((currentEdge = currentEdge.faceSuccessor) !== pFace);\n\n for (let i: number = 0; i < 3; i++) {\n xyzMidpoint[i] = xyz[i].interpolate(0.5, xyz[i + 1]);\n xyzMidpoint[i + 3] = xyzMidpoint[i];\n }\n\n xyzCentroid.scaleInPlace(1.0 / 3.0);\n\n if (numBoundary === 0) {\n // Interior branch\n const xyzInterior = this.selectTriangleInteriorPoint(xyz);\n if (bIncludeInterior) {\n this.addEdge(xyzOut, xyzMidpoint[0], xyzInterior);\n this.addEdge(xyzOut, xyzMidpoint[1], xyzInterior);\n this.addEdge(xyzOut, xyzMidpoint[2], xyzInterior);\n }\n } else if (numBoundary === 1) {\n if (bIncludeInterior)\n this.addEdge(xyzOut, xyzMidpoint[lastBoundary + 1], xyzMidpoint[lastBoundary + 2]);\n } else if (numBoundary === 2) {\n if (bIncludeFinal && lastInterior >= 0)\n this.addEdge(xyzOut, xyzMidpoint[lastInterior], xyz[lastInterior + 2]);\n } else if (numBoundary === 3) {\n const xyzInterior = this.selectTriangleInteriorPoint(xyz);\n if (bIncludeFinal) {\n this.addEdge(xyzOut, xyzMidpoint[0], xyzInterior);\n this.addEdge(xyzOut, xyzMidpoint[1], xyzInterior);\n this.addEdge(xyzOut, xyzMidpoint[2], xyzInterior);\n }\n }\n return true;\n }\n\n /** Add a polyline to the graph.\n * * This may be called multiple times\n */\n public insertEdges(xyzIn: Point3d[], bClosed: boolean): void {\n let pPreviousB, pFirstA;\n for (let i: number = 1; i < xyzIn.length; i++) {\n const nodeA = this._spineGraph.createEdgeXYZXYZ(\n xyzIn[i - 1].x, xyzIn[i - 1].y, 0, 0,\n xyzIn[i].x, xyzIn[i].y, 0, 0);\n const nodeB = nodeA.faceSuccessor;\n nodeA.setMask(HalfEdgeMask.BOUNDARY_EDGE);\n nodeB.setMask(HalfEdgeMask.BOUNDARY_EDGE);\n if (pPreviousB === undefined) {\n pFirstA = nodeA;\n } else {\n HalfEdge.pinch(pPreviousB, nodeA);\n }\n pPreviousB = nodeB;\n }\n if (bClosed && pFirstA !== undefined && pPreviousB !== undefined)\n HalfEdge.pinch(pPreviousB, pFirstA);\n }\n /**\n * Look for trivial (2 edge) faces that have exteriorMask and non-masked on both sides.\n * * clear the mask\n * @param exteriorMask\n */\n private purgeNullFaces(exteriorMask: HalfEdgeMask) {\n for (const nodeA of this._spineGraph.allHalfEdges) {\n const nodeB = nodeA.faceSuccessor;\n const nodeC = nodeB.faceSuccessor;\n if (nodeB !== nodeA && nodeC === nodeA) {\n if (nodeA.getMask(exteriorMask) && nodeB.getMask(exteriorMask)) {\n const mateA = nodeA.edgeMate;\n const mateB = nodeB.edgeMate;\n if (!mateA.getMask(exteriorMask) && !mateB.getMask(exteriorMask)) {\n nodeA.clearMask(exteriorMask);\n nodeB.clearMask(exteriorMask);\n }\n }\n }\n }\n }\n private static _regularize1 = true;\n private static _regularize2 = false;\n /**\n * Triangulate the graph for the edges that have been inserted.\n * @param applyParity if true ()\n * @param minSplitRadians smallest allowed angle in the split sector that is split.\n */\n public triangulateForSpine(applyParity: boolean = true, minSplitRadians: number = 0.3): void {\n\n const sMaxSplit = 20;\n const sMinCandidateRadians = 1.0;\n let numSplit = 0;\n HalfEdgeGraphMerge.splitIntersectingEdges(this.graph);\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(this.graph);\n\n const context1 = new RegularizationContext(this.graph);\n context1.regularizeGraph(HalfEdgeGraphSpineContext._regularize1, false);\n const context2 = new RegularizationContext(this.graph);\n context2.regularizeGraph(false, HalfEdgeGraphSpineContext._regularize2);\n if (applyParity) {\n HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(this.graph,\n new HalfEdgeMaskTester(HalfEdgeMask.BOUNDARY_EDGE), HalfEdgeMask.EXTERIOR);\n this.purgeNullFaces(HalfEdgeMask.EXTERIOR);\n }\n\n Triangulator.triangulateAllPositiveAreaFaces(this.graph);\n Triangulator.flipTriangles(this.graph);\n\n while (numSplit++ < sMaxSplit) {\n const numPerp = this.addPerpendicularsToBoundaries(minSplitRadians, sMinCandidateRadians);\n if (numPerp <= 0)\n break;\n Triangulator.flipTriangles(this.graph);\n }\n }\n\n // Find pseudo spine edges\n // Optionally include pure internal midline segments.\n // Optionally include midline segments into \"dead end\"\n // Optionally include adjacent spokes to corner.\n /**\n * Retrieve edges of the spine as arrays of points.\n * @param bIncludeInterior true to include fully internal segments\n * @param bIncludeFinal true to include segments that terminate at a boundary\n * @param bIncludeCornerSpokes\n * @return array of line data.\n */\n public getSpineEdges(bIncludeInterior: boolean = true, bIncludeFinal: boolean = true, bIncludeCornerSpokes: boolean = true): Point3d[][] {\n const xyzOut: Point3d[][] = [];\n this._spineGraph.announceFaceLoops(\n (_graph: HalfEdgeGraph, faceSeed: HalfEdge) => {\n if (!faceSeed.getMask(HalfEdgeMask.EXTERIOR)) {\n if (this.getSpineEdgesInTriangle(faceSeed, xyzOut, bIncludeInterior, bIncludeFinal)) {\n } else if (this.getSpineEdgesInQuad(faceSeed, xyzOut, bIncludeInterior, bIncludeFinal, bIncludeCornerSpokes)) {\n }\n }\n return true;\n });\n return xyzOut;\n }\n\n /**\n * Intermediate markup step to identify quads between corresponding boundary edges.\n * * search for and mark triangle edges that should be treated as diagonal of a quad\n * * Angle logic is:\n * * In a candidate quad (formed by joining triangles that share an edge)\n * * form segments between opposite edges of the quad.\n * * compute angles between these segments and the edges of their quads.\n * * if this angle is larger than minAngleRadians, accept this as a quad.\n * * recommended angle is between 15 and 5 degrees; 50 degrees is typical\n * @param bDeleteDiagonals if true, eliminate the diagonals.\n * @param minAngleRadians angle tolerance, as described above.\n */\n public consolidateTrianglesToQuads(bDeleteDiagonals: boolean, minAngle: Angle = Angle.createDegrees(50)): number {\n\n const numDiagonal = this.setSortedDiagonalMasks(minAngle.radians);\n if (bDeleteDiagonals && numDiagonal > 0) {\n this.graph.yankAndDeleteEdges(\n (node: HalfEdge) => node.getMask(this._diagonalMask));\n }\n return numDiagonal;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"HalfEdgeGraphSpineContext.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgeGraphSpineContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Topology\n */\nimport { Geometry } from \"../Geometry\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { HalfEdgeGraphMerge } from \"./Merging\";\nimport { Triangulator } from \"./Triangulation\";\nimport { RegularizationContext } from \"./RegularizeFace\";\nimport { HalfEdgeGraphSearch, HalfEdgeMaskTester } from \"./HalfEdgeGraphSearch\";\nimport { Angle } from \"../geometry3d/Angle\";\n// cSpell:disable\n// const sSpineRelTol = 1.0e-8;\n// const sSpineGraphAbsTol = 0.0;\n// const sSpineGraphRelTol = 1.0e-10;\n\nfunction createNPoints(n: number): Point3d[] {\n const points = [];\n for (let i = 0; i < n; i++)\n points.push(Point3d.create(0, 0, 0));\n return points;\n}\nfunction createNVectors(n: number): Vector3d[] {\n const points = [];\n for (let i = 0; i < n; i++)\n points.push(Vector3d.create(0, 0, 0));\n return points;\n}\n// Local struct to pair a graph node with a double as a sort key for std::sort\nclass NodeSortKey {\n private _a: number;\n private _node: HalfEdge;\n public get node() { return this._node; }\n\n public constructor(node: HalfEdge, b: number) {\n this._node = node;\n this._a = b;\n }\n public static compareForSort(dataA: NodeSortKey, dataB: NodeSortKey): number { return dataA._a - dataB._a; }\n}\n\n/**\n * Context manager to hold a vu graph and do spine operations\n *\n * Spine calculations determine both (a) a \"skeletal\" network of linework that follows the interior\n * path through within the boundaries, and (b) a block decomposition into quads and triangles.\n *\n * Usage pattern:\n * ```\n * const sc = new HalfEdgeGraphSpineContext();\n * // Data setup ....\n * foreach polygon or polyline\n * {\n * sc.InsertEdges (edgePoints, bClosed)\n * }\n * // Analysis steps ...\n * * bParity = true to treat the data as a \"polygon\". The interior is determined by parity rules\n * and the triangulation and spine are only constructed \"inside\"\n * * bParity = false if \"all\" spaces are to be triangulated and spined.\n * * minSplitRadians -- suggested value 0.3. If this value is large, it will encourage add internal\n * * edges from a vertex to an edge 'across' the polygon even if it creates small angles.\n * * minDiagonalAngle -- suggested value 1.0. If this value is large (up to about 1.5 as max) it favors\n * * using triangles to navigate turns. If it is small, it favors using skewed quadrilaterals.\n * sc.TriangulateForSpine (bParity, minSplitRadians)\n * sc.MarkBoxes (true, minDiagonalAngle);\n * edges = sc.GetSpineEdges ();\n * ```\n * @internal\n */\nexport class HalfEdgeGraphSpineContext {\n /** The Evolving graph */\n private _spineGraph: HalfEdgeGraph;\n /** mask marking edges that have been paired into quads */\n private _diagonalMask: HalfEdgeMask;\n private _boxMask: HalfEdgeMask;\n public get graph() { return this._spineGraph; }\n /**\n * Create a context with an empty graph.\n * * Reserve masks for specialized markup.\n */\n public constructor() {\n this._spineGraph = new HalfEdgeGraph();\n // vu_setTol (_spineGraph, sSpineGraphAbsTol, sSpineGraphRelTol);\n this._diagonalMask = this._spineGraph.grabMask();\n this._boxMask = this._spineGraph.grabMask();\n }\n\n /**\n * Release resources to the graph.\n */\n public teardown() {\n this._spineGraph.dropMask(this._diagonalMask);\n this._spineGraph.dropMask(this._boxMask);\n this._spineGraph.decommission();\n }\n\n // an edge (as new bvector<DPoint3d> at back, with cloned points>\n private addEdge(xyzOut: Point3d[][], xyzA: Point3d, xyzB: Point3d) {\n const newArray = [];\n newArray.push(xyzA.clone());\n newArray.push(xyzB.clone());\n xyzOut.push(newArray);\n }\n\n private getBoxCorners(diagonalNode: HalfEdge,\n nodes: HalfEdge[],\n points: Point3d[]): boolean {\n const diagonalMate = diagonalNode.edgeMate;\n nodes.length = 0;\n points.length = 0;\n if (!diagonalNode.getMask(HalfEdgeMask.BOUNDARY_EDGE)\n && diagonalNode.countEdgesAroundFace() === 3\n && diagonalMate.countEdgesAroundFace() === 3) {\n const nodeA = diagonalMate.faceSuccessor;\n nodes.push(nodeA);\n nodes.push(nodeA.faceSuccessor);\n const nodeB = diagonalNode.faceSuccessor;\n nodes.push(nodeB);\n nodes.push(nodeB.faceSuccessor);\n for (let i = 0; i < 4; i++)\n points.push(Point3d.create(nodes[i].x, nodes[i].y));\n return true;\n }\n return false;\n }\n\n // Compute bisectors of the quad.\n // function key is the smaller absolute angle between the bisectors.\n // (pi/2 is max possible value).\n private diagonalKeyFunc(pDiagonalNode: HalfEdge): number {\n\n const nodes: HalfEdge[] = [];\n const points: Point3d[] = [];\n if (this.getBoxCorners(pDiagonalNode, nodes, points)) {\n const xyzA = points[0];\n const xyzB = points[1];\n const xyzC = points[2];\n const xyzD = points[3];\n const xyzAB = xyzA.interpolate(0.5, xyzB);\n const xyzBC = xyzB.interpolate(0.5, xyzC);\n const xyzCD = xyzC.interpolate(0.5, xyzD);\n const xyzDA = xyzD.interpolate(0.5, xyzA);\n\n const vectorAB = Vector3d.createStartEnd(xyzA, xyzB);\n const vectorBC = Vector3d.createStartEnd(xyzB, xyzC);\n const vectorCD = Vector3d.createStartEnd(xyzC, xyzD);\n const vectorDA = Vector3d.createStartEnd(xyzD, xyzA);\n\n const vectorABToCD = Vector3d.createStartEnd(xyzCD, xyzAB);\n const vectorBCToDA = Vector3d.createStartEnd(xyzDA, xyzBC);\n vectorABToCD.z = 0.0;\n vectorBCToDA.z = 0.0;\n const thetaAB = vectorABToCD.smallerUnorientedAngleTo(vectorAB).radians;\n const thetaBC = vectorBCToDA.smallerUnorientedAngleTo(vectorBC).radians;\n const thetaCD = vectorABToCD.smallerUnorientedAngleTo(vectorCD).radians;\n const thetaDA = vectorBCToDA.smallerUnorientedAngleTo(vectorDA).radians;\n\n const alpha = thetaAB < thetaCD ? thetaAB : thetaCD;\n const beta = thetaBC < thetaDA ? thetaBC : thetaDA;\n return alpha < beta ? alpha : beta;\n }\n\n return Number.NEGATIVE_INFINITY;\n }\n\n // Select a branch point in a triangle.\n // This may be the centroid or the midpoint of an edge joining midpoints of a pair of edges.\n private selectTriangleInteriorPoint(pXYZ: Point3d[]): Point3d {\n\n const xyz = createNPoints(6);\n const xyzMid = createNPoints(6); // Midpoints of each edge.\n const interiorCandidate = createNPoints(4); // for i in {012}, [i] is midpoint of midpoint[i+1] and midpoint[i+2].\n // [3] is centroid.\n const edgeVector = createNVectors(6);\n const centroid = Point3d.create();\n for (let i = 0; i < 3; i++) {\n xyz[i] = xyz[i + 3] = pXYZ[i];\n centroid.addInPlace(xyz[i]);\n }\n centroid.scaleInPlace(1.0 / 3.0);\n\n // Edge midpoints ...\n for (let i = 0; i < 3; i++) {\n xyzMid[i] = xyz[i].interpolate(0.5, xyz[i + 1]);\n xyzMid[i + 3] = xyzMid[i];\n edgeVector[i] = Vector3d.createStartEnd(xyz[i], xyz[i + 1]); // use wraparound\n edgeVector[i + 3] = edgeVector[i];\n }\n\n // Midpoints of midpoint-to-midpoint connections ..\n for (let i = 0; i < 3; i++) {\n const i1 = i + 1;\n const i2 = i + 2;\n interiorCandidate[i] = xyzMid[i1].interpolate(0.5, xyzMid[i2]);\n }\n\n interiorCandidate[3] = centroid;\n\n let bestAngle = Number.NEGATIVE_INFINITY;\n let bestIndex = -1;\n const theta: number[] = [0, 0, 0];\n let thetaMin;\n for (let k: number = 0; k < 4; k++) {\n // Measure angles from edge midpoints towards interior candidate.\n thetaMin = Number.POSITIVE_INFINITY;\n for (let i: number = 0; i < 3; i++) {\n const edgeToInterior = Vector3d.createStartEnd(xyzMid[i], interiorCandidate[k]);\n theta[i] = edgeVector[i].smallerUnorientedAngleTo(edgeToInterior).radians;\n if (theta[i] < thetaMin)\n thetaMin = theta[i];\n }\n if (thetaMin > bestAngle) {\n bestAngle = thetaMin;\n bestIndex = k;\n }\n }\n return interiorCandidate[bestIndex];\n }\n\n private markBox(pA: HalfEdge): void {\n\n const pB = pA.edgeMate;\n pA.setMask(this._diagonalMask);\n pB.setMask(this._diagonalMask);\n pA.setMaskAroundFace(this._boxMask);\n pB.setMaskAroundFace(this._boxMask);\n }\n\n private setSortedDiagonalMasks(minA: number): number {\n\n const candidates: NodeSortKey[] = [];\n let numDiagonal = 0;\n for (const node of this._spineGraph.allHalfEdges) {\n const b = this.diagonalKeyFunc(node);\n if (b > minA)\n candidates.push(new NodeSortKey(node, b));\n }\n\n candidates.sort((dataA, dataB) => NodeSortKey.compareForSort(dataA, dataB));\n\n let key;\n while (undefined !== (key = candidates.pop())) {\n const pA = key.node;\n const pB = pA.edgeMate;\n if (!pA.getMask(this._boxMask)\n && !pB.getMask(this._boxMask)) {\n this.markBox(pA);\n numDiagonal++;\n }\n }\n return numDiagonal;\n }\n\n /// <param name=\"xyzA\">Vertex whose angle is being split</param>\n private splitOK(xyzA: Point3d, xyzB: Point3d, xyzQ: Point3d, xyzC: Point3d, minAngle: number): boolean {\n\n const vectorAB = Vector3d.createStartEnd(xyzA, xyzB);\n const vectorAQ = Vector3d.createStartEnd(xyzA, xyzQ);\n const vectorAC = Vector3d.createStartEnd(xyzA, xyzC);\n const angleBAQ = vectorAB.angleToXY(vectorAQ).radians;\n const angleQAC = vectorAQ.angleToXY(vectorAC).radians;\n return Math.abs(angleBAQ) > minAngle && Math.abs(angleQAC) > minAngle;\n }\n\n // Search a triangulation for vertices which have\n // (a) pre-split angle greater than 90 degrees\n // (b) the opposite edge is a boundary.\n // (c) each post split angle is less than minSplitRadians\n // Drop a perpenedicular to that boundary.\n // return the number of edges added.\n private addPerpendicularsToBoundaries(minSplitRadians: number, minCandidateRadians: number): number {\n\n let numAdd = 0;\n for (const pA of this._spineGraph.allHalfEdges) {\n const pB = pA.faceSuccessor;\n const pC = pB.faceSuccessor;\n if (!pA.getMask(HalfEdgeMask.EXTERIOR)\n && !pA.getMask(HalfEdgeMask.BOUNDARY_EDGE) // ?? prevent deep recursion\n && !pC.getMask(HalfEdgeMask.BOUNDARY_EDGE) // ?? prevent deep recursion\n && pB.getMask(HalfEdgeMask.BOUNDARY_EDGE)\n && pC.faceSuccessor === pA\n ) {\n const vectorAB = pA.getVector2dAlongEdge();\n const vectorBC = pB.getVector2dAlongEdge();\n const vectorCA = pC.getVector2dAlongEdge();\n const candidateRadians = Math.PI - vectorCA.angleTo(vectorAB).radians;\n // const candidateDot = vectorCA.DotProduct (vectorAB);\n if (candidateRadians > minCandidateRadians) { // vectorCA.DotProduct (vectorAB) > 0.0)\n const bb = vectorBC.dotProduct(vectorBC);\n const ba = -vectorBC.dotProduct(vectorAB);\n const s = Geometry.conditionalDivideFraction(ba, bb);\n if (s !== undefined && s > 0.0 && s < 1.0) {\n const xyzA = pA.getPoint3d();\n const xyzB = pB.getPoint3d();\n const xyzC = pC.getPoint3d();\n const xyzE = xyzB.interpolate(s, xyzC);\n if (this.splitOK(xyzA, xyzB, xyzE, xyzC, minSplitRadians)) {\n const pE = this._spineGraph.splitEdgeAtFraction(pB, s);\n const pA1 = this._spineGraph.createEdgeHalfEdgeHalfEdge(pA, 0, pE, 0);\n pA1.setXYZFrom(pA);\n pE.setXYZAroundVertex(xyzE.x, xyzE.y, xyzE.z);\n numAdd++;\n }\n }\n }\n }\n }\n return numAdd;\n }\n\n private getSpineEdgesInQuad(\n pFace: HalfEdge,\n xyzOut: Point3d[][],\n bIncludeInterior: boolean,\n // true to include the edge to boundary when the qued is a dead end.\n bIncludeFinal: boolean,\n // true to include the two adjacent edges to boundary if the quad is at a corner.\n bIncludeCornerSpokes: boolean): boolean {\n\n if (pFace.countEdgesAroundFace() !== 4)\n return false;\n const pNode: HalfEdge[] = [];\n const xyz = createNPoints(8);\n const midpoint = createNPoints(8);\n pNode[0] = pNode[4] = pFace;\n pNode[1] = pNode[5] = pNode[0].faceSuccessor;\n pNode[2] = pNode[6] = pNode[1].faceSuccessor;\n pNode[3] = pNode[7] = pNode[2].faceSuccessor;\n let numBoundary = 0;\n let numInterior = 0;\n const iBoundary: number[] = [];\n const iInterior: number[] = [];\n const bIsBoundary: boolean[] = [];\n const centroid = Point3d.create();\n for (let i: number = 0; i < 4; i++) {\n bIsBoundary[i] = 0 !== pNode[i].getMask(HalfEdgeMask.BOUNDARY_EDGE);\n if (pNode[i].getMask(HalfEdgeMask.BOUNDARY_EDGE))\n iBoundary[numBoundary++] = i;\n else\n iInterior[numInterior++] = i;\n xyz[i] = pNode[i].getPoint3d();\n xyz[i + 4] = xyz[i];\n centroid.addInPlace(xyz[i]);\n }\n for (let i: number = 0; i < 4; i++) {\n midpoint[i] = xyz[i].interpolate(0.5, xyz[i + 1]);\n midpoint[i + 4] = midpoint[i];\n }\n\n centroid.scaleInPlace(0.25);\n if (numBoundary === 0 || numBoundary === 1) {\n for (let i: number = 0; i < numInterior; i++)\n if (bIncludeInterior)\n this.addEdge(xyzOut, midpoint[iInterior[i]], centroid);\n } else if (numBoundary === 4) {\n for (let i: number = 0; i < numBoundary; i++)\n if (bIncludeFinal)\n this.addEdge(xyzOut, midpoint[i], centroid);\n } else if (numBoundary === 2) {\n if (iInterior[1] === iInterior[0] + 2) {\n // Spine enters one end, exits the other ..\n if (bIncludeInterior)\n this.addEdge(xyzOut, midpoint[iInterior[0]], midpoint[iInterior[1]]);\n } else {\n // Block sits as exterior corner. Let the two spines continue to their opposite faces ..\n for (let i: number = 0; i < 4; i++)\n if ((bIsBoundary[i] && bIncludeCornerSpokes)\n || (!bIsBoundary[i] && bIncludeInterior))\n this.addEdge(xyzOut, midpoint[i], centroid);\n }\n } else if (numBoundary === 3) {\n if (bIncludeInterior)\n this.addEdge(xyzOut, midpoint[iInterior[0]], centroid);\n if (bIncludeFinal)\n this.addEdge(xyzOut, centroid, midpoint[iInterior[0] + 2]);\n }\n return true;\n }\n\n private getSpineEdgesInTriangle(\n pFace: HalfEdge, xyzOut: Point3d[][],\n bIncludeInterior: boolean,\n bIncludeFinal: boolean): boolean {\n\n if (pFace.countEdgesAroundFace() !== 3)\n return false;\n let n = 0;\n const xyzMidpoint = createNPoints(6);\n const xyz = createNPoints(6);\n const xyzCentroid = Point3d.createZero();\n const isBoundary: boolean[] = [];\n let numBoundary = 0;\n let lastBoundary = -1;\n let lastInterior = -1;\n let currentEdge = pFace;\n do {\n xyz[n] = currentEdge.getPoint3d();\n xyzCentroid.addInPlace(xyz[n]);\n isBoundary[n] = false;\n if (currentEdge.getMask(HalfEdgeMask.BOUNDARY_EDGE)) {\n isBoundary[n] = true;\n numBoundary++;\n lastBoundary = n;\n } else {\n lastInterior = n;\n }\n xyz[n + 3] = xyz[n];\n isBoundary[n + 3] = isBoundary[n];\n n++;\n } while ((currentEdge = currentEdge.faceSuccessor) !== pFace);\n\n for (let i: number = 0; i < 3; i++) {\n xyzMidpoint[i] = xyz[i].interpolate(0.5, xyz[i + 1]);\n xyzMidpoint[i + 3] = xyzMidpoint[i];\n }\n\n xyzCentroid.scaleInPlace(1.0 / 3.0);\n\n if (numBoundary === 0) {\n // Interior branch\n const xyzInterior = this.selectTriangleInteriorPoint(xyz);\n if (bIncludeInterior) {\n this.addEdge(xyzOut, xyzMidpoint[0], xyzInterior);\n this.addEdge(xyzOut, xyzMidpoint[1], xyzInterior);\n this.addEdge(xyzOut, xyzMidpoint[2], xyzInterior);\n }\n } else if (numBoundary === 1) {\n if (bIncludeInterior)\n this.addEdge(xyzOut, xyzMidpoint[lastBoundary + 1], xyzMidpoint[lastBoundary + 2]);\n } else if (numBoundary === 2) {\n if (bIncludeFinal && lastInterior >= 0)\n this.addEdge(xyzOut, xyzMidpoint[lastInterior], xyz[lastInterior + 2]);\n } else if (numBoundary === 3) {\n const xyzInterior = this.selectTriangleInteriorPoint(xyz);\n if (bIncludeFinal) {\n this.addEdge(xyzOut, xyzMidpoint[0], xyzInterior);\n this.addEdge(xyzOut, xyzMidpoint[1], xyzInterior);\n this.addEdge(xyzOut, xyzMidpoint[2], xyzInterior);\n }\n }\n return true;\n }\n\n /** Add a polyline to the graph.\n * * This may be called multiple times\n */\n public insertEdges(xyzIn: Point3d[], bClosed: boolean): void {\n let pPreviousB, pFirstA;\n for (let i: number = 1; i < xyzIn.length; i++) {\n const nodeA = this._spineGraph.createEdgeXYZXYZ(\n xyzIn[i - 1].x, xyzIn[i - 1].y, 0, 0,\n xyzIn[i].x, xyzIn[i].y, 0, 0);\n const nodeB = nodeA.faceSuccessor;\n nodeA.setMask(HalfEdgeMask.BOUNDARY_EDGE);\n nodeB.setMask(HalfEdgeMask.BOUNDARY_EDGE);\n if (pPreviousB === undefined) {\n pFirstA = nodeA;\n } else {\n HalfEdge.pinch(pPreviousB, nodeA);\n }\n pPreviousB = nodeB;\n }\n if (bClosed && pFirstA !== undefined && pPreviousB !== undefined)\n HalfEdge.pinch(pPreviousB, pFirstA);\n }\n /**\n * Look for trivial (2 edge) faces that have exteriorMask and non-masked on both sides.\n * * clear the mask\n * @param exteriorMask\n */\n private purgeNullFaces(exteriorMask: HalfEdgeMask) {\n for (const nodeA of this._spineGraph.allHalfEdges) {\n const nodeB = nodeA.faceSuccessor;\n const nodeC = nodeB.faceSuccessor;\n if (nodeB !== nodeA && nodeC === nodeA) {\n if (nodeA.getMask(exteriorMask) && nodeB.getMask(exteriorMask)) {\n const mateA = nodeA.edgeMate;\n const mateB = nodeB.edgeMate;\n if (!mateA.getMask(exteriorMask) && !mateB.getMask(exteriorMask)) {\n nodeA.clearMask(exteriorMask);\n nodeB.clearMask(exteriorMask);\n }\n }\n }\n }\n }\n private static _regularize1 = true;\n private static _regularize2 = false;\n /**\n * Triangulate the graph for the edges that have been inserted.\n * @param applyParity if true ()\n * @param minSplitRadians smallest allowed angle in the split sector that is split.\n */\n public triangulateForSpine(applyParity: boolean = true, minSplitRadians: number = 0.3): void {\n\n const sMaxSplit = 20;\n const sMinCandidateRadians = 1.0;\n let numSplit = 0;\n HalfEdgeGraphMerge.splitIntersectingEdges(this.graph);\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(this.graph);\n\n const context1 = new RegularizationContext(this.graph);\n context1.regularizeGraph(HalfEdgeGraphSpineContext._regularize1, false);\n const context2 = new RegularizationContext(this.graph);\n context2.regularizeGraph(false, HalfEdgeGraphSpineContext._regularize2);\n if (applyParity) {\n HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(this.graph,\n new HalfEdgeMaskTester(HalfEdgeMask.BOUNDARY_EDGE), HalfEdgeMask.EXTERIOR);\n this.purgeNullFaces(HalfEdgeMask.EXTERIOR);\n }\n\n Triangulator.triangulateAllPositiveAreaFaces(this.graph);\n Triangulator.flipTriangles(this.graph);\n\n while (numSplit++ < sMaxSplit) {\n const numPerp = this.addPerpendicularsToBoundaries(minSplitRadians, sMinCandidateRadians);\n if (numPerp <= 0)\n break;\n Triangulator.flipTriangles(this.graph);\n }\n }\n\n // Find pseudo spine edges\n // Optionally include pure internal midline segments.\n // Optionally include midline segments into \"dead end\"\n // Optionally include adjacent spokes to corner.\n /**\n * Retrieve edges of the spine as arrays of points.\n * @param bIncludeInterior true to include fully internal segments\n * @param bIncludeFinal true to include segments that terminate at a boundary\n * @param bIncludeCornerSpokes\n * @return array of line data.\n */\n public getSpineEdges(bIncludeInterior: boolean = true, bIncludeFinal: boolean = true, bIncludeCornerSpokes: boolean = true): Point3d[][] {\n const xyzOut: Point3d[][] = [];\n this._spineGraph.announceFaceLoops(\n (_graph: HalfEdgeGraph, faceSeed: HalfEdge) => {\n if (!faceSeed.getMask(HalfEdgeMask.EXTERIOR)) {\n if (this.getSpineEdgesInTriangle(faceSeed, xyzOut, bIncludeInterior, bIncludeFinal)) {\n } else if (this.getSpineEdgesInQuad(faceSeed, xyzOut, bIncludeInterior, bIncludeFinal, bIncludeCornerSpokes)) {\n }\n }\n return true;\n });\n return xyzOut;\n }\n\n /**\n * Intermediate markup step to identify quads between corresponding boundary edges.\n * * search for and mark triangle edges that should be treated as diagonal of a quad\n * * Angle logic is:\n * * In a candidate quad (formed by joining triangles that share an edge)\n * * form segments between opposite edges of the quad.\n * * compute angles between these segments and the edges of their quads.\n * * if this angle is larger than minAngleRadians, accept this as a quad.\n * * recommended angle is between 15 and 5 degrees; 50 degrees is typical\n * @param bDeleteDiagonals if true, eliminate the diagonals.\n * @param minAngleRadians angle tolerance, as described above.\n */\n public consolidateTrianglesToQuads(bDeleteDiagonals: boolean, minAngle: Angle = Angle.createDegrees(50)): number {\n\n const numDiagonal = this.setSortedDiagonalMasks(minAngle.radians);\n if (bDeleteDiagonals && numDiagonal > 0) {\n this.graph.yankAndDeleteEdges(\n (node: HalfEdge) => node.getMask(this._diagonalMask));\n }\n return numDiagonal;\n }\n}\n"]}
|
|
@@ -580,6 +580,8 @@ class Triangulator {
|
|
|
580
580
|
}
|
|
581
581
|
return true; // um .. I'm not sure what this state is.
|
|
582
582
|
}
|
|
583
|
+
/** @internal */
|
|
584
|
+
static { this.sEnableDebugGraphCapture = false; }
|
|
583
585
|
/**
|
|
584
586
|
* * returns the (possibly undefined) debug graph.
|
|
585
587
|
* * sets the debug graph to undefined.
|
|
@@ -621,6 +623,15 @@ class Triangulator {
|
|
|
621
623
|
return true;
|
|
622
624
|
return Geometry_1.Geometry.isAlmostEqualXAndY(a, b);
|
|
623
625
|
}
|
|
626
|
+
// for reuse over all calls to isEar ....
|
|
627
|
+
static { this._edgeInterval = Range_1.Range1d.createNull(); }
|
|
628
|
+
static { this._earRange = Range_1.Range2d.createNull(); }
|
|
629
|
+
static { this._edgeRange = Range_1.Range2d.createNull(); }
|
|
630
|
+
static { this._planes = [
|
|
631
|
+
Plane3dByOriginAndUnitNormal_1.Plane3dByOriginAndUnitNormal.createXYPlane(),
|
|
632
|
+
Plane3dByOriginAndUnitNormal_1.Plane3dByOriginAndUnitNormal.createXYPlane(),
|
|
633
|
+
Plane3dByOriginAndUnitNormal_1.Plane3dByOriginAndUnitNormal.createXYPlane(),
|
|
634
|
+
]; }
|
|
624
635
|
/** Check whether a polygon node forms a valid ear with adjacent nodes */
|
|
625
636
|
static isEar(ear) {
|
|
626
637
|
const a = ear.facePredecessor;
|
|
@@ -978,17 +989,6 @@ class Triangulator {
|
|
|
978
989
|
}
|
|
979
990
|
}
|
|
980
991
|
exports.Triangulator = Triangulator;
|
|
981
|
-
/** @internal */
|
|
982
|
-
Triangulator.sEnableDebugGraphCapture = false;
|
|
983
|
-
// for reuse over all calls to isEar ....
|
|
984
|
-
Triangulator._edgeInterval = Range_1.Range1d.createNull();
|
|
985
|
-
Triangulator._earRange = Range_1.Range2d.createNull();
|
|
986
|
-
Triangulator._edgeRange = Range_1.Range2d.createNull();
|
|
987
|
-
Triangulator._planes = [
|
|
988
|
-
Plane3dByOriginAndUnitNormal_1.Plane3dByOriginAndUnitNormal.createXYPlane(),
|
|
989
|
-
Plane3dByOriginAndUnitNormal_1.Plane3dByOriginAndUnitNormal.createXYPlane(),
|
|
990
|
-
Plane3dByOriginAndUnitNormal_1.Plane3dByOriginAndUnitNormal.createXYPlane(),
|
|
991
|
-
];
|
|
992
992
|
/**
|
|
993
993
|
* Internal class for assembling chains
|
|
994
994
|
* @internal
|