@itwin/core-geometry 5.3.0-dev.21 → 5.3.0-dev.24
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 +6 -1
- package/lib/cjs/Constant.js.map +1 -1
- 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.map +1 -1
- 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.map +1 -1
- package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.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.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js.map +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.map +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- 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/CurveTypes.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.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/ProxyCurve.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.map +1 -1
- 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/AnnounceTangentStrokeHandler.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/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +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/EllipticalArcApproximationContext.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/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransformInPlaceContext.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/CubicEvaluator.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.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.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.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.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3d.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.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.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +27 -7
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +30 -9
- package/lib/cjs/geometry3d/PolygonOps.js.map +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.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.js.map +1 -1
- package/lib/cjs/geometry3d/UVSurfaceOps.js.map +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.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.map +1 -1
- package/lib/cjs/numerics/PolarData.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/numerics/Quadrature.js.map +1 -1
- package/lib/cjs/numerics/Range1dArray.js.map +1 -1
- package/lib/cjs/numerics/SmallSystem.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/numerics/UsageSums.js.map +1 -1
- package/lib/cjs/polyface/AuxData.js.map +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.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.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.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.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +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.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +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/SolidPrimitive.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.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.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/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +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.map +1 -1
- package/lib/cjs/topology/Voronoi.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- 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.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.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.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.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- 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/CurveTypes.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.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/ProxyCurve.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.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/AnnounceTangentStrokeHandler.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/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- 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/EllipticalArcApproximationContext.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/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransformInPlaceContext.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/CubicEvaluator.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.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.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.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.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Plane3d.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.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.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +27 -7
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +30 -9
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- 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.js.map +1 -1
- package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/esm/geometry3d/XYZProps.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.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.map +1 -1
- package/lib/esm/numerics/PolarData.js.map +1 -1
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/numerics/Quadrature.js.map +1 -1
- package/lib/esm/numerics/Range1dArray.js.map +1 -1
- package/lib/esm/numerics/SmallSystem.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/numerics/UsageSums.js.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- 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.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeLengthData.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.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.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- 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.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- 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/SolidPrimitive.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.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.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/HalfEdgeNodeXYZUV.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.map +1 -1
- package/lib/esm/topology/Voronoi.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePointInGraphSearch.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePointInGraphSearch.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { HalfEdge, HalfEdgeMask } from \"./Graph\";\r\nimport { NodeXYZUV } from \"./HalfEdgeNodeXYZUV\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\n\r\n// cspell:word Chebyshev\r\n\r\n/**\r\n * Return code from [PointSearchContext.reAimAroundFace]\r\n * @internal\r\n */\r\nexport enum RayClassification {\r\n NoHits,\r\n TargetOnVertex,\r\n TargetOnEdge,\r\n Bracket,\r\n TargetBefore,\r\n TargetAfter,\r\n}\r\n\r\n/**\r\n * Context for searching for the location of an xy-point in a graph.\r\n * * Assumptions: interior faces of the graph are convex, no edge has length less than `tol`.\r\n * @internal\r\n */\r\nexport class PointSearchContext {\r\n private _tol: number;\r\n private constructor(tol: number) {\r\n this._tol = tol;\r\n }\r\n public static create(tol: number = Geometry.smallMetricDistance) {\r\n return new PointSearchContext(tol);\r\n }\r\n private panic(): HalfEdgePositionDetail {\r\n // A note on \"unexpectedly\" found in comments in this file:\r\n // Though this class assumes all edges of the graph have length at least tolerance, the tests below account for\r\n // edges with smaller length. This is because we are using two different metrics: Euclidean for distinguishing\r\n // points matching user expectation, and Chebyshev, aka \"max component\", for efficiently testing ray-sector\r\n // inclusion in the reAimXXX methods. In particular, epsilon-balls in the former metric are smaller than in the\r\n // latter. Thus an edge can be inserted into the graph with Euclidean length (barely) greater than epsilon, but\r\n // the edge's parallel and perpendicular components with respect to a ray can have Euclidean length *less* than\r\n // epsilon, yielding a Chebyshev edge length less than epsilon. This discrepancy requires careful analysis below,\r\n // and if this method is invoked, it is probably because we've missed a case where a dot/cross product lies just\r\n // beyond the tolerance.\r\n return HalfEdgePositionDetail.create();\r\n }\r\n /**\r\n * Reposition `edgeHit` to an adjacent face or vertex, or another position on the edge, that is closer to the\r\n * target point.\r\n * @param edgeHit start position on a graph edge, updated and returned.\r\n * @param ray the ray to the target point. Origin is assumed to lie on the edge.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @return detail closer to the target point.\r\n */\r\n public reAimFromEdge(\r\n edgeHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\r\n ): HalfEdgePositionDetail {\r\n const nodeA = edgeHit.node!;\r\n const dataA = NodeXYZUV.createNodeAndRayOrigin(nodeA, ray);\r\n const dataB = NodeXYZUV.createNodeAndRayOrigin(nodeA.edgeMate, ray);\r\n const sideA = -dataA.classifyV(0.0, this._tol);\r\n const sideB = -dataB.classifyV(0.0, this._tol);\r\n let result;\r\n if (sideA * sideB < 0) { // simple crossing; just aim into a face\r\n if (sideA > 0) {\r\n result = edgeHit.resetAsFace(dataA.node);\r\n } else {\r\n result = edgeHit.resetAsFace(dataB.node);\r\n }\r\n } else if (sideA === 0 || sideB === 0) {\r\n const alongA = dataA.classifyU(targetDistance, this._tol);\r\n const alongB = dataB.classifyU(targetDistance, this._tol);\r\n if (sideA === 0 && alongA === 0) { // hit start vertex\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n result.setITag(1);\r\n } else if (sideB === 0 && alongB === 0) { // hit end vertex\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n result.setITag(1);\r\n } else if (sideA === 0 && sideB === 0) { // ray is clearly along the edge\r\n if (alongA * alongB < 0) { // target is within edge\r\n const edgeFraction = (targetDistance - dataA.u) / (dataB.u - dataA.u);\r\n result = edgeHit.resetAtEdgeAndFraction(dataA.node, edgeFraction);\r\n result.setITag(1);\r\n } else if (alongA < 0 && alongB < 0) { // target is beyond the edge; move towards it\r\n if (dataA.u > dataB.u)\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n else\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n } else { // both vertices lie on the ray before or after the target; shouldn't happen for edgeHit between nodes\r\n edgeHit.resetAsUnknown();\r\n result = this.panic();\r\n }\r\n } else if (sideA === 0) { // ray near start vertex but NOT parallel to the edge\r\n if (0 === dataA.classifyU(0.0, this._tol))\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n else\r\n result = edgeHit.resetAsFace(sideB > 0 ? dataB.node : dataA.node);\r\n } else { // ray near end vertex but NOT parallel to the edge\r\n assert(sideB === 0);\r\n if (0 === dataB.classifyU(0.0, this._tol))\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n else\r\n result = edgeHit.resetAsFace(sideA > 0 ? dataA.node : dataB.node);\r\n }\r\n } else { // both vertices are to same side of the ray; shouldn't happen for edgeHit between nodes\r\n edgeHit.resetAsUnknown();\r\n result = this.panic();\r\n }\r\n return result;\r\n }\r\n /**\r\n * Reposition `vertexHit` to an adjacent face, edge, or vertex hit that is closer to the target point.\r\n * @param vertexHit start position at a graph vertex, updated and returned.\r\n * @param ray the ray to the target point, assumed to start exactly at the vertex.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @return detail closer to the target point.\r\n */\r\n public reAimFromVertex(\r\n vertexHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\r\n ): HalfEdgePositionDetail {\r\n assert(ray.origin.isExactEqual(vertexHit));\r\n const vertexNode = vertexHit.node;\r\n let outboundEdge = vertexNode!;\r\n // lambda to handle the case where the target definitively lies in the same direction as outboundEdge\r\n const advancePositionAlongOutboundEdge = (rayParam: number): boolean => {\r\n if (Math.abs(rayParam - targetDistance) <= this._tol) { // direct hit at far end of outBoundEdge\r\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor).setITag(1);\r\n } else if (rayParam > targetDistance) { // direct hit within outBoundEdge\r\n vertexHit.resetAtEdgeAndFraction(outboundEdge, targetDistance / rayParam);\r\n } else if (rayParam > this._tol) { // far end of outBoundEdge is closer to target\r\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor);\r\n } else {\r\n return false;\r\n }\r\n return true;\r\n };\r\n do {\r\n // examine the sector at the outboundEdge node; if ray lies in this sector, return updated detail\r\n const data0 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.faceSuccessor, ray);\r\n const data1 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.facePredecessor, ray);\r\n // u0 is the length of projection of faceSuccessor to the ray and v0 is the length of projection of\r\n // faceSuccessor to the ray perp line (90 degrees CCW). Similarly for u1 and v1 with facePredecessor.\r\n const u0 = data0.u;\r\n const u1 = data1.u;\r\n const v0 = data0.v;\r\n const v1 = data1.v;\r\n // examine dot and cross of ray with both edges defining this sector to see if ray lies between them\r\n if (Math.abs(v0) <= this._tol) { // ray parallel to outBoundEdge\r\n if (advancePositionAlongOutboundEdge(u0))\r\n return vertexHit;\r\n if (Math.abs(u0) <= this._tol) { // edge is unexpectedly* small\r\n if (v0 <= 0 && v1 > this._tol && (u0 >= 0 || (u0 < 0 && u1 > this._tol)))\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n }\r\n // The only remaining case is u0 < -this._tol: ray points opposite outBoundEdge.\r\n // By our convexity assumption, the only way that ray lies in this sector is if the lookBack\r\n // vector points in the same direction as ray, but this would be handled in the next sector.\r\n } else if (v0 < -this._tol) {\r\n if (v1 > this._tol) // ray definitely lies in this sector\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n if (v1 >= -this._tol) { // ray and lookBack vector are parallel\r\n // handle special cases not handled in the next sector\r\n if (Math.abs(u1) <= this._tol) { // lookBack vector is unexpectedly* small...\r\n if (v1 > 0 && (u1 >= 0 || (u0 > this._tol && u1 < 0))) // ...and ray is in this sector\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n } else if (u0 > this._tol && u1 < 0) { // ray and lookBack point in opposite directions\r\n return vertexHit.resetAsVertex(outboundEdge.faceSuccessor); // far end is closer to target\r\n }\r\n }\r\n // The only remaining case is v1 < -this._tol: ray definitely lies outside this sector.\r\n }\r\n // Proceed to the next sector around this vertex. We even examine the (concave) exterior sector at a boundary\r\n // vertex in order to handle the case where the target lies in the direction of an exterior outboundEdge.\r\n outboundEdge = outboundEdge.vertexSuccessor;\r\n } while (outboundEdge !== vertexNode);\r\n return this.panic();\r\n }\r\n /**\r\n * Visit all edges around the face, updating `lastBefore` and `firstAfter` to ray-edge intersections that\r\n * lie directly before and/or after the target point on the ray, if at all.\r\n * @param faceNode starting node on a graph face.\r\n * @param ray the ray to the target point.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @param lastBefore the detail to reset as the last hit on the ray before the target point (CALLER CREATED).\r\n * @param firstAfter the detail to reset as the first hit on the ray after the target point (CALLER CREATED).\r\n * @returns summary of the updated details:\r\n * * [[RayClassification.TargetOnVertex]] - target lies at a vertex of the face (details are identical).\r\n * * [[RayClassification.TargetOnEdge]] - target lies on an edge of the face (details are identical).\r\n * * [[RayClassification.TargetBefore]] - target lies before the face; the ray intersects the face beyond\r\n * the target point.\r\n * * [[RayClassification.TargetAfter]] - target lies after the face; the ray intersects the face before\r\n * the target point.\r\n * * [[RayClassification.Bracket]] - target lies between intersections of the ray and the face; if the face\r\n * is convex, this means the target lies inside the face.\r\n * * [[RayClassification.NoHits]] - the face does not intersect the ray.\r\n */\r\n public reAimAroundFace(\r\n faceNode: HalfEdge,\r\n ray: Ray3d,\r\n targetDistance: number,\r\n lastBefore: HalfEdgePositionDetail,\r\n firstAfter: HalfEdgePositionDetail,\r\n ): RayClassification {\r\n assert(!faceNode.isMaskSet(HalfEdgeMask.EXTERIOR));\r\n lastBefore.resetAsUndefinedWithTag(-Number.MAX_VALUE);\r\n firstAfter.resetAsUndefinedWithTag(Number.MAX_VALUE);\r\n const data0 = NodeXYZUV.createNodeAndRayOrigin(faceNode, ray);\r\n let data1;\r\n let node0 = faceNode;\r\n // find the intersection of the ray with each edge of the face to classify the ray hit\r\n do {\r\n const node1 = node0.faceSuccessor;\r\n data1 = NodeXYZUV.createNodeAndRayOrigin(node1, ray, data1);\r\n const u0 = data0.u;\r\n const u1 = data1.u;\r\n const v0 = data0.v;\r\n const v1 = data1.v;\r\n if (Math.abs(v1) < this._tol) { // ray parallel to edge\r\n const vertexHit = HalfEdgePositionDetail.createVertex(node1);\r\n vertexHit.setDTag(u1);\r\n if (Math.abs(u1 - targetDistance) < this._tol) {\r\n firstAfter.setFrom(vertexHit);\r\n lastBefore.setFrom(vertexHit);\r\n return RayClassification.TargetOnVertex;\r\n }\r\n if (u1 > targetDistance && u1 < firstAfter.getDTag()!)\r\n firstAfter.setFrom(vertexHit);\r\n if (u1 < targetDistance && u1 > lastBefore.getDTag()!)\r\n lastBefore.setFrom(vertexHit);\r\n } else if (v0 * v1 < 0.0) { // ray crosses edge\r\n const edgeFraction = -v0 / (v1 - v0);\r\n const rayFraction = Geometry.interpolate(u0, edgeFraction, u1);\r\n const edgeHit = HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);\r\n edgeHit.setDTag(rayFraction);\r\n if (Math.abs(rayFraction - targetDistance) <= this._tol) {\r\n firstAfter.setFrom(edgeHit);\r\n lastBefore.setFrom(edgeHit);\r\n return RayClassification.TargetOnEdge;\r\n }\r\n if (rayFraction > targetDistance && rayFraction < firstAfter.getDTag()!)\r\n firstAfter.setFrom(edgeHit);\r\n if (rayFraction < targetDistance && rayFraction > lastBefore.getDTag()!)\r\n lastBefore.setFrom(edgeHit);\r\n }\r\n data0.setFrom(data1);\r\n node0 = node0.faceSuccessor;\r\n } while (node0 !== faceNode);\r\n // returned to start node\r\n firstAfter.setITag(0);\r\n lastBefore.setITag(0);\r\n if (lastBefore.isUnclassified) {\r\n if (firstAfter.isUnclassified)\r\n return RayClassification.NoHits;\r\n return RayClassification.TargetBefore;\r\n }\r\n if (firstAfter.isUnclassified)\r\n return RayClassification.TargetAfter;\r\n else\r\n return RayClassification.Bracket; // face is locally convex; target lies inside this face\r\n }\r\n /**\r\n * Initialize the input ray for topology search:\r\n * * `origin` is at `start`\r\n * * `direction` is the unit xy-vector from `start` towards `target`\r\n * * `a` is the xy-distance from `start` to `target`\r\n * @param start existing position\r\n * @param target target xy coordinates\r\n * @param ray updated in place\r\n * @returns false if target is reached.\r\n */\r\n public setSearchRay(start: HalfEdgePositionDetail, target: Point3d, ray: Ray3d): boolean {\r\n ray.origin.setFromPoint3d(start);\r\n Vector3d.createStartEnd(ray.origin, target, ray.direction);\r\n ray.direction.z = 0.0;\r\n const distanceToTargetXY = ray.direction.magnitudeXY();\r\n if (distanceToTargetXY < this._tol)\r\n return false; // no searching necessary, we are already at the target point\r\n ray.a = distanceToTargetXY;\r\n ray.direction.scaleInPlace(1 / distanceToTargetXY);\r\n return true;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"HalfEdgePointInGraphSearch.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePointInGraphSearch.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 { Geometry } from \"../Geometry\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { HalfEdge, HalfEdgeMask } from \"./Graph\";\nimport { NodeXYZUV } from \"./HalfEdgeNodeXYZUV\";\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\n\n// cspell:word Chebyshev\n\n/**\n * Return code from [PointSearchContext.reAimAroundFace]\n * @internal\n */\nexport enum RayClassification {\n NoHits,\n TargetOnVertex,\n TargetOnEdge,\n Bracket,\n TargetBefore,\n TargetAfter,\n}\n\n/**\n * Context for searching for the location of an xy-point in a graph.\n * * Assumptions: interior faces of the graph are convex, no edge has length less than `tol`.\n * @internal\n */\nexport class PointSearchContext {\n private _tol: number;\n private constructor(tol: number) {\n this._tol = tol;\n }\n public static create(tol: number = Geometry.smallMetricDistance) {\n return new PointSearchContext(tol);\n }\n private panic(): HalfEdgePositionDetail {\n // A note on \"unexpectedly\" found in comments in this file:\n // Though this class assumes all edges of the graph have length at least tolerance, the tests below account for\n // edges with smaller length. This is because we are using two different metrics: Euclidean for distinguishing\n // points matching user expectation, and Chebyshev, aka \"max component\", for efficiently testing ray-sector\n // inclusion in the reAimXXX methods. In particular, epsilon-balls in the former metric are smaller than in the\n // latter. Thus an edge can be inserted into the graph with Euclidean length (barely) greater than epsilon, but\n // the edge's parallel and perpendicular components with respect to a ray can have Euclidean length *less* than\n // epsilon, yielding a Chebyshev edge length less than epsilon. This discrepancy requires careful analysis below,\n // and if this method is invoked, it is probably because we've missed a case where a dot/cross product lies just\n // beyond the tolerance.\n return HalfEdgePositionDetail.create();\n }\n /**\n * Reposition `edgeHit` to an adjacent face or vertex, or another position on the edge, that is closer to the\n * target point.\n * @param edgeHit start position on a graph edge, updated and returned.\n * @param ray the ray to the target point. Origin is assumed to lie on the edge.\n * @param targetDistance distance along the ray to the target point.\n * @return detail closer to the target point.\n */\n public reAimFromEdge(\n edgeHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\n ): HalfEdgePositionDetail {\n const nodeA = edgeHit.node!;\n const dataA = NodeXYZUV.createNodeAndRayOrigin(nodeA, ray);\n const dataB = NodeXYZUV.createNodeAndRayOrigin(nodeA.edgeMate, ray);\n const sideA = -dataA.classifyV(0.0, this._tol);\n const sideB = -dataB.classifyV(0.0, this._tol);\n let result;\n if (sideA * sideB < 0) { // simple crossing; just aim into a face\n if (sideA > 0) {\n result = edgeHit.resetAsFace(dataA.node);\n } else {\n result = edgeHit.resetAsFace(dataB.node);\n }\n } else if (sideA === 0 || sideB === 0) {\n const alongA = dataA.classifyU(targetDistance, this._tol);\n const alongB = dataB.classifyU(targetDistance, this._tol);\n if (sideA === 0 && alongA === 0) { // hit start vertex\n result = edgeHit.resetAsVertex(dataA.node);\n result.setITag(1);\n } else if (sideB === 0 && alongB === 0) { // hit end vertex\n result = edgeHit.resetAsVertex(dataB.node);\n result.setITag(1);\n } else if (sideA === 0 && sideB === 0) { // ray is clearly along the edge\n if (alongA * alongB < 0) { // target is within edge\n const edgeFraction = (targetDistance - dataA.u) / (dataB.u - dataA.u);\n result = edgeHit.resetAtEdgeAndFraction(dataA.node, edgeFraction);\n result.setITag(1);\n } else if (alongA < 0 && alongB < 0) { // target is beyond the edge; move towards it\n if (dataA.u > dataB.u)\n result = edgeHit.resetAsVertex(dataA.node);\n else\n result = edgeHit.resetAsVertex(dataB.node);\n } else { // both vertices lie on the ray before or after the target; shouldn't happen for edgeHit between nodes\n edgeHit.resetAsUnknown();\n result = this.panic();\n }\n } else if (sideA === 0) { // ray near start vertex but NOT parallel to the edge\n if (0 === dataA.classifyU(0.0, this._tol))\n result = edgeHit.resetAsVertex(dataA.node);\n else\n result = edgeHit.resetAsFace(sideB > 0 ? dataB.node : dataA.node);\n } else { // ray near end vertex but NOT parallel to the edge\n assert(sideB === 0);\n if (0 === dataB.classifyU(0.0, this._tol))\n result = edgeHit.resetAsVertex(dataB.node);\n else\n result = edgeHit.resetAsFace(sideA > 0 ? dataA.node : dataB.node);\n }\n } else { // both vertices are to same side of the ray; shouldn't happen for edgeHit between nodes\n edgeHit.resetAsUnknown();\n result = this.panic();\n }\n return result;\n }\n /**\n * Reposition `vertexHit` to an adjacent face, edge, or vertex hit that is closer to the target point.\n * @param vertexHit start position at a graph vertex, updated and returned.\n * @param ray the ray to the target point, assumed to start exactly at the vertex.\n * @param targetDistance distance along the ray to the target point.\n * @return detail closer to the target point.\n */\n public reAimFromVertex(\n vertexHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\n ): HalfEdgePositionDetail {\n assert(ray.origin.isExactEqual(vertexHit));\n const vertexNode = vertexHit.node;\n let outboundEdge = vertexNode!;\n // lambda to handle the case where the target definitively lies in the same direction as outboundEdge\n const advancePositionAlongOutboundEdge = (rayParam: number): boolean => {\n if (Math.abs(rayParam - targetDistance) <= this._tol) { // direct hit at far end of outBoundEdge\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor).setITag(1);\n } else if (rayParam > targetDistance) { // direct hit within outBoundEdge\n vertexHit.resetAtEdgeAndFraction(outboundEdge, targetDistance / rayParam);\n } else if (rayParam > this._tol) { // far end of outBoundEdge is closer to target\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor);\n } else {\n return false;\n }\n return true;\n };\n do {\n // examine the sector at the outboundEdge node; if ray lies in this sector, return updated detail\n const data0 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.faceSuccessor, ray);\n const data1 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.facePredecessor, ray);\n // u0 is the length of projection of faceSuccessor to the ray and v0 is the length of projection of\n // faceSuccessor to the ray perp line (90 degrees CCW). Similarly for u1 and v1 with facePredecessor.\n const u0 = data0.u;\n const u1 = data1.u;\n const v0 = data0.v;\n const v1 = data1.v;\n // examine dot and cross of ray with both edges defining this sector to see if ray lies between them\n if (Math.abs(v0) <= this._tol) { // ray parallel to outBoundEdge\n if (advancePositionAlongOutboundEdge(u0))\n return vertexHit;\n if (Math.abs(u0) <= this._tol) { // edge is unexpectedly* small\n if (v0 <= 0 && v1 > this._tol && (u0 >= 0 || (u0 < 0 && u1 > this._tol)))\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\n }\n // The only remaining case is u0 < -this._tol: ray points opposite outBoundEdge.\n // By our convexity assumption, the only way that ray lies in this sector is if the lookBack\n // vector points in the same direction as ray, but this would be handled in the next sector.\n } else if (v0 < -this._tol) {\n if (v1 > this._tol) // ray definitely lies in this sector\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\n if (v1 >= -this._tol) { // ray and lookBack vector are parallel\n // handle special cases not handled in the next sector\n if (Math.abs(u1) <= this._tol) { // lookBack vector is unexpectedly* small...\n if (v1 > 0 && (u1 >= 0 || (u0 > this._tol && u1 < 0))) // ...and ray is in this sector\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\n } else if (u0 > this._tol && u1 < 0) { // ray and lookBack point in opposite directions\n return vertexHit.resetAsVertex(outboundEdge.faceSuccessor); // far end is closer to target\n }\n }\n // The only remaining case is v1 < -this._tol: ray definitely lies outside this sector.\n }\n // Proceed to the next sector around this vertex. We even examine the (concave) exterior sector at a boundary\n // vertex in order to handle the case where the target lies in the direction of an exterior outboundEdge.\n outboundEdge = outboundEdge.vertexSuccessor;\n } while (outboundEdge !== vertexNode);\n return this.panic();\n }\n /**\n * Visit all edges around the face, updating `lastBefore` and `firstAfter` to ray-edge intersections that\n * lie directly before and/or after the target point on the ray, if at all.\n * @param faceNode starting node on a graph face.\n * @param ray the ray to the target point.\n * @param targetDistance distance along the ray to the target point.\n * @param lastBefore the detail to reset as the last hit on the ray before the target point (CALLER CREATED).\n * @param firstAfter the detail to reset as the first hit on the ray after the target point (CALLER CREATED).\n * @returns summary of the updated details:\n * * [[RayClassification.TargetOnVertex]] - target lies at a vertex of the face (details are identical).\n * * [[RayClassification.TargetOnEdge]] - target lies on an edge of the face (details are identical).\n * * [[RayClassification.TargetBefore]] - target lies before the face; the ray intersects the face beyond\n * the target point.\n * * [[RayClassification.TargetAfter]] - target lies after the face; the ray intersects the face before\n * the target point.\n * * [[RayClassification.Bracket]] - target lies between intersections of the ray and the face; if the face\n * is convex, this means the target lies inside the face.\n * * [[RayClassification.NoHits]] - the face does not intersect the ray.\n */\n public reAimAroundFace(\n faceNode: HalfEdge,\n ray: Ray3d,\n targetDistance: number,\n lastBefore: HalfEdgePositionDetail,\n firstAfter: HalfEdgePositionDetail,\n ): RayClassification {\n assert(!faceNode.isMaskSet(HalfEdgeMask.EXTERIOR));\n lastBefore.resetAsUndefinedWithTag(-Number.MAX_VALUE);\n firstAfter.resetAsUndefinedWithTag(Number.MAX_VALUE);\n const data0 = NodeXYZUV.createNodeAndRayOrigin(faceNode, ray);\n let data1;\n let node0 = faceNode;\n // find the intersection of the ray with each edge of the face to classify the ray hit\n do {\n const node1 = node0.faceSuccessor;\n data1 = NodeXYZUV.createNodeAndRayOrigin(node1, ray, data1);\n const u0 = data0.u;\n const u1 = data1.u;\n const v0 = data0.v;\n const v1 = data1.v;\n if (Math.abs(v1) < this._tol) { // ray parallel to edge\n const vertexHit = HalfEdgePositionDetail.createVertex(node1);\n vertexHit.setDTag(u1);\n if (Math.abs(u1 - targetDistance) < this._tol) {\n firstAfter.setFrom(vertexHit);\n lastBefore.setFrom(vertexHit);\n return RayClassification.TargetOnVertex;\n }\n if (u1 > targetDistance && u1 < firstAfter.getDTag()!)\n firstAfter.setFrom(vertexHit);\n if (u1 < targetDistance && u1 > lastBefore.getDTag()!)\n lastBefore.setFrom(vertexHit);\n } else if (v0 * v1 < 0.0) { // ray crosses edge\n const edgeFraction = -v0 / (v1 - v0);\n const rayFraction = Geometry.interpolate(u0, edgeFraction, u1);\n const edgeHit = HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);\n edgeHit.setDTag(rayFraction);\n if (Math.abs(rayFraction - targetDistance) <= this._tol) {\n firstAfter.setFrom(edgeHit);\n lastBefore.setFrom(edgeHit);\n return RayClassification.TargetOnEdge;\n }\n if (rayFraction > targetDistance && rayFraction < firstAfter.getDTag()!)\n firstAfter.setFrom(edgeHit);\n if (rayFraction < targetDistance && rayFraction > lastBefore.getDTag()!)\n lastBefore.setFrom(edgeHit);\n }\n data0.setFrom(data1);\n node0 = node0.faceSuccessor;\n } while (node0 !== faceNode);\n // returned to start node\n firstAfter.setITag(0);\n lastBefore.setITag(0);\n if (lastBefore.isUnclassified) {\n if (firstAfter.isUnclassified)\n return RayClassification.NoHits;\n return RayClassification.TargetBefore;\n }\n if (firstAfter.isUnclassified)\n return RayClassification.TargetAfter;\n else\n return RayClassification.Bracket; // face is locally convex; target lies inside this face\n }\n /**\n * Initialize the input ray for topology search:\n * * `origin` is at `start`\n * * `direction` is the unit xy-vector from `start` towards `target`\n * * `a` is the xy-distance from `start` to `target`\n * @param start existing position\n * @param target target xy coordinates\n * @param ray updated in place\n * @returns false if target is reached.\n */\n public setSearchRay(start: HalfEdgePositionDetail, target: Point3d, ray: Ray3d): boolean {\n ray.origin.setFromPoint3d(start);\n Vector3d.createStartEnd(ray.origin, target, ray.direction);\n ray.direction.z = 0.0;\n const distanceToTargetXY = ray.direction.magnitudeXY();\n if (distanceToTargetXY < this._tol)\n return false; // no searching necessary, we are already at the target point\n ray.a = distanceToTargetXY;\n ray.direction.scaleInPlace(1 / distanceToTargetXY);\n return true;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePositionDetail.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePositionDetail.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { HalfEdge } from \"./Graph\";\r\n\r\n/** Enumeration of categorization of \"where\" a HalfEdgePositionDetail is sitting in the graph. */\r\nexport enum HalfEdgeTopo {\r\n /** No known position. */\r\n None = 0,\r\n /** Sitting at a vertex, reached by a ray in this sector. */\r\n Vertex = 1,\r\n /** Sitting on an edge. */\r\n Edge = 2,\r\n /** Face point (before hitting barrier edge). */\r\n Face = 3,\r\n /**\r\n * Exterior point (after hitting barrier edge at fraction).\r\n * Fraction is 0 if exterior point \"in sweep around exterior corner\".\r\n */\r\n ExteriorFace = 4\r\n}\r\n/**\r\n * Description of a generalized position within a graph, categorized as:\r\n * * \"at a certain node around a vertex\"\r\n * * \"at a fractional position along an edge\"\r\n * * \"within a face\"\r\n */\r\nexport class HalfEdgePositionDetail {\r\n /** The relevant node. */\r\n private _node?: HalfEdge;\r\n /** The current coordinates. */\r\n public x: number;\r\n public y: number;\r\n public z: number;\r\n /** Fractional position along edge. Only defined if the topo tag is `HalfEdgeTopo.Edge`. */\r\n private _edgeFraction?: number;\r\n /** Enumeration of status vertex, edge, or face status. */\r\n private _topo: HalfEdgeTopo;\r\n /** First data tag. */\r\n private _iTag?: number;\r\n /** Second data tag. */\r\n private _dTag?: number;\r\n /** Special case for point on edge or vertex but target beyond and exterior. */\r\n private _isExteriorTarget?: boolean;\r\n /**\r\n * Constructor.\r\n * * The point is CAPTURED (static `create` methods normally clone their inputs).\r\n */\r\n private constructor(\r\n node: HalfEdge | undefined,\r\n x: number, y: number, z: number,\r\n topo: HalfEdgeTopo,\r\n edgeFraction?: number,\r\n iTag?: number,\r\n dTag?: number,\r\n isExteriorTarget?: boolean,\r\n ) {\r\n this._node = node;\r\n this.x = x; this.y = y; this.z = z;\r\n this._topo = topo;\r\n this._edgeFraction = edgeFraction;\r\n this._iTag = iTag;\r\n this._dTag = dTag;\r\n this._isExteriorTarget = isExteriorTarget;\r\n }\r\n /** Copy (clones of) all data from other. */\r\n public setFrom(other: HalfEdgePositionDetail) {\r\n this._node = other._node;\r\n this.x = other.x;\r\n this.y = other.y;\r\n this.z = other.z;\r\n this._topo = other._topo;\r\n this._edgeFraction = other._edgeFraction;\r\n this._iTag = other._iTag;\r\n this._dTag = other._dTag;\r\n }\r\n /** Reset to null topo state. */\r\n public resetAsUnknown() {\r\n this._node = undefined;\r\n this._topo = HalfEdgeTopo.None;\r\n }\r\n /** Create with null data. */\r\n public static create(): HalfEdgePositionDetail {\r\n const detail = new HalfEdgePositionDetail(undefined, 0, 0, 0, HalfEdgeTopo.None);\r\n return detail;\r\n }\r\n public getITag(): number | undefined {\r\n return this._iTag;\r\n }\r\n public setITag(value: number): void {\r\n this._iTag = value;\r\n }\r\n public getDTag(): number | undefined {\r\n return this._dTag;\r\n }\r\n public setDTag(value: number): void {\r\n this._dTag = value;\r\n }\r\n public getTopo(): HalfEdgeTopo {\r\n return this._topo;\r\n }\r\n /** Create with node, fraction along edge, marked as \"HalfEdgeTopo.Edge\". Compute interpolated xyz on the edge. */\r\n public static createEdgeAtFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\r\n const node1 = node.faceSuccessor;\r\n const x = Geometry.interpolate(node.x, edgeFraction, node1.x);\r\n const y = Geometry.interpolate(node.y, edgeFraction, node1.y);\r\n const z = Geometry.interpolate(node.z, edgeFraction, node1.z);\r\n return new HalfEdgePositionDetail(node, x, y, z, HalfEdgeTopo.Edge, edgeFraction);\r\n }\r\n /**\r\n * Reassign contents so this instance becomes a face hit.\r\n * @param node new node value. If missing, current node is left unchanged.\r\n * @param xyz new coordinates. if missing, current coordinates are left unchanged.\r\n */\r\n public resetAsFace(node?: HalfEdge, xyz?: XYAndZ): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Face;\r\n if (node)\r\n this._node = node;\r\n if (xyz) {\r\n this.x = xyz.x;\r\n this.y = xyz.y;\r\n this.z = xyz.z;\r\n }\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /** Reassign contents so this instance has dTag but no node or HalfEdgeTopo. */\r\n public resetAsUndefinedWithTag(dTag: number): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.None;\r\n this._dTag = 0;\r\n this._iTag = 0;\r\n this._dTag = dTag;\r\n this._node = undefined;\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /**\r\n * Reassign contents so this instance becomes an edge hit.\r\n * @param node new node value.\r\n * @param edgeFraction new edge fraction. xyz is recomputed from this edge and its face successor.\r\n */\r\n public resetAtEdgeAndFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Edge;\r\n this._node = node;\r\n const nodeB = node.faceSuccessor;\r\n this._edgeFraction = edgeFraction;\r\n this.x = Geometry.interpolate(node.x, edgeFraction, nodeB.x);\r\n this.y = Geometry.interpolate(node.y, edgeFraction, nodeB.y);\r\n this.z = Geometry.interpolate(node.z, edgeFraction, nodeB.z);\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /**\r\n * Create at a node.\r\n * * Take xyz from the node.\r\n */\r\n public static createVertex(node: HalfEdge): HalfEdgePositionDetail {\r\n return new HalfEdgePositionDetail(node, node.x, node.y, node.z, HalfEdgeTopo.Vertex);\r\n }\r\n /** Mark as \"HalfEdgeTopo.Vertex\". */\r\n public resetAsVertex(node: HalfEdge): HalfEdgePositionDetail {\r\n this._topo = HalfEdgeTopo.Vertex;\r\n this._node = node;\r\n this._edgeFraction = 0.0;\r\n this.setXYZFromNode(node);\r\n this._isExteriorTarget = undefined;\r\n return this;\r\n }\r\n /** Set the flag for an exterior relationship to target. */\r\n public setIsExteriorTarget(isExterior: boolean | undefined) {\r\n this._isExteriorTarget = isExterior;\r\n }\r\n /** Copy x,y,z from the node to this instance local values. */\r\n public setXYZFromNode(node: HalfEdge) {\r\n this.x = node.x;\r\n this.y = node.y;\r\n this.z = node.z;\r\n }\r\n /** Return the (possibly undefined) edge fraction. */\r\n public get edgeFraction(): number | undefined {\r\n return this._edgeFraction;\r\n }\r\n /**\r\n * Property access for the flag for an exterior relationship to target.\r\n * * undefined flag is returned as false.\r\n */\r\n public get isExteriorTarget(): boolean {\r\n return this._isExteriorTarget !== undefined ? this._isExteriorTarget : false;\r\n }\r\n /** Return true if this detail is marked as being within a face. */\r\n public get isFace(): boolean {\r\n return this._topo === HalfEdgeTopo.Face;\r\n }\r\n /** Return true if this detail is marked as being within an edge. */\r\n public get isEdge(): boolean {\r\n return this._topo === HalfEdgeTopo.Edge;\r\n }\r\n /** Return true if this detail is marked as being at a vertex. */\r\n public get isVertex(): boolean {\r\n return this._topo === HalfEdgeTopo.Vertex;\r\n }\r\n /** Return true if this detail has no vertex, edge, or face qualifier. */\r\n public get isUnclassified(): boolean {\r\n return this._topo === HalfEdgeTopo.None;\r\n }\r\n /** Return the node reference from this detail */\r\n public get node(): HalfEdge | undefined {\r\n return this._node;\r\n }\r\n /** Return the (clone of, or optional filled in result) coordinates from this detail. */\r\n public clonePoint(result?: Point3d): Point3d {\r\n return Point3d.create(this.x, this.y, this.z, result);\r\n }\r\n /*\r\n // If candidateKey is less than resultKey, replace resultPos and resultKey\r\n // by the candidate data.\r\n public updateMinimizer(\r\n HalfEdgePositionDetail & resultPos, number & resultKey,\r\n : HalfEdgePositionDetail & candidatePos, candidateKey: number\r\n ): boolean {\r\n if (candidateKey < resultKey) {\r\n resultKey = candidateKey;\r\n resultPos = candidatePos;\r\n return true;\r\n }\r\n return false;\r\n }\r\n */\r\n public isAtXY(x: number, y: number): boolean {\r\n return this._topo !== HalfEdgeTopo.None && Geometry.isSameCoordinate(this.x, x) && Geometry.isSameCoordinate(this.y, y);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"HalfEdgePositionDetail.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePositionDetail.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\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/** Enumeration of categorization of \"where\" a HalfEdgePositionDetail is sitting in the graph. */\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 /**\n * Exterior point (after hitting barrier edge at fraction).\n * Fraction is 0 if exterior point \"in sweep around exterior corner\".\n */\n ExteriorFace = 4\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 /**\n * Constructor.\n * * The point is CAPTURED (static `create` methods normally clone their inputs).\n */\n private constructor(\n node: HalfEdge | undefined,\n x: number, y: number, z: number,\n topo: HalfEdgeTopo,\n edgeFraction?: number,\n iTag?: number,\n dTag?: number,\n isExteriorTarget?: boolean,\n ) {\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 /** 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 {\n return this._iTag;\n }\n public setITag(value: number): void {\n this._iTag = value;\n }\n public getDTag(): number | undefined {\n return this._dTag;\n }\n public setDTag(value: number): void {\n this._dTag = value;\n }\n public getTopo(): HalfEdgeTopo {\n 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 /** Reassign contents so this instance has dTag but no node or HalfEdgeTopo. */\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 /** Mark as \"HalfEdgeTopo.Vertex\". */\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 /** Return the (possibly undefined) edge fraction. */\n public get edgeFraction(): number | undefined {\n return this._edgeFraction;\n }\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 /** Return true if this detail is marked as being within a face. */\n public get isFace(): boolean {\n return this._topo === HalfEdgeTopo.Face;\n }\n /** Return true if this detail is marked as being within an edge. */\n public get isEdge(): boolean {\n return this._topo === HalfEdgeTopo.Edge;\n }\n /** Return true if this detail is marked as being at a vertex. */\n public get isVertex(): boolean {\n return this._topo === HalfEdgeTopo.Vertex;\n }\n /** Return true if this detail has no vertex, edge, or face qualifier. */\n public get isUnclassified(): boolean {\n return this._topo === HalfEdgeTopo.None;\n }\n /** Return the node reference from this detail */\n public get node(): HalfEdge | undefined {\n return this._node;\n }\n /** Return the (clone of, or optional filled in result) coordinates from this detail. */\n public clonePoint(result?: Point3d): Point3d {\n 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 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"]}
|
|
@@ -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;IACzC,aAAa,CAA0B;IACvC,WAAW,CAAa;IAC/B,YACE,UAAuC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IACD,qEAAqE;IAC9D,eAAe;QACpB,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO;YAC5B,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,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":["/*---------------------------------------------------------------------------------------------\
|
|
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;IACzC,aAAa,CAA0B;IACvC,WAAW,CAAa;IAC/B,YACE,UAAuC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IACD,qEAAqE;IAC9D,eAAe;QACpB,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO;YAC5B,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,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":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry, PolygonLocation } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { SmallSystem } from \"../numerics/SmallSystem\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\nimport { Triangulator } from \"./Triangulation\";\r\n\r\n/**\r\n * Options for setting the z-coordinate of a vertex in the triangulation when a point with the same xy is inserted.\r\n * @internal\r\n */\r\nexport enum InsertedVertexZOptions {\r\n /** The point's z-coordinate is ignored, and the existing vertex's z-coordinate is unchanged. */\r\n Ignore,\r\n /** The point's z-coordinate replaces the existing vertex's z-coordinate. */\r\n Replace,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is larger.\r\n */\r\n ReplaceIfLarger,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is smaller.\r\n */\r\n ReplaceIfSmaller,\r\n}\r\n\r\n/**\r\n * Context for repeated insertion of new points in a graph.\r\n * * Initial graph should have clean outer boundary (e.g., as typically marked with `HalfEdgeMask.EXTERIOR` and\r\n * `HalfEdgeMask.BOUNDARY_EDGE`).\r\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\r\n * can reuse that position as start for walking to the new point.\r\n * @internal\r\n */\r\nexport class InsertAndRetriangulateContext {\r\n private _graph: HalfEdgeGraph;\r\n private _edgeSet: MarkedEdgeSet;\r\n private _searcher: HalfEdgePositionDetail;\r\n private _tolerance: number;\r\n\r\n private constructor(graph: HalfEdgeGraph, tolerance: number) {\r\n this._graph = graph;\r\n this._edgeSet = MarkedEdgeSet.create(graph)!;\r\n this._searcher = HalfEdgePositionDetail.create();\r\n this._tolerance = tolerance;\r\n }\r\n /** Create a new context referencing the graph. */\r\n public static create(graph: HalfEdgeGraph, tolerance: number = Geometry.smallMetricDistance) {\r\n return new InsertAndRetriangulateContext(graph, tolerance);\r\n }\r\n /** Query the (pointer to) the graph in the context. */\r\n public get graph(): HalfEdgeGraph {\r\n return this._graph;\r\n }\r\n /**\r\n * Walk face from edgeNode. Insert new edges back to start node from all except immediate successor and predecessor.\r\n * Insert all new nodes and nodes of the existing face in edgeSet.\r\n */\r\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\r\n const numNode = centralNode.countEdgesAroundFace();\r\n if (numNode < 4 || centralNode.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return;\r\n this._edgeSet.addAroundFace(centralNode);\r\n const numEdge = numNode - 3;\r\n let farNode = centralNode.faceSuccessor;\r\n let nearNode = centralNode;\r\n for (let i = 0; i < numEdge; i++) {\r\n farNode = farNode.faceSuccessor;\r\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\r\n farNode = nearNode.faceSuccessor;\r\n this._edgeSet.addToSet(nearNode);\r\n }\r\n }\r\n /** Reset the \"current\" position to unknown state. */\r\n public reset() {\r\n this._searcher = HalfEdgePositionDetail.create();\r\n }\r\n /** Return a (reference to!) the current position in the graph. */\r\n public get currentPosition() {\r\n return this._searcher;\r\n }\r\n /** Linear search for the nearest graph edge or vertex. */\r\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n const xyzC = Point3d.create();\r\n let fractionC;\r\n let distanceC;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n const nodeB = nodeA.faceSuccessor;\r\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\r\n if (fractionC !== undefined) {\r\n if (fractionC > 1.0) {\r\n distanceC = xyz.distanceXY(nodeB);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeB);\r\n position.setDTag(distanceC);\r\n }\r\n } else if (fractionC < 0.0) {\r\n distanceC = xyz.distanceXY(nodeA);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceC);\r\n }\r\n } else {\r\n nodeA.fractionToPoint3d(fractionC, xyzC);\r\n\r\n distanceC = xyz.distanceXY(xyzC);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAtEdgeAndFraction(nodeA, fractionC);\r\n }\r\n }\r\n }\r\n }\r\n return position;\r\n }\r\n /** Linear search for the nearest graph vertex. */\r\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n let distanceA;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n distanceA = xyz.distanceXY(nodeA);\r\n if (distanceA < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceA);\r\n }\r\n }\r\n return position;\r\n }\r\n /**\r\n * Reset the \"current\" position to a vertex nearest the target point.\r\n * @param xyz target point\r\n * @param searchEdgesToo reset to nearest vertex or edge\r\n */\r\n public resetSearch(xyz: Point3d, searchEdgesToo: boolean): void {\r\n if (searchEdgesToo)\r\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\r\n else\r\n this._searcher = this.searchForNearestVertex(xyz);\r\n }\r\n /** Reclassify the current interior face hit if it is too close to an edge of the face. */\r\n private reclassifyFaceHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isFace || this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const face = this._searcher.node.collectAroundFace((node: HalfEdge) => {\r\n const xy = Point3d.create(node.x, node.y);\r\n (xy as any).node = node; // decorate the point with the node\r\n return xy;\r\n });\r\n const detail = PolygonOps.closestPointOnBoundary(face, pointXY, this._tolerance);\r\n assert(detail.code === PolygonLocation.OnPolygonEdgeInterior);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = face[detail.closestEdgeIndex].node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */\r\n private reclassifyEdgeHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isEdge || this._searcher.node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const superFace: Point3d[] = [];\r\n for (let n = this._searcher.node.faceSuccessor; n !== this._searcher.node; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the left face\r\n superFace.push(xy);\r\n }\r\n for (let n = this._searcher.node.vertexPredecessor; n !== this._searcher.node.edgeMate; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the right face\r\n superFace.push(xy);\r\n }\r\n const detail = PolygonOps.closestPointOnBoundary(superFace, pointXY, this._tolerance);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = (superFace[detail.closestEdgeIndex] as any).node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.code === PolygonLocation.OnPolygonVertex) // can happen if superFace is non-concave (e.g., a dart)\r\n this._searcher.resetAsVertex(vertex);\r\n else if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /**\r\n * Given a point that was just inserted into the graph at the given node, apply the z-coordinate rule around\r\n * the vertex loop.\r\n */\r\n private updateZAroundVertex(node: HalfEdge, point: Point3d, zOption: InsertedVertexZOptions): void {\r\n if (InsertedVertexZOptions.Ignore === zOption)\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfLarger === zOption) && (point.z <= node.z))\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfSmaller === zOption) && (point.z >= node.z))\r\n return;\r\n // only replace z; preserving xy preserves convexity of the hull\r\n node.setXYZAroundVertex(node.x, node.y, point.z);\r\n }\r\n /**\r\n * Insert a new point into the graph and retriangulate.\r\n * @param point the coordinates of the node to be inserted.\r\n * @param newZWins rule governing when `point.z` should override the z-coordinate of an existing vertex with the\r\n * same x and y.\r\n * @returns true if and only if the point didn't need to be inserted or was successfully inserted.\r\n */\r\n public insertAndRetriangulate(point: Point3d, newZWins: InsertedVertexZOptions): boolean {\r\n this.moveToPoint(this._searcher, point);\r\n if (this._searcher.node === undefined)\r\n return false;\r\n // Try to avoid skinny triangles. If we iterated, this could get out of control (e.g., inserting point into a fan).\r\n // Limiting to one reclassification ensures the hit doesn't move more than tol and reduces skinny triangles\r\n // adjacent to the hull.\r\n if (!this.reclassifyFaceHit(point))\r\n this.reclassifyEdgeHit(point);\r\n if (this._searcher.isFace) {\r\n // insert point into the graph if it lies in an interior face\r\n if (!this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);\r\n this.retriangulateFromBaseVertex(newNode);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newNode);\r\n }\r\n } else if (this._searcher.isEdge) {\r\n // insert point into the graph by splitting its containing edge\r\n const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction!);\r\n const newB = newA.vertexPredecessor;\r\n this.updateZAroundVertex(newA, point, InsertedVertexZOptions.Replace); // always replace\r\n this.retriangulateFromBaseVertex(newA);\r\n this.retriangulateFromBaseVertex(newB);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newA);\r\n } else if (this._searcher.isVertex) {\r\n // no need to insert point as there's already a vertex there, but maybe update its z-coord\r\n this.updateZAroundVertex(this._searcher.node, point, newZWins);\r\n }\r\n return true;\r\n }\r\n /**\r\n * Advance movingPosition to a face, edge, or vertex position detail that contains `target`.\r\n * @param movingPosition input seed for search, updated on return.\r\n * @param target point to search for containing topology in the graph.\r\n * @param announcer optional callback invoked during search loop; return false to end search.\r\n * @returns true if search was successful.\r\n */\r\n public moveToPoint(\r\n movingPosition: HalfEdgePositionDetail,\r\n target: Point3d,\r\n announcer?: (position: HalfEdgePositionDetail) => boolean,\r\n ): boolean {\r\n const psc = PointSearchContext.create(this._tolerance);\r\n movingPosition.setITag(0);\r\n if (movingPosition.isUnclassified) {\r\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, HalfEdgeMask.NULL_MASK);\r\n if (movingPosition.isUnclassified)\r\n return false;\r\n }\r\n let trap = 0;\r\n const ray = Ray3d.createXAxis();\r\n for (; movingPosition.getITag() === 0 && trap < 2;) {\r\n if (announcer !== undefined) {\r\n const continueSearch = announcer(movingPosition);\r\n if (!continueSearch)\r\n break;\r\n }\r\n if (!psc.setSearchRay(movingPosition, target, ray)) {\r\n return false;\r\n } else if (movingPosition.isFace) {\r\n const lastBefore = HalfEdgePositionDetail.create();\r\n const firstAfter = HalfEdgePositionDetail.create();\r\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\r\n // reAimAroundFace returns lots of cases in `lastBefore`\r\n switch (rc) {\r\n case RayClassification.NoHits: {\r\n movingPosition.resetAsUnknown();\r\n break;\r\n }\r\n case RayClassification.TargetOnVertex: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetOnEdge: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.Bracket: {\r\n movingPosition.resetAsFace(lastBefore.node, target);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetBefore: { // do we ever get here?\r\n movingPosition.resetAsFace(movingPosition.node, target);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetAfter: {\r\n if (movingPosition.node === lastBefore.node\r\n && movingPosition.isFace\r\n && (lastBefore.isEdge || lastBefore.isVertex)) {\r\n trap++;\r\n } else {\r\n trap = 0;\r\n }\r\n movingPosition.setFrom(lastBefore);\r\n break;\r\n }\r\n }\r\n } else if (movingPosition.isEdge) {\r\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n } else if (movingPosition.isVertex) {\r\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n }\r\n }\r\n if (movingPosition.isAtXY(target.x, target.y))\r\n return true;\r\n if (trap > 1) {\r\n // ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.\r\n // This happens only when the target point is exterior (heavy triangulation use cases start with a convex\r\n // hull and only do interior intersections, so case only happens in contrived unit tests so far\r\n // What to mark? Leave it as is, but mark as exterior target\r\n if (movingPosition.node !== undefined) {\r\n movingPosition.setIsExteriorTarget(true);\r\n }\r\n return false;\r\n }\r\n // murky here; should never be hit. Has never been hit in unit tests.\r\n return false;\r\n }\r\n}\r\n/** Set `position` to a random unmasked edge at the specified fraction. */\r\nfunction moveToAnyUnmaskedEdge(\r\n graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask,\r\n): boolean {\r\n for (const candidate of graph.allHalfEdges) {\r\n if (!candidate.isMaskSet(skipMask)) {\r\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\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 { assert } from \"@itwin/core-bentley\";\nimport { Geometry, PolygonLocation } from \"../Geometry\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { SmallSystem } from \"../numerics/SmallSystem\";\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 * Options for setting the z-coordinate of a vertex in the triangulation when a point with the same xy is inserted.\n * @internal\n */\nexport enum InsertedVertexZOptions {\n /** The point's z-coordinate is ignored, and the existing vertex's z-coordinate is unchanged. */\n Ignore,\n /** The point's z-coordinate replaces the existing vertex's z-coordinate. */\n Replace,\n /**\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\n * point's z-coordinate is larger.\n */\n ReplaceIfLarger,\n /**\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\n * point's z-coordinate is smaller.\n */\n ReplaceIfSmaller,\n}\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` and\n * `HalfEdgeMask.BOUNDARY_EDGE`).\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 * @internal\n */\nexport class InsertAndRetriangulateContext {\n private _graph: HalfEdgeGraph;\n private _edgeSet: MarkedEdgeSet;\n private _searcher: HalfEdgePositionDetail;\n private _tolerance: number;\n\n private constructor(graph: HalfEdgeGraph, tolerance: number) {\n this._graph = graph;\n this._edgeSet = MarkedEdgeSet.create(graph)!;\n this._searcher = HalfEdgePositionDetail.create();\n this._tolerance = tolerance;\n }\n /** Create a new context referencing the graph. */\n public static create(graph: HalfEdgeGraph, tolerance: number = Geometry.smallMetricDistance) {\n return new InsertAndRetriangulateContext(graph, tolerance);\n }\n /** Query the (pointer to) the graph in the context. */\n public get graph(): HalfEdgeGraph {\n return this._graph;\n }\n /**\n * Walk face from edgeNode. Insert new edges back to start node from all except immediate successor and predecessor.\n * Insert all new nodes and nodes of the existing face in edgeSet.\n */\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\n const numNode = centralNode.countEdgesAroundFace();\n if (numNode < 4 || centralNode.isMaskSet(HalfEdgeMask.EXTERIOR))\n return;\n this._edgeSet.addAroundFace(centralNode);\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 /** Return a (reference to!) the current position in the graph. */\n public get currentPosition() {\n return this._searcher;\n }\n /** Linear search for the nearest graph edge or vertex. */\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 /** Linear search for the nearest graph vertex. */\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 * Reset the \"current\" position to a vertex nearest the target point.\n * @param xyz target point\n * @param searchEdgesToo reset to nearest vertex or edge\n */\n public resetSearch(xyz: Point3d, searchEdgesToo: boolean): void {\n if (searchEdgesToo)\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\n else\n this._searcher = this.searchForNearestVertex(xyz);\n }\n /** Reclassify the current interior face hit if it is too close to an edge of the face. */\n private reclassifyFaceHit(point: Point3d): boolean {\n if (undefined === this._searcher.node || !this._searcher.isFace || this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR))\n return false;\n const pointXY = Point3d.create(point.x, point.y);\n const face = this._searcher.node.collectAroundFace((node: HalfEdge) => {\n const xy = Point3d.create(node.x, node.y);\n (xy as any).node = node; // decorate the point with the node\n return xy;\n });\n const detail = PolygonOps.closestPointOnBoundary(face, pointXY, this._tolerance);\n assert(detail.code === PolygonLocation.OnPolygonEdgeInterior);\n if (detail.a > this._tolerance)\n return false;\n const edge = face[detail.closestEdgeIndex].node;\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\n if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\n this._searcher.resetAsVertex(vertex);\n else\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\n return true;\n }\n /** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */\n private reclassifyEdgeHit(point: Point3d): boolean {\n if (undefined === this._searcher.node || !this._searcher.isEdge || this._searcher.node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE))\n return false;\n const pointXY = Point3d.create(point.x, point.y);\n const superFace: Point3d[] = [];\n for (let n = this._searcher.node.faceSuccessor; n !== this._searcher.node; n = n.faceSuccessor) {\n const xy = Point3d.create(n.x, n.y);\n (xy as any).node = n; // decorate the point with a node of the left face\n superFace.push(xy);\n }\n for (let n = this._searcher.node.vertexPredecessor; n !== this._searcher.node.edgeMate; n = n.faceSuccessor) {\n const xy = Point3d.create(n.x, n.y);\n (xy as any).node = n; // decorate the point with a node of the right face\n superFace.push(xy);\n }\n const detail = PolygonOps.closestPointOnBoundary(superFace, pointXY, this._tolerance);\n if (detail.a > this._tolerance)\n return false;\n const edge = (superFace[detail.closestEdgeIndex] as any).node;\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\n if (detail.code === PolygonLocation.OnPolygonVertex) // can happen if superFace is non-concave (e.g., a dart)\n this._searcher.resetAsVertex(vertex);\n else if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\n this._searcher.resetAsVertex(vertex);\n else\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\n return true;\n }\n /**\n * Given a point that was just inserted into the graph at the given node, apply the z-coordinate rule around\n * the vertex loop.\n */\n private updateZAroundVertex(node: HalfEdge, point: Point3d, zOption: InsertedVertexZOptions): void {\n if (InsertedVertexZOptions.Ignore === zOption)\n return;\n if ((InsertedVertexZOptions.ReplaceIfLarger === zOption) && (point.z <= node.z))\n return;\n if ((InsertedVertexZOptions.ReplaceIfSmaller === zOption) && (point.z >= node.z))\n return;\n // only replace z; preserving xy preserves convexity of the hull\n node.setXYZAroundVertex(node.x, node.y, point.z);\n }\n /**\n * Insert a new point into the graph and retriangulate.\n * @param point the coordinates of the node to be inserted.\n * @param newZWins rule governing when `point.z` should override the z-coordinate of an existing vertex with the\n * same x and y.\n * @returns true if and only if the point didn't need to be inserted or was successfully inserted.\n */\n public insertAndRetriangulate(point: Point3d, newZWins: InsertedVertexZOptions): boolean {\n this.moveToPoint(this._searcher, point);\n if (this._searcher.node === undefined)\n return false;\n // Try to avoid skinny triangles. If we iterated, this could get out of control (e.g., inserting point into a fan).\n // Limiting to one reclassification ensures the hit doesn't move more than tol and reduces skinny triangles\n // adjacent to the hull.\n if (!this.reclassifyFaceHit(point))\n this.reclassifyEdgeHit(point);\n if (this._searcher.isFace) {\n // insert point into the graph if it lies in an interior face\n if (!this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR)) {\n const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);\n this.retriangulateFromBaseVertex(newNode);\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\n this._searcher.resetAsVertex(newNode);\n }\n } else if (this._searcher.isEdge) {\n // insert point into the graph by splitting its containing edge\n const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction!);\n const newB = newA.vertexPredecessor;\n this.updateZAroundVertex(newA, point, InsertedVertexZOptions.Replace); // always replace\n this.retriangulateFromBaseVertex(newA);\n this.retriangulateFromBaseVertex(newB);\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\n this._searcher.resetAsVertex(newA);\n } else if (this._searcher.isVertex) {\n // no need to insert point as there's already a vertex there, but maybe update its z-coord\n this.updateZAroundVertex(this._searcher.node, point, newZWins);\n }\n return true;\n }\n /**\n * Advance movingPosition to a face, edge, or vertex position detail that contains `target`.\n * @param movingPosition input seed for search, updated on return.\n * @param target point to search for containing topology in the graph.\n * @param announcer optional callback invoked during search loop; return false to end search.\n * @returns true if search was successful.\n */\n public moveToPoint(\n movingPosition: HalfEdgePositionDetail,\n target: Point3d,\n announcer?: (position: HalfEdgePositionDetail) => boolean,\n ): boolean {\n const psc = PointSearchContext.create(this._tolerance);\n movingPosition.setITag(0);\n if (movingPosition.isUnclassified) {\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, HalfEdgeMask.NULL_MASK);\n if (movingPosition.isUnclassified)\n return false;\n }\n let trap = 0;\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, target, 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.NoHits: {\n movingPosition.resetAsUnknown();\n break;\n }\n case RayClassification.TargetOnVertex: {\n movingPosition.setFrom(lastBefore);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.TargetOnEdge: {\n movingPosition.setFrom(lastBefore);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.Bracket: {\n movingPosition.resetAsFace(lastBefore.node, target);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.TargetBefore: { // do we ever get here?\n movingPosition.resetAsFace(movingPosition.node, target);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.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(target.x, target.y))\n return true;\n if (trap > 1) {\n // ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.\n // This happens only when the target point is exterior (heavy triangulation use cases start with a convex\n // hull and only do interior intersections, so case only happens in contrived unit tests so far\n // What to mark? Leave it as is, but mark as exterior target\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/** Set `position` to a random unmasked edge at the specified fraction. */\nfunction moveToAnyUnmaskedEdge(\n graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask,\n): 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;IACd,UAAU,CAAS;IACnB,kBAAkB,CAAS;IAC3B,cAAc,CAAS;IAC/B;;;;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":["/*---------------------------------------------------------------------------------------------\
|
|
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;IACd,UAAU,CAAS;IACnB,kBAAkB,CAAS;IAC3B,cAAc,CAAS;IAC/B;;;;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"]}
|