@itwin/core-geometry 4.6.0-dev.8 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/lib/cjs/Constant.js +1 -1
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +7 -6
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.js +4 -4
- package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
- package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.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 +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.d.ts +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.d.ts.map +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.d.ts +1 -1
- package/lib/cjs/clipping/ClipPlane.js +2 -2
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +4 -4
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js +2 -2
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +1 -1
- 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/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/curve/Arc3d.js +2 -2
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js +1 -1
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +3 -3
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.js +1 -1
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.js +1 -1
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +2 -2
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js +1 -1
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +2 -2
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts +2 -0
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js +5 -0
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js +2 -2
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +3 -3
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +5 -0
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js +11 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +3 -3
- package/lib/cjs/geometry3d/Transform.js +3 -3
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.js +1 -1
- package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/geometry4d/Map4d.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/geometry4d/MomentData.js.map +1 -1
- package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/cjs/geometry4d/Point4d.js.map +1 -1
- package/lib/cjs/numerics/BandedSystem.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js +1 -1
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/Complex.js.map +1 -1
- package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/cjs/numerics/Newton.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 +2 -2
- package/lib/cjs/numerics/PolarData.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.js +2 -2
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/numerics/Quadrature.js +1 -1
- package/lib/cjs/numerics/Quadrature.js.map +1 -1
- package/lib/cjs/numerics/Range1dArray.js.map +1 -1
- package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/cjs/numerics/UnionFind.js.map +1 -1
- package/lib/cjs/polyface/AuxData.js +1 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/BoxTopology.js +1 -1
- package/lib/cjs/polyface/BoxTopology.js.map +1 -1
- package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +10 -2
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts +1 -1
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js +13 -3
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js +1 -1
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +2 -2
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
- package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js +2 -2
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js +1 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.js +2 -2
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
- package/lib/cjs/topology/Triangulation.js +1 -1
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js +1 -2
- package/lib/esm/Constant.js.map +1 -1
- 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/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js +2 -2
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js +1 -2
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js +1 -2
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.d.ts +1 -1
- package/lib/esm/clipping/BooleanClipFactory.d.ts.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.d.ts +1 -1
- package/lib/esm/clipping/ClipPlane.js +2 -3
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +1 -2
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js +1 -2
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +1 -2
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +1 -2
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/curve/Arc3d.js +2 -3
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +1 -2
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.js +1 -2
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +1 -2
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +1 -2
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +1 -2
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js +1 -2
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +1 -2
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +1 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js +1 -2
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +1 -2
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js +1 -2
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.d.ts +2 -0
- package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js +5 -0
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js +2 -4
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +3 -6
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +1 -2
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +5 -0
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js +11 -2
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/Segment1d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +3 -3
- package/lib/esm/geometry3d/Transform.js +3 -3
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/geometry4d/Map4d.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/geometry4d/MomentData.js.map +1 -1
- package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/esm/geometry4d/Point4d.js.map +1 -1
- package/lib/esm/numerics/BandedSystem.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js +1 -2
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/Complex.js.map +1 -1
- package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/numerics/PascalCoefficients.js +1 -2
- package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
- package/lib/esm/numerics/PolarData.js +1 -2
- package/lib/esm/numerics/PolarData.js.map +1 -1
- package/lib/esm/numerics/Polynomials.js +2 -4
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/numerics/Quadrature.js +1 -2
- package/lib/esm/numerics/Quadrature.js.map +1 -1
- package/lib/esm/numerics/Range1dArray.js.map +1 -1
- package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/esm/numerics/UnionFind.js.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/BoxTopology.js +1 -2
- package/lib/esm/polyface/BoxTopology.js.map +1 -1
- package/lib/esm/polyface/FacetFaceData.js.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/esm/polyface/FacetOrientation.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js +1 -2
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js +10 -2
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts +1 -1
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +1 -2
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js +13 -3
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js +1 -2
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +1 -2
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
- package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js +2 -2
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js +1 -2
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js +1 -2
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js +1 -2
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.js +1 -2
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js +1 -2
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
- package/lib/esm/topology/Triangulation.js +1 -2
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePositionDetail.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePositionDetail.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 */\n\nimport { Geometry } from \"../Geometry\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\nimport { HalfEdge } from \"./Graph\";\n\n/**\n * Enumeration of categorization of \"where\" a HalfEdgePositionDetail is sitting in the graph.\n */\nexport enum HalfEdgeTopo {\n /** No known position */\n None = 0,\n /** Sitting at a vertex, reached by a ray in this sector */\n Vertex = 1,\n /** Sitting on an edge */\n Edge = 2,\n /** Face point (before hitting barrier edge) */\n Face = 3,\n /** Exterior point (after hitting barrier edge at fraction)\n * Fraction is 0 if exterior point \"in sweep around exterior corner\"\n */\n ExteriorFace\n}\n/**\n * Description of a generalized position within a graph, categorized as:\n * * \"at a certain node around a vertex\"\n * * \"at a fractional position along an edge\n * * \"within a face\"\n */\nexport class HalfEdgePositionDetail {\n /** the relevant node */\n private _node?: HalfEdge;\n /** The current coordinates */\n public x: number;\n public y: number;\n public z: number;\n /** fractional position along edge. Only defined if the topo tag is `HalfEdgeTopo.Edge` */\n private _edgeFraction?: number;\n /** Enumeration of status vertex, edge, or face status. */\n private _topo: HalfEdgeTopo;\n /** first data tag */\n private _iTag?: number;\n /** second data tag */\n private _dTag?: number;\n /** Special case for point on edge or vertex but target beyond and exterior. */\n private _isExteriorTarget?: boolean;\n /** Constructor.\n * * The point is CAPTURED. (static `create` methods normally clone their inputs.)\n */\n private constructor(node: HalfEdge | undefined, x: number, y: number, z: number, topo: HalfEdgeTopo, edgeFraction?: number, iTag?: number, dTag?: number, isExteriorTarget?: boolean) {\n this._node = node;\n this.x = x; this.y = y; this.z = z;\n this._topo = topo;\n this._edgeFraction = edgeFraction;\n this._iTag = iTag;\n this._dTag = dTag;\n this._isExteriorTarget = isExteriorTarget;\n }\n\n /** Copy (clones of) all data from other */\n public setFrom(other: HalfEdgePositionDetail) {\n this._node = other._node;\n this.x = other.x;\n this.y = other.y;\n this.z = other.z;\n this._topo = other._topo;\n this._edgeFraction = other._edgeFraction;\n this._iTag = other._iTag;\n this._dTag = other._dTag;\n }\n /** reset to null topo state. */\n public resetAsUnknown() {\n this._node = undefined;\n this._topo = HalfEdgeTopo.None;\n }\n /** Create with null data. */\n public static create(): HalfEdgePositionDetail {\n const detail = new HalfEdgePositionDetail(undefined, 0, 0, 0, HalfEdgeTopo.None);\n return detail;\n }\n public getITag(): number | undefined { return this._iTag; }\n public setITag(value: number): void { this._iTag = value; }\n\n public getDTag(): number | undefined { return this._dTag; }\n public setDTag(value: number): void { this._dTag = value; }\n public getTopo(): HalfEdgeTopo { return this._topo; }\n\n /** Create with node, fraction along edge, marked as \"HalfEdgeTopo.Edge\". Compute interpolated xyz on the edge */\n public static createEdgeAtFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\n const node1 = node.faceSuccessor;\n const x = Geometry.interpolate(node.x, edgeFraction, node1.x);\n const y = Geometry.interpolate(node.y, edgeFraction, node1.y);\n const z = Geometry.interpolate(node.z, edgeFraction, node1.z);\n return new HalfEdgePositionDetail(node, x, y, z, HalfEdgeTopo.Edge, edgeFraction);\n }\n\n /** reassign contents so this instance becomes a face hit.\n * @param node new node value. If missing, current node is left unchanged.\n * @param xyz new coordinates. if missing, current coordinates are left unchanged.\n */\n public resetAsFace(node?: HalfEdge, xyz?: XYAndZ): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Face;\n if (node)\n this._node = node;\n if (xyz) {\n this.x = xyz.x;\n this.y = xyz.y;\n this.z = xyz.z;\n }\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** reassign contents so this instance has dTag but no node or HalfEdgeTopo\n */\n public resetAsUndefinedWithTag(dTag: number): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.None;\n this._dTag = 0;\n this._iTag = 0;\n this._dTag = dTag;\n this._node = undefined;\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** reassign contents so this instance becomes an edge hit\n * @param node new node value.\n * @param edgeFraction new edge fraction. xyz is recomputed from this edge and its face successor.\n */\n public resetAtEdgeAndFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Edge;\n this._node = node;\n const nodeB = node.faceSuccessor;\n this._edgeFraction = edgeFraction;\n this.x = Geometry.interpolate(node.x, edgeFraction, nodeB.x);\n this.y = Geometry.interpolate(node.y, edgeFraction, nodeB.y);\n this.z = Geometry.interpolate(node.z, edgeFraction, nodeB.z);\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** Create at a node.\n * * Take xyz from the node.\n */\n public static createVertex(node: HalfEdge): HalfEdgePositionDetail {\n return new HalfEdgePositionDetail(node, node.x, node.y, node.z, HalfEdgeTopo.Vertex);\n }\n\n /** Mark as \"HalfEdgeTopo.Vertex\"\n */\n public resetAsVertex(node: HalfEdge): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Vertex;\n this._node = node;\n this._edgeFraction = 0.0;\n this.setXYZFromNode(node);\n this._isExteriorTarget = undefined;\n return this;\n }\n /** Set the flag for an exterior relationship to target. */\n public setIsExteriorTarget(isExterior: boolean | undefined) {\n this._isExteriorTarget = isExterior;\n }\n /** Copy x,y,z from the node to this instance local values. */\n public setXYZFromNode(node: HalfEdge) {\n this.x = node.x;\n this.y = node.y;\n this.z = node.z;\n }\n /**\n * Return the (possibly undefined) edge fraction.\n */\n public get edgeFraction(): number | undefined {\n return this._edgeFraction;\n }\n /** property access for the flag for an exterior relationship to target.\n * * undefined flag is returned as false.\n */\n public get isExteriorTarget(): boolean {\n return this._isExteriorTarget !== undefined ? this._isExteriorTarget : false;\n }\n\n /** Return true if this detail is marked as being within a face. */\n public get isFace(): boolean { return this._topo === HalfEdgeTopo.Face; }\n /** Return true if this detail is marked as being within an edge. */\n public get isEdge(): boolean { return this._topo === HalfEdgeTopo.Edge; }\n /** Return true if this detail is marked as being at a vertex. */\n public get isVertex(): boolean { return this._topo === HalfEdgeTopo.Vertex; }\n /** Return true if this detail has no vertex, edge, or face qualifier. */\n public get isUnclassified(): boolean { return this._topo === HalfEdgeTopo.None; }\n\n /** Return the node reference from this detail */\n public get node(): HalfEdge | undefined { return this._node; }\n /** Return the (clone of, or optional filled in result) coordinates from this detail. */\n public clonePoint(result?: Point3d): Point3d { return Point3d.create(this.x, this.y, this.z, result); }\n\n /*\n // If candidateKey is less than resultKey, replace resultPos and resultKey\n // by the candidate data.\n public updateMinimizer(\n HalfEdgePositionDetail & resultPos, number & resultKey,\n : HalfEdgePositionDetail & candidatePos, candidateKey: number\n ): boolean {\n if (candidateKey < resultKey) {\n resultKey = candidateKey;\n resultPos = candidatePos;\n return true;\n }\n return false;\n }\n */\n\n public isAtXY(x: number, y: number): boolean {\n return this._topo !== HalfEdgeTopo.None && Geometry.isSameCoordinate(this.x, x) && Geometry.isSameCoordinate(this.y, y);\n\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"HalfEdgePositionDetail.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePositionDetail.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 */\n\nimport { Geometry } from \"../Geometry\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\nimport { HalfEdge } from \"./Graph\";\n\n/**\n * Enumeration of categorization of \"where\" a HalfEdgePositionDetail is sitting in the graph.\n */\nexport enum HalfEdgeTopo {\n /** No known position */\n None = 0,\n /** Sitting at a vertex, reached by a ray in this sector */\n Vertex = 1,\n /** Sitting on an edge */\n Edge = 2,\n /** Face point (before hitting barrier edge) */\n Face = 3,\n /** Exterior point (after hitting barrier edge at fraction)\n * Fraction is 0 if exterior point \"in sweep around exterior corner\"\n */\n ExteriorFace\n}\n/**\n * Description of a generalized position within a graph, categorized as:\n * * \"at a certain node around a vertex\"\n * * \"at a fractional position along an edge\n * * \"within a face\"\n */\nexport class HalfEdgePositionDetail {\n /** the relevant node */\n private _node?: HalfEdge;\n /** The current coordinates */\n public x: number;\n public y: number;\n public z: number;\n /** fractional position along edge. Only defined if the topo tag is `HalfEdgeTopo.Edge` */\n private _edgeFraction?: number;\n /** Enumeration of status vertex, edge, or face status. */\n private _topo: HalfEdgeTopo;\n /** first data tag */\n private _iTag?: number;\n /** second data tag */\n private _dTag?: number;\n /** Special case for point on edge or vertex but target beyond and exterior. */\n private _isExteriorTarget?: boolean;\n /** Constructor.\n * * The point is CAPTURED. (static `create` methods normally clone their inputs.)\n */\n private constructor(node: HalfEdge | undefined, x: number, y: number, z: number, topo: HalfEdgeTopo, edgeFraction?: number, iTag?: number, dTag?: number, isExteriorTarget?: boolean) {\n this._node = node;\n this.x = x; this.y = y; this.z = z;\n this._topo = topo;\n this._edgeFraction = edgeFraction;\n this._iTag = iTag;\n this._dTag = dTag;\n this._isExteriorTarget = isExteriorTarget;\n }\n\n /** Copy (clones of) all data from other */\n public setFrom(other: HalfEdgePositionDetail) {\n this._node = other._node;\n this.x = other.x;\n this.y = other.y;\n this.z = other.z;\n this._topo = other._topo;\n this._edgeFraction = other._edgeFraction;\n this._iTag = other._iTag;\n this._dTag = other._dTag;\n }\n /** reset to null topo state. */\n public resetAsUnknown() {\n this._node = undefined;\n this._topo = HalfEdgeTopo.None;\n }\n /** Create with null data. */\n public static create(): HalfEdgePositionDetail {\n const detail = new HalfEdgePositionDetail(undefined, 0, 0, 0, HalfEdgeTopo.None);\n return detail;\n }\n public getITag(): number | undefined { return this._iTag; }\n public setITag(value: number): void { this._iTag = value; }\n\n public getDTag(): number | undefined { return this._dTag; }\n public setDTag(value: number): void { this._dTag = value; }\n public getTopo(): HalfEdgeTopo { return this._topo; }\n\n /** Create with node, fraction along edge, marked as \"HalfEdgeTopo.Edge\". Compute interpolated xyz on the edge */\n public static createEdgeAtFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\n const node1 = node.faceSuccessor;\n const x = Geometry.interpolate(node.x, edgeFraction, node1.x);\n const y = Geometry.interpolate(node.y, edgeFraction, node1.y);\n const z = Geometry.interpolate(node.z, edgeFraction, node1.z);\n return new HalfEdgePositionDetail(node, x, y, z, HalfEdgeTopo.Edge, edgeFraction);\n }\n\n /** reassign contents so this instance becomes a face hit.\n * @param node new node value. If missing, current node is left unchanged.\n * @param xyz new coordinates. if missing, current coordinates are left unchanged.\n */\n public resetAsFace(node?: HalfEdge, xyz?: XYAndZ): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Face;\n if (node)\n this._node = node;\n if (xyz) {\n this.x = xyz.x;\n this.y = xyz.y;\n this.z = xyz.z;\n }\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** reassign contents so this instance has dTag but no node or HalfEdgeTopo\n */\n public resetAsUndefinedWithTag(dTag: number): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.None;\n this._dTag = 0;\n this._iTag = 0;\n this._dTag = dTag;\n this._node = undefined;\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** reassign contents so this instance becomes an edge hit\n * @param node new node value.\n * @param edgeFraction new edge fraction. xyz is recomputed from this edge and its face successor.\n */\n public resetAtEdgeAndFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Edge;\n this._node = node;\n const nodeB = node.faceSuccessor;\n this._edgeFraction = edgeFraction;\n this.x = Geometry.interpolate(node.x, edgeFraction, nodeB.x);\n this.y = Geometry.interpolate(node.y, edgeFraction, nodeB.y);\n this.z = Geometry.interpolate(node.z, edgeFraction, nodeB.z);\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** Create at a node.\n * * Take xyz from the node.\n */\n public static createVertex(node: HalfEdge): HalfEdgePositionDetail {\n return new HalfEdgePositionDetail(node, node.x, node.y, node.z, HalfEdgeTopo.Vertex);\n }\n\n /** Mark as \"HalfEdgeTopo.Vertex\"\n */\n public resetAsVertex(node: HalfEdge): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Vertex;\n this._node = node;\n this._edgeFraction = 0.0;\n this.setXYZFromNode(node);\n this._isExteriorTarget = undefined;\n return this;\n }\n /** Set the flag for an exterior relationship to target. */\n public setIsExteriorTarget(isExterior: boolean | undefined) {\n this._isExteriorTarget = isExterior;\n }\n /** Copy x,y,z from the node to this instance local values. */\n public setXYZFromNode(node: HalfEdge) {\n this.x = node.x;\n this.y = node.y;\n this.z = node.z;\n }\n /**\n * Return the (possibly undefined) edge fraction.\n */\n public get edgeFraction(): number | undefined {\n return this._edgeFraction;\n }\n /** property access for the flag for an exterior relationship to target.\n * * undefined flag is returned as false.\n */\n public get isExteriorTarget(): boolean {\n return this._isExteriorTarget !== undefined ? this._isExteriorTarget : false;\n }\n\n /** Return true if this detail is marked as being within a face. */\n public get isFace(): boolean { return this._topo === HalfEdgeTopo.Face; }\n /** Return true if this detail is marked as being within an edge. */\n public get isEdge(): boolean { return this._topo === HalfEdgeTopo.Edge; }\n /** Return true if this detail is marked as being at a vertex. */\n public get isVertex(): boolean { return this._topo === HalfEdgeTopo.Vertex; }\n /** Return true if this detail has no vertex, edge, or face qualifier. */\n public get isUnclassified(): boolean { return this._topo === HalfEdgeTopo.None; }\n\n /** Return the node reference from this detail */\n public get node(): HalfEdge | undefined { return this._node; }\n /** Return the (clone of, or optional filled in result) coordinates from this detail. */\n public clonePoint(result?: Point3d): Point3d { return Point3d.create(this.x, this.y, this.z, result); }\n\n /*\n // If candidateKey is less than resultKey, replace resultPos and resultKey\n // by the candidate data.\n public updateMinimizer(\n HalfEdgePositionDetail & resultPos, number & resultKey,\n : HalfEdgePositionDetail & candidatePos, candidateKey: number\n ): boolean {\n if (candidateKey < resultKey) {\n resultKey = candidateKey;\n resultPos = candidatePos;\n return true;\n }\n return false;\n }\n */\n\n public isAtXY(x: number, y: number): boolean {\n return this._topo !== HalfEdgeTopo.None && Geometry.isSameCoordinate(this.x, x) && Geometry.isSameCoordinate(this.y, y);\n\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePriorityQueue.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePriorityQueue.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH,OAAO,EAAqB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,OAAO,qCAAqC;IAGhD,YACE,UAAuC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IACD,qEAAqE;IAC9D,eAAe;QACpB,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO;YAC5B,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAG,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IACD;;;;OAIG;IACI,oBAAoB,CAAC,CAAS;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"HalfEdgePriorityQueue.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePriorityQueue.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH,OAAO,EAAqB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,OAAO,qCAAqC;IAGhD,YACE,UAAuC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IACD,qEAAqE;IAC9D,eAAe;QACpB,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO;YAC5B,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAG,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IACD;;;;OAIG;IACI,oBAAoB,CAAC,CAAS;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAG,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD;;;;OAIG;IACI,6BAA6B,CAAC,CAAS;QAC5C,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACZ,+BAA+B;gBAC/B,IAAI,OAAO,GAAG,CAAC;oBACb,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,mBAAmB;YACrB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC;IACpC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\nimport { OrderedComparator, PriorityQueue } from \"@itwin/core-bentley\";\nimport { HalfEdge } from \"./Graph\";\nimport { HalfEdgeGraphOps } from \"./Merging\";\n\n/**\n * * Combination of a priority queue of HalfEdges with\n * * Additional \"active\" array to carry edges that have been removed from the queue but are still to be\n * inspected (possibly many times)\n * * The priority queue default sort is Y-then-X lexical sort.\n * * Caller has direct access to the queue and array.\n * * Methods are added here only to do things that involve both the queue and the array.\n * @internal\n */\nexport class HalfEdgePriorityQueueWithPartnerArray {\n public priorityQueue: PriorityQueue<HalfEdge>;\n public activeEdges: HalfEdge[];\n public constructor(\n compare: OrderedComparator<HalfEdge> = (a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b)) {\n this.priorityQueue = new PriorityQueue(compare);\n this.activeEdges = [];\n }\n /** Read a member from the queue and transfer to the active array. */\n public popQueueToArray(): HalfEdge | undefined {\n if (this.priorityQueue.isEmpty)\n return undefined;\n const x = this.priorityQueue.pop()!;\n this.activeEdges.push(x);\n return x;\n }\n /** Pop the last entry and put it back as replacement for current entry at index i.\n * * Effectively remove active member at index i\n * * The array order is changed.\n * * constant time.\n */\n public popArrayToArrayIndex(i: number) {\n const n = this.activeEdges.length;\n if (i < n) {\n const x = this.activeEdges.pop()!;\n this.activeEdges[i] = x;\n }\n }\n /**\n * * Scan the active array.\n * * remove edges whose top y is below y\n * * (pack all remaining ones back towards the beginning)\n */\n public removeArrayMembersWithY1Below(y: number) {\n let numKeep = 0;\n const n = this.activeEdges.length;\n for (let i = 0; i < n; i++) {\n const q = this.activeEdges[i];\n const yB = q.faceSuccessor.y;\n if (yB >= y) {\n // copy [i] forward to [target]\n if (numKeep < i)\n this.activeEdges[numKeep] = q;\n numKeep++;\n } else {\n // let it go by !!!\n }\n }\n this.activeEdges.length = numKeep;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.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 */\n\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { SmallSystem } from \"../numerics/Polynomials\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\nimport { Triangulator } from \"./Triangulation\";\n\n/**\n * Context for repeated insertion of new points in a graph.\n * * Initial graph should have clean outer boundary. (e.g. as typically marked with HalfEdgeMask.EXTERIOR)\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\n * can reuse that position as start for walking to the new point.\n */\nexport class InsertAndRetriangulateContext {\n private _graph: HalfEdgeGraph;\n private _edgeSet: MarkedEdgeSet;\n private _searcher: HalfEdgePositionDetail;\n // Temporaries used in reAimFromFace\n // private _lastBefore: HalfEdgePositionDetail;\n // private _firstAfter: HalfEdgePositionDetail;\n\n private constructor(graph: HalfEdgeGraph) {\n this._graph = graph;\n this._edgeSet = MarkedEdgeSet.create(graph)!;\n this._searcher = HalfEdgePositionDetail.create();\n // this._lastBefore = HalfEdgePositionDetail.create();\n // this._firstAfter = HalfEdgePositionDetail.create();\n }\n /** Create a new context referencing the graph. */\n public static create(graph: HalfEdgeGraph) {\n return new InsertAndRetriangulateContext(graph);\n }\n /** Query the (pointer to) the graph in the context. */\n public get graph(): HalfEdgeGraph { return this._graph; }\n // Walk face from edgeNode; insert new edges back to start node from all except\n // immediate successor and predecessor.\n // insert all new nodes, and nodes of the existing face, in edgeSet.\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\n const numNode = centralNode.countEdgesAroundFace();\n this._edgeSet.addAroundFace(centralNode);\n if (numNode < 4 || centralNode.signedFaceArea() <= 0.0)\n return;\n const numEdge = numNode - 3;\n let farNode = centralNode.faceSuccessor;\n let nearNode = centralNode;\n for (let i = 0; i < numEdge; i++) {\n farNode = farNode.faceSuccessor;\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\n farNode = nearNode.faceSuccessor;\n this._edgeSet.addToSet(nearNode);\n }\n }\n /** Reset the \"current\" position to unknown state. */\n public reset() {\n this._searcher = HalfEdgePositionDetail.create();\n }\n\n /** Return a (reference to!) the current position in the graph */\n public get currentPosition() { return this._searcher; }\n /**\n * Linear search through the graph\n * * Returns a HalfEdgePositionDetail for the nearest edge or vertex.\n * @param xyz\n */\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\n const position = HalfEdgePositionDetail.create();\n position.setDTag(Number.MAX_VALUE);\n const xyzC = Point3d.create();\n let fractionC;\n let distanceC;\n for (const nodeA of this._graph.allHalfEdges) {\n const nodeB = nodeA.faceSuccessor;\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\n if (fractionC !== undefined) {\n if (fractionC > 1.0) {\n distanceC = xyz.distanceXY(nodeB);\n if (distanceC < position.getDTag()!) {\n position.resetAsVertex(nodeB);\n position.setDTag(distanceC);\n }\n } else if (fractionC < 0.0) {\n distanceC = xyz.distanceXY(nodeA);\n if (distanceC < position.getDTag()!) {\n position.resetAsVertex(nodeA);\n position.setDTag(distanceC);\n }\n } else {\n nodeA.fractionToPoint3d(fractionC, xyzC);\n\n distanceC = xyz.distanceXY(xyzC);\n if (distanceC < position.getDTag()!) {\n position.resetAtEdgeAndFraction(nodeA, fractionC);\n }\n }\n }\n }\n return position;\n }\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\n const position = HalfEdgePositionDetail.create();\n position.setDTag(Number.MAX_VALUE);\n let distanceA;\n for (const nodeA of this._graph.allHalfEdges) {\n distanceA = xyz.distanceXY(nodeA);\n if (distanceA < position.getDTag()!) {\n position.resetAsVertex(nodeA);\n position.setDTag(distanceA);\n }\n }\n return position;\n }\n\n public resetSearch(xyz: Point3d, maxDim: number) {\n if (maxDim > 0)\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\n else\n this._searcher = this.searchForNearestVertex(xyz);\n }\n public insertAndRetriangulate(xyz: Point3d, newZWins: boolean): boolean {\n this.moveToPoint(this._searcher, xyz);\n const seedNode = this._searcher.node;\n let stat = false;\n if (seedNode === undefined) {\n } else if (this._searcher.isFace) {\n if (!seedNode.isMaskSet(HalfEdgeMask.EXTERIOR)) {\n const newInteriorNode = this._graph.createEdgeXYZHalfEdge(xyz.x, xyz.y, xyz.z, 0, seedNode, 0);\n this.retriangulateFromBaseVertex(newInteriorNode);\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\n this._searcher.resetAsVertex(newInteriorNode);\n }\n stat = true;\n } else if (this._searcher.isEdge) {\n const newA = this._graph.splitEdgeAtFraction(seedNode, this._searcher.edgeFraction!);\n const newB = newA.vertexPredecessor;\n this.retriangulateFromBaseVertex(newA);\n this.retriangulateFromBaseVertex(newB);\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\n this._searcher.resetAsVertex(newA);\n stat = true;\n } else if (this._searcher.isVertex) {\n // There's already a vertex there. Maybe the z is different.\n if (newZWins)\n seedNode.setXYZAroundVertex(xyz.x, xyz.y, xyz.z);\n stat = true;\n } else {\n stat = false;\n }\n return stat;\n }\n\n // Advance movingPosition to a face, edge, or vertex position detail that contains xyz.\n // Prior content in movingPosition is used as seed.\n // Return true if successful.\n public moveToPoint(movingPosition: HalfEdgePositionDetail, xyz: Point3d, announcer?: (position: HalfEdgePositionDetail) => boolean): boolean {\n const psc = PointSearchContext.create();\n movingPosition.setITag(0);\n if (movingPosition.isUnclassified) {\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, 0);\n if (movingPosition.isUnclassified)\n return false;\n }\n let trap = 0;\n // double tol = vu_getMergeTol (pGraph);\n const ray = Ray3d.createXAxis();\n for (; movingPosition.getITag() === 0 && trap < 2;) {\n if (announcer !== undefined) {\n const continueSearch = announcer(movingPosition);\n if (!continueSearch)\n break;\n }\n if (!psc.setSearchRay(movingPosition, xyz, ray)) {\n return false;\n } else if (movingPosition.isFace) {\n const lastBefore = HalfEdgePositionDetail.create();\n const firstAfter = HalfEdgePositionDetail.create();\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\n // reAimAroundFace returns lots of cases in `lastBefore` !!\n switch (rc) {\n case RayClassification.RC_NoHits: {\n movingPosition.resetAsUnknown();\n break;\n }\n case RayClassification.RC_TargetOnVertex: {\n movingPosition.setFrom(lastBefore);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetOnEdge: {\n movingPosition.setFrom(lastBefore);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_Bracket: {\n movingPosition.resetAsFace(lastBefore.node, xyz);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetBefore: {\n movingPosition.resetAsFace(movingPosition.node, xyz);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetAfter: {\n if (movingPosition.node === lastBefore.node\n && movingPosition.isFace\n && (lastBefore.isEdge || lastBefore.isVertex)){\n trap++;\n } else {\n trap = 0;\n }\n movingPosition.setFrom(lastBefore);\n break;\n }\n }\n } else if (movingPosition.isEdge) {\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\n if (movingPosition.isUnclassified)\n break;\n } else if (movingPosition.isVertex) {\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\n if (movingPosition.isUnclassified)\n break;\n }\n }\n if (movingPosition.isAtXY(xyz.x, xyz.y))\n return true;\n if (trap > 1) {\n // Ugh. We exited the loop by repeatedly hitting the same node\n // with edge or vertex type in lastBefore.\n // This happens only when the target point is exterior.\n // (Heavy triangulation use cases start with a convex hull and only do interior intersections,\n // so case only happens in contrived unit tests.... so far ...)\n // What to mark?\n // Leave it as is, but mark as exterior target\n //\n if (movingPosition.node !== undefined) {\n movingPosition.setIsExteriorTarget(true);\n }\n return false;\n }\n // Murky here ... should never be hit. Has never been hit in unit tests.\n return false;\n }\n\n}\n// Create a VuPositionDetail for specified fraction along any unmasked edge.\nfunction moveToAnyUnmaskedEdge(graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask): boolean {\n for (const candidate of graph.allHalfEdges) {\n if (!candidate.isMaskSet(skipMask)) {\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\n return true;\n }\n }\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.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 */\n\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { SmallSystem } from \"../numerics/Polynomials\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\nimport { Triangulator } from \"./Triangulation\";\n\n/**\n * Context for repeated insertion of new points in a graph.\n * * Initial graph should have clean outer boundary. (e.g. as typically marked with HalfEdgeMask.EXTERIOR)\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\n * can reuse that position as start for walking to the new point.\n */\nexport class InsertAndRetriangulateContext {\n private _graph: HalfEdgeGraph;\n private _edgeSet: MarkedEdgeSet;\n private _searcher: HalfEdgePositionDetail;\n // Temporaries used in reAimFromFace\n // private _lastBefore: HalfEdgePositionDetail;\n // private _firstAfter: HalfEdgePositionDetail;\n\n private constructor(graph: HalfEdgeGraph) {\n this._graph = graph;\n this._edgeSet = MarkedEdgeSet.create(graph)!;\n this._searcher = HalfEdgePositionDetail.create();\n // this._lastBefore = HalfEdgePositionDetail.create();\n // this._firstAfter = HalfEdgePositionDetail.create();\n }\n /** Create a new context referencing the graph. */\n public static create(graph: HalfEdgeGraph) {\n return new InsertAndRetriangulateContext(graph);\n }\n /** Query the (pointer to) the graph in the context. */\n public get graph(): HalfEdgeGraph { return this._graph; }\n // Walk face from edgeNode; insert new edges back to start node from all except\n // immediate successor and predecessor.\n // insert all new nodes, and nodes of the existing face, in edgeSet.\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\n const numNode = centralNode.countEdgesAroundFace();\n this._edgeSet.addAroundFace(centralNode);\n if (numNode < 4 || centralNode.signedFaceArea() <= 0.0)\n return;\n const numEdge = numNode - 3;\n let farNode = centralNode.faceSuccessor;\n let nearNode = centralNode;\n for (let i = 0; i < numEdge; i++) {\n farNode = farNode.faceSuccessor;\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\n farNode = nearNode.faceSuccessor;\n this._edgeSet.addToSet(nearNode);\n }\n }\n /** Reset the \"current\" position to unknown state. */\n public reset() {\n this._searcher = HalfEdgePositionDetail.create();\n }\n\n /** Return a (reference to!) the current position in the graph */\n public get currentPosition() { return this._searcher; }\n /**\n * Linear search through the graph\n * * Returns a HalfEdgePositionDetail for the nearest edge or vertex.\n * @param xyz\n */\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\n const position = HalfEdgePositionDetail.create();\n position.setDTag(Number.MAX_VALUE);\n const xyzC = Point3d.create();\n let fractionC;\n let distanceC;\n for (const nodeA of this._graph.allHalfEdges) {\n const nodeB = nodeA.faceSuccessor;\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\n if (fractionC !== undefined) {\n if (fractionC > 1.0) {\n distanceC = xyz.distanceXY(nodeB);\n if (distanceC < position.getDTag()!) {\n position.resetAsVertex(nodeB);\n position.setDTag(distanceC);\n }\n } else if (fractionC < 0.0) {\n distanceC = xyz.distanceXY(nodeA);\n if (distanceC < position.getDTag()!) {\n position.resetAsVertex(nodeA);\n position.setDTag(distanceC);\n }\n } else {\n nodeA.fractionToPoint3d(fractionC, xyzC);\n\n distanceC = xyz.distanceXY(xyzC);\n if (distanceC < position.getDTag()!) {\n position.resetAtEdgeAndFraction(nodeA, fractionC);\n }\n }\n }\n }\n return position;\n }\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\n const position = HalfEdgePositionDetail.create();\n position.setDTag(Number.MAX_VALUE);\n let distanceA;\n for (const nodeA of this._graph.allHalfEdges) {\n distanceA = xyz.distanceXY(nodeA);\n if (distanceA < position.getDTag()!) {\n position.resetAsVertex(nodeA);\n position.setDTag(distanceA);\n }\n }\n return position;\n }\n\n public resetSearch(xyz: Point3d, maxDim: number) {\n if (maxDim > 0)\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\n else\n this._searcher = this.searchForNearestVertex(xyz);\n }\n public insertAndRetriangulate(xyz: Point3d, newZWins: boolean): boolean {\n this.moveToPoint(this._searcher, xyz);\n const seedNode = this._searcher.node;\n let stat = false;\n if (seedNode === undefined) {\n } else if (this._searcher.isFace) {\n if (!seedNode.isMaskSet(HalfEdgeMask.EXTERIOR)) {\n const newInteriorNode = this._graph.createEdgeXYZHalfEdge(xyz.x, xyz.y, xyz.z, 0, seedNode, 0);\n this.retriangulateFromBaseVertex(newInteriorNode);\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\n this._searcher.resetAsVertex(newInteriorNode);\n }\n stat = true;\n } else if (this._searcher.isEdge) {\n const newA = this._graph.splitEdgeAtFraction(seedNode, this._searcher.edgeFraction!);\n const newB = newA.vertexPredecessor;\n this.retriangulateFromBaseVertex(newA);\n this.retriangulateFromBaseVertex(newB);\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\n this._searcher.resetAsVertex(newA);\n stat = true;\n } else if (this._searcher.isVertex) {\n // There's already a vertex there. Maybe the z is different.\n if (newZWins)\n seedNode.setXYZAroundVertex(xyz.x, xyz.y, xyz.z);\n stat = true;\n } else {\n stat = false;\n }\n return stat;\n }\n\n // Advance movingPosition to a face, edge, or vertex position detail that contains xyz.\n // Prior content in movingPosition is used as seed.\n // Return true if successful.\n public moveToPoint(movingPosition: HalfEdgePositionDetail, xyz: Point3d, announcer?: (position: HalfEdgePositionDetail) => boolean): boolean {\n const psc = PointSearchContext.create();\n movingPosition.setITag(0);\n if (movingPosition.isUnclassified) {\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, 0);\n if (movingPosition.isUnclassified)\n return false;\n }\n let trap = 0;\n // double tol = vu_getMergeTol (pGraph);\n const ray = Ray3d.createXAxis();\n for (; movingPosition.getITag() === 0 && trap < 2;) {\n if (announcer !== undefined) {\n const continueSearch = announcer(movingPosition);\n if (!continueSearch)\n break;\n }\n if (!psc.setSearchRay(movingPosition, xyz, ray)) {\n return false;\n } else if (movingPosition.isFace) {\n const lastBefore = HalfEdgePositionDetail.create();\n const firstAfter = HalfEdgePositionDetail.create();\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\n // reAimAroundFace returns lots of cases in `lastBefore` !!\n switch (rc) {\n case RayClassification.RC_NoHits: {\n movingPosition.resetAsUnknown();\n break;\n }\n case RayClassification.RC_TargetOnVertex: {\n movingPosition.setFrom(lastBefore);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetOnEdge: {\n movingPosition.setFrom(lastBefore);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_Bracket: {\n movingPosition.resetAsFace(lastBefore.node, xyz);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetBefore: {\n movingPosition.resetAsFace(movingPosition.node, xyz);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetAfter: {\n if (movingPosition.node === lastBefore.node\n && movingPosition.isFace\n && (lastBefore.isEdge || lastBefore.isVertex)){\n trap++;\n } else {\n trap = 0;\n }\n movingPosition.setFrom(lastBefore);\n break;\n }\n }\n } else if (movingPosition.isEdge) {\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\n if (movingPosition.isUnclassified)\n break;\n } else if (movingPosition.isVertex) {\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\n if (movingPosition.isUnclassified)\n break;\n }\n }\n if (movingPosition.isAtXY(xyz.x, xyz.y))\n return true;\n if (trap > 1) {\n // Ugh. We exited the loop by repeatedly hitting the same node\n // with edge or vertex type in lastBefore.\n // This happens only when the target point is exterior.\n // (Heavy triangulation use cases start with a convex hull and only do interior intersections,\n // so case only happens in contrived unit tests.... so far ...)\n // What to mark?\n // Leave it as is, but mark as exterior target\n //\n if (movingPosition.node !== undefined) {\n movingPosition.setIsExteriorTarget(true);\n }\n return false;\n }\n // Murky here ... should never be hit. Has never been hit in unit tests.\n return false;\n }\n\n}\n// Create a VuPositionDetail for specified fraction along any unmasked edge.\nfunction moveToAnyUnmaskedEdge(graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask): boolean {\n for (const candidate of graph.allHalfEdges) {\n if (!candidate.isMaskSet(skipMask)) {\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\n return true;\n }\n }\n return false;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaskManager.js","sourceRoot":"","sources":["../../../src/topology/MaskManager.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IAItB;;;;OAIG;IACH,YAAoB,SAAiB,EAAE,aAAqB;QAC1D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,MAAM,CAAC,SAAiB;QACpC,kCAAkC;QAClC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"MaskManager.js","sourceRoot":"","sources":["../../../src/topology/MaskManager.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IAItB;;;;OAIG;IACH,YAAoB,SAAiB,EAAE,aAAqB;QAC1D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,MAAM,CAAC,SAAiB;QACpC,kCAAkC;QAClC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,SAAS,GAAG,OAAO,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,SAAS,KAAK,CAAC;YACjB,OAAO,SAAS,CAAC;QACnB,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IACD,yEAAyE;IAClE,QAAQ;QACb,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC;YACvB,OAAO,CAAC,CAAC;QACX,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;QAC/B,OAAO,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;YAC9B,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,8DAA8D;IACvD,QAAQ,CAAC,IAAY;QAC1B,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,kDAAkD;QACnF,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IAC1B,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n/**\n * Methods to \"grab and drop\" mask bits.\n * * Caller code (e.g. HalfEdgeGraph) initializes with a block of bits to be managed.\n * * Callers borrow and return masks with \"grabMask\" and \"dropMask\".\n * * Callers must exercise grab/drop balance discipline.\n * @internal\n */\nexport class MaskManager {\n private _freeMasks: number;\n private _originalFreeMasks: number;\n private _firstFreeMask: number;\n /**\n * Constructor\n * @param freeMasks caller-defined block of bits that are to be managed.\n * @param firstFreeMask the first free mask in the freeMasks bits block.\n */\n private constructor(freeMasks: number, firstFreeMask: number) {\n this._freeMasks = freeMasks;\n this._originalFreeMasks = freeMasks;\n this._firstFreeMask = firstFreeMask;\n }\n /**\n * Create a MaskManager.\n * Typical use: MaskManager.create(0xFFFF0000)\n * * This makes bits 16 through 31 available to be borrowed, with lower bits available for fixed usage.\n */\n public static create(freeMasks: number): MaskManager | undefined {\n // look for first bit up to bit 31\n let firstFree = 0;\n let testBit = 0x01;\n for (let i = 0; i < 32; i++) {\n if ((testBit & freeMasks) !== 0) {\n firstFree = testBit;\n break;\n }\n testBit = (testBit << 1);\n }\n if (firstFree === 0)\n return undefined;\n return new MaskManager(freeMasks, firstFree);\n }\n /** Find a mask bit that is not \"in use\" in order to borrow that mask. */\n public grabMask(): number {\n if (this._freeMasks === 0)\n return 0;\n let mask = this._firstFreeMask;\n while (!(mask & this._freeMasks))\n mask = mask << 1;\n this._freeMasks &= ~mask;\n return mask;\n }\n /** Return the borrowed mask so it is not \"in use\" anymore. */\n public dropMask(mask: number) {\n mask &= this._originalFreeMasks; // prevent \"drop\" of mask that is not in the pool.\n this._freeMasks |= mask;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Merging.js","sourceRoot":"","sources":["../../../src/topology/Merging.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { Point2d, Vector2d } from \"../geometry3d/Point2dVector2d\";\nimport { Range3d } from \"../geometry3d/Range\";\nimport { ClusterableArray } from \"../numerics/ClusterableArray\";\nimport { SmallSystem } from \"../numerics/Polynomials\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { HalfEdgePriorityQueueWithPartnerArray } from \"./HalfEdgePriorityQueue\";\nimport { RegularizationContext } from \"./RegularizeFace\";\nimport { Triangulator } from \"./Triangulation\";\nimport { MultiLineStringDataVariant } from \"../geometry3d/IndexedXYZCollection\";\n\nexport class GraphSplitData {\n public numUpEdge = 0;\n public numIntersectionTest = 0;\n public numSplit = 0;\n public numPopOut = 0;\n public numA0B0 = 0;\n public numA0B1 = 0;\n public constructor() {\n }\n}\n/**\n * Structure for data used when sorting outbound edges \"around a node\"\n */\nexport class VertexNeighborhoodSortData {\n public index: number;\n public radiusOfCurvature: number;\n public node: HalfEdge;\n public radians?: number;\n public constructor(index: number, key: number, node: HalfEdge, radians?: number) {\n this.index = index;\n this.radiusOfCurvature = key;\n this.node = node;\n this.radians = radians;\n }\n}\n\n/** Function signature for announcing a vertex neighborhood during sorting. */\nexport type AnnounceVertexNeighborhoodSortData = (data: VertexNeighborhoodSortData[]) => any;\n/**\n * * Assorted methods used in algorithms on HalfEdgeGraph.\n * @internal\n */\nexport class HalfEdgeGraphOps {\n\n /** Compare function for sorting with primary y compare, secondary x compare. */\n public static compareNodesYXUp(a: HalfEdge, b: HalfEdge) {\n // Check y's\n // if (!Geometry.isSameCoordinate(a.y, b.y))\n if (a.y < b.y)\n return -1;\n else if (a.y > b.y)\n return 1;\n // Check x's\n // if (!Geometry.isSameCoordinate(a.x, b.x))\n if (a.x < b.x)\n return -1;\n else if (a.x > b.x)\n return 1;\n return 0;\n }\n\n /** Return true if nodeB (a) is lower than both its neighbors and (b) inflects as a downward peak (rather than an upward trough) */\n public static isDownPeak(nodeB: HalfEdge) {\n const nodeA = nodeB.facePredecessor;\n const nodeC = nodeB.faceSuccessor;\n return this.compareNodesYXUp(nodeB, nodeA) < 0\n && this.compareNodesYXUp(nodeB, nodeC) < 0\n && this.crossProductToTargets(nodeB, nodeA, nodeC) > 0;\n }\n\n /** return the cross product of vectors from base to targetA and base to targetB\n * @param base base vertex of both vectors.\n * @param targetA target vertex of first vector\n * @param targetB target vertex of second vector\n */\n public static crossProductToTargets(base: HalfEdge, targetA: HalfEdge, targetB: HalfEdge): number {\n return Geometry.crossProductXYXY(targetA.x - base.x, targetA.y - base.y, targetB.x - base.x, targetB.y - base.y);\n }\n\n // ---------------------------------------------------------------------------------------------------------------------\n // ----------------------------------------------------------------------------------------------------------------------\n\n public static graphRange(graph: HalfEdgeGraph): Range3d {\n const range = Range3d.create();\n for (const node of graph.allHalfEdges) {\n range.extendXYZ(node.x, node.y, node.z);\n }\n return range;\n }\n /** Returns an array of all nodes (both ends) of edges created from segments. */\n public static segmentArrayToGraphEdges(segments: LineSegment3d[], returnGraph: HalfEdgeGraph, mask: HalfEdgeMask): HalfEdge[] {\n const result = [];\n let idxCounter = 0;\n\n // Push the endpoints of each segment onto arr[] in the form {(x, y, theta), Node}\n for (const segment of segments) {\n\n const node0 = returnGraph.createEdgeXYZXYZ(\n segment.point0Ref.x, segment.point0Ref.y, segment.point0Ref.z,\n idxCounter,\n segment.point1Ref.x, segment.point1Ref.y, segment.point1Ref.z,\n idxCounter + 1);\n\n const node1 = node0.edgeMate;\n idxCounter += 2;\n\n node0.setMaskAroundFace(mask); // Original given coordinates must be part of boundary\n result.push(node0);\n result.push(node1);\n }\n\n return result;\n }\n\n /**\n * * Visit all nodes in `graph`.\n * * invoke `pinch(node, vertexPredecessor)`\n * * this leaves the graph as isolated edges.\n * @param graph graph to modify\n */\n public static isolateAllEdges(graph: HalfEdgeGraph) {\n for (const nodeA of graph.allHalfEdges) {\n const nodeB = nodeA.vertexPredecessor;\n HalfEdge.pinch(nodeA, nodeB);\n }\n }\n /**\n * Compute convexity of a sector of a super-face.\n * @param base node whose edge is to be tested for removal\n * @param ignore edges with this mask (on either side) are ignored for the purposes of computing convexity\n * @param barrier edges with this mask (on either side) will not be removed\n * @param signedAreaTol optional signed area tolerance to use in test for parallel vectors\n * @return whether removing the edge at base would create a convex sector in the super-face\n */\n private static isSectorConvexAfterEdgeRemoval(base: HalfEdge, ignore: HalfEdgeMask, barrier: HalfEdgeMask, signedAreaTol: number = 0): boolean {\n let vs = base;\n do { // loop ccw around vertex looking for a super-face predecessor\n if (vs.isMaskSet(barrier) || vs.edgeMate.isMaskSet(barrier))\n break;\n vs = vs.vertexSuccessor;\n } while (vs !== base && vs.isMaskSet(ignore));\n if (vs === base)\n return false;\n let vp = base;\n do { // loop cw around vertex looking for a super-face successor\n if (vp.isMaskSet(barrier) || vp.edgeMate.isMaskSet(barrier))\n break;\n vp = vp.vertexPredecessor;\n } while (vp !== base && vp.isMaskSet(ignore));\n if (vp === base)\n return false;\n return HalfEdge.isSectorConvex(vs.edgeMate, base, vp.faceSuccessor, signedAreaTol);\n }\n /**\n * Mask edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to examine and mark\n * @param mark the mask used to mark (both sides of) removable edges\n * @param barrier edges with this mask (on either side) will not be marked. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return number of edges masked (half the number of HalfEdges masked)\n */\n public static markRemovableEdgesToExpandConvexFaces(graph: HalfEdgeGraph, mark: HalfEdgeMask, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): number {\n if (HalfEdgeMask.NULL_MASK === mark)\n return 0;\n const visit = graph.grabMask(true);\n let numMarked = 0;\n for (const node of graph.allHalfEdges) {\n if (!node.isMaskSet(visit)) {\n if (!node.isMaskSet(barrier) && !node.edgeMate.isMaskSet(barrier)) {\n // tol based on areas of *original* faces on each side of the edge to be removed\n const signedAreaTol = Geometry.smallMetricDistanceSquared * (node.signedFaceArea() + node.edgeMate.signedFaceArea());\n if (this.isSectorConvexAfterEdgeRemoval(node, mark, barrier, signedAreaTol) && this.isSectorConvexAfterEdgeRemoval(node.edgeMate, mark, barrier, signedAreaTol)) {\n node.setMaskAroundEdge(mark);\n ++numMarked;\n }\n }\n }\n node.setMaskAroundEdge(visit);\n }\n graph.dropMask(visit);\n return numMarked;\n }\n /**\n * Collect edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to examine\n * @param barrier edges with this mask (on either side) will not be collected. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return one HalfEdge per removable edge\n */\n public static collectRemovableEdgesToExpandConvexFaces(graph: HalfEdgeGraph, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): HalfEdge[] | undefined {\n const removable: HalfEdge[] = [];\n const mark = graph.grabMask(true);\n if (0 < this.markRemovableEdgesToExpandConvexFaces(graph, mark, barrier)) {\n const visited = graph.grabMask(true);\n for (const node of graph.allHalfEdges) {\n if (node.isMaskSet(mark) && !node.isMaskSet(visited)) {\n node.setMaskAroundEdge(visited);\n removable.push(node);\n }\n }\n graph.dropMask(visited);\n }\n graph.dropMask(mark);\n return removable;\n }\n\n /**\n * Remove edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to modify\n * @param barrier edges with this mask (on either side) will not be removed. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return number of edges deleted\n */\n public static expandConvexFaces(graph: HalfEdgeGraph, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): number {\n const mark = graph.grabMask(true);\n const numRemovedEdges = this.markRemovableEdgesToExpandConvexFaces(graph, mark, barrier);\n if (numRemovedEdges > 0) {\n const numYankedEdges = 0.5 * graph.yankAndDeleteEdges((node: HalfEdge) => node.getMask(mark));\n assert(numYankedEdges === numRemovedEdges);\n }\n graph.dropMask(mark);\n return numRemovedEdges;\n }\n\n /**\n * Test desired faces for convexity.\n * @param graph graph to examine\n * @param avoid faces with this mask will not be examined. Defaults to HalfEdgeMask.EXTERIOR.\n * @return whether every face in the graph is convex\n */\n public static isEveryFaceConvex(graph: HalfEdgeGraph, avoid: HalfEdgeMask = HalfEdgeMask.EXTERIOR): boolean {\n const allFaces = graph.collectFaceLoops();\n for (const node of allFaces) {\n if (node.isMaskedAroundFace(avoid))\n continue;\n if (!node.isFaceConvex())\n return false;\n }\n return true;\n }\n}\n\n/**\n * Note: this class uses hardcoded micrometer coordinate/cluster tolerance throughout.\n * @internal\n */\nexport class HalfEdgeGraphMerge {\n // return kC such that all angles k are equal, with kA <= k < kC <= kB.\n // * Assume: angles k are stored at extra data index 0.\n // * Note that the usual case (when angle at kA is not repeated) is kA+1 === kC\n public static getCommonThetaEndIndex(clusters: ClusterableArray, order: Uint32Array, kA: number, kB: number): number {\n let kC = kA + 1;\n const thetaA = clusters.getExtraData(order[kA], 0);\n while (kC < kB) {\n const thetaB = clusters.getExtraData(order[kC], 0);\n if (!Angle.isAlmostEqualRadiansAllowPeriodShift(thetaA, thetaB)) {\n return kC;\n }\n kC++;\n }\n return kC;\n }\n private static _announceVertexNeighborhoodFunction?: AnnounceVertexNeighborhoodSortData;\n /**\n * public property setter for a function to be called with sorted edge data around a vertex.\n */\n public static set announceVertexNeighborhoodFunction(func: AnnounceVertexNeighborhoodSortData | undefined) { this._announceVertexNeighborhoodFunction = func; }\n private static doAnnounceVertexNeighborhood(clusters: ClusterableArray, order: Uint32Array, allNodes: HalfEdge[], k0: number, k1: number) {\n if (this._announceVertexNeighborhoodFunction) {\n const sortData: VertexNeighborhoodSortData[] = [];\n // build and share the entire vertex order\n for (let k = k0; k < k1; k++) {\n const index = clusters.getExtraData(order[k], 1);\n const theta = clusters.getExtraData(order[k], 0);\n const node = allNodes[index];\n const signedDistance = this.curvatureSortKey(node);\n sortData.push(new VertexNeighborhoodSortData(order[k], signedDistance, node, theta));\n }\n this._announceVertexNeighborhoodFunction(sortData);\n }\n\n }\n // assumptions about cluster array:\n // * data order is: x,y,theta,nodeIndex\n // * theta and nodeIndex are the \"extra\" data.\n // * only want to do anything here when curves are present.\n // * k0<=k<k1 are around a vertex\n // * These are sorted by theta.\n private static secondarySortAroundVertex(clusters: ClusterableArray, order: Uint32Array, allNodes: HalfEdge[], k0: number, k1: number) {\n const sortData: VertexNeighborhoodSortData[] = [];\n\n for (let k = k0; k < k1;) {\n const kB = this.getCommonThetaEndIndex(clusters, order, k, k1);\n if (k + 1 < kB) {\n sortData.length = 0;\n for (let kA = k; kA < kB; kA++) {\n const index = clusters.getExtraData(order[kA], 1);\n const node = allNodes[index];\n const signedDistance = this.curvatureSortKey(node);\n sortData.push(new VertexNeighborhoodSortData(order[kA], signedDistance, node));\n }\n sortData.sort((a: VertexNeighborhoodSortData, b: VertexNeighborhoodSortData) => (a.radiusOfCurvature - b.radiusOfCurvature));\n for (let i = 0; i < sortData.length; i++) {\n order[k + i] = sortData[i].index;\n }\n }\n k = kB;\n }\n }\n /** Return the sort key for sorting by curvature.\n * * This is the signed distance from the curve at the edge start, to center of curvature.\n * * NOTE: Currently does not account for higher derivatives in the case of higher-than-tangent match.\n */\n public static curvatureSortKey(node: HalfEdge): number {\n const cld = node.edgeTag as CurveLocationDetail;\n if (cld !== undefined) {\n const fraction = cld.fraction;\n const curve = cld.curve;\n if (curve) {\n let radius = curve.fractionToSignedXYRadiusOfCurvature(fraction);\n if (node.sortData !== undefined && node.sortData < 0)\n radius = -radius;\n return radius;\n }\n }\n return 0.0;\n }\n /** Whether the HalfEdge is part of a null face, as marked by [[clusterAndMergeXYTheta]]. */\n public static isNullFace(node: HalfEdge): boolean {\n return node.isMaskSet(HalfEdgeMask.NULL_FACE) && node.faceSuccessor.isMaskSet(HalfEdgeMask.NULL_FACE) && node === node.faceSuccessor.faceSuccessor;\n }\n /** Simplest merge algorithm:\n * * collect array of (x,y,theta) at all nodes\n * * lexical sort of the array.\n * * twist all vertices together.\n * * This effectively creates valid face loops for a planar subdivision if there are no edge crossings.\n * * If there are edge crossings, the graph can be a (highly complicated) Klein bottle topology.\n * * Mask.NULL_FACE is cleared throughout and applied within null faces.\n */\n public static clusterAndMergeXYTheta(graph: HalfEdgeGraph, outboundRadiansFunction?: (he: HalfEdge) => number) {\n const allNodes = graph.allHalfEdges;\n const numNodes = allNodes.length;\n graph.clearMask(HalfEdgeMask.NULL_FACE);\n const clusters = new ClusterableArray(2, 2, numNodes); // data order: x,y,theta,nodeIndex. But theta is not set in first round.\n for (let i = 0; i < numNodes; i++) {\n const nodeA = allNodes[i];\n const xA = nodeA.x;\n const yA = nodeA.y;\n HalfEdge.pinch(nodeA, nodeA.vertexSuccessor); // pull it out of its current vertex loop.\n clusters.addDirect(xA, yA, 0.0, i);\n }\n const clusterTol = Geometry.smallMetricDistance;\n const order = clusters.clusterIndicesLexical(clusterTol);\n let k0 = 0;\n const numK = order.length;\n for (let k1 = 0; k1 < numK; k1++) {\n if (order[k1] === ClusterableArray.clusterTerminator) {\n // nodes identified in order[k0]..order[k1-1] are at a vertex cluster; equate their xy\n if (k1 > k0) {\n const iA = clusters.getExtraData(order[k0], 1);\n const nodeA0 = allNodes[iA];\n for (let k = k0 + 1; k < k1; k++) {\n const iB = clusters.getExtraData(order[k], 1);\n const nodeB = allNodes[iB];\n nodeB.x = nodeA0.x;\n nodeB.y = nodeA0.y;\n }\n }\n k0 = k1 + 1;\n }\n }\n // NOW\n // 1) There are identical coordinates at all nodes around each vertex loop.\n // 2) Hence ready do sort (at each vertex) by theta.\n\n // insert theta as extra data in the sort table . . .\n for (const clusterTableIndex of order) {\n if (clusterTableIndex !== ClusterableArray.clusterTerminator) {\n const nodeA = allNodes[clusterTableIndex];\n const nodeB = nodeA.faceSuccessor;\n let getPrecomputedRadians = outboundRadiansFunction;\n if (getPrecomputedRadians) {\n // Recompute theta when edge geometry is completely determined by the vertices, which may have been perturbed by clustering.\n const detail = nodeA.edgeTag as CurveLocationDetail;\n if (undefined === detail || undefined === detail.curve || detail.curve instanceof LineSegment3d)\n getPrecomputedRadians = undefined;\n }\n let radians = getPrecomputedRadians ? getPrecomputedRadians(nodeA) : Math.atan2(nodeB.y - nodeA.y, nodeB.x - nodeA.x);\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, -Math.PI))\n radians = Math.PI;\n clusters.setExtraData(clusterTableIndex, 0, radians);\n }\n }\n clusters.sortSubsetsBySingleKey(order, 2);\n const unmatchedNullFaceNodes: HalfEdge[] = [];\n k0 = 0;\n let thetaA, thetaB;\n // GeometryCoreTestIO.consoleLog(\"START VERTEX LINKS\");\n\n // now pinch each neighboring pair together\n for (let k1 = 0; k1 < numK; k1++) {\n if (order[k1] === ClusterableArray.clusterTerminator) {\n // nodes identified in order[k0]..order[k1-1] are properly sorted around a vertex.\n if (k1 > k0) {\n // const xy = clusters.getPoint2d(order[k0]);\n // GeometryCoreTestIO.consoleLog({ k0, k1, x: xy.x, y: xy.y });\n if (k1 > k0 + 1)\n this.secondarySortAroundVertex(clusters, order, allNodes, k0, k1);\n this.doAnnounceVertexNeighborhood(clusters, order, allNodes, k0, k1);\n const iA = clusters.getExtraData(order[k0], 1);\n thetaA = clusters.getExtraData(order[k0], 0);\n const nodeA0 = allNodes[iA];\n let nodeA = nodeA0;\n for (let k = k0 + 1; k < k1; k++) {\n const iB = clusters.getExtraData(order[k], 1);\n thetaB = clusters.getExtraData(order[k], 0);\n const nodeB = allNodes[iB];\n if (nodeA.isMaskSet(HalfEdgeMask.NULL_FACE)) {\n // nope, this edge was flagged and pinched from the other end.\n const j = unmatchedNullFaceNodes.findIndex((node: HalfEdge) => nodeA === node);\n if (j >= 0) {\n unmatchedNullFaceNodes[j] = unmatchedNullFaceNodes[unmatchedNullFaceNodes.length - 1];\n unmatchedNullFaceNodes.pop();\n }\n nodeA = nodeB;\n thetaA = thetaB;\n } else if (nodeB.isMaskSet(HalfEdgeMask.NULL_FACE)) {\n const j = unmatchedNullFaceNodes.findIndex((node: HalfEdge) => nodeB === node);\n if (j >= 0) {\n unmatchedNullFaceNodes[j] = unmatchedNullFaceNodes[unmatchedNullFaceNodes.length - 1];\n unmatchedNullFaceNodes.pop();\n }\n // NO leave nodeA and thetaA ignore nodeB -- later step will get the outside of its banana.\n } else {\n HalfEdge.pinch(nodeA, nodeB);\n\n // Detect null face using the heuristic:\n // * near vertex angles are same (periodic, toleranced)\n // * far vertex is clustered (exactly equal)\n // * near vertex curvatures are same (toleranced)\n // Note that near vertex is already clustered.\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(thetaA, thetaB)) {\n const nodeA1 = nodeA.faceSuccessor;\n const nodeB1 = nodeB.edgeMate;\n if (nodeA1.isEqualXY(nodeB1)) {\n const cA = this.curvatureSortKey(nodeA);\n const cB = this.curvatureSortKey(nodeB);\n if (Geometry.isSameCoordinate(cA, cB, clusterTol)) { // rule out banana\n HalfEdge.pinch(nodeA1, nodeB1);\n nodeA.setMask(HalfEdgeMask.NULL_FACE);\n nodeB1.setMask(HalfEdgeMask.NULL_FACE);\n unmatchedNullFaceNodes.push(nodeB1);\n }\n }\n }\n nodeA = nodeB;\n thetaA = thetaB;\n }\n }\n }\n k0 = k1 + 1;\n }\n }\n }\n\n private static buildVerticalSweepPriorityQueue(graph: HalfEdgeGraph): HalfEdgePriorityQueueWithPartnerArray {\n const sweepHeap = new HalfEdgePriorityQueueWithPartnerArray();\n for (const p of graph.allHalfEdges) {\n\n if (HalfEdgeGraphOps.compareNodesYXUp(p, p.faceSuccessor) < 0) {\n sweepHeap.priorityQueue.push(p);\n }\n }\n return sweepHeap;\n }\n private static snapFractionToNode(xy: Point2d, fraction: number, node: HalfEdge, nodeFraction: number): number {\n if (Geometry.isSameCoordinate(xy.x, node.x) && Geometry.isSameCoordinate(xy.y, node.y))\n return nodeFraction;\n return fraction;\n }\n private static computeIntersectionFractionsOnEdges(nodeA0: HalfEdge, nodeB0: HalfEdge, fractions: Vector2d, pointA: Point2d, pointB: Point2d): boolean {\n const nodeA1 = nodeA0.faceSuccessor;\n const ax0 = nodeA0.x;\n const ay0 = nodeA0.y;\n const ux = nodeA1.x - ax0;\n const uy = nodeA1.y - ay0;\n const nodeB1 = nodeB0.faceSuccessor;\n const bx0 = nodeB0.x;\n const by0 = nodeB0.y;\n const vx = nodeB1.x - bx0;\n const vy = nodeB1.y - by0;\n // cspell:word lineSegmentXYUVTransverseIntersectionUnbounded\n if (SmallSystem.lineSegmentXYUVTransverseIntersectionUnbounded(ax0, ay0, ux, uy,\n bx0, by0, vx, vy, fractions)) {\n pointA.x = ax0 + fractions.x * ux;\n pointA.y = ay0 + fractions.x * uy;\n pointB.x = bx0 + fractions.y * vx;\n pointB.y = by0 + fractions.y * vy;\n fractions.x = this.snapFractionToNode(pointA, fractions.x, nodeA0, 0.0);\n fractions.x = this.snapFractionToNode(pointA, fractions.x, nodeA1, 1.0);\n fractions.y = this.snapFractionToNode(pointB, fractions.y, nodeB0, 0.0);\n fractions.y = this.snapFractionToNode(pointB, fractions.y, nodeB1, 1.0);\n return Geometry.isIn01(fractions.x) && Geometry.isIn01(fractions.y);\n }\n return false;\n }\n /**\n * Split edges at intersections.\n * * This is a large operation.\n * @param graph\n */\n public static splitIntersectingEdges(graph: HalfEdgeGraph): GraphSplitData {\n const data = new GraphSplitData();\n const sweepHeap = this.buildVerticalSweepPriorityQueue(graph);\n let nodeA0, nodeB1;\n const smallFraction = 1.0e-8;\n const largeFraction = 1.0 - smallFraction;\n let i;\n const fractions = Vector2d.create();\n const pointA = Point2d.create();\n const pointB = Point2d.create();\n let nodeB0;\n const popTolerance = Geometry.smallMetricDistance;\n while (undefined !== (nodeA0 = sweepHeap.priorityQueue.pop())) {\n data.numUpEdge++;\n const n0 = sweepHeap.activeEdges.length;\n sweepHeap.removeArrayMembersWithY1Below(nodeA0.y - popTolerance);\n data.numPopOut += n0 - sweepHeap.activeEdges.length;\n for (i = 0; i < sweepHeap.activeEdges.length; i++) {\n nodeB0 = sweepHeap.activeEdges[i];\n nodeB1 = nodeB0.faceSuccessor;\n // const nodeB1 = nodeB0.faceSuccessor;\n if (Geometry.isSameCoordinateXY(nodeA0.x, nodeA0.y, nodeB0.x, nodeB0.y)) {\n data.numA0B0++;\n } else if (Geometry.isSameCoordinateXY(nodeB1.x, nodeB1.y, nodeA0.x, nodeA0.y)) {\n data.numA0B1++;\n } else {\n data.numIntersectionTest++;\n if (this.computeIntersectionFractionsOnEdges(nodeA0, nodeB0, fractions, pointA, pointB)) {\n if (fractions.x > smallFraction && fractions.x < largeFraction) {\n const nodeC0 = graph.splitEdgeAtFraction(nodeA0, fractions.x);\n sweepHeap.priorityQueue.push(nodeC0); // The upper portion will be reviewed as a nodeA0 later !!!\n data.numSplit++;\n }\n if (fractions.y > smallFraction && fractions.y < largeFraction) {\n const nodeD0 = graph.splitEdgeAtFraction(nodeB0, fractions.y);\n sweepHeap.priorityQueue.push(nodeD0); // The upper portion will be reviewed as a nodeA0 later !!!\n data.numSplit++;\n }\n // existing nodeA0 and its shortened edge remain for further intersections\n }\n }\n }\n sweepHeap.activeEdges.push(nodeA0);\n }\n return data;\n }\n\n /**\n * Returns a graph structure formed from the given LineSegment array\n *\n * * Find all intersections among segments, and split them if necessary\n * * Record endpoints of every segment in the form X, Y, Theta; This information is stored as a new node and sorted to match up\n * vertices.\n * * For vertices that match up, pinch the nodes to create vertex loops, which in closed objects, will also eventually form face\n * loops\n */\n public static formGraphFromSegments(lineSegments: LineSegment3d[]): HalfEdgeGraph {\n // Structure of an index of the array: { xyTheta: Point3d, node: Node }\n const graph = new HalfEdgeGraph();\n HalfEdgeGraphOps.segmentArrayToGraphEdges(lineSegments, graph, HalfEdgeMask.BOUNDARY_EDGE);\n this.splitIntersectingEdges(graph);\n this.clusterAndMergeXYTheta(graph);\n return graph;\n }\n\n /**\n * * Input is random linestrings, not necessarily loops\n * * Graph gets full splitEdges, regularize, and triangulate.\n * @returns triangulated graph, or undefined if bad data.\n */\n public static formGraphFromChains(chains: MultiLineStringDataVariant, regularize: boolean = true, mask: HalfEdgeMask = HalfEdgeMask.PRIMARY_EDGE): HalfEdgeGraph | undefined {\n if (chains.length < 1)\n return undefined;\n const graph = new HalfEdgeGraph();\n const chainSeeds = Triangulator.directCreateChainsFromCoordinates(graph, chains);\n for (const seed of chainSeeds)\n seed.setMaskAroundFace(mask);\n\n this.splitIntersectingEdges(graph);\n this.clusterAndMergeXYTheta(graph);\n if (regularize) {\n const context = new RegularizationContext(graph);\n context.regularizeGraph(true, true);\n }\n return graph;\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Merging.js","sourceRoot":"","sources":["../../../src/topology/Merging.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { Point2d, Vector2d } from \"../geometry3d/Point2dVector2d\";\nimport { Range3d } from \"../geometry3d/Range\";\nimport { ClusterableArray } from \"../numerics/ClusterableArray\";\nimport { SmallSystem } from \"../numerics/Polynomials\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { HalfEdgePriorityQueueWithPartnerArray } from \"./HalfEdgePriorityQueue\";\nimport { RegularizationContext } from \"./RegularizeFace\";\nimport { Triangulator } from \"./Triangulation\";\nimport { MultiLineStringDataVariant } from \"../geometry3d/IndexedXYZCollection\";\n\nexport class GraphSplitData {\n public numUpEdge = 0;\n public numIntersectionTest = 0;\n public numSplit = 0;\n public numPopOut = 0;\n public numA0B0 = 0;\n public numA0B1 = 0;\n public constructor() {\n }\n}\n/**\n * Structure for data used when sorting outbound edges \"around a node\"\n */\nexport class VertexNeighborhoodSortData {\n public index: number;\n public radiusOfCurvature: number;\n public node: HalfEdge;\n public radians?: number;\n public constructor(index: number, key: number, node: HalfEdge, radians?: number) {\n this.index = index;\n this.radiusOfCurvature = key;\n this.node = node;\n this.radians = radians;\n }\n}\n\n/** Function signature for announcing a vertex neighborhood during sorting. */\nexport type AnnounceVertexNeighborhoodSortData = (data: VertexNeighborhoodSortData[]) => any;\n/**\n * * Assorted methods used in algorithms on HalfEdgeGraph.\n * @internal\n */\nexport class HalfEdgeGraphOps {\n\n /** Compare function for sorting with primary y compare, secondary x compare. */\n public static compareNodesYXUp(a: HalfEdge, b: HalfEdge) {\n // Check y's\n // if (!Geometry.isSameCoordinate(a.y, b.y))\n if (a.y < b.y)\n return -1;\n else if (a.y > b.y)\n return 1;\n // Check x's\n // if (!Geometry.isSameCoordinate(a.x, b.x))\n if (a.x < b.x)\n return -1;\n else if (a.x > b.x)\n return 1;\n return 0;\n }\n\n /** Return true if nodeB (a) is lower than both its neighbors and (b) inflects as a downward peak (rather than an upward trough) */\n public static isDownPeak(nodeB: HalfEdge) {\n const nodeA = nodeB.facePredecessor;\n const nodeC = nodeB.faceSuccessor;\n return this.compareNodesYXUp(nodeB, nodeA) < 0\n && this.compareNodesYXUp(nodeB, nodeC) < 0\n && this.crossProductToTargets(nodeB, nodeA, nodeC) > 0;\n }\n\n /** return the cross product of vectors from base to targetA and base to targetB\n * @param base base vertex of both vectors.\n * @param targetA target vertex of first vector\n * @param targetB target vertex of second vector\n */\n public static crossProductToTargets(base: HalfEdge, targetA: HalfEdge, targetB: HalfEdge): number {\n return Geometry.crossProductXYXY(targetA.x - base.x, targetA.y - base.y, targetB.x - base.x, targetB.y - base.y);\n }\n\n // ---------------------------------------------------------------------------------------------------------------------\n // ----------------------------------------------------------------------------------------------------------------------\n\n public static graphRange(graph: HalfEdgeGraph): Range3d {\n const range = Range3d.create();\n for (const node of graph.allHalfEdges) {\n range.extendXYZ(node.x, node.y, node.z);\n }\n return range;\n }\n /** Returns an array of all nodes (both ends) of edges created from segments. */\n public static segmentArrayToGraphEdges(segments: LineSegment3d[], returnGraph: HalfEdgeGraph, mask: HalfEdgeMask): HalfEdge[] {\n const result = [];\n let idxCounter = 0;\n\n // Push the endpoints of each segment onto arr[] in the form {(x, y, theta), Node}\n for (const segment of segments) {\n\n const node0 = returnGraph.createEdgeXYZXYZ(\n segment.point0Ref.x, segment.point0Ref.y, segment.point0Ref.z,\n idxCounter,\n segment.point1Ref.x, segment.point1Ref.y, segment.point1Ref.z,\n idxCounter + 1);\n\n const node1 = node0.edgeMate;\n idxCounter += 2;\n\n node0.setMaskAroundFace(mask); // Original given coordinates must be part of boundary\n result.push(node0);\n result.push(node1);\n }\n\n return result;\n }\n\n /**\n * * Visit all nodes in `graph`.\n * * invoke `pinch(node, vertexPredecessor)`\n * * this leaves the graph as isolated edges.\n * @param graph graph to modify\n */\n public static isolateAllEdges(graph: HalfEdgeGraph) {\n for (const nodeA of graph.allHalfEdges) {\n const nodeB = nodeA.vertexPredecessor;\n HalfEdge.pinch(nodeA, nodeB);\n }\n }\n /**\n * Compute convexity of a sector of a super-face.\n * @param base node whose edge is to be tested for removal\n * @param ignore edges with this mask (on either side) are ignored for the purposes of computing convexity\n * @param barrier edges with this mask (on either side) will not be removed\n * @param signedAreaTol optional signed area tolerance to use in test for parallel vectors\n * @return whether removing the edge at base would create a convex sector in the super-face\n */\n private static isSectorConvexAfterEdgeRemoval(base: HalfEdge, ignore: HalfEdgeMask, barrier: HalfEdgeMask, signedAreaTol: number = 0): boolean {\n let vs = base;\n do { // loop ccw around vertex looking for a super-face predecessor\n if (vs.isMaskSet(barrier) || vs.edgeMate.isMaskSet(barrier))\n break;\n vs = vs.vertexSuccessor;\n } while (vs !== base && vs.isMaskSet(ignore));\n if (vs === base)\n return false;\n let vp = base;\n do { // loop cw around vertex looking for a super-face successor\n if (vp.isMaskSet(barrier) || vp.edgeMate.isMaskSet(barrier))\n break;\n vp = vp.vertexPredecessor;\n } while (vp !== base && vp.isMaskSet(ignore));\n if (vp === base)\n return false;\n return HalfEdge.isSectorConvex(vs.edgeMate, base, vp.faceSuccessor, signedAreaTol);\n }\n /**\n * Mask edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to examine and mark\n * @param mark the mask used to mark (both sides of) removable edges\n * @param barrier edges with this mask (on either side) will not be marked. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return number of edges masked (half the number of HalfEdges masked)\n */\n public static markRemovableEdgesToExpandConvexFaces(graph: HalfEdgeGraph, mark: HalfEdgeMask, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): number {\n if (HalfEdgeMask.NULL_MASK === mark)\n return 0;\n const visit = graph.grabMask(true);\n let numMarked = 0;\n for (const node of graph.allHalfEdges) {\n if (!node.isMaskSet(visit)) {\n if (!node.isMaskSet(barrier) && !node.edgeMate.isMaskSet(barrier)) {\n // tol based on areas of *original* faces on each side of the edge to be removed\n const signedAreaTol = Geometry.smallMetricDistanceSquared * (node.signedFaceArea() + node.edgeMate.signedFaceArea());\n if (this.isSectorConvexAfterEdgeRemoval(node, mark, barrier, signedAreaTol) && this.isSectorConvexAfterEdgeRemoval(node.edgeMate, mark, barrier, signedAreaTol)) {\n node.setMaskAroundEdge(mark);\n ++numMarked;\n }\n }\n }\n node.setMaskAroundEdge(visit);\n }\n graph.dropMask(visit);\n return numMarked;\n }\n /**\n * Collect edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to examine\n * @param barrier edges with this mask (on either side) will not be collected. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return one HalfEdge per removable edge\n */\n public static collectRemovableEdgesToExpandConvexFaces(graph: HalfEdgeGraph, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): HalfEdge[] | undefined {\n const removable: HalfEdge[] = [];\n const mark = graph.grabMask(true);\n if (0 < this.markRemovableEdgesToExpandConvexFaces(graph, mark, barrier)) {\n const visited = graph.grabMask(true);\n for (const node of graph.allHalfEdges) {\n if (node.isMaskSet(mark) && !node.isMaskSet(visited)) {\n node.setMaskAroundEdge(visited);\n removable.push(node);\n }\n }\n graph.dropMask(visited);\n }\n graph.dropMask(mark);\n return removable;\n }\n\n /**\n * Remove edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to modify\n * @param barrier edges with this mask (on either side) will not be removed. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return number of edges deleted\n */\n public static expandConvexFaces(graph: HalfEdgeGraph, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): number {\n const mark = graph.grabMask(true);\n const numRemovedEdges = this.markRemovableEdgesToExpandConvexFaces(graph, mark, barrier);\n if (numRemovedEdges > 0) {\n const numYankedEdges = 0.5 * graph.yankAndDeleteEdges((node: HalfEdge) => node.getMask(mark));\n assert(numYankedEdges === numRemovedEdges);\n }\n graph.dropMask(mark);\n return numRemovedEdges;\n }\n\n /**\n * Test desired faces for convexity.\n * @param graph graph to examine\n * @param avoid faces with this mask will not be examined. Defaults to HalfEdgeMask.EXTERIOR.\n * @return whether every face in the graph is convex\n */\n public static isEveryFaceConvex(graph: HalfEdgeGraph, avoid: HalfEdgeMask = HalfEdgeMask.EXTERIOR): boolean {\n const allFaces = graph.collectFaceLoops();\n for (const node of allFaces) {\n if (node.isMaskedAroundFace(avoid))\n continue;\n if (!node.isFaceConvex())\n return false;\n }\n return true;\n }\n}\n\n/**\n * Note: this class uses hardcoded micrometer coordinate/cluster tolerance throughout.\n * @internal\n */\nexport class HalfEdgeGraphMerge {\n // return kC such that all angles k are equal, with kA <= k < kC <= kB.\n // * Assume: angles k are stored at extra data index 0.\n // * Note that the usual case (when angle at kA is not repeated) is kA+1 === kC\n public static getCommonThetaEndIndex(clusters: ClusterableArray, order: Uint32Array, kA: number, kB: number): number {\n let kC = kA + 1;\n const thetaA = clusters.getExtraData(order[kA], 0);\n while (kC < kB) {\n const thetaB = clusters.getExtraData(order[kC], 0);\n if (!Angle.isAlmostEqualRadiansAllowPeriodShift(thetaA, thetaB)) {\n return kC;\n }\n kC++;\n }\n return kC;\n }\n private static _announceVertexNeighborhoodFunction?: AnnounceVertexNeighborhoodSortData;\n /**\n * public property setter for a function to be called with sorted edge data around a vertex.\n */\n public static set announceVertexNeighborhoodFunction(func: AnnounceVertexNeighborhoodSortData | undefined) { this._announceVertexNeighborhoodFunction = func; }\n private static doAnnounceVertexNeighborhood(clusters: ClusterableArray, order: Uint32Array, allNodes: HalfEdge[], k0: number, k1: number) {\n if (this._announceVertexNeighborhoodFunction) {\n const sortData: VertexNeighborhoodSortData[] = [];\n // build and share the entire vertex order\n for (let k = k0; k < k1; k++) {\n const index = clusters.getExtraData(order[k], 1);\n const theta = clusters.getExtraData(order[k], 0);\n const node = allNodes[index];\n const signedDistance = this.curvatureSortKey(node);\n sortData.push(new VertexNeighborhoodSortData(order[k], signedDistance, node, theta));\n }\n this._announceVertexNeighborhoodFunction(sortData);\n }\n\n }\n // assumptions about cluster array:\n // * data order is: x,y,theta,nodeIndex\n // * theta and nodeIndex are the \"extra\" data.\n // * only want to do anything here when curves are present.\n // * k0<=k<k1 are around a vertex\n // * These are sorted by theta.\n private static secondarySortAroundVertex(clusters: ClusterableArray, order: Uint32Array, allNodes: HalfEdge[], k0: number, k1: number) {\n const sortData: VertexNeighborhoodSortData[] = [];\n\n for (let k = k0; k < k1;) {\n const kB = this.getCommonThetaEndIndex(clusters, order, k, k1);\n if (k + 1 < kB) {\n sortData.length = 0;\n for (let kA = k; kA < kB; kA++) {\n const index = clusters.getExtraData(order[kA], 1);\n const node = allNodes[index];\n const signedDistance = this.curvatureSortKey(node);\n sortData.push(new VertexNeighborhoodSortData(order[kA], signedDistance, node));\n }\n sortData.sort((a: VertexNeighborhoodSortData, b: VertexNeighborhoodSortData) => (a.radiusOfCurvature - b.radiusOfCurvature));\n for (let i = 0; i < sortData.length; i++) {\n order[k + i] = sortData[i].index;\n }\n }\n k = kB;\n }\n }\n /** Return the sort key for sorting by curvature.\n * * This is the signed distance from the curve at the edge start, to center of curvature.\n * * NOTE: Currently does not account for higher derivatives in the case of higher-than-tangent match.\n */\n public static curvatureSortKey(node: HalfEdge): number {\n const cld = node.edgeTag as CurveLocationDetail;\n if (cld !== undefined) {\n const fraction = cld.fraction;\n const curve = cld.curve;\n if (curve) {\n let radius = curve.fractionToSignedXYRadiusOfCurvature(fraction);\n if (node.sortData !== undefined && node.sortData < 0)\n radius = -radius;\n return radius;\n }\n }\n return 0.0;\n }\n /** Whether the HalfEdge is part of a null face, as marked by [[clusterAndMergeXYTheta]]. */\n public static isNullFace(node: HalfEdge): boolean {\n return node.isMaskSet(HalfEdgeMask.NULL_FACE) && node.faceSuccessor.isMaskSet(HalfEdgeMask.NULL_FACE) && node === node.faceSuccessor.faceSuccessor;\n }\n /** Simplest merge algorithm:\n * * collect array of (x,y,theta) at all nodes\n * * lexical sort of the array.\n * * twist all vertices together.\n * * This effectively creates valid face loops for a planar subdivision if there are no edge crossings.\n * * If there are edge crossings, the graph can be a (highly complicated) Klein bottle topology.\n * * Mask.NULL_FACE is cleared throughout and applied within null faces.\n */\n public static clusterAndMergeXYTheta(graph: HalfEdgeGraph, outboundRadiansFunction?: (he: HalfEdge) => number) {\n const allNodes = graph.allHalfEdges;\n const numNodes = allNodes.length;\n graph.clearMask(HalfEdgeMask.NULL_FACE);\n const clusters = new ClusterableArray(2, 2, numNodes); // data order: x,y,theta,nodeIndex. But theta is not set in first round.\n for (let i = 0; i < numNodes; i++) {\n const nodeA = allNodes[i];\n const xA = nodeA.x;\n const yA = nodeA.y;\n HalfEdge.pinch(nodeA, nodeA.vertexSuccessor); // pull it out of its current vertex loop.\n clusters.addDirect(xA, yA, 0.0, i);\n }\n const clusterTol = Geometry.smallMetricDistance;\n const order = clusters.clusterIndicesLexical(clusterTol);\n let k0 = 0;\n const numK = order.length;\n for (let k1 = 0; k1 < numK; k1++) {\n if (order[k1] === ClusterableArray.clusterTerminator) {\n // nodes identified in order[k0]..order[k1-1] are at a vertex cluster; equate their xy\n if (k1 > k0) {\n const iA = clusters.getExtraData(order[k0], 1);\n const nodeA0 = allNodes[iA];\n for (let k = k0 + 1; k < k1; k++) {\n const iB = clusters.getExtraData(order[k], 1);\n const nodeB = allNodes[iB];\n nodeB.x = nodeA0.x;\n nodeB.y = nodeA0.y;\n }\n }\n k0 = k1 + 1;\n }\n }\n // NOW\n // 1) There are identical coordinates at all nodes around each vertex loop.\n // 2) Hence ready do sort (at each vertex) by theta.\n\n // insert theta as extra data in the sort table . . .\n for (const clusterTableIndex of order) {\n if (clusterTableIndex !== ClusterableArray.clusterTerminator) {\n const nodeA = allNodes[clusterTableIndex];\n const nodeB = nodeA.faceSuccessor;\n let getPrecomputedRadians = outboundRadiansFunction;\n if (getPrecomputedRadians) {\n // Recompute theta when edge geometry is completely determined by the vertices, which may have been perturbed by clustering.\n const detail = nodeA.edgeTag as CurveLocationDetail;\n if (undefined === detail || undefined === detail.curve || detail.curve instanceof LineSegment3d)\n getPrecomputedRadians = undefined;\n }\n let radians = getPrecomputedRadians ? getPrecomputedRadians(nodeA) : Math.atan2(nodeB.y - nodeA.y, nodeB.x - nodeA.x);\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, -Math.PI))\n radians = Math.PI;\n clusters.setExtraData(clusterTableIndex, 0, radians);\n }\n }\n clusters.sortSubsetsBySingleKey(order, 2);\n const unmatchedNullFaceNodes: HalfEdge[] = [];\n k0 = 0;\n let thetaA, thetaB;\n // GeometryCoreTestIO.consoleLog(\"START VERTEX LINKS\");\n\n // now pinch each neighboring pair together\n for (let k1 = 0; k1 < numK; k1++) {\n if (order[k1] === ClusterableArray.clusterTerminator) {\n // nodes identified in order[k0]..order[k1-1] are properly sorted around a vertex.\n if (k1 > k0) {\n // const xy = clusters.getPoint2d(order[k0]);\n // GeometryCoreTestIO.consoleLog({ k0, k1, x: xy.x, y: xy.y });\n if (k1 > k0 + 1)\n this.secondarySortAroundVertex(clusters, order, allNodes, k0, k1);\n this.doAnnounceVertexNeighborhood(clusters, order, allNodes, k0, k1);\n const iA = clusters.getExtraData(order[k0], 1);\n thetaA = clusters.getExtraData(order[k0], 0);\n const nodeA0 = allNodes[iA];\n let nodeA = nodeA0;\n for (let k = k0 + 1; k < k1; k++) {\n const iB = clusters.getExtraData(order[k], 1);\n thetaB = clusters.getExtraData(order[k], 0);\n const nodeB = allNodes[iB];\n if (nodeA.isMaskSet(HalfEdgeMask.NULL_FACE)) {\n // nope, this edge was flagged and pinched from the other end.\n const j = unmatchedNullFaceNodes.findIndex((node: HalfEdge) => nodeA === node);\n if (j >= 0) {\n unmatchedNullFaceNodes[j] = unmatchedNullFaceNodes[unmatchedNullFaceNodes.length - 1];\n unmatchedNullFaceNodes.pop();\n }\n nodeA = nodeB;\n thetaA = thetaB;\n } else if (nodeB.isMaskSet(HalfEdgeMask.NULL_FACE)) {\n const j = unmatchedNullFaceNodes.findIndex((node: HalfEdge) => nodeB === node);\n if (j >= 0) {\n unmatchedNullFaceNodes[j] = unmatchedNullFaceNodes[unmatchedNullFaceNodes.length - 1];\n unmatchedNullFaceNodes.pop();\n }\n // NO leave nodeA and thetaA ignore nodeB -- later step will get the outside of its banana.\n } else {\n HalfEdge.pinch(nodeA, nodeB);\n\n // Detect null face using the heuristic:\n // * near vertex angles are same (periodic, toleranced)\n // * far vertex is clustered (exactly equal)\n // * near vertex curvatures are same (toleranced)\n // Note that near vertex is already clustered.\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(thetaA, thetaB)) {\n const nodeA1 = nodeA.faceSuccessor;\n const nodeB1 = nodeB.edgeMate;\n if (nodeA1.isEqualXY(nodeB1)) {\n const cA = this.curvatureSortKey(nodeA);\n const cB = this.curvatureSortKey(nodeB);\n if (Geometry.isSameCoordinate(cA, cB, clusterTol)) { // rule out banana\n HalfEdge.pinch(nodeA1, nodeB1);\n nodeA.setMask(HalfEdgeMask.NULL_FACE);\n nodeB1.setMask(HalfEdgeMask.NULL_FACE);\n unmatchedNullFaceNodes.push(nodeB1);\n }\n }\n }\n nodeA = nodeB;\n thetaA = thetaB;\n }\n }\n }\n k0 = k1 + 1;\n }\n }\n }\n\n private static buildVerticalSweepPriorityQueue(graph: HalfEdgeGraph): HalfEdgePriorityQueueWithPartnerArray {\n const sweepHeap = new HalfEdgePriorityQueueWithPartnerArray();\n for (const p of graph.allHalfEdges) {\n\n if (HalfEdgeGraphOps.compareNodesYXUp(p, p.faceSuccessor) < 0) {\n sweepHeap.priorityQueue.push(p);\n }\n }\n return sweepHeap;\n }\n private static snapFractionToNode(xy: Point2d, fraction: number, node: HalfEdge, nodeFraction: number): number {\n if (Geometry.isSameCoordinate(xy.x, node.x) && Geometry.isSameCoordinate(xy.y, node.y))\n return nodeFraction;\n return fraction;\n }\n private static computeIntersectionFractionsOnEdges(nodeA0: HalfEdge, nodeB0: HalfEdge, fractions: Vector2d, pointA: Point2d, pointB: Point2d): boolean {\n const nodeA1 = nodeA0.faceSuccessor;\n const ax0 = nodeA0.x;\n const ay0 = nodeA0.y;\n const ux = nodeA1.x - ax0;\n const uy = nodeA1.y - ay0;\n const nodeB1 = nodeB0.faceSuccessor;\n const bx0 = nodeB0.x;\n const by0 = nodeB0.y;\n const vx = nodeB1.x - bx0;\n const vy = nodeB1.y - by0;\n // cspell:word lineSegmentXYUVTransverseIntersectionUnbounded\n if (SmallSystem.lineSegmentXYUVTransverseIntersectionUnbounded(ax0, ay0, ux, uy,\n bx0, by0, vx, vy, fractions)) {\n pointA.x = ax0 + fractions.x * ux;\n pointA.y = ay0 + fractions.x * uy;\n pointB.x = bx0 + fractions.y * vx;\n pointB.y = by0 + fractions.y * vy;\n fractions.x = this.snapFractionToNode(pointA, fractions.x, nodeA0, 0.0);\n fractions.x = this.snapFractionToNode(pointA, fractions.x, nodeA1, 1.0);\n fractions.y = this.snapFractionToNode(pointB, fractions.y, nodeB0, 0.0);\n fractions.y = this.snapFractionToNode(pointB, fractions.y, nodeB1, 1.0);\n return Geometry.isIn01(fractions.x) && Geometry.isIn01(fractions.y);\n }\n return false;\n }\n /**\n * Split edges at intersections.\n * * This is a large operation.\n * @param graph\n */\n public static splitIntersectingEdges(graph: HalfEdgeGraph): GraphSplitData {\n const data = new GraphSplitData();\n const sweepHeap = this.buildVerticalSweepPriorityQueue(graph);\n let nodeA0, nodeB1;\n const smallFraction = 1.0e-8;\n const largeFraction = 1.0 - smallFraction;\n let i;\n const fractions = Vector2d.create();\n const pointA = Point2d.create();\n const pointB = Point2d.create();\n let nodeB0;\n const popTolerance = Geometry.smallMetricDistance;\n while (undefined !== (nodeA0 = sweepHeap.priorityQueue.pop())) {\n data.numUpEdge++;\n const n0 = sweepHeap.activeEdges.length;\n sweepHeap.removeArrayMembersWithY1Below(nodeA0.y - popTolerance);\n data.numPopOut += n0 - sweepHeap.activeEdges.length;\n for (i = 0; i < sweepHeap.activeEdges.length; i++) {\n nodeB0 = sweepHeap.activeEdges[i];\n nodeB1 = nodeB0.faceSuccessor;\n // const nodeB1 = nodeB0.faceSuccessor;\n if (Geometry.isSameCoordinateXY(nodeA0.x, nodeA0.y, nodeB0.x, nodeB0.y)) {\n data.numA0B0++;\n } else if (Geometry.isSameCoordinateXY(nodeB1.x, nodeB1.y, nodeA0.x, nodeA0.y)) {\n data.numA0B1++;\n } else {\n data.numIntersectionTest++;\n if (this.computeIntersectionFractionsOnEdges(nodeA0, nodeB0, fractions, pointA, pointB)) {\n if (fractions.x > smallFraction && fractions.x < largeFraction) {\n const nodeC0 = graph.splitEdgeAtFraction(nodeA0, fractions.x);\n sweepHeap.priorityQueue.push(nodeC0); // The upper portion will be reviewed as a nodeA0 later !!!\n data.numSplit++;\n }\n if (fractions.y > smallFraction && fractions.y < largeFraction) {\n const nodeD0 = graph.splitEdgeAtFraction(nodeB0, fractions.y);\n sweepHeap.priorityQueue.push(nodeD0); // The upper portion will be reviewed as a nodeA0 later !!!\n data.numSplit++;\n }\n // existing nodeA0 and its shortened edge remain for further intersections\n }\n }\n }\n sweepHeap.activeEdges.push(nodeA0);\n }\n return data;\n }\n\n /**\n * Returns a graph structure formed from the given LineSegment array\n *\n * * Find all intersections among segments, and split them if necessary\n * * Record endpoints of every segment in the form X, Y, Theta; This information is stored as a new node and sorted to match up\n * vertices.\n * * For vertices that match up, pinch the nodes to create vertex loops, which in closed objects, will also eventually form face\n * loops\n */\n public static formGraphFromSegments(lineSegments: LineSegment3d[]): HalfEdgeGraph {\n // Structure of an index of the array: { xyTheta: Point3d, node: Node }\n const graph = new HalfEdgeGraph();\n HalfEdgeGraphOps.segmentArrayToGraphEdges(lineSegments, graph, HalfEdgeMask.BOUNDARY_EDGE);\n this.splitIntersectingEdges(graph);\n this.clusterAndMergeXYTheta(graph);\n return graph;\n }\n\n /**\n * * Input is random linestrings, not necessarily loops\n * * Graph gets full splitEdges, regularize, and triangulate.\n * @returns triangulated graph, or undefined if bad data.\n */\n public static formGraphFromChains(chains: MultiLineStringDataVariant, regularize: boolean = true, mask: HalfEdgeMask = HalfEdgeMask.PRIMARY_EDGE): HalfEdgeGraph | undefined {\n if (chains.length < 1)\n return undefined;\n const graph = new HalfEdgeGraph();\n const chainSeeds = Triangulator.directCreateChainsFromCoordinates(graph, chains);\n for (const seed of chainSeeds)\n seed.setMaskAroundFace(mask);\n\n this.splitIntersectingEdges(graph);\n this.clusterAndMergeXYTheta(graph);\n if (regularize) {\n const context = new RegularizationContext(graph);\n context.regularizeGraph(true, true);\n }\n return graph;\n }\n\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegularizeFace.js","sourceRoot":"","sources":["../../../src/topology/RegularizeFace.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { HalfEdgeGraphOps } from \"./Merging\";\n\n/**\n * * Context for regularizing single faces.\n * @internal\n */\nexport class RegularizationContext {\n // For debugging use ... \"almost always\" undefined.\n // If defined, it is called with each inserted node pair.\n // scale will be either plus or minus one.\n // when it is negative, the node coordinates (both x and y) have been negated.\n // The call is made after full insertion into vertex loop.\n public static announceEdge?: (graph: HalfEdgeGraph, nodeA: HalfEdge, nodeB: HalfEdge, scale: number) => void;\n public constructor(graph: HalfEdgeGraph) {\n this.graph = graph;\n this.upEdges = [];\n this.downEdges = [];\n this.bottomPeaks = [];\n this.topPeaks = [];\n this.localMin = [];\n this.localMax = [];\n }\n\n /**\n * These are public only for testing.\n */\n public graph: HalfEdgeGraph;\n /** array of edges directed upward. Turn can be left or right, but is not large enough to be a min or max */\n public upEdges: HalfEdge[];\n /** array of edges directed downward, Turn can be left or right, but is not large enough to be a min or max */\n public downEdges: HalfEdge[];\n /** Array of edges whose start is an upward peak (right turn, inbound up, outbound down) */\n public topPeaks: HalfEdge[];\n /** Array of edges whose start is an downward peak (right turn, inbound down, outbound up) */\n public bottomPeaks: HalfEdge[];\n\n /** Array of edges at local minima (left turn, inbound down, outbound up). Ensuing chain is up */\n public localMin: HalfEdge[];\n /** Array of edges at local maxima (left turn, inbound up, outbound down). Ensuing chain is down */\n public localMax: HalfEdge[];\n /**\n * Collect (and classify) all the edges around a single face.\n * * The various arrays are collected: upEdges, downEdges, topPeaks, bottomPeaks, upChains, downChains\n * @param faceSeed face to examine\n */\n public collectVerticalEventsAroundFace(faceSeed: HalfEdge) {\n let nodeA = faceSeed;\n let nodeB;\n let nodeC;\n let abUp;\n let bcUp;\n this.upEdges.length = 0;\n this.downEdges.length = 0;\n this.topPeaks.length = 0;\n this.bottomPeaks.length = 0;\n this.localMin.length = 0;\n this.localMax.length = 0;\n do {\n nodeB = nodeA.faceSuccessor;\n nodeC = nodeB.faceSuccessor;\n abUp = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB) < 0;\n bcUp = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC) < 0;\n if (abUp) {\n this.upEdges.push(nodeA);\n if (!bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) < 0)\n this.localMax.push(nodeB);\n else\n this.topPeaks.push(nodeB);\n }\n\n } else { // ab is DOWN\n this.downEdges.push(nodeA);\n if (bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) > 0)\n this.bottomPeaks.push(nodeB);\n else\n this.localMin.push(nodeB);\n }\n }\n nodeA = nodeB;\n } while (nodeA !== faceSeed);\n }\n\n /**\n * Collect (and classify) all the edges in an array.\n * * The various arrays are collected: upEdges, downEdges, topPeaks, bottomPeaks, upChains, downChains\n * @param candidateEdges array of edges.\n */\n public collectVerticalEventFromEdgesInAndArray(candidateEdges: HalfEdge[]) {\n let nodeA;\n let nodeB;\n let nodeC;\n let abUp;\n let bcUp;\n this.upEdges.length = 0;\n this.downEdges.length = 0;\n this.topPeaks.length = 0;\n this.bottomPeaks.length = 0;\n this.localMin.length = 0;\n this.localMax.length = 0;\n for (nodeA of candidateEdges) {\n nodeB = nodeA.faceSuccessor;\n nodeC = nodeB.faceSuccessor;\n abUp = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB) < 0;\n bcUp = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC) < 0;\n if (abUp) {\n this.upEdges.push(nodeA);\n if (!bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) < 0)\n this.localMax.push(nodeB);\n else\n this.topPeaks.push(nodeB);\n }\n\n } else { // ab is DOWN\n this.downEdges.push(nodeA);\n if (bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) > 0)\n this.bottomPeaks.push(nodeB);\n else\n this.localMin.push(nodeB);\n }\n }\n }\n }\n\n private swapArrays() {\n let save = this.downEdges; this.downEdges = this.upEdges; this.upEdges = save;\n save = this.localMax; this.localMax = this.localMin; this.localMin = save;\n save = this.topPeaks; this.topPeaks = this.bottomPeaks; this.bottomPeaks = save;\n }\n\n /**\n * Find the edge (among candidates) which is first struck by a \"rightward\" scan from node\n * * comparisonFunction determines scan sense\n * * HalfEdge.compareNodeYXTheta is an upward scan.\n * * HalfEdge.compareNodeYXThetaDownward is a downward scan.\n * @param node\n * @param candidates Array of nodes to search\n * @param nodeComparisonFunction function for lexical comparison.\n */\n private findTopVisibleEdge(node: HalfEdge, candidates: HalfEdge[],\n directionSign: number) {\n const y0 = node.y;\n const x0 = node.x;\n let dx;\n let distanceRight = Number.MAX_SAFE_INTEGER;\n let result: HalfEdge | undefined;\n for (const rightBase of candidates) {\n const rightTop = rightBase.faceSuccessor;\n if (rightBase === node || rightTop === node)\n continue;\n // for horizontal edge cases -- require edges ends to have strict sign change (no zeros!!)\n const cRight = HalfEdgeGraphOps.compareNodesYXUp(node, rightBase);\n const cTop = HalfEdgeGraphOps.compareNodesYXUp(node, rightTop);\n // GeometryCoreTestIO.consoleLog(node.id, rightBase.id, rightTop.id, cRight, cTop);\n if (cRight * cTop >= 0)\n continue;\n const fraction = HalfEdge.horizontalScanFraction01(rightBase, y0);\n if (fraction !== undefined) {\n dx = directionSign * (rightBase.fractionToX(fraction) - x0);\n if (dx > 0 && dx < distanceRight) {\n result = rightBase;\n distanceRight = dx;\n }\n }\n }\n return result;\n }\n /**\n *\n * @param downPeak a \"bottom\" node where the interior CCW loop has a local min\n * @param downEdgeStart (optional) node at the start (heading downwards!) of an edge that brackets downPeak on the left.\n * @param upEdgeStart (optional) node at the start (heading up!) of the edge that brackets downPeak on the right.\n */\n private highestUpPeakConnection(downPeak: HalfEdge, downEdgeStart: HalfEdge | undefined, upEdgeStart: HalfEdge | undefined): HalfEdge | undefined {\n let highestPeak;\n\n for (const upPeak of this.topPeaks) {\n const y0 = upPeak.y;\n const x0 = upPeak.x;\n // is upPeak higher than prior upPeak?\n if (highestPeak !== undefined && HalfEdgeGraphOps.compareNodesYXUp(upPeak, highestPeak) < 0)\n continue;\n // is upPeak BELOW downPeak, ABOVE both limit edges lower node, and between limit edge interiors.\n if (HalfEdgeGraphOps.compareNodesYXUp(upPeak, downPeak) < 0) {\n if (downEdgeStart) {\n const fraction = HalfEdge.horizontalScanFraction01(downEdgeStart, y0);\n if (fraction === undefined)\n continue;\n if (x0 <= downEdgeStart.fractionToX(fraction))\n continue;\n }\n if (upEdgeStart) {\n const fraction = HalfEdge.horizontalScanFraction01(upEdgeStart, y0);\n if (fraction === undefined)\n continue;\n if (upEdgeStart.fractionToX(fraction) <= x0)\n continue;\n }\n highestPeak = upPeak;\n }\n }\n return highestPeak;\n }\n\n private updateMaxNode(maxNode: HalfEdge | undefined, candidate: HalfEdge | undefined, compare: (a: HalfEdge, b: HalfEdge) => number): HalfEdge | undefined {\n if (!maxNode)\n return candidate;\n if (!candidate)\n return maxNode;\n // both are defined .. look for positive compare ...\n if (compare(maxNode, candidate) < 0)\n return candidate;\n return maxNode;\n }\n private negateXY() {\n for (const node of this.graph.allHalfEdges) {\n node.x *= -1;\n node.y *= -1;\n }\n }\n private downwardConnectionFromBottomPeak(node: HalfEdge): HalfEdge | undefined {\n let connectTo;\n const upFunction = (a: HalfEdge, b: HalfEdge) => HalfEdgeGraphOps.compareNodesYXUp(a, b);\n const upEdgeBase = this.findTopVisibleEdge(node, this.upEdges, 1.0)!;\n const downEdgeBase = this.findTopVisibleEdge(node, this.downEdges, -1.0)!;\n connectTo = this.updateMaxNode(connectTo, upEdgeBase, upFunction);\n if (downEdgeBase)\n connectTo = this.updateMaxNode(connectTo, downEdgeBase.faceSuccessor, upFunction);\n const upPeakConnection = this.highestUpPeakConnection(node, downEdgeBase, upEdgeBase);\n if (upPeakConnection !== undefined)\n connectTo = this.updateMaxNode(connectTo, upPeakConnection, upFunction);\n return connectTo;\n }\n /** Search around the vertex of nodeA for a nodeA1 such that nodeB is visible in the sector at nodeA1 */\n private findVisibleSector(nodeA: HalfEdge, nodeB: HalfEdge): HalfEdge | undefined {\n let nodeA1 = nodeA;\n do {\n if (HalfEdge.isNodeVisibleInSector(nodeB, nodeA1))\n return nodeA1;\n nodeA1 = nodeA1.vertexSuccessor;\n } while (nodeA1 !== nodeA);\n return undefined;\n }\n /**\n * Create an edge from (some node around the vertex of) nodeA to (some node around the vertex of) nodeB.\n * * looking around the vertex for alternate insertion corrects cusp insertion errors.\n * @param nodeA\n * @param nodeB\n */\n private joinNodes(nodeA: HalfEdge, nodeB: HalfEdge, direction: number): HalfEdge | undefined {\n const nodeC = this.graph.createEdgeXYZXYZ(nodeA.x, nodeA.y, nodeA.z, 0, nodeB.x, nodeB.y, nodeB.z, 0);\n const nodeA1 = this.findVisibleSector(nodeA, nodeB);\n const nodeB1 = this.findVisibleSector(nodeB, nodeA);\n if (nodeA1 !== undefined && nodeB1 !== undefined) {\n HalfEdge.pinch(nodeA1, nodeC);\n HalfEdge.pinch(nodeB1, nodeC.edgeMate);\n if (RegularizationContext.announceEdge)\n RegularizationContext.announceEdge(this.graph, nodeA, nodeB, direction);\n return nodeC;\n }\n return undefined;\n }\n /**\n * Regularize a single face.\n * * Insert edge from any downward interior vertex to something lower\n * * Insert an edge from each upward interior vertex to something higher.\n * * The face is split into smaller faces\n * * Each final face has at most one \"min\" and one \"max\", and is easy to triangulate with a bottom to top sweep.\n * * Normal usage is to sweep in both directions, i.e. use the default (true,true) for the upSweep and downSweep parameters.\n * @param faceSeed any representative half edge on the face\n * @param upSweep true to do the upward sweep.\n * @param downSweep true to do the downward sweep.\n */\n private runRegularization(upSweep: boolean = true, downSweep: boolean = true) {\n if (upSweep) {\n this.bottomPeaks.sort((a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b));\n for (const bottomPeak of this.bottomPeaks) {\n // GeometryCoreTestIO.consoleLog(\"SEARCH\", bottomPeak.id, [bottomPeak.x, bottomPeak.y]);\n if (!HalfEdgeGraphOps.isDownPeak(bottomPeak))\n continue;\n const target = this.downwardConnectionFromBottomPeak(bottomPeak);\n if (target !== undefined) {\n // GeometryCoreTestIO.consoleLog(\"join\", bottomPeak.id, [bottomPeak.x, bottomPeak.y], target.id, [target.x, target.y]);\n this.joinNodes(bottomPeak, target, 1);\n }\n }\n }\n if (downSweep) {\n // flip the whole graph (ouch)\n this.negateXY();\n // swap the various p and down seeds ....\n this.swapArrays();\n this.bottomPeaks.sort((a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b));\n for (const bottomPeak of this.bottomPeaks) {\n if (!HalfEdgeGraphOps.isDownPeak(bottomPeak))\n continue;\n const target = this.downwardConnectionFromBottomPeak(bottomPeak);\n if (target !== undefined) {\n this.joinNodes(bottomPeak, target, -1);\n }\n }\n this.negateXY();\n this.swapArrays();\n }\n }\n\n /**\n * Regularize a single face.\n * * Insert edge from any downward interior vertex to something lower\n * * Insert an edge from each upward interior vertex to something higher.\n * * The face is split into smaller faces\n * * Each final face has at most one \"min\" and one \"max\", and is easy to triangulate with a bottom to top sweep.\n * * Normal usage is to sweep in both directions, i.e. use the default (true,true) for the upSweep and downSweep parameters.\n * @param faceSeed any representative half edge on the face\n * @param upSweep true to do the upward sweep.\n * @param downSweep true to do the downward sweep.\n */\n public regularizeFace(faceSeed: HalfEdge, upSweep: boolean = true, downSweep: boolean = true) {\n this.collectVerticalEventsAroundFace(faceSeed);\n this.runRegularization(upSweep, downSweep);\n }\n\n public regularizeGraph(upSweep: boolean = true, downSweep: boolean = true) {\n this.collectVerticalEventFromEdgesInAndArray(this.graph.allHalfEdges);\n this.runRegularization(upSweep, downSweep);\n }\n\n /** test if a single face is monotone; if so, return its (single) min */\n public static isMonotoneFace(seed: HalfEdge): HalfEdge | undefined {\n let numMin = 0;\n let numMax = 0;\n let nodeMin: HalfEdge | undefined;\n let nodeA = seed;\n do {\n const nodeB = nodeA.faceSuccessor;\n const nodeC = nodeB.faceSuccessor;\n const ab = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB);\n const bc = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC);\n if (ab * bc <= 0) {\n if (ab > 0) {\n numMin++;\n nodeMin = nodeB;\n }\n if (bc > 0) {\n numMax++;\n }\n }\n } while ((nodeA = nodeA.faceSuccessor) !== seed);\n return numMin === 1 && numMax === 1 ? nodeMin : undefined;\n }\n /** Return faces filtered by area and test function.\n * * find one arbitrary representative of each face\n * * offer the candidate to the mutate function.\n * * collect results\n * @param mappedSeeds when filter returns a HalfEdge, collect it here\n * @param unmappedSeeds when filter does not return a half edge, collect the candidate.\n */\n public static collectMappedFaceRepresentatives(\n graph: HalfEdgeGraph,\n positiveAreaOnly: boolean,\n mutate: (seed: HalfEdge) => HalfEdge | undefined,\n mappedEdges: HalfEdge[] | undefined,\n unMappedSeeds: HalfEdge[] | undefined) {\n if (mappedEdges)\n mappedEdges.length = 0;\n if (unMappedSeeds)\n unMappedSeeds.length = 0;\n const mask = HalfEdgeMask.VISITED;\n graph.clearMask(mask);\n for (const seed of graph.allHalfEdges) {\n if (!seed.getMask(mask)) {\n seed.setMaskAroundFace(mask);\n if (!positiveAreaOnly || seed.signedFaceArea() > 0) {\n const edge = mutate(seed);\n if (edge) {\n if (mappedEdges)\n mappedEdges.push(edge);\n } else {\n if (unMappedSeeds)\n unMappedSeeds.push(seed);\n }\n }\n }\n }\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RegularizeFace.js","sourceRoot":"","sources":["../../../src/topology/RegularizeFace.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { HalfEdgeGraphOps } from \"./Merging\";\n\n/**\n * * Context for regularizing single faces.\n * @internal\n */\nexport class RegularizationContext {\n // For debugging use ... \"almost always\" undefined.\n // If defined, it is called with each inserted node pair.\n // scale will be either plus or minus one.\n // when it is negative, the node coordinates (both x and y) have been negated.\n // The call is made after full insertion into vertex loop.\n public static announceEdge?: (graph: HalfEdgeGraph, nodeA: HalfEdge, nodeB: HalfEdge, scale: number) => void;\n public constructor(graph: HalfEdgeGraph) {\n this.graph = graph;\n this.upEdges = [];\n this.downEdges = [];\n this.bottomPeaks = [];\n this.topPeaks = [];\n this.localMin = [];\n this.localMax = [];\n }\n\n /**\n * These are public only for testing.\n */\n public graph: HalfEdgeGraph;\n /** array of edges directed upward. Turn can be left or right, but is not large enough to be a min or max */\n public upEdges: HalfEdge[];\n /** array of edges directed downward, Turn can be left or right, but is not large enough to be a min or max */\n public downEdges: HalfEdge[];\n /** Array of edges whose start is an upward peak (right turn, inbound up, outbound down) */\n public topPeaks: HalfEdge[];\n /** Array of edges whose start is an downward peak (right turn, inbound down, outbound up) */\n public bottomPeaks: HalfEdge[];\n\n /** Array of edges at local minima (left turn, inbound down, outbound up). Ensuing chain is up */\n public localMin: HalfEdge[];\n /** Array of edges at local maxima (left turn, inbound up, outbound down). Ensuing chain is down */\n public localMax: HalfEdge[];\n /**\n * Collect (and classify) all the edges around a single face.\n * * The various arrays are collected: upEdges, downEdges, topPeaks, bottomPeaks, upChains, downChains\n * @param faceSeed face to examine\n */\n public collectVerticalEventsAroundFace(faceSeed: HalfEdge) {\n let nodeA = faceSeed;\n let nodeB;\n let nodeC;\n let abUp;\n let bcUp;\n this.upEdges.length = 0;\n this.downEdges.length = 0;\n this.topPeaks.length = 0;\n this.bottomPeaks.length = 0;\n this.localMin.length = 0;\n this.localMax.length = 0;\n do {\n nodeB = nodeA.faceSuccessor;\n nodeC = nodeB.faceSuccessor;\n abUp = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB) < 0;\n bcUp = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC) < 0;\n if (abUp) {\n this.upEdges.push(nodeA);\n if (!bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) < 0)\n this.localMax.push(nodeB);\n else\n this.topPeaks.push(nodeB);\n }\n\n } else { // ab is DOWN\n this.downEdges.push(nodeA);\n if (bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) > 0)\n this.bottomPeaks.push(nodeB);\n else\n this.localMin.push(nodeB);\n }\n }\n nodeA = nodeB;\n } while (nodeA !== faceSeed);\n }\n\n /**\n * Collect (and classify) all the edges in an array.\n * * The various arrays are collected: upEdges, downEdges, topPeaks, bottomPeaks, upChains, downChains\n * @param candidateEdges array of edges.\n */\n public collectVerticalEventFromEdgesInAndArray(candidateEdges: HalfEdge[]) {\n let nodeA;\n let nodeB;\n let nodeC;\n let abUp;\n let bcUp;\n this.upEdges.length = 0;\n this.downEdges.length = 0;\n this.topPeaks.length = 0;\n this.bottomPeaks.length = 0;\n this.localMin.length = 0;\n this.localMax.length = 0;\n for (nodeA of candidateEdges) {\n nodeB = nodeA.faceSuccessor;\n nodeC = nodeB.faceSuccessor;\n abUp = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB) < 0;\n bcUp = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC) < 0;\n if (abUp) {\n this.upEdges.push(nodeA);\n if (!bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) < 0)\n this.localMax.push(nodeB);\n else\n this.topPeaks.push(nodeB);\n }\n\n } else { // ab is DOWN\n this.downEdges.push(nodeA);\n if (bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) > 0)\n this.bottomPeaks.push(nodeB);\n else\n this.localMin.push(nodeB);\n }\n }\n }\n }\n\n private swapArrays() {\n let save = this.downEdges; this.downEdges = this.upEdges; this.upEdges = save;\n save = this.localMax; this.localMax = this.localMin; this.localMin = save;\n save = this.topPeaks; this.topPeaks = this.bottomPeaks; this.bottomPeaks = save;\n }\n\n /**\n * Find the edge (among candidates) which is first struck by a \"rightward\" scan from node\n * * comparisonFunction determines scan sense\n * * HalfEdge.compareNodeYXTheta is an upward scan.\n * * HalfEdge.compareNodeYXThetaDownward is a downward scan.\n * @param node\n * @param candidates Array of nodes to search\n * @param nodeComparisonFunction function for lexical comparison.\n */\n private findTopVisibleEdge(node: HalfEdge, candidates: HalfEdge[],\n directionSign: number) {\n const y0 = node.y;\n const x0 = node.x;\n let dx;\n let distanceRight = Number.MAX_SAFE_INTEGER;\n let result: HalfEdge | undefined;\n for (const rightBase of candidates) {\n const rightTop = rightBase.faceSuccessor;\n if (rightBase === node || rightTop === node)\n continue;\n // for horizontal edge cases -- require edges ends to have strict sign change (no zeros!!)\n const cRight = HalfEdgeGraphOps.compareNodesYXUp(node, rightBase);\n const cTop = HalfEdgeGraphOps.compareNodesYXUp(node, rightTop);\n // GeometryCoreTestIO.consoleLog(node.id, rightBase.id, rightTop.id, cRight, cTop);\n if (cRight * cTop >= 0)\n continue;\n const fraction = HalfEdge.horizontalScanFraction01(rightBase, y0);\n if (fraction !== undefined) {\n dx = directionSign * (rightBase.fractionToX(fraction) - x0);\n if (dx > 0 && dx < distanceRight) {\n result = rightBase;\n distanceRight = dx;\n }\n }\n }\n return result;\n }\n /**\n *\n * @param downPeak a \"bottom\" node where the interior CCW loop has a local min\n * @param downEdgeStart (optional) node at the start (heading downwards!) of an edge that brackets downPeak on the left.\n * @param upEdgeStart (optional) node at the start (heading up!) of the edge that brackets downPeak on the right.\n */\n private highestUpPeakConnection(downPeak: HalfEdge, downEdgeStart: HalfEdge | undefined, upEdgeStart: HalfEdge | undefined): HalfEdge | undefined {\n let highestPeak;\n\n for (const upPeak of this.topPeaks) {\n const y0 = upPeak.y;\n const x0 = upPeak.x;\n // is upPeak higher than prior upPeak?\n if (highestPeak !== undefined && HalfEdgeGraphOps.compareNodesYXUp(upPeak, highestPeak) < 0)\n continue;\n // is upPeak BELOW downPeak, ABOVE both limit edges lower node, and between limit edge interiors.\n if (HalfEdgeGraphOps.compareNodesYXUp(upPeak, downPeak) < 0) {\n if (downEdgeStart) {\n const fraction = HalfEdge.horizontalScanFraction01(downEdgeStart, y0);\n if (fraction === undefined)\n continue;\n if (x0 <= downEdgeStart.fractionToX(fraction))\n continue;\n }\n if (upEdgeStart) {\n const fraction = HalfEdge.horizontalScanFraction01(upEdgeStart, y0);\n if (fraction === undefined)\n continue;\n if (upEdgeStart.fractionToX(fraction) <= x0)\n continue;\n }\n highestPeak = upPeak;\n }\n }\n return highestPeak;\n }\n\n private updateMaxNode(maxNode: HalfEdge | undefined, candidate: HalfEdge | undefined, compare: (a: HalfEdge, b: HalfEdge) => number): HalfEdge | undefined {\n if (!maxNode)\n return candidate;\n if (!candidate)\n return maxNode;\n // both are defined .. look for positive compare ...\n if (compare(maxNode, candidate) < 0)\n return candidate;\n return maxNode;\n }\n private negateXY() {\n for (const node of this.graph.allHalfEdges) {\n node.x *= -1;\n node.y *= -1;\n }\n }\n private downwardConnectionFromBottomPeak(node: HalfEdge): HalfEdge | undefined {\n let connectTo;\n const upFunction = (a: HalfEdge, b: HalfEdge) => HalfEdgeGraphOps.compareNodesYXUp(a, b);\n const upEdgeBase = this.findTopVisibleEdge(node, this.upEdges, 1.0)!;\n const downEdgeBase = this.findTopVisibleEdge(node, this.downEdges, -1.0)!;\n connectTo = this.updateMaxNode(connectTo, upEdgeBase, upFunction);\n if (downEdgeBase)\n connectTo = this.updateMaxNode(connectTo, downEdgeBase.faceSuccessor, upFunction);\n const upPeakConnection = this.highestUpPeakConnection(node, downEdgeBase, upEdgeBase);\n if (upPeakConnection !== undefined)\n connectTo = this.updateMaxNode(connectTo, upPeakConnection, upFunction);\n return connectTo;\n }\n /** Search around the vertex of nodeA for a nodeA1 such that nodeB is visible in the sector at nodeA1 */\n private findVisibleSector(nodeA: HalfEdge, nodeB: HalfEdge): HalfEdge | undefined {\n let nodeA1 = nodeA;\n do {\n if (HalfEdge.isNodeVisibleInSector(nodeB, nodeA1))\n return nodeA1;\n nodeA1 = nodeA1.vertexSuccessor;\n } while (nodeA1 !== nodeA);\n return undefined;\n }\n /**\n * Create an edge from (some node around the vertex of) nodeA to (some node around the vertex of) nodeB.\n * * looking around the vertex for alternate insertion corrects cusp insertion errors.\n * @param nodeA\n * @param nodeB\n */\n private joinNodes(nodeA: HalfEdge, nodeB: HalfEdge, direction: number): HalfEdge | undefined {\n const nodeC = this.graph.createEdgeXYZXYZ(nodeA.x, nodeA.y, nodeA.z, 0, nodeB.x, nodeB.y, nodeB.z, 0);\n const nodeA1 = this.findVisibleSector(nodeA, nodeB);\n const nodeB1 = this.findVisibleSector(nodeB, nodeA);\n if (nodeA1 !== undefined && nodeB1 !== undefined) {\n HalfEdge.pinch(nodeA1, nodeC);\n HalfEdge.pinch(nodeB1, nodeC.edgeMate);\n if (RegularizationContext.announceEdge)\n RegularizationContext.announceEdge(this.graph, nodeA, nodeB, direction);\n return nodeC;\n }\n return undefined;\n }\n /**\n * Regularize a single face.\n * * Insert edge from any downward interior vertex to something lower\n * * Insert an edge from each upward interior vertex to something higher.\n * * The face is split into smaller faces\n * * Each final face has at most one \"min\" and one \"max\", and is easy to triangulate with a bottom to top sweep.\n * * Normal usage is to sweep in both directions, i.e. use the default (true,true) for the upSweep and downSweep parameters.\n * @param faceSeed any representative half edge on the face\n * @param upSweep true to do the upward sweep.\n * @param downSweep true to do the downward sweep.\n */\n private runRegularization(upSweep: boolean = true, downSweep: boolean = true) {\n if (upSweep) {\n this.bottomPeaks.sort((a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b));\n for (const bottomPeak of this.bottomPeaks) {\n // GeometryCoreTestIO.consoleLog(\"SEARCH\", bottomPeak.id, [bottomPeak.x, bottomPeak.y]);\n if (!HalfEdgeGraphOps.isDownPeak(bottomPeak))\n continue;\n const target = this.downwardConnectionFromBottomPeak(bottomPeak);\n if (target !== undefined) {\n // GeometryCoreTestIO.consoleLog(\"join\", bottomPeak.id, [bottomPeak.x, bottomPeak.y], target.id, [target.x, target.y]);\n this.joinNodes(bottomPeak, target, 1);\n }\n }\n }\n if (downSweep) {\n // flip the whole graph (ouch)\n this.negateXY();\n // swap the various p and down seeds ....\n this.swapArrays();\n this.bottomPeaks.sort((a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b));\n for (const bottomPeak of this.bottomPeaks) {\n if (!HalfEdgeGraphOps.isDownPeak(bottomPeak))\n continue;\n const target = this.downwardConnectionFromBottomPeak(bottomPeak);\n if (target !== undefined) {\n this.joinNodes(bottomPeak, target, -1);\n }\n }\n this.negateXY();\n this.swapArrays();\n }\n }\n\n /**\n * Regularize a single face.\n * * Insert edge from any downward interior vertex to something lower\n * * Insert an edge from each upward interior vertex to something higher.\n * * The face is split into smaller faces\n * * Each final face has at most one \"min\" and one \"max\", and is easy to triangulate with a bottom to top sweep.\n * * Normal usage is to sweep in both directions, i.e. use the default (true,true) for the upSweep and downSweep parameters.\n * @param faceSeed any representative half edge on the face\n * @param upSweep true to do the upward sweep.\n * @param downSweep true to do the downward sweep.\n */\n public regularizeFace(faceSeed: HalfEdge, upSweep: boolean = true, downSweep: boolean = true) {\n this.collectVerticalEventsAroundFace(faceSeed);\n this.runRegularization(upSweep, downSweep);\n }\n\n public regularizeGraph(upSweep: boolean = true, downSweep: boolean = true) {\n this.collectVerticalEventFromEdgesInAndArray(this.graph.allHalfEdges);\n this.runRegularization(upSweep, downSweep);\n }\n\n /** test if a single face is monotone; if so, return its (single) min */\n public static isMonotoneFace(seed: HalfEdge): HalfEdge | undefined {\n let numMin = 0;\n let numMax = 0;\n let nodeMin: HalfEdge | undefined;\n let nodeA = seed;\n do {\n const nodeB = nodeA.faceSuccessor;\n const nodeC = nodeB.faceSuccessor;\n const ab = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB);\n const bc = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC);\n if (ab * bc <= 0) {\n if (ab > 0) {\n numMin++;\n nodeMin = nodeB;\n }\n if (bc > 0) {\n numMax++;\n }\n }\n } while ((nodeA = nodeA.faceSuccessor) !== seed);\n return numMin === 1 && numMax === 1 ? nodeMin : undefined;\n }\n /** Return faces filtered by area and test function.\n * * find one arbitrary representative of each face\n * * offer the candidate to the mutate function.\n * * collect results\n * @param mappedSeeds when filter returns a HalfEdge, collect it here\n * @param unmappedSeeds when filter does not return a half edge, collect the candidate.\n */\n public static collectMappedFaceRepresentatives(\n graph: HalfEdgeGraph,\n positiveAreaOnly: boolean,\n mutate: (seed: HalfEdge) => HalfEdge | undefined,\n mappedEdges: HalfEdge[] | undefined,\n unMappedSeeds: HalfEdge[] | undefined) {\n if (mappedEdges)\n mappedEdges.length = 0;\n if (unMappedSeeds)\n unMappedSeeds.length = 0;\n const mask = HalfEdgeMask.VISITED;\n graph.clearMask(mask);\n for (const seed of graph.allHalfEdges) {\n if (!seed.getMask(mask)) {\n seed.setMaskAroundFace(mask);\n if (!positiveAreaOnly || seed.signedFaceArea() > 0) {\n const edge = mutate(seed);\n if (edge) {\n if (mappedEdges)\n mappedEdges.push(edge);\n } else {\n if (unMappedSeeds)\n unMappedSeeds.push(seed);\n }\n }\n }\n }\n }\n\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignedDataSummary.js","sourceRoot":"","sources":["../../../src/topology/SignedDataSummary.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAuB5B,gDAAgD;IAChD,YAAmB,YAAqB;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACzD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAC5D,IAAI,YAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"SignedDataSummary.js","sourceRoot":"","sources":["../../../src/topology/SignedDataSummary.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAuB5B,gDAAgD;IAChD,YAAmB,YAAqB;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACzD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAC5D,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,8CAA8C;IACvC,YAAY,CAAC,IAAO,EAAE,IAAY;QACvC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,iBAAiB;gBACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,iBAAiB;gBACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,aAAa;gBACpB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n/**\n * Class to accumulate statistics about a stream of signed numbers with tag items.\n * * All sums, counts, extrema, and item values are initialized to zero in the constructor.\n * * Each call to `announceItem(item, value)` updates the various sums, counts, and extrema.\n */\nexport class SignedDataSummary<T> {\n /** Sum of all positive area items. */\n public positiveSum: number;\n /** Number of positive area items. */\n public numPositive: number;\n /** Sum of negative area items. */\n public negativeSum: number;\n /** Number of negative area items. */\n public numNegative: number;\n /** Number of zero area items. */\n public numZero: number;\n /** The tag item item with the largest positive data. */\n public largestPositiveItem?: T;\n /** The tag item item with the most negative data. */\n public largestNegativeItem?: T;\n public largestPositiveValue: number;\n public largestNegativeValue: number;\n /** Array of all negative area items. */\n public negativeItemArray?: T[];\n /** Array of zero area items. */\n public zeroItemArray?: T[];\n /** Array of positive area items. */\n public positiveItemArray?: T[];\n /** Setup with zero sums and optional arrays. */\n public constructor(createArrays: boolean) {\n this.positiveSum = this.negativeSum = 0.0;\n this.numPositive = this.numNegative = this.numZero = 0.0;\n this.largestPositiveValue = this.largestNegativeValue = 0.0;\n if (createArrays) {\n this.negativeItemArray = [];\n this.positiveItemArray = [];\n this.zeroItemArray = [];\n }\n }\n /** Update with an item and its data value. */\n public announceItem(item: T, data: number) {\n if (data < 0) {\n this.numNegative++;\n this.negativeSum += data;\n if (this.negativeItemArray)\n this.negativeItemArray.push(item);\n if (data < this.largestNegativeValue) {\n this.largestNegativeValue = data;\n this.largestNegativeItem = item;\n }\n } else if (data > 0) {\n this.numPositive++;\n this.positiveSum += data;\n if (this.positiveItemArray)\n this.positiveItemArray.push(item);\n if (data > this.largestPositiveValue) {\n this.largestPositiveValue = data;\n this.largestPositiveItem = item;\n }\n } else {\n this.numZero++;\n if (this.zeroItemArray)\n this.zeroItemArray.push(item);\n }\n }\n}\n"]}
|