@itwin/core-geometry 4.4.0-dev.1 → 4.4.0-dev.10
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 +30 -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/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/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/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.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/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/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/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.d.ts +19 -9
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +19 -9
- 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.d.ts +23 -18
- package/lib/cjs/topology/HalfEdgeGraphValidation.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js +23 -18
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.d.ts +17 -10
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js +38 -17
- 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/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/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/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/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.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/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/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/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.d.ts +19 -9
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +19 -9
- 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.d.ts +23 -18
- package/lib/esm/topology/HalfEdgeGraphValidation.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js +23 -18
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.d.ts +17 -10
- package/lib/esm/topology/HalfEdgeNodeXYZUV.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js +38 -17
- 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/XYParitySearchContext.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgeMarkSet.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgeMarkSet.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\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\n\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n/**\r\n * A class to manage a set of edges as both (a) an array of possible members and (b) mask bits.\r\n * * A half edge is \"in the MarkSet\" if its mask is set.\r\n * * The MarkSet array is a superset of the half edges in the set.\r\n * * Entry of a HalfEdge into the set is indicated by both\r\n * * adding the HalfEdge to the array\r\n * * setting the mask on the half edge, edge, face, or vertex\r\n * * Half edges can \"go out of the MarkSet\" if the mask is cleared.\r\n * * This clearing can happen independently of the array management.\r\n * * Hence the array can contain half edges that are no longer in the MarkSet\r\n * * the \"remove\" methods monitor this.\r\n * * Derived classes expand this concept for edge, vertex, or face MarkSets.\r\n * * a single representative of an edge, vertex, or face is entered to the array\r\n * * all edges around the edge, vertex, or face are marked with the mask\r\n * * Hence the array contains one or more representatives of the edge, face, or vertex\r\n * * This allows quick query for both:\r\n * * Testing the mask gives constant time test of whether a HalfEdge is in the set\r\n * * access through the array gives direct access to the HalfEdge pointers\r\n * @internal\r\n */\r\nexport abstract class AbstractHalfEdgeGraphMarkSet {\r\n private _graph: HalfEdgeGraph;\r\n private _candidates: HalfEdge[];\r\n protected _mask: HalfEdgeMask;\r\n\r\n protected constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\r\n this._graph = graph;\r\n this._candidates = [];\r\n this._mask = mask;\r\n this._graph.clearMask(mask);\r\n }\r\n /** remove all nodes from the set.\r\n * * This pops from the array, clearing masks as the pop.\r\n * * Note that it does NOT walk the entire graph to clear masks.\r\n */\r\n public clear() {\r\n for (; undefined !== this.chooseAndRemoveAny();) {\r\n }\r\n }\r\n\r\n /**\r\n * count the number of active members.\r\n * * This is the number of HalfEdges which are (a) in the array and (b) masked.\r\n */\r\n public getLength(): number {\r\n let n = 0;\r\n for (const candidate of this._candidates) {\r\n if (candidate.isMaskSet(this._mask)) n++;\r\n }\r\n return n;\r\n }\r\n /**\r\n * Return the number of candidates.\r\n * * This may be more than `getLength ()`\r\n * * This will typically only be called by the iterator.\r\n */\r\n public getNumCandidates(): number {\r\n return this._candidates.length;\r\n }\r\n /** Read property accessor: return the graph */\r\n public get graph(): HalfEdgeGraph { return this._graph; }\r\n\r\n /** return borrowed assets (the mask!) to the graph. */\r\n public teardown() {\r\n this._graph.dropMask(this._mask);\r\n this._candidates.length = 0;\r\n // this._graph = undefined;\r\n }\r\n /** (Read property) return the mask used to mark members of the set. */\r\n public get mask(): HalfEdgeMask { return this._mask; }\r\n\r\n /** pop and return the last node out of the array, without testing if it is still marked. */\r\n protected popAndReturn(): HalfEdge | undefined {\r\n const n = this._candidates.length;\r\n if (n === 0)\r\n return undefined;\r\n const node = this._candidates[n - 1];\r\n this._candidates.pop();\r\n return node;\r\n }\r\n\r\n /**\r\n * * read at an index in the candidates array.\r\n * * if that candidate has the mask, return it.\r\n * * otherwise return undefined.\r\n * * REMARK: This is only to be called by the iterator.\r\n */\r\n public getAtIndex(index: number): HalfEdge | undefined {\r\n if (index >= 0 && index < this._candidates.length) {\r\n const candidate = this._candidates[index];\r\n if (candidate.isMaskSet(this._mask))\r\n return candidate;\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Add a node to the set. This means\r\n * * Set the mask\r\n * * push the node on the array\r\n * * (BUT!) If the node already has the mask, do nothing.\r\n * * This base class method affects only the single given HalfEdge.\r\n * * Derived classes for edge, face, and vertex will override this method and also set the mask around the larger structures.\r\n * @returns true if the HalfEdge is a new member of the set, false if it was already in the set.\r\n */\r\n public addToSet(candidate: HalfEdge) {\r\n if (candidate.isMaskSet(this._mask))\r\n return false;\r\n this._candidates.push(candidate);\r\n this.setMaskInScope(candidate);\r\n return true;\r\n }\r\n /** Test if `candidate` is already in the set.\r\n * * This examines only the mask.\r\n */\r\n public isCandidateInSet(candidate: HalfEdge): boolean {\r\n return candidate.isMaskSet(this._mask);\r\n }\r\n /**\r\n * * If the candidate is not marked as a member of the MarkSet, do nothing.\r\n * * If the candidate is marked:\r\n * * clear the mask\r\n * * but do NOT search the array.\r\n * * As the array is searched, the candidate will appear and be ignored because the mask is not set.\r\n * @param candidate\r\n * @return true if the candidate was a member (an hence removed), false if the candidate was not masked.\r\n */\r\n public removeFromSet(candidate: HalfEdge): boolean {\r\n if (!candidate.isMaskSet(this._mask))\r\n return false;\r\n this.clearMaskInScope(candidate);\r\n return true;\r\n }\r\n /**\r\n * * Search the array to find any current set member\r\n * * If found, clear its mask and return it.\r\n * * If unmasked HalfEdges are found in the array, they are removed from the array.\r\n */\r\n public chooseAndRemoveAny(): HalfEdge | undefined {\r\n for (; ;) {\r\n const candidate = this.popAndReturn();\r\n if (!candidate)\r\n return undefined;\r\n if (this.removeFromSet(candidate))\r\n return candidate;\r\n }\r\n }\r\n /** Set mask on candidate -- i.e. edge, face, vertex, or single half edge as required.\r\n * * Base class only changes the candidate mask.\r\n * * Derived classes change more masks around edge, face, or vertex.\r\n */\r\n protected abstract setMaskInScope(candidate: HalfEdge | undefined): void;\r\n\r\n /** Clear mask on candidate -- i.e. edge, face, vertex, or single half edge as required.\r\n * * Base class only changes the candidate mask.\r\n * * Derived classes change more masks around edge, face, or vertex.\r\n */\r\n protected abstract clearMaskInScope(candidate: HalfEdge | undefined): void;\r\n /**\r\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\r\n * * This is always 1 for HalfEdgeMarkSet\r\n * @param candidate\r\n */\r\n public abstract countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number;\r\n /** Create an iterator over member HalfEdges */\r\n public [Symbol.iterator](): IterableIterator<HalfEdge> { return new IterableHalfEdgeMarkSetIterator(this); }\r\n /**\r\n * * visit all half edges around face.\r\n * * Add each to mark set.\r\n */\r\n public addAroundFace(seed: HalfEdge): void {\r\n let p = seed;\r\n do {\r\n this.addToSet(p);\r\n p = p.faceSuccessor;\r\n } while (p !== seed);\r\n }\r\n\r\n /**\r\n * * visit all half edges around vertex.\r\n * * Add each to mark set.\r\n */\r\n public addAroundVertex(seed: HalfEdge): void {\r\n let p = seed;\r\n do {\r\n this.addToSet(p);\r\n p = p.vertexSuccessor;\r\n } while (p !== seed);\r\n }\r\n}\r\n\r\n/**\r\n * AbstractHalfEdgeGraphMarkSet specialized to manage the masks on individual half edges\r\n * @internal\r\n */\r\nexport class MarkedHalfEdgeSet extends AbstractHalfEdgeGraphMarkSet {\r\n constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\r\n super(graph, mask);\r\n }\r\n /** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.\r\n * * Returns undefined if unable to get a mask for the graph.\r\n * * Undefined return can only happen if the caller is failing to return grabbed masks.\r\n */\r\n public static create(graph: HalfEdgeGraph): MarkedHalfEdgeSet | undefined {\r\n const mask = graph.grabMask();\r\n if (mask === HalfEdgeMask.NULL_MASK)\r\n return undefined;\r\n return new MarkedHalfEdgeSet(graph, mask);\r\n }\r\n\r\n /**\r\n * * Set mask on candidate's edge.\r\n * * This overrides the base class implementation.\r\n */\r\n protected setMaskInScope(candidate: HalfEdge) {\r\n candidate.setMask(this._mask);\r\n }\r\n\r\n /**\r\n * * Clear mask on candidate's edge.\r\n * * This overrides the base class implementation.\r\n */\r\n protected clearMaskInScope(candidate: HalfEdge) {\r\n candidate.clearMask(this._mask);\r\n }\r\n /**\r\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\r\n * * This is always 1 for EdgeMarkSet\r\n * * return 0 for undefined candidate\r\n * @param candidate\r\n */\r\n public countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number {\r\n if (!candidate)\r\n return 0;\r\n return 1;\r\n }\r\n}\r\n\r\n/**\r\n * AbstractHalfEdgeGraphMarkSet specialized to manage the mask on both sides of edges.\r\n * @internal\r\n */\r\nexport class MarkedEdgeSet extends AbstractHalfEdgeGraphMarkSet {\r\n constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\r\n super(graph, mask);\r\n }\r\n /** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.\r\n * * Returns undefined if unable to get a mask for the graph.\r\n * * Undefined return can only happen if the caller is failing to return grabbed masks.\r\n */\r\n public static create(graph: HalfEdgeGraph): MarkedEdgeSet | undefined {\r\n const mask = graph.grabMask();\r\n if (mask === HalfEdgeMask.NULL_MASK)\r\n return undefined;\r\n return new MarkedEdgeSet(graph, mask);\r\n }\r\n\r\n /**\r\n * * Set mask on candidate's edge.\r\n * * This overrides the base class implementation.\r\n */\r\n protected setMaskInScope(candidate: HalfEdge) {\r\n candidate.setMaskAroundEdge(this._mask);\r\n }\r\n\r\n /**\r\n * * Clear mask on candidate's edge.\r\n * * This overrides the base class implementation.\r\n */\r\n protected clearMaskInScope(candidate: HalfEdge) {\r\n candidate.clearMaskAroundEdge(this._mask);\r\n }\r\n /**\r\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\r\n * * This is always 2 for EdgeMarkSet\r\n * @param candidate\r\n */\r\n public countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number {\r\n if (!candidate)\r\n return 0;\r\n return 2;\r\n }\r\n}\r\n\r\n/**\r\n * AbstractHalfEdgeGraphMarkSet specialized to manage the mask around faces\r\n * @internal\r\n */\r\nexport class MarkedFaceSet extends AbstractHalfEdgeGraphMarkSet {\r\n constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\r\n super(graph, mask);\r\n }\r\n /** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.\r\n * * Returns undefined if unable to get a mask for the graph.\r\n * * Undefined return can only happen if the caller is failing to return grabbed masks.\r\n */\r\n public static create(graph: HalfEdgeGraph): MarkedFaceSet | undefined {\r\n const mask = graph.grabMask();\r\n if (mask === HalfEdgeMask.NULL_MASK)\r\n return undefined;\r\n return new MarkedFaceSet(graph, mask);\r\n }\r\n\r\n /**\r\n * * Set mask on (all nodes around) candidate's face\r\n * * This overrides the base class implementation.\r\n */\r\n protected setMaskInScope(candidate: HalfEdge) {\r\n candidate.setMaskAroundFace(this._mask);\r\n }\r\n\r\n /**\r\n * * Clear mask on (all nodes around) candidate's face.\r\n * * This overrides the base class implementation.\r\n */\r\n protected clearMaskInScope(candidate: HalfEdge) {\r\n candidate.clearMaskAroundFace(this._mask);\r\n }\r\n /**\r\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\r\n * * This is the \"aroundFace\" count.\r\n * @param candidate\r\n */\r\n public countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number {\r\n if (!candidate)\r\n return 0;\r\n return candidate.countEdgesAroundFace();\r\n }\r\n}\r\n/**\r\n * AbstractHalfEdgeGraphMarkSet specialized to manage the mask around faces\r\n * @internal\r\n */\r\nexport class MarkedVertexSet extends AbstractHalfEdgeGraphMarkSet {\r\n constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\r\n super(graph, mask);\r\n }\r\n /** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.\r\n * * Returns undefined if unable to get a mask for the graph.\r\n * * Undefined return can only happen if the caller is failing to return grabbed masks.\r\n */\r\n public static create(graph: HalfEdgeGraph): MarkedVertexSet | undefined {\r\n const mask = graph.grabMask();\r\n if (mask === HalfEdgeMask.NULL_MASK)\r\n return undefined;\r\n return new MarkedVertexSet(graph, mask);\r\n }\r\n\r\n /**\r\n * * Set mask on (all nodes around) candidate's face\r\n * * This overrides the base class implementation.\r\n */\r\n protected setMaskInScope(candidate: HalfEdge) {\r\n candidate.setMaskAroundVertex(this._mask);\r\n }\r\n\r\n /**\r\n * * Clear mask on (all nodes around) candidate's face.\r\n * * This overrides the base class implementation.\r\n */\r\n protected clearMaskInScope(candidate: HalfEdge) {\r\n candidate.clearMaskAroundVertex(this._mask);\r\n }\r\n /**\r\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\r\n * * This is the \"aroundVertex\" count.\r\n * @param candidate\r\n */\r\n public countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number {\r\n if (!candidate)\r\n return 0;\r\n return candidate.countEdgesAroundVertex();\r\n }\r\n}\r\n\r\n/**\r\n * Class to act as an iterator over points in a markSet.\r\n * * Internal data is:\r\n * * pointer to the parent markSet\r\n * * index of index of the next point to read.\r\n * * the parent markSet class\r\n */\r\nclass IterableHalfEdgeMarkSetIterator implements Iterator<HalfEdge> {\r\n private _markSet: AbstractHalfEdgeGraphMarkSet;\r\n private _nextReadIndex: number;\r\n public constructor(markSet: AbstractHalfEdgeGraphMarkSet) {\r\n this._markSet = markSet;\r\n this._nextReadIndex = 0;\r\n }\r\n public next(): IteratorResult<HalfEdge> {\r\n const n = this._markSet.getNumCandidates();\r\n // Walk over candidates that have been quietly de-masked\r\n while (this._nextReadIndex < n) {\r\n const p = this._markSet.getAtIndex(this._nextReadIndex++);\r\n if (p !== undefined)\r\n return { done: false, value: p };\r\n }\r\n return { done: true, value: undefined } as any as IteratorResult<HalfEdge>;\r\n }\r\n\r\n public [Symbol.iterator](): IterableIterator<HalfEdge> { return this; }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"HalfEdgeMarkSet.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgeMarkSet.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*--------------------------------------------------------------------------------------------*/\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\n\n/** @packageDocumentation\n * @module Topology\n */\n/**\n * A class to manage a set of edges as both (a) an array of possible members and (b) mask bits.\n * * A half edge is \"in the MarkSet\" if its mask is set.\n * * The MarkSet array is a superset of the half edges in the set.\n * * Entry of a HalfEdge into the set is indicated by both\n * * adding the HalfEdge to the array\n * * setting the mask on the half edge, edge, face, or vertex\n * * Half edges can \"go out of the MarkSet\" if the mask is cleared.\n * * This clearing can happen independently of the array management.\n * * Hence the array can contain half edges that are no longer in the MarkSet\n * * the \"remove\" methods monitor this.\n * * Derived classes expand this concept for edge, vertex, or face MarkSets.\n * * a single representative of an edge, vertex, or face is entered to the array\n * * all edges around the edge, vertex, or face are marked with the mask\n * * Hence the array contains one or more representatives of the edge, face, or vertex\n * * This allows quick query for both:\n * * Testing the mask gives constant time test of whether a HalfEdge is in the set\n * * access through the array gives direct access to the HalfEdge pointers\n * @internal\n */\nexport abstract class AbstractHalfEdgeGraphMarkSet {\n private _graph: HalfEdgeGraph;\n private _candidates: HalfEdge[];\n protected _mask: HalfEdgeMask;\n\n protected constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\n this._graph = graph;\n this._candidates = [];\n this._mask = mask;\n this._graph.clearMask(mask);\n }\n /** remove all nodes from the set.\n * * This pops from the array, clearing masks as the pop.\n * * Note that it does NOT walk the entire graph to clear masks.\n */\n public clear() {\n for (; undefined !== this.chooseAndRemoveAny();) {\n }\n }\n\n /**\n * count the number of active members.\n * * This is the number of HalfEdges which are (a) in the array and (b) masked.\n */\n public getLength(): number {\n let n = 0;\n for (const candidate of this._candidates) {\n if (candidate.isMaskSet(this._mask)) n++;\n }\n return n;\n }\n /**\n * Return the number of candidates.\n * * This may be more than `getLength ()`\n * * This will typically only be called by the iterator.\n */\n public getNumCandidates(): number {\n return this._candidates.length;\n }\n /** Read property accessor: return the graph */\n public get graph(): HalfEdgeGraph { return this._graph; }\n\n /** return borrowed assets (the mask!) to the graph. */\n public teardown() {\n this._graph.dropMask(this._mask);\n this._candidates.length = 0;\n // this._graph = undefined;\n }\n /** (Read property) return the mask used to mark members of the set. */\n public get mask(): HalfEdgeMask { return this._mask; }\n\n /** pop and return the last node out of the array, without testing if it is still marked. */\n protected popAndReturn(): HalfEdge | undefined {\n const n = this._candidates.length;\n if (n === 0)\n return undefined;\n const node = this._candidates[n - 1];\n this._candidates.pop();\n return node;\n }\n\n /**\n * * read at an index in the candidates array.\n * * if that candidate has the mask, return it.\n * * otherwise return undefined.\n * * REMARK: This is only to be called by the iterator.\n */\n public getAtIndex(index: number): HalfEdge | undefined {\n if (index >= 0 && index < this._candidates.length) {\n const candidate = this._candidates[index];\n if (candidate.isMaskSet(this._mask))\n return candidate;\n }\n return undefined;\n }\n\n /** Add a node to the set. This means\n * * Set the mask\n * * push the node on the array\n * * (BUT!) If the node already has the mask, do nothing.\n * * This base class method affects only the single given HalfEdge.\n * * Derived classes for edge, face, and vertex will override this method and also set the mask around the larger structures.\n * @returns true if the HalfEdge is a new member of the set, false if it was already in the set.\n */\n public addToSet(candidate: HalfEdge) {\n if (candidate.isMaskSet(this._mask))\n return false;\n this._candidates.push(candidate);\n this.setMaskInScope(candidate);\n return true;\n }\n /** Test if `candidate` is already in the set.\n * * This examines only the mask.\n */\n public isCandidateInSet(candidate: HalfEdge): boolean {\n return candidate.isMaskSet(this._mask);\n }\n /**\n * * If the candidate is not marked as a member of the MarkSet, do nothing.\n * * If the candidate is marked:\n * * clear the mask\n * * but do NOT search the array.\n * * As the array is searched, the candidate will appear and be ignored because the mask is not set.\n * @param candidate\n * @return true if the candidate was a member (an hence removed), false if the candidate was not masked.\n */\n public removeFromSet(candidate: HalfEdge): boolean {\n if (!candidate.isMaskSet(this._mask))\n return false;\n this.clearMaskInScope(candidate);\n return true;\n }\n /**\n * * Search the array to find any current set member\n * * If found, clear its mask and return it.\n * * If unmasked HalfEdges are found in the array, they are removed from the array.\n */\n public chooseAndRemoveAny(): HalfEdge | undefined {\n for (; ;) {\n const candidate = this.popAndReturn();\n if (!candidate)\n return undefined;\n if (this.removeFromSet(candidate))\n return candidate;\n }\n }\n /** Set mask on candidate -- i.e. edge, face, vertex, or single half edge as required.\n * * Base class only changes the candidate mask.\n * * Derived classes change more masks around edge, face, or vertex.\n */\n protected abstract setMaskInScope(candidate: HalfEdge | undefined): void;\n\n /** Clear mask on candidate -- i.e. edge, face, vertex, or single half edge as required.\n * * Base class only changes the candidate mask.\n * * Derived classes change more masks around edge, face, or vertex.\n */\n protected abstract clearMaskInScope(candidate: HalfEdge | undefined): void;\n /**\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\n * * This is always 1 for HalfEdgeMarkSet\n * @param candidate\n */\n public abstract countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number;\n /** Create an iterator over member HalfEdges */\n public [Symbol.iterator](): IterableIterator<HalfEdge> { return new IterableHalfEdgeMarkSetIterator(this); }\n /**\n * * visit all half edges around face.\n * * Add each to mark set.\n */\n public addAroundFace(seed: HalfEdge): void {\n let p = seed;\n do {\n this.addToSet(p);\n p = p.faceSuccessor;\n } while (p !== seed);\n }\n\n /**\n * * visit all half edges around vertex.\n * * Add each to mark set.\n */\n public addAroundVertex(seed: HalfEdge): void {\n let p = seed;\n do {\n this.addToSet(p);\n p = p.vertexSuccessor;\n } while (p !== seed);\n }\n}\n\n/**\n * AbstractHalfEdgeGraphMarkSet specialized to manage the masks on individual half edges\n * @internal\n */\nexport class MarkedHalfEdgeSet extends AbstractHalfEdgeGraphMarkSet {\n constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\n super(graph, mask);\n }\n /** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.\n * * Returns undefined if unable to get a mask for the graph.\n * * Undefined return can only happen if the caller is failing to return grabbed masks.\n */\n public static create(graph: HalfEdgeGraph): MarkedHalfEdgeSet | undefined {\n const mask = graph.grabMask();\n if (mask === HalfEdgeMask.NULL_MASK)\n return undefined;\n return new MarkedHalfEdgeSet(graph, mask);\n }\n\n /**\n * * Set mask on candidate's edge.\n * * This overrides the base class implementation.\n */\n protected setMaskInScope(candidate: HalfEdge) {\n candidate.setMask(this._mask);\n }\n\n /**\n * * Clear mask on candidate's edge.\n * * This overrides the base class implementation.\n */\n protected clearMaskInScope(candidate: HalfEdge) {\n candidate.clearMask(this._mask);\n }\n /**\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\n * * This is always 1 for EdgeMarkSet\n * * return 0 for undefined candidate\n * @param candidate\n */\n public countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number {\n if (!candidate)\n return 0;\n return 1;\n }\n}\n\n/**\n * AbstractHalfEdgeGraphMarkSet specialized to manage the mask on both sides of edges.\n * @internal\n */\nexport class MarkedEdgeSet extends AbstractHalfEdgeGraphMarkSet {\n constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\n super(graph, mask);\n }\n /** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.\n * * Returns undefined if unable to get a mask for the graph.\n * * Undefined return can only happen if the caller is failing to return grabbed masks.\n */\n public static create(graph: HalfEdgeGraph): MarkedEdgeSet | undefined {\n const mask = graph.grabMask();\n if (mask === HalfEdgeMask.NULL_MASK)\n return undefined;\n return new MarkedEdgeSet(graph, mask);\n }\n\n /**\n * * Set mask on candidate's edge.\n * * This overrides the base class implementation.\n */\n protected setMaskInScope(candidate: HalfEdge) {\n candidate.setMaskAroundEdge(this._mask);\n }\n\n /**\n * * Clear mask on candidate's edge.\n * * This overrides the base class implementation.\n */\n protected clearMaskInScope(candidate: HalfEdge) {\n candidate.clearMaskAroundEdge(this._mask);\n }\n /**\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\n * * This is always 2 for EdgeMarkSet\n * @param candidate\n */\n public countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number {\n if (!candidate)\n return 0;\n return 2;\n }\n}\n\n/**\n * AbstractHalfEdgeGraphMarkSet specialized to manage the mask around faces\n * @internal\n */\nexport class MarkedFaceSet extends AbstractHalfEdgeGraphMarkSet {\n constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\n super(graph, mask);\n }\n /** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.\n * * Returns undefined if unable to get a mask for the graph.\n * * Undefined return can only happen if the caller is failing to return grabbed masks.\n */\n public static create(graph: HalfEdgeGraph): MarkedFaceSet | undefined {\n const mask = graph.grabMask();\n if (mask === HalfEdgeMask.NULL_MASK)\n return undefined;\n return new MarkedFaceSet(graph, mask);\n }\n\n /**\n * * Set mask on (all nodes around) candidate's face\n * * This overrides the base class implementation.\n */\n protected setMaskInScope(candidate: HalfEdge) {\n candidate.setMaskAroundFace(this._mask);\n }\n\n /**\n * * Clear mask on (all nodes around) candidate's face.\n * * This overrides the base class implementation.\n */\n protected clearMaskInScope(candidate: HalfEdge) {\n candidate.clearMaskAroundFace(this._mask);\n }\n /**\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\n * * This is the \"aroundFace\" count.\n * @param candidate\n */\n public countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number {\n if (!candidate)\n return 0;\n return candidate.countEdgesAroundFace();\n }\n}\n/**\n * AbstractHalfEdgeGraphMarkSet specialized to manage the mask around faces\n * @internal\n */\nexport class MarkedVertexSet extends AbstractHalfEdgeGraphMarkSet {\n constructor(graph: HalfEdgeGraph, mask: HalfEdgeMask) {\n super(graph, mask);\n }\n /** Create a new 'HalfEdgeMarkSet', operating on half edges with only themselves as scope.\n * * Returns undefined if unable to get a mask for the graph.\n * * Undefined return can only happen if the caller is failing to return grabbed masks.\n */\n public static create(graph: HalfEdgeGraph): MarkedVertexSet | undefined {\n const mask = graph.grabMask();\n if (mask === HalfEdgeMask.NULL_MASK)\n return undefined;\n return new MarkedVertexSet(graph, mask);\n }\n\n /**\n * * Set mask on (all nodes around) candidate's face\n * * This overrides the base class implementation.\n */\n protected setMaskInScope(candidate: HalfEdge) {\n candidate.setMaskAroundVertex(this._mask);\n }\n\n /**\n * * Clear mask on (all nodes around) candidate's face.\n * * This overrides the base class implementation.\n */\n protected clearMaskInScope(candidate: HalfEdge) {\n candidate.clearMaskAroundVertex(this._mask);\n }\n /**\n * Return the number of half edges that would be set/cleared when dealing with this candidate.\n * * This is the \"aroundVertex\" count.\n * @param candidate\n */\n public countHalfEdgesAroundCandidate(candidate: HalfEdge | undefined): number {\n if (!candidate)\n return 0;\n return candidate.countEdgesAroundVertex();\n }\n}\n\n/**\n * Class to act as an iterator over points in a markSet.\n * * Internal data is:\n * * pointer to the parent markSet\n * * index of index of the next point to read.\n * * the parent markSet class\n */\nclass IterableHalfEdgeMarkSetIterator implements Iterator<HalfEdge> {\n private _markSet: AbstractHalfEdgeGraphMarkSet;\n private _nextReadIndex: number;\n public constructor(markSet: AbstractHalfEdgeGraphMarkSet) {\n this._markSet = markSet;\n this._nextReadIndex = 0;\n }\n public next(): IteratorResult<HalfEdge> {\n const n = this._markSet.getNumCandidates();\n // Walk over candidates that have been quietly de-masked\n while (this._nextReadIndex < n) {\n const p = this._markSet.getAtIndex(this._nextReadIndex++);\n if (p !== undefined)\n return { done: false, value: p };\n }\n return { done: true, value: undefined } as any as IteratorResult<HalfEdge>;\n }\n\n public [Symbol.iterator](): IterableIterator<HalfEdge> { return this; }\n}\n"]}
|
|
@@ -16,30 +16,37 @@ export declare class NodeXYZUV {
|
|
|
16
16
|
private _z;
|
|
17
17
|
private _u;
|
|
18
18
|
private _v;
|
|
19
|
+
/** Constructor */
|
|
19
20
|
private constructor();
|
|
20
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Set all content directly from args.
|
|
21
23
|
* @returns `this` reference
|
|
22
24
|
*/
|
|
23
25
|
set(node: HalfEdge, x: number, y: number, z: number, u: number, v: number): NodeXYZUV;
|
|
26
|
+
/** Set from `other` */
|
|
24
27
|
setFrom(other: NodeXYZUV): void;
|
|
25
|
-
/**
|
|
26
|
-
*
|
|
27
|
-
* *
|
|
28
|
+
/**
|
|
29
|
+
* Create a `NodeXYZUV` with:
|
|
30
|
+
* * node from the given HalfEdge.
|
|
31
|
+
* * x,y,z as the coordinates of `node`.
|
|
32
|
+
* * u as the xy dot product of vectorA with `ray.direction`, where vectorA is the vector from ray origin to
|
|
33
|
+
* `node` coordinates.
|
|
34
|
+
* * v as the xy cross product of `ray.direction` with vectorA.
|
|
28
35
|
*/
|
|
29
36
|
static createNodeAndRayOrigin(node: HalfEdge, ray: Ray3d, result?: NodeXYZUV): NodeXYZUV;
|
|
30
|
-
/** Create a `NodeXYZUV` with explicit node
|
|
37
|
+
/** Create a `NodeXYZUV` with explicit `node`, xyz, uv. */
|
|
31
38
|
static create(node: HalfEdge, x?: number, y?: number, z?: number, u?: number, v?: number): NodeXYZUV;
|
|
32
39
|
/** Access the node. */
|
|
33
40
|
get node(): HalfEdge;
|
|
34
|
-
/** Access the x coordinate */
|
|
41
|
+
/** Access the x coordinate. */
|
|
35
42
|
get x(): number;
|
|
36
|
-
/** Access the y coordinate */
|
|
43
|
+
/** Access the y coordinate. */
|
|
37
44
|
get y(): number;
|
|
38
|
-
/** Access the z coordinate */
|
|
45
|
+
/** Access the z coordinate. */
|
|
39
46
|
get z(): number;
|
|
40
|
-
/** Access the u coordinate */
|
|
47
|
+
/** Access the u coordinate. */
|
|
41
48
|
get u(): number;
|
|
42
|
-
/** Access the v coordinate */
|
|
49
|
+
/** Access the v coordinate. */
|
|
43
50
|
get v(): number;
|
|
44
51
|
/** Access the x,y,z coordinates as Point3d with optional caller-supplied result. */
|
|
45
52
|
getXYZAsPoint3d(result?: Point3d): Point3d;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgeNodeXYZUV.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgeNodeXYZUV.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC;;GAEG;AACH;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;
|
|
1
|
+
{"version":3,"file":"HalfEdgeNodeXYZUV.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgeNodeXYZUV.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC;;GAEG;AACH;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,kBAAkB;IAClB,OAAO;IAQP;;;OAGG;IACI,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS;IAS5F,uBAAuB;IAChB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAQtC;;;;;;;OAOG;WACW,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS;IAY/F,0DAA0D;WAC5C,MAAM,CAClB,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAE,MAAU,EAAE,CAAC,GAAE,MAAU,EAAE,CAAC,GAAE,MAAU,EAAE,CAAC,GAAE,MAAU,EAAE,CAAC,GAAE,MAAU,GACxF,SAAS;IAGZ,uBAAuB;IACvB,IAAW,IAAI,IAAI,QAAQ,CAE1B;IACD,+BAA+B;IAC/B,IAAW,CAAC,IAAI,MAAM,CAErB;IACD,+BAA+B;IAC/B,IAAW,CAAC,IAAI,MAAM,CAErB;IACD,+BAA+B;IAC/B,IAAW,CAAC,IAAI,MAAM,CAErB;IACD,+BAA+B;IAC/B,IAAW,CAAC,IAAI,MAAM,CAErB;IACD,+BAA+B;IAC/B,IAAW,CAAC,IAAI,MAAM,CAErB;IACD,oFAAoF;IAC7E,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAGjD,iFAAiF;IAC1E,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAGhD,sDAAsD;IAC/C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAMrD,sDAAsD;IAC/C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAMtD"}
|
|
@@ -16,6 +16,7 @@ const Point3dVector3d_1 = require("../geometry3d/Point3dVector3d");
|
|
|
16
16
|
* @internal
|
|
17
17
|
*/
|
|
18
18
|
class NodeXYZUV {
|
|
19
|
+
/** Constructor */
|
|
19
20
|
constructor(node, x, y, z, u, v) {
|
|
20
21
|
this._x = x;
|
|
21
22
|
this._y = y;
|
|
@@ -24,7 +25,8 @@ class NodeXYZUV {
|
|
|
24
25
|
this._v = v;
|
|
25
26
|
this._node = node;
|
|
26
27
|
}
|
|
27
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Set all content directly from args.
|
|
28
30
|
* @returns `this` reference
|
|
29
31
|
*/
|
|
30
32
|
set(node, x, y, z, u, v) {
|
|
@@ -36,6 +38,7 @@ class NodeXYZUV {
|
|
|
36
38
|
this._node = node;
|
|
37
39
|
return this;
|
|
38
40
|
}
|
|
41
|
+
/** Set from `other` */
|
|
39
42
|
setFrom(other) {
|
|
40
43
|
this._x = other.x;
|
|
41
44
|
this._y = other.y;
|
|
@@ -44,9 +47,13 @@ class NodeXYZUV {
|
|
|
44
47
|
this._v = other.v;
|
|
45
48
|
this._node = other.node;
|
|
46
49
|
}
|
|
47
|
-
/**
|
|
48
|
-
*
|
|
49
|
-
* *
|
|
50
|
+
/**
|
|
51
|
+
* Create a `NodeXYZUV` with:
|
|
52
|
+
* * node from the given HalfEdge.
|
|
53
|
+
* * x,y,z as the coordinates of `node`.
|
|
54
|
+
* * u as the xy dot product of vectorA with `ray.direction`, where vectorA is the vector from ray origin to
|
|
55
|
+
* `node` coordinates.
|
|
56
|
+
* * v as the xy cross product of `ray.direction` with vectorA.
|
|
50
57
|
*/
|
|
51
58
|
static createNodeAndRayOrigin(node, ray, result) {
|
|
52
59
|
const x = node.x;
|
|
@@ -60,28 +67,42 @@ class NodeXYZUV {
|
|
|
60
67
|
return result.set(node, x, y, z, u, v);
|
|
61
68
|
return new NodeXYZUV(node, x, y, z, u, v);
|
|
62
69
|
}
|
|
63
|
-
/** Create a `NodeXYZUV` with explicit node
|
|
70
|
+
/** Create a `NodeXYZUV` with explicit `node`, xyz, uv. */
|
|
64
71
|
static create(node, x = 0, y = 0, z = 0, u = 0, v = 0) {
|
|
65
72
|
return new NodeXYZUV(node, x, y, z, u, v);
|
|
66
73
|
}
|
|
67
74
|
/** Access the node. */
|
|
68
|
-
get node() {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
/** Access the
|
|
72
|
-
get
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
/** Access the
|
|
76
|
-
get
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
get node() {
|
|
76
|
+
return this._node;
|
|
77
|
+
}
|
|
78
|
+
/** Access the x coordinate. */
|
|
79
|
+
get x() {
|
|
80
|
+
return this._x;
|
|
81
|
+
}
|
|
82
|
+
/** Access the y coordinate. */
|
|
83
|
+
get y() {
|
|
84
|
+
return this._y;
|
|
85
|
+
}
|
|
86
|
+
/** Access the z coordinate. */
|
|
87
|
+
get z() {
|
|
88
|
+
return this._z;
|
|
89
|
+
}
|
|
90
|
+
/** Access the u coordinate. */
|
|
91
|
+
get u() {
|
|
92
|
+
return this._u;
|
|
93
|
+
}
|
|
94
|
+
/** Access the v coordinate. */
|
|
95
|
+
get v() {
|
|
96
|
+
return this._v;
|
|
97
|
+
}
|
|
79
98
|
/** Access the x,y,z coordinates as Point3d with optional caller-supplied result. */
|
|
80
99
|
getXYZAsPoint3d(result) {
|
|
81
100
|
return Point3dVector3d_1.Point3d.create(this._x, this._y, this._z, result);
|
|
82
101
|
}
|
|
83
102
|
/** Access the uv coordinates as Point2d with optional caller-supplied result. */
|
|
84
|
-
getUVAsPoint2d(result) {
|
|
103
|
+
getUVAsPoint2d(result) {
|
|
104
|
+
return Point2dVector2d_1.Point2d.create(this._u, this._v, result);
|
|
105
|
+
}
|
|
85
106
|
/** Toleranced comparison function for u coordinate */
|
|
86
107
|
classifyU(target, tol) {
|
|
87
108
|
const delta = this.u - target;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgeNodeXYZUV.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgeNodeXYZUV.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,0CAAuC;AACvC,mEAAwD;AACxD,mEAAwD;AAIxD;;GAEG;AACH;;;GAGG;AACH,MAAa,SAAS;
|
|
1
|
+
{"version":3,"file":"HalfEdgeNodeXYZUV.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgeNodeXYZUV.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*--------------------------------------------------------------------------------------------*/\nimport { Geometry } from \"../Geometry\";\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { HalfEdge } from \"./Graph\";\n\n/** @packageDocumentation\n * @module Topology\n */\n/**\n * Reference to a HalfEdge node with extra XYZ and UV data.\n * @internal\n */\nexport class NodeXYZUV {\n private _node: HalfEdge;\n private _x: number;\n private _y: number;\n private _z: number;\n private _u: number;\n private _v: number;\n /** Constructor */\n private constructor(node: HalfEdge, x: number, y: number, z: number, u: number, v: number) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._u = u;\n this._v = v;\n this._node = node;\n }\n /**\n * Set all content directly from args.\n * @returns `this` reference\n */\n public set(node: HalfEdge, x: number, y: number, z: number, u: number, v: number): NodeXYZUV {\n this._x = x;\n this._y = y;\n this._z = z;\n this._u = u;\n this._v = v;\n this._node = node;\n return this;\n }\n /** Set from `other` */\n public setFrom(other: NodeXYZUV): void {\n this._x = other.x;\n this._y = other.y;\n this._z = other.z;\n this._u = other.u;\n this._v = other.v;\n this._node = other.node;\n }\n /**\n * Create a `NodeXYZUV` with:\n * * node from the given HalfEdge.\n * * x,y,z as the coordinates of `node`.\n * * u as the xy dot product of vectorA with `ray.direction`, where vectorA is the vector from ray origin to\n * `node` coordinates.\n * * v as the xy cross product of `ray.direction` with vectorA.\n */\n public static createNodeAndRayOrigin(node: HalfEdge, ray: Ray3d, result?: NodeXYZUV): NodeXYZUV {\n const x = node.x;\n const y = node.y;\n const z = node.z;\n const dx = x - ray.origin.x;\n const dy = y - ray.origin.y;\n const u = Geometry.dotProductXYXY(dx, dy, ray.direction.x, ray.direction.y);\n const v = Geometry.crossProductXYXY(ray.direction.x, ray.direction.y, dx, dy);\n if (result)\n return result.set(node, x, y, z, u, v);\n return new NodeXYZUV(node, x, y, z, u, v);\n }\n /** Create a `NodeXYZUV` with explicit `node`, xyz, uv. */\n public static create(\n node: HalfEdge, x: number = 0, y: number = 0, z: number = 0, u: number = 0, v: number = 0,\n ): NodeXYZUV {\n return new NodeXYZUV(node, x, y, z, u, v);\n }\n /** Access the node. */\n public get node(): HalfEdge {\n return this._node;\n }\n /** Access the x coordinate. */\n public get x(): number {\n return this._x;\n }\n /** Access the y coordinate. */\n public get y(): number {\n return this._y;\n }\n /** Access the z coordinate. */\n public get z(): number {\n return this._z;\n }\n /** Access the u coordinate. */\n public get u(): number {\n return this._u;\n }\n /** Access the v coordinate. */\n public get v(): number {\n return this._v;\n }\n /** Access the x,y,z coordinates as Point3d with optional caller-supplied result. */\n public getXYZAsPoint3d(result?: Point3d): Point3d {\n return Point3d.create(this._x, this._y, this._z, result);\n }\n /** Access the uv coordinates as Point2d with optional caller-supplied result. */\n public getUVAsPoint2d(result?: Point2d): Point2d {\n return Point2d.create(this._u, this._v, result);\n }\n /** Toleranced comparison function for u coordinate */\n public classifyU(target: number, tol: number): number {\n const delta = this.u - target;\n if (Math.abs(delta) <= tol)\n return 0;\n return delta >= 0 ? 1 : -1;\n }\n /** Toleranced comparison function for v coordinate */\n public classifyV(target: number, tol: number): number {\n const delta = target - this._v;\n if (Math.abs(delta) <= tol)\n return 0;\n return delta >= 0 ? 1 : -1;\n }\n}\n"]}
|
|
@@ -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 { Geometry } from \"../Geometry\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { HalfEdge } from \"./Graph\";\r\nimport { NodeXYZUV } from \"./HalfEdgeNodeXYZUV\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nexport enum RayClassification {\r\n RC_NoHits,\r\n RC_TargetOnVertex,\r\n RC_TargetOnEdge,\r\n RC_Bracket,\r\n RC_TargetBefore,\r\n RC_TargetAfter,\r\n}\r\n/* eslint-enable @typescript-eslint/naming-convention */\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 return HalfEdgePositionDetail.create();\r\n }\r\n // From given edge start point\r\n // The edgeHit is reused as the result.\r\n public reAimFromEdge(\r\n edgeHit: HalfEdgePositionDetail,\r\n ray: Ray3d,\r\n targetDistance: number): 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) {\r\n // 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 // The usual case is both 0 i.e. ray is clearly along the edge.\r\n\r\n const alongA = dataA.classifyU(targetDistance, this._tol);\r\n const alongB = dataB.classifyU(targetDistance, this._tol);\r\n if (alongA === 0 && sideA === 0) {\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n result.setITag(1);\r\n } else if (alongB === 0 && sideB === 0) {\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n result.setITag(1);\r\n } else if (alongA * alongB < 0) {\r\n // target is within edge\r\n // (.. This is written for the case where both sideA and sideB are zero.\r\n // If only one is zero, this computes a close edge point but the strong \"on\" conclusion might be wrong)\r\n\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) {\r\n // 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 {\r\n // This shouldn't happen -- maybe as if the initial edge point was not within the edge???\r\n if (Math.abs(dataA.u) < this._tol\r\n && Math.abs(dataA.v) < this._tol\r\n ) {\r\n result = edgeHit.resetAsVertex(dataA.node); // , dataA);\r\n } else if (Math.abs(dataB.u) < this._tol\r\n && Math.abs(dataB.v) < this._tol\r\n ) {\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n } else {\r\n edgeHit.resetAsUnknown();\r\n result = this.panic();\r\n }\r\n }\r\n } else {\r\n // Both vertices are to same side of the line. This can't happen for edge point between nodes.\r\n edgeHit.resetAsUnknown();\r\n result = this.panic();\r\n }\r\n return result;\r\n }\r\n\r\n // From given edge start point, pick vertex or edge side for proceeding along ray.\r\n // RAY IS ASSUMED TO START AT THE VERTEX PRECISELY !!!!\r\n public reAimFromVertex(\r\n searchBase: HalfEdgePositionDetail,\r\n ray: Ray3d,\r\n targetDistance: number): HalfEdgePositionDetail {\r\n const vertexNode = searchBase.node;\r\n let result;\r\n let outboundEdge = vertexNode!;\r\n do {\r\n // DPoint3d xyzBase;\r\n // vu_getDPoint3d(& xyzBase, outboundEdge);\r\n const data0 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.faceSuccessor, ray);\r\n const data1 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.facePredecessor, ray);\r\n const u0 = data0.u;\r\n // double u1 = data1.GetU ();\r\n const v0 = data0.v;\r\n const v1 = data1.v;\r\n if (Math.abs(v0) < this._tol) {\r\n if (Math.abs(u0 - targetDistance) < this._tol) {\r\n // Direct hit at far end\r\n result = searchBase.resetAsVertex(data0.node);\r\n result.setITag(1);\r\n return result;\r\n } else if (u0 > targetDistance) {\r\n // Direct hig within edge\r\n const edgeFraction = targetDistance / u0;\r\n result = searchBase.resetAtEdgeAndFraction(outboundEdge, edgeFraction);\r\n return result;\r\n } else if (Math.abs(u0) <= this._tol) {\r\n // Unexpected direct hit on the base of the search, but call it a hit....\r\n result = searchBase.resetAsVertex(outboundEdge);\r\n result.setITag(1);\r\n return result;\r\n } else if (u0 > this._tol) {\r\n // Advance to vertex ...\r\n // double edgeFraction = targetDistance / u0;\r\n result = searchBase.resetAsVertex(data0.node);\r\n return result;\r\n } else {\r\n // Search direction is exactly opposite this edge.\r\n // See if the other side of the sector is turned even beyond that ...\r\n if (v1 > this._tol) {\r\n result = searchBase.resetAsFace(outboundEdge, outboundEdge);\r\n return result;\r\n }\r\n }\r\n } else if (v0 < -this._tol) {\r\n if (v1 > this._tol) {\r\n // The usual simple entry into an angle < 180\r\n result = searchBase.resetAsFace(outboundEdge, outboundEdge);\r\n return result;\r\n }\r\n }\r\n // NEEDS WORK: angle >= 180 cases !!!!\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 face.\r\n // reset lastBefore and firstAfter describing progress towards target distance on ray.\r\n public reAimAroundFace(\r\n faceNode: HalfEdge,\r\n ray: Ray3d,\r\n targetDistance: number, // !< distance to target point\r\n lastBefore: HalfEdgePositionDetail, // CALLER CREATED -- reset as first hit on negative side of ray.\r\n firstAfter: HalfEdgePositionDetail): RayClassification { // ! CALLER CREATED -- reset as first hit on positive side of ray.\r\n\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 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) {\r\n // Vertex hit ...\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.RC_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) {\r\n // Edge Crossing ...\r\n const edgeFraction = - v0 / (v1 - v0);\r\n const uEdge = Geometry.interpolate(u0, edgeFraction, u1);\r\n const edgeHit = HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);\r\n edgeHit.setDTag(uEdge);\r\n if (Math.abs(uEdge - targetDistance) <= this._tol) {\r\n firstAfter.setFrom(edgeHit);\r\n lastBefore.setFrom(edgeHit);\r\n return RayClassification.RC_TargetOnEdge;\r\n }\r\n if (uEdge > targetDistance && uEdge < firstAfter.getDTag()!) {\r\n firstAfter.setFrom(edgeHit);\r\n firstAfter.setITag(v0 > 0.0 ? -1 : 1);\r\n }\r\n if (uEdge < targetDistance && uEdge > lastBefore.getDTag()!) {\r\n lastBefore.setFrom(edgeHit);\r\n lastBefore.setDTag(uEdge);\r\n }\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 const afterTag = firstAfter.getITag();\r\n firstAfter.setITag(0);\r\n lastBefore.setITag(0);\r\n if (lastBefore.isUnclassified) {\r\n if (firstAfter.isUnclassified)\r\n return RayClassification.RC_NoHits;\r\n return RayClassification.RC_TargetBefore;\r\n }\r\n if (firstAfter.isUnclassified\r\n || (firstAfter.isEdge && afterTag && afterTag < 0)) {\r\n return RayClassification.RC_TargetAfter;\r\n } else {\r\n return RayClassification.RC_Bracket;\r\n }\r\n }\r\n\r\n // Return false if target is reached !!!!\r\n /**\r\n * Set (replace contents) ray with\r\n * * `origin` at start\r\n * * `direction` is unit vector from start towards target\r\n * * `a` is distance from start to target.\r\n * @param start existing position\r\n * @param target target xy coordinates\r\n * @param ray ray to update\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 distanceToTarget = ray.direction.magnitudeXY();\r\n ray.a = ray.direction.magnitude();\r\n ray.direction.scaleInPlace(1 / ray.a);\r\n return distanceToTarget >= this._tol;\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 { Geometry } from \"../Geometry\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { HalfEdge } from \"./Graph\";\nimport { NodeXYZUV } from \"./HalfEdgeNodeXYZUV\";\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport enum RayClassification {\n RC_NoHits,\n RC_TargetOnVertex,\n RC_TargetOnEdge,\n RC_Bracket,\n RC_TargetBefore,\n RC_TargetAfter,\n}\n/* eslint-enable @typescript-eslint/naming-convention */\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 return HalfEdgePositionDetail.create();\n }\n // From given edge start point\n // The edgeHit is reused as the result.\n public reAimFromEdge(\n edgeHit: HalfEdgePositionDetail,\n ray: Ray3d,\n targetDistance: number): 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) {\n // 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 // The usual case is both 0 i.e. ray is clearly along the edge.\n\n const alongA = dataA.classifyU(targetDistance, this._tol);\n const alongB = dataB.classifyU(targetDistance, this._tol);\n if (alongA === 0 && sideA === 0) {\n result = edgeHit.resetAsVertex(dataA.node);\n result.setITag(1);\n } else if (alongB === 0 && sideB === 0) {\n result = edgeHit.resetAsVertex(dataB.node);\n result.setITag(1);\n } else if (alongA * alongB < 0) {\n // target is within edge\n // (.. This is written for the case where both sideA and sideB are zero.\n // If only one is zero, this computes a close edge point but the strong \"on\" conclusion might be wrong)\n\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) {\n // 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 {\n // This shouldn't happen -- maybe as if the initial edge point was not within the edge???\n if (Math.abs(dataA.u) < this._tol\n && Math.abs(dataA.v) < this._tol\n ) {\n result = edgeHit.resetAsVertex(dataA.node); // , dataA);\n } else if (Math.abs(dataB.u) < this._tol\n && Math.abs(dataB.v) < this._tol\n ) {\n result = edgeHit.resetAsVertex(dataB.node);\n } else {\n edgeHit.resetAsUnknown();\n result = this.panic();\n }\n }\n } else {\n // Both vertices are to same side of the line. This can't happen for edge point between nodes.\n edgeHit.resetAsUnknown();\n result = this.panic();\n }\n return result;\n }\n\n // From given edge start point, pick vertex or edge side for proceeding along ray.\n // RAY IS ASSUMED TO START AT THE VERTEX PRECISELY !!!!\n public reAimFromVertex(\n searchBase: HalfEdgePositionDetail,\n ray: Ray3d,\n targetDistance: number): HalfEdgePositionDetail {\n const vertexNode = searchBase.node;\n let result;\n let outboundEdge = vertexNode!;\n do {\n // DPoint3d xyzBase;\n // vu_getDPoint3d(& xyzBase, outboundEdge);\n const data0 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.faceSuccessor, ray);\n const data1 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.facePredecessor, ray);\n const u0 = data0.u;\n // double u1 = data1.GetU ();\n const v0 = data0.v;\n const v1 = data1.v;\n if (Math.abs(v0) < this._tol) {\n if (Math.abs(u0 - targetDistance) < this._tol) {\n // Direct hit at far end\n result = searchBase.resetAsVertex(data0.node);\n result.setITag(1);\n return result;\n } else if (u0 > targetDistance) {\n // Direct hig within edge\n const edgeFraction = targetDistance / u0;\n result = searchBase.resetAtEdgeAndFraction(outboundEdge, edgeFraction);\n return result;\n } else if (Math.abs(u0) <= this._tol) {\n // Unexpected direct hit on the base of the search, but call it a hit....\n result = searchBase.resetAsVertex(outboundEdge);\n result.setITag(1);\n return result;\n } else if (u0 > this._tol) {\n // Advance to vertex ...\n // double edgeFraction = targetDistance / u0;\n result = searchBase.resetAsVertex(data0.node);\n return result;\n } else {\n // Search direction is exactly opposite this edge.\n // See if the other side of the sector is turned even beyond that ...\n if (v1 > this._tol) {\n result = searchBase.resetAsFace(outboundEdge, outboundEdge);\n return result;\n }\n }\n } else if (v0 < -this._tol) {\n if (v1 > this._tol) {\n // The usual simple entry into an angle < 180\n result = searchBase.resetAsFace(outboundEdge, outboundEdge);\n return result;\n }\n }\n // NEEDS WORK: angle >= 180 cases !!!!\n outboundEdge = outboundEdge.vertexSuccessor;\n } while (outboundEdge !== vertexNode);\n return this.panic();\n }\n\n // Visit all edges around face.\n // reset lastBefore and firstAfter describing progress towards target distance on ray.\n public reAimAroundFace(\n faceNode: HalfEdge,\n ray: Ray3d,\n targetDistance: number, // !< distance to target point\n lastBefore: HalfEdgePositionDetail, // CALLER CREATED -- reset as first hit on negative side of ray.\n firstAfter: HalfEdgePositionDetail): RayClassification { // ! CALLER CREATED -- reset as first hit on positive side of ray.\n\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 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) {\n // Vertex hit ...\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.RC_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) {\n // Edge Crossing ...\n const edgeFraction = - v0 / (v1 - v0);\n const uEdge = Geometry.interpolate(u0, edgeFraction, u1);\n const edgeHit = HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);\n edgeHit.setDTag(uEdge);\n if (Math.abs(uEdge - targetDistance) <= this._tol) {\n firstAfter.setFrom(edgeHit);\n lastBefore.setFrom(edgeHit);\n return RayClassification.RC_TargetOnEdge;\n }\n if (uEdge > targetDistance && uEdge < firstAfter.getDTag()!) {\n firstAfter.setFrom(edgeHit);\n firstAfter.setITag(v0 > 0.0 ? -1 : 1);\n }\n if (uEdge < targetDistance && uEdge > lastBefore.getDTag()!) {\n lastBefore.setFrom(edgeHit);\n lastBefore.setDTag(uEdge);\n }\n }\n data0.setFrom(data1);\n node0 = node0.faceSuccessor;\n } while (node0 !== faceNode);\n// Returned to start node !!!\n const afterTag = firstAfter.getITag();\n firstAfter.setITag(0);\n lastBefore.setITag(0);\n if (lastBefore.isUnclassified) {\n if (firstAfter.isUnclassified)\n return RayClassification.RC_NoHits;\n return RayClassification.RC_TargetBefore;\n }\n if (firstAfter.isUnclassified\n || (firstAfter.isEdge && afterTag && afterTag < 0)) {\n return RayClassification.RC_TargetAfter;\n } else {\n return RayClassification.RC_Bracket;\n }\n }\n\n // Return false if target is reached !!!!\n /**\n * Set (replace contents) ray with\n * * `origin` at start\n * * `direction` is unit vector from start towards target\n * * `a` is distance from start to target.\n * @param start existing position\n * @param target target xy coordinates\n * @param ray ray to update\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 distanceToTarget = ray.direction.magnitudeXY();\n ray.a = ray.direction.magnitude();\n ray.direction.scaleInPlace(1 / ray.a);\n return distanceToTarget >= this._tol;\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/**\r\n * Enumeration of categorization of \"where\" a HalfEdgePositionDetail is sitting in the graph.\r\n */\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 /** 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\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 /** Constructor.\r\n * * The point is CAPTURED. (static `create` methods normally clone their inputs.)\r\n */\r\n private constructor(node: HalfEdge | undefined, x: number, y: number, z: number, topo: HalfEdgeTopo, edgeFraction?: number, iTag?: number, dTag?: number, isExteriorTarget?: boolean) {\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\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 { return this._iTag; }\r\n public setITag(value: number): void { this._iTag = value; }\r\n\r\n public getDTag(): number | undefined { return this._dTag; }\r\n public setDTag(value: number): void { this._dTag = value; }\r\n public getTopo(): HalfEdgeTopo { 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\r\n /** reassign contents so this instance has dTag but no node or HalfEdgeTopo\r\n */\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\r\n /** Mark as \"HalfEdgeTopo.Vertex\"\r\n */\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 /**\r\n * Return the (possibly undefined) edge fraction.\r\n */\r\n public get edgeFraction(): number | undefined {\r\n return this._edgeFraction;\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\r\n /** Return true if this detail is marked as being within a face. */\r\n public get isFace(): boolean { return this._topo === HalfEdgeTopo.Face; }\r\n /** Return true if this detail is marked as being within an edge. */\r\n public get isEdge(): boolean { return this._topo === HalfEdgeTopo.Edge; }\r\n /** Return true if this detail is marked as being at a vertex. */\r\n public get isVertex(): boolean { return this._topo === HalfEdgeTopo.Vertex; }\r\n /** Return true if this detail has no vertex, edge, or face qualifier. */\r\n public get isUnclassified(): boolean { return this._topo === HalfEdgeTopo.None; }\r\n\r\n /** Return the node reference from this detail */\r\n public get node(): HalfEdge | undefined { return this._node; }\r\n /** Return the (clone of, or optional filled in result) coordinates from this detail. */\r\n public clonePoint(result?: Point3d): Point3d { 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\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}\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/**\n * Enumeration of categorization of \"where\" a HalfEdgePositionDetail is sitting in the graph.\n */\nexport enum HalfEdgeTopo {\n /** No known position */\n None = 0,\n /** Sitting at a vertex, reached by a ray in this sector */\n Vertex = 1,\n /** Sitting on an edge */\n Edge = 2,\n /** Face point (before hitting barrier edge) */\n Face = 3,\n /** Exterior point (after hitting barrier edge at fraction)\n * Fraction is 0 if exterior point \"in sweep around exterior corner\"\n */\n ExteriorFace\n}\n/**\n * Description of a generalized position within a graph, categorized as:\n * * \"at a certain node around a vertex\"\n * * \"at a fractional position along an edge\n * * \"within a face\"\n */\nexport class HalfEdgePositionDetail {\n /** the relevant node */\n private _node?: HalfEdge;\n /** The current coordinates */\n public x: number;\n public y: number;\n public z: number;\n /** fractional position along edge. Only defined if the topo tag is `HalfEdgeTopo.Edge` */\n private _edgeFraction?: number;\n /** Enumeration of status vertex, edge, or face status. */\n private _topo: HalfEdgeTopo;\n /** first data tag */\n private _iTag?: number;\n /** second data tag */\n private _dTag?: number;\n /** Special case for point on edge or vertex but target beyond and exterior. */\n private _isExteriorTarget?: boolean;\n /** Constructor.\n * * The point is CAPTURED. (static `create` methods normally clone their inputs.)\n */\n private constructor(node: HalfEdge | undefined, x: number, y: number, z: number, topo: HalfEdgeTopo, edgeFraction?: number, iTag?: number, dTag?: number, isExteriorTarget?: boolean) {\n this._node = node;\n this.x = x; this.y = y; this.z = z;\n this._topo = topo;\n this._edgeFraction = edgeFraction;\n this._iTag = iTag;\n this._dTag = dTag;\n this._isExteriorTarget = isExteriorTarget;\n }\n\n /** Copy (clones of) all data from other */\n public setFrom(other: HalfEdgePositionDetail) {\n this._node = other._node;\n this.x = other.x;\n this.y = other.y;\n this.z = other.z;\n this._topo = other._topo;\n this._edgeFraction = other._edgeFraction;\n this._iTag = other._iTag;\n this._dTag = other._dTag;\n }\n /** reset to null topo state. */\n public resetAsUnknown() {\n this._node = undefined;\n this._topo = HalfEdgeTopo.None;\n }\n /** Create with null data. */\n public static create(): HalfEdgePositionDetail {\n const detail = new HalfEdgePositionDetail(undefined, 0, 0, 0, HalfEdgeTopo.None);\n return detail;\n }\n public getITag(): number | undefined { return this._iTag; }\n public setITag(value: number): void { this._iTag = value; }\n\n public getDTag(): number | undefined { return this._dTag; }\n public setDTag(value: number): void { this._dTag = value; }\n public getTopo(): HalfEdgeTopo { return this._topo; }\n\n /** Create with node, fraction along edge, marked as \"HalfEdgeTopo.Edge\". Compute interpolated xyz on the edge */\n public static createEdgeAtFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\n const node1 = node.faceSuccessor;\n const x = Geometry.interpolate(node.x, edgeFraction, node1.x);\n const y = Geometry.interpolate(node.y, edgeFraction, node1.y);\n const z = Geometry.interpolate(node.z, edgeFraction, node1.z);\n return new HalfEdgePositionDetail(node, x, y, z, HalfEdgeTopo.Edge, edgeFraction);\n }\n\n /** reassign contents so this instance becomes a face hit.\n * @param node new node value. If missing, current node is left unchanged.\n * @param xyz new coordinates. if missing, current coordinates are left unchanged.\n */\n public resetAsFace(node?: HalfEdge, xyz?: XYAndZ): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Face;\n if (node)\n this._node = node;\n if (xyz) {\n this.x = xyz.x;\n this.y = xyz.y;\n this.z = xyz.z;\n }\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** reassign contents so this instance has dTag but no node or HalfEdgeTopo\n */\n public resetAsUndefinedWithTag(dTag: number): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.None;\n this._dTag = 0;\n this._iTag = 0;\n this._dTag = dTag;\n this._node = undefined;\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** reassign contents so this instance becomes an edge hit\n * @param node new node value.\n * @param edgeFraction new edge fraction. xyz is recomputed from this edge and its face successor.\n */\n public resetAtEdgeAndFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Edge;\n this._node = node;\n const nodeB = node.faceSuccessor;\n this._edgeFraction = edgeFraction;\n this.x = Geometry.interpolate(node.x, edgeFraction, nodeB.x);\n this.y = Geometry.interpolate(node.y, edgeFraction, nodeB.y);\n this.z = Geometry.interpolate(node.z, edgeFraction, nodeB.z);\n this._isExteriorTarget = undefined;\n return this;\n }\n\n /** Create at a node.\n * * Take xyz from the node.\n */\n public static createVertex(node: HalfEdge): HalfEdgePositionDetail {\n return new HalfEdgePositionDetail(node, node.x, node.y, node.z, HalfEdgeTopo.Vertex);\n }\n\n /** Mark as \"HalfEdgeTopo.Vertex\"\n */\n public resetAsVertex(node: HalfEdge): HalfEdgePositionDetail {\n this._topo = HalfEdgeTopo.Vertex;\n this._node = node;\n this._edgeFraction = 0.0;\n this.setXYZFromNode(node);\n this._isExteriorTarget = undefined;\n return this;\n }\n /** Set the flag for an exterior relationship to target. */\n public setIsExteriorTarget(isExterior: boolean | undefined) {\n this._isExteriorTarget = isExterior;\n }\n /** Copy x,y,z from the node to this instance local values. */\n public setXYZFromNode(node: HalfEdge) {\n this.x = node.x;\n this.y = node.y;\n this.z = node.z;\n }\n /**\n * Return the (possibly undefined) edge fraction.\n */\n public get edgeFraction(): number | undefined {\n return this._edgeFraction;\n }\n /** property access for the flag for an exterior relationship to target.\n * * undefined flag is returned as false.\n */\n public get isExteriorTarget(): boolean {\n return this._isExteriorTarget !== undefined ? this._isExteriorTarget : false;\n }\n\n /** Return true if this detail is marked as being within a face. */\n public get isFace(): boolean { return this._topo === HalfEdgeTopo.Face; }\n /** Return true if this detail is marked as being within an edge. */\n public get isEdge(): boolean { return this._topo === HalfEdgeTopo.Edge; }\n /** Return true if this detail is marked as being at a vertex. */\n public get isVertex(): boolean { return this._topo === HalfEdgeTopo.Vertex; }\n /** Return true if this detail has no vertex, edge, or face qualifier. */\n public get isUnclassified(): boolean { return this._topo === HalfEdgeTopo.None; }\n\n /** Return the node reference from this detail */\n public get node(): HalfEdge | undefined { return this._node; }\n /** Return the (clone of, or optional filled in result) coordinates from this detail. */\n public clonePoint(result?: Point3d): Point3d { return Point3d.create(this.x, this.y, this.z, result); }\n\n /*\n // If candidateKey is less than resultKey, replace resultPos and resultKey\n // by the candidate data.\n public updateMinimizer(\n HalfEdgePositionDetail & resultPos, number & resultKey,\n : HalfEdgePositionDetail & candidatePos, candidateKey: number\n ): boolean {\n if (candidateKey < resultKey) {\n resultKey = candidateKey;\n resultPos = candidatePos;\n return true;\n }\n return false;\n }\n */\n\n public isAtXY(x: number, y: number): boolean {\n return this._topo !== HalfEdgeTopo.None && Geometry.isSameCoordinate(this.x, x) && Geometry.isSameCoordinate(this.y, y);\n\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePriorityQueue.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePriorityQueue.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AACH,sDAAuE;AAEvE,uCAA6C;AAE7C;;;;;;;;GAQG;AACH,MAAa,qCAAqC;IAGhD,YACE,UAAuC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,0BAAgB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,aAAa,GAAG,IAAI,4BAAa,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;YACT,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAG,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACzB;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;YAC1B,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;gBACX,+BAA+B;gBAC/B,IAAI,OAAO,GAAG,CAAC;oBACb,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,OAAO,EAAE,CAAC;aACX;iBAAM;gBACL,mBAAmB;aACpB;SACF;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC;IACpC,CAAC;CACF;AAlDD,sFAkDC","sourcesContent":["/*---------------------------------------------------------------------------------------------\
|
|
1
|
+
{"version":3,"file":"HalfEdgePriorityQueue.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePriorityQueue.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AACH,sDAAuE;AAEvE,uCAA6C;AAE7C;;;;;;;;GAQG;AACH,MAAa,qCAAqC;IAGhD,YACE,UAAuC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,0BAAgB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,aAAa,GAAG,IAAI,4BAAa,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;YACT,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAG,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACzB;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;YAC1B,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;gBACX,+BAA+B;gBAC/B,IAAI,OAAO,GAAG,CAAC;oBACb,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,OAAO,EAAE,CAAC;aACX;iBAAM;gBACL,mBAAmB;aACpB;SACF;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC;IACpC,CAAC;CACF;AAlDD,sFAkDC","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 { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\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 * 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)\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 */\r\nexport class InsertAndRetriangulateContext {\r\n private _graph: HalfEdgeGraph;\r\n private _edgeSet: MarkedEdgeSet;\r\n private _searcher: HalfEdgePositionDetail;\r\n // Temporaries used in reAimFromFace\r\n // private _lastBefore: HalfEdgePositionDetail;\r\n // private _firstAfter: HalfEdgePositionDetail;\r\n\r\n private constructor(graph: HalfEdgeGraph) {\r\n this._graph = graph;\r\n this._edgeSet = MarkedEdgeSet.create(graph)!;\r\n this._searcher = HalfEdgePositionDetail.create();\r\n // this._lastBefore = HalfEdgePositionDetail.create();\r\n // this._firstAfter = HalfEdgePositionDetail.create();\r\n }\r\n /** Create a new context referencing the graph. */\r\n public static create(graph: HalfEdgeGraph) {\r\n return new InsertAndRetriangulateContext(graph);\r\n }\r\n /** Query the (pointer to) the graph in the context. */\r\n public get graph(): HalfEdgeGraph { return this._graph; }\r\n // Walk face from edgeNode; insert new edges back to start node from all except\r\n // immediate successor and predecessor.\r\n // insert all new nodes, and nodes of the existing face, in edgeSet.\r\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\r\n const numNode = centralNode.countEdgesAroundFace();\r\n this._edgeSet.addAroundFace(centralNode);\r\n if (numNode < 4 || centralNode.signedFaceArea() <= 0.0)\r\n return;\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\r\n /** Return a (reference to!) the current position in the graph */\r\n public get currentPosition() { return this._searcher; }\r\n /**\r\n * Linear search through the graph\r\n * * Returns a HalfEdgePositionDetail for the nearest edge or vertex.\r\n * @param xyz\r\n */\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 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 public resetSearch(xyz: Point3d, maxDim: number) {\r\n if (maxDim > 0)\r\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\r\n else\r\n this._searcher = this.searchForNearestVertex(xyz);\r\n }\r\n public insertAndRetriangulate(xyz: Point3d, newZWins: boolean): boolean {\r\n this.moveToPoint(this._searcher, xyz);\r\n const seedNode = this._searcher.node;\r\n let stat = false;\r\n if (seedNode === undefined) {\r\n } else if (this._searcher.isFace) {\r\n if (!seedNode.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const newInteriorNode = this._graph.createEdgeXYZHalfEdge(xyz.x, xyz.y, xyz.z, 0, seedNode, 0);\r\n this.retriangulateFromBaseVertex(newInteriorNode);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newInteriorNode);\r\n }\r\n stat = true;\r\n } else if (this._searcher.isEdge) {\r\n const newA = this._graph.splitEdgeAtFraction(seedNode, this._searcher.edgeFraction!);\r\n const newB = newA.vertexPredecessor;\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 stat = true;\r\n } else if (this._searcher.isVertex) {\r\n // There's already a vertex there. Maybe the z is different.\r\n if (newZWins)\r\n seedNode.setXYZAroundVertex(xyz.x, xyz.y, xyz.z);\r\n stat = true;\r\n } else {\r\n stat = false;\r\n }\r\n return stat;\r\n }\r\n\r\n // Advance movingPosition to a face, edge, or vertex position detail that contains xyz.\r\n // Prior content in movingPosition is used as seed.\r\n // Return true if successful.\r\n public moveToPoint(movingPosition: HalfEdgePositionDetail, xyz: Point3d, announcer?: (position: HalfEdgePositionDetail) => boolean): boolean {\r\n const psc = PointSearchContext.create();\r\n movingPosition.setITag(0);\r\n if (movingPosition.isUnclassified) {\r\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, 0);\r\n if (movingPosition.isUnclassified)\r\n return false;\r\n }\r\n let trap = 0;\r\n // double tol = vu_getMergeTol (pGraph);\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, xyz, 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.RC_NoHits: {\r\n movingPosition.resetAsUnknown();\r\n break;\r\n }\r\n case RayClassification.RC_TargetOnVertex: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_TargetOnEdge: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_Bracket: {\r\n movingPosition.resetAsFace(lastBefore.node, xyz);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_TargetBefore: {\r\n movingPosition.resetAsFace(movingPosition.node, xyz);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_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(xyz.x, xyz.y))\r\n return true;\r\n if (trap > 1) {\r\n // Ugh. We exited the loop by repeatedly hitting the same node\r\n // with edge or vertex type in lastBefore.\r\n // This happens only when the target point is exterior.\r\n // (Heavy triangulation use cases start with a convex hull and only do interior intersections,\r\n // so case only happens in contrived unit tests.... so far ...)\r\n // What to mark?\r\n // Leave it as is, but mark as exterior target\r\n //\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}\r\n// Create a VuPositionDetail for specified fraction along any unmasked edge.\r\nfunction moveToAnyUnmaskedEdge(graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask): 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 { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { SmallSystem } from \"../numerics/Polynomials\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\nimport { Triangulator } from \"./Triangulation\";\n\n/**\n * Context for repeated insertion of new points in a graph.\n * * Initial graph should have clean outer boundary. (e.g. as typically marked with HalfEdgeMask.EXTERIOR)\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\n * can reuse that position as start for walking to the new point.\n */\nexport class InsertAndRetriangulateContext {\n private _graph: HalfEdgeGraph;\n private _edgeSet: MarkedEdgeSet;\n private _searcher: HalfEdgePositionDetail;\n // Temporaries used in reAimFromFace\n // private _lastBefore: HalfEdgePositionDetail;\n // private _firstAfter: HalfEdgePositionDetail;\n\n private constructor(graph: HalfEdgeGraph) {\n this._graph = graph;\n this._edgeSet = MarkedEdgeSet.create(graph)!;\n this._searcher = HalfEdgePositionDetail.create();\n // this._lastBefore = HalfEdgePositionDetail.create();\n // this._firstAfter = HalfEdgePositionDetail.create();\n }\n /** Create a new context referencing the graph. */\n public static create(graph: HalfEdgeGraph) {\n return new InsertAndRetriangulateContext(graph);\n }\n /** Query the (pointer to) the graph in the context. */\n public get graph(): HalfEdgeGraph { return this._graph; }\n // Walk face from edgeNode; insert new edges back to start node from all except\n // immediate successor and predecessor.\n // insert all new nodes, and nodes of the existing face, in edgeSet.\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\n const numNode = centralNode.countEdgesAroundFace();\n this._edgeSet.addAroundFace(centralNode);\n if (numNode < 4 || centralNode.signedFaceArea() <= 0.0)\n return;\n const numEdge = numNode - 3;\n let farNode = centralNode.faceSuccessor;\n let nearNode = centralNode;\n for (let i = 0; i < numEdge; i++) {\n farNode = farNode.faceSuccessor;\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\n farNode = nearNode.faceSuccessor;\n this._edgeSet.addToSet(nearNode);\n }\n }\n /** Reset the \"current\" position to unknown state. */\n public reset() {\n this._searcher = HalfEdgePositionDetail.create();\n }\n\n /** Return a (reference to!) the current position in the graph */\n public get currentPosition() { return this._searcher; }\n /**\n * Linear search through the graph\n * * Returns a HalfEdgePositionDetail for the nearest edge or vertex.\n * @param xyz\n */\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\n const position = HalfEdgePositionDetail.create();\n position.setDTag(Number.MAX_VALUE);\n const xyzC = Point3d.create();\n let fractionC;\n let distanceC;\n for (const nodeA of this._graph.allHalfEdges) {\n const nodeB = nodeA.faceSuccessor;\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\n if (fractionC !== undefined) {\n if (fractionC > 1.0) {\n distanceC = xyz.distanceXY(nodeB);\n if (distanceC < position.getDTag()!) {\n position.resetAsVertex(nodeB);\n position.setDTag(distanceC);\n }\n } else if (fractionC < 0.0) {\n distanceC = xyz.distanceXY(nodeA);\n if (distanceC < position.getDTag()!) {\n position.resetAsVertex(nodeA);\n position.setDTag(distanceC);\n }\n } else {\n nodeA.fractionToPoint3d(fractionC, xyzC);\n\n distanceC = xyz.distanceXY(xyzC);\n if (distanceC < position.getDTag()!) {\n position.resetAtEdgeAndFraction(nodeA, fractionC);\n }\n }\n }\n }\n return position;\n }\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\n const position = HalfEdgePositionDetail.create();\n position.setDTag(Number.MAX_VALUE);\n let distanceA;\n for (const nodeA of this._graph.allHalfEdges) {\n distanceA = xyz.distanceXY(nodeA);\n if (distanceA < position.getDTag()!) {\n position.resetAsVertex(nodeA);\n position.setDTag(distanceA);\n }\n }\n return position;\n }\n\n public resetSearch(xyz: Point3d, maxDim: number) {\n if (maxDim > 0)\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\n else\n this._searcher = this.searchForNearestVertex(xyz);\n }\n public insertAndRetriangulate(xyz: Point3d, newZWins: boolean): boolean {\n this.moveToPoint(this._searcher, xyz);\n const seedNode = this._searcher.node;\n let stat = false;\n if (seedNode === undefined) {\n } else if (this._searcher.isFace) {\n if (!seedNode.isMaskSet(HalfEdgeMask.EXTERIOR)) {\n const newInteriorNode = this._graph.createEdgeXYZHalfEdge(xyz.x, xyz.y, xyz.z, 0, seedNode, 0);\n this.retriangulateFromBaseVertex(newInteriorNode);\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\n this._searcher.resetAsVertex(newInteriorNode);\n }\n stat = true;\n } else if (this._searcher.isEdge) {\n const newA = this._graph.splitEdgeAtFraction(seedNode, this._searcher.edgeFraction!);\n const newB = newA.vertexPredecessor;\n this.retriangulateFromBaseVertex(newA);\n this.retriangulateFromBaseVertex(newB);\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\n this._searcher.resetAsVertex(newA);\n stat = true;\n } else if (this._searcher.isVertex) {\n // There's already a vertex there. Maybe the z is different.\n if (newZWins)\n seedNode.setXYZAroundVertex(xyz.x, xyz.y, xyz.z);\n stat = true;\n } else {\n stat = false;\n }\n return stat;\n }\n\n // Advance movingPosition to a face, edge, or vertex position detail that contains xyz.\n // Prior content in movingPosition is used as seed.\n // Return true if successful.\n public moveToPoint(movingPosition: HalfEdgePositionDetail, xyz: Point3d, announcer?: (position: HalfEdgePositionDetail) => boolean): boolean {\n const psc = PointSearchContext.create();\n movingPosition.setITag(0);\n if (movingPosition.isUnclassified) {\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, 0);\n if (movingPosition.isUnclassified)\n return false;\n }\n let trap = 0;\n // double tol = vu_getMergeTol (pGraph);\n const ray = Ray3d.createXAxis();\n for (; movingPosition.getITag() === 0 && trap < 2;) {\n if (announcer !== undefined) {\n const continueSearch = announcer(movingPosition);\n if (!continueSearch)\n break;\n }\n if (!psc.setSearchRay(movingPosition, xyz, ray)) {\n return false;\n } else if (movingPosition.isFace) {\n const lastBefore = HalfEdgePositionDetail.create();\n const firstAfter = HalfEdgePositionDetail.create();\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\n // reAimAroundFace returns lots of cases in `lastBefore` !!\n switch (rc) {\n case RayClassification.RC_NoHits: {\n movingPosition.resetAsUnknown();\n break;\n }\n case RayClassification.RC_TargetOnVertex: {\n movingPosition.setFrom(lastBefore);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetOnEdge: {\n movingPosition.setFrom(lastBefore);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_Bracket: {\n movingPosition.resetAsFace(lastBefore.node, xyz);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetBefore: {\n movingPosition.resetAsFace(movingPosition.node, xyz);\n movingPosition.setITag(1);\n break;\n }\n case RayClassification.RC_TargetAfter: {\n if (movingPosition.node === lastBefore.node\n && movingPosition.isFace\n && (lastBefore.isEdge || lastBefore.isVertex)){\n trap++;\n } else {\n trap = 0;\n }\n movingPosition.setFrom(lastBefore);\n break;\n }\n }\n } else if (movingPosition.isEdge) {\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\n if (movingPosition.isUnclassified)\n break;\n } else if (movingPosition.isVertex) {\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\n if (movingPosition.isUnclassified)\n break;\n }\n }\n if (movingPosition.isAtXY(xyz.x, xyz.y))\n return true;\n if (trap > 1) {\n // Ugh. We exited the loop by repeatedly hitting the same node\n // with edge or vertex type in lastBefore.\n // This happens only when the target point is exterior.\n // (Heavy triangulation use cases start with a convex hull and only do interior intersections,\n // so case only happens in contrived unit tests.... so far ...)\n // What to mark?\n // Leave it as is, but mark as exterior target\n //\n if (movingPosition.node !== undefined) {\n movingPosition.setIsExteriorTarget(true);\n }\n return false;\n }\n // Murky here ... should never be hit. Has never been hit in unit tests.\n return false;\n }\n\n}\n// Create a VuPositionDetail for specified fraction along any unmasked edge.\nfunction moveToAnyUnmaskedEdge(graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask): boolean {\n for (const candidate of graph.allHalfEdges) {\n if (!candidate.isMaskSet(skipMask)) {\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\n return true;\n }\n }\n return false;\n}\n"]}
|