@itwin/core-geometry 4.9.0-dev.8 → 4.10.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -1
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.d.ts +57 -46
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +73 -53
- 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.d.ts +141 -38
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +219 -31
- 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.d.ts +11 -6
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +12 -10
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +2 -1
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +2 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.d.ts +11 -9
- package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurve.js +11 -9
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.d.ts +4 -3
- package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +4 -3
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +19 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +39 -0
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.d.ts +4 -4
- package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
- package/lib/cjs/curve/CurveOps.js +6 -6
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +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.d.ts +7 -5
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +8 -6
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.d.ts.map +1 -1
- package/lib/cjs/curve/Loop.js +6 -6
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.d.ts +1 -1
- package/lib/cjs/curve/OffsetOptions.js +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.d.ts.map +1 -1
- package/lib/cjs/curve/Path.js +5 -6
- 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.d.ts.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -4
- 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.d.ts +4 -3
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +4 -3
- 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.d.ts +23 -7
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +22 -8
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +127 -52
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js +1000 -0
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +11 -8
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js +7 -4
- 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.d.ts +18 -5
- package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Angle.js +23 -7
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +14 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +47 -12
- 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.d.ts +2 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +12 -10
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js +1 -7
- 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.d.ts +6 -4
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +6 -4
- 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.d.ts +5 -5
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +5 -5
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.d.ts +6 -5
- package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js +11 -10
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +4 -4
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +7 -11
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +3 -3
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +6 -1
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js +9 -3
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +1 -1
- package/lib/cjs/geometry3d/Transform.js +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.d.ts +3 -3
- package/lib/cjs/numerics/Newton.d.ts.map +1 -1
- package/lib/cjs/numerics/Newton.js +14 -16
- 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.d.ts +2 -2
- package/lib/cjs/numerics/Polynomials.js +2 -2
- 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.d.ts +7 -4
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +11 -6
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.d.ts +13 -10
- package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js +17 -14
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +11 -14
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +59 -52
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
- package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js +2 -2
- 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.d.ts.map +1 -1
- package/lib/cjs/solid/SweepContour.js +0 -4
- 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 +1 -1
- package/lib/cjs/topology/Graph.js +2 -2
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +168 -127
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.d.ts +35 -35
- package/lib/cjs/topology/HalfEdgePositionDetail.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js +63 -41
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts +64 -12
- package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js +174 -75
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/Merging.d.ts +2 -2
- package/lib/cjs/topology/Merging.js +2 -2
- 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.d.ts +16 -10
- package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
- package/lib/cjs/topology/Triangulation.js +23 -30
- 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.d.ts +57 -46
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +73 -53
- 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.d.ts +141 -38
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +217 -30
- 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.d.ts +11 -6
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +12 -10
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +2 -1
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +2 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.d.ts +11 -9
- package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurve.js +11 -9
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts +4 -3
- package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
- package/lib/esm/curve/CurveFactory.js +4 -3
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +19 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +39 -0
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.d.ts +4 -4
- package/lib/esm/curve/CurveOps.d.ts.map +1 -1
- package/lib/esm/curve/CurveOps.js +6 -6
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +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.d.ts +7 -5
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +8 -6
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.d.ts.map +1 -1
- package/lib/esm/curve/Loop.js +6 -6
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.d.ts +1 -1
- package/lib/esm/curve/OffsetOptions.js +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.d.ts.map +1 -1
- package/lib/esm/curve/Path.js +5 -6
- 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.d.ts.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -4
- 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.d.ts +4 -3
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +4 -3
- 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.d.ts +23 -7
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +22 -8
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +127 -52
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js +995 -0
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +11 -8
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js +7 -4
- 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.d.ts +18 -5
- package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
- package/lib/esm/geometry3d/Angle.js +23 -7
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +14 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +47 -12
- 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.d.ts +2 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +12 -10
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js +1 -7
- 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.d.ts +6 -4
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +6 -4
- 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.d.ts +5 -5
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +5 -5
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.d.ts +6 -5
- package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js +11 -10
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +4 -4
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +7 -11
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +3 -3
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +6 -1
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js +9 -3
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/Segment1d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +1 -1
- package/lib/esm/geometry3d/Transform.js +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.d.ts +3 -3
- package/lib/esm/numerics/Newton.d.ts.map +1 -1
- package/lib/esm/numerics/Newton.js +14 -16
- 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.d.ts +2 -2
- package/lib/esm/numerics/Polynomials.js +2 -2
- 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.d.ts +7 -4
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +11 -6
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.d.ts +13 -10
- package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js +17 -14
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +11 -14
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +59 -52
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeLengthData.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
- package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js +2 -2
- 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.d.ts.map +1 -1
- package/lib/esm/solid/SweepContour.js +0 -4
- 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 +1 -1
- package/lib/esm/topology/Graph.js +2 -2
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
- package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js +168 -127
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.d.ts +35 -35
- package/lib/esm/topology/HalfEdgePositionDetail.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js +63 -41
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.d.ts +64 -12
- package/lib/esm/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js +173 -74
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/Merging.d.ts +2 -2
- package/lib/esm/topology/Merging.js +2 -2
- 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.d.ts +16 -10
- package/lib/esm/topology/Triangulation.d.ts.map +1 -1
- package/lib/esm/topology/Triangulation.js +24 -31
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -2,32 +2,74 @@ import { Point3d } from "../geometry3d/Point3dVector3d";
|
|
|
2
2
|
import { Ray3d } from "../geometry3d/Ray3d";
|
|
3
3
|
import { HalfEdge } from "./Graph";
|
|
4
4
|
import { HalfEdgePositionDetail } from "./HalfEdgePositionDetail";
|
|
5
|
+
/**
|
|
6
|
+
* Return code from [PointSearchContext.reAimAroundFace]
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
5
9
|
export declare enum RayClassification {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
NoHits = 0,
|
|
11
|
+
TargetOnVertex = 1,
|
|
12
|
+
TargetOnEdge = 2,
|
|
13
|
+
Bracket = 3,
|
|
14
|
+
TargetBefore = 4,
|
|
15
|
+
TargetAfter = 5
|
|
12
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Context for searching for the location of an xy-point in a graph.
|
|
19
|
+
* * Assumptions: interior faces of the graph are convex, no edge has length less than `tol`.
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
13
22
|
export declare class PointSearchContext {
|
|
14
23
|
private _tol;
|
|
15
24
|
private constructor();
|
|
16
25
|
static create(tol?: number): PointSearchContext;
|
|
17
26
|
private panic;
|
|
27
|
+
/**
|
|
28
|
+
* Reposition `edgeHit` to an adjacent face or vertex, or another position on the edge, that is closer to the
|
|
29
|
+
* target point.
|
|
30
|
+
* @param edgeHit start position on a graph edge, updated and returned.
|
|
31
|
+
* @param ray the ray to the target point. Origin is assumed to lie on the edge.
|
|
32
|
+
* @param targetDistance distance along the ray to the target point.
|
|
33
|
+
* @return detail closer to the target point.
|
|
34
|
+
*/
|
|
18
35
|
reAimFromEdge(edgeHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number): HalfEdgePositionDetail;
|
|
19
|
-
reAimFromVertex(searchBase: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number): HalfEdgePositionDetail;
|
|
20
|
-
reAimAroundFace(faceNode: HalfEdge, ray: Ray3d, targetDistance: number, // !< distance to target point
|
|
21
|
-
lastBefore: HalfEdgePositionDetail, // CALLER CREATED -- reset as first hit on negative side of ray.
|
|
22
|
-
firstAfter: HalfEdgePositionDetail): RayClassification;
|
|
23
36
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
37
|
+
* Reposition `vertexHit` to an adjacent face, edge, or vertex hit that is closer to the target point.
|
|
38
|
+
* @param vertexHit start position at a graph vertex, updated and returned.
|
|
39
|
+
* @param ray the ray to the target point, assumed to start exactly at the vertex.
|
|
40
|
+
* @param targetDistance distance along the ray to the target point.
|
|
41
|
+
* @return detail closer to the target point.
|
|
42
|
+
*/
|
|
43
|
+
reAimFromVertex(vertexHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number): HalfEdgePositionDetail;
|
|
44
|
+
/**
|
|
45
|
+
* Visit all edges around the face, updating `lastBefore` and `firstAfter` to ray-edge intersections that
|
|
46
|
+
* lie directly before and/or after the target point on the ray, if at all.
|
|
47
|
+
* @param faceNode starting node on a graph face.
|
|
48
|
+
* @param ray the ray to the target point.
|
|
49
|
+
* @param targetDistance distance along the ray to the target point.
|
|
50
|
+
* @param lastBefore the detail to reset as the last hit on the ray before the target point (CALLER CREATED).
|
|
51
|
+
* @param firstAfter the detail to reset as the first hit on the ray after the target point (CALLER CREATED).
|
|
52
|
+
* @returns summary of the updated details:
|
|
53
|
+
* * [[RayClassification.TargetOnVertex]] - target lies at a vertex of the face (details are identical).
|
|
54
|
+
* * [[RayClassification.TargetOnEdge]] - target lies on an edge of the face (details are identical).
|
|
55
|
+
* * [[RayClassification.TargetBefore]] - target lies before the face; the ray intersects the face beyond
|
|
56
|
+
* the target point.
|
|
57
|
+
* * [[RayClassification.TargetAfter]] - target lies after the face; the ray intersects the face before
|
|
58
|
+
* the target point.
|
|
59
|
+
* * [[RayClassification.Bracket]] - target lies between intersections of the ray and the face; if the face
|
|
60
|
+
* is convex, this means the target lies inside the face.
|
|
61
|
+
* * [[RayClassification.NoHits]] - the face does not intersect the ray.
|
|
62
|
+
*/
|
|
63
|
+
reAimAroundFace(faceNode: HalfEdge, ray: Ray3d, targetDistance: number, lastBefore: HalfEdgePositionDetail, firstAfter: HalfEdgePositionDetail): RayClassification;
|
|
64
|
+
/**
|
|
65
|
+
* Initialize the input ray for topology search:
|
|
66
|
+
* * `origin` is at `start`
|
|
67
|
+
* * `direction` is the unit xy-vector from `start` towards `target`
|
|
68
|
+
* * `a` is the xy-distance from `start` to `target`
|
|
28
69
|
* @param start existing position
|
|
29
70
|
* @param target target xy coordinates
|
|
30
|
-
* @param ray
|
|
71
|
+
* @param ray updated in place
|
|
72
|
+
* @returns false if target is reached.
|
|
31
73
|
*/
|
|
32
74
|
setSearchRay(start: HalfEdgePositionDetail, target: Point3d, ray: Ray3d): boolean;
|
|
33
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HalfEdgePointInGraphSearch.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgePointInGraphSearch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HalfEdgePointInGraphSearch.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgePointInGraphSearch.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAY,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;GAGG;AACH,oBAAY,iBAAiB;IAC3B,MAAM,IAAA;IACN,cAAc,IAAA;IACd,YAAY,IAAA;IACZ,OAAO,IAAA;IACP,YAAY,IAAA;IACZ,WAAW,IAAA;CACZ;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO;WAGO,MAAM,CAAC,GAAG,GAAE,MAAqC;IAG/D,OAAO,CAAC,KAAK;IAab;;;;;;;OAOG;IACI,aAAa,CAClB,OAAO,EAAE,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,GAClE,sBAAsB;IAsDzB;;;;;;OAMG;IACI,eAAe,CACpB,SAAS,EAAE,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,GACpE,sBAAsB;IA0DzB;;;;;;;;;;;;;;;;;;OAkBG;IACI,eAAe,CACpB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,KAAK,EACV,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,sBAAsB,GACjC,iBAAiB;IA0DpB;;;;;;;;;OASG;IACI,YAAY,CAAC,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO;CAWzF"}
|
|
@@ -8,21 +8,31 @@ exports.PointSearchContext = exports.RayClassification = void 0;
|
|
|
8
8
|
/** @packageDocumentation
|
|
9
9
|
* @module Topology
|
|
10
10
|
*/
|
|
11
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
11
12
|
const Geometry_1 = require("../Geometry");
|
|
12
13
|
const Point3dVector3d_1 = require("../geometry3d/Point3dVector3d");
|
|
14
|
+
const Graph_1 = require("./Graph");
|
|
13
15
|
const HalfEdgeNodeXYZUV_1 = require("./HalfEdgeNodeXYZUV");
|
|
14
16
|
const HalfEdgePositionDetail_1 = require("./HalfEdgePositionDetail");
|
|
15
|
-
|
|
17
|
+
// cspell:word Chebyshev
|
|
18
|
+
/**
|
|
19
|
+
* Return code from [PointSearchContext.reAimAroundFace]
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
16
22
|
var RayClassification;
|
|
17
23
|
(function (RayClassification) {
|
|
18
|
-
RayClassification[RayClassification["
|
|
19
|
-
RayClassification[RayClassification["
|
|
20
|
-
RayClassification[RayClassification["
|
|
21
|
-
RayClassification[RayClassification["
|
|
22
|
-
RayClassification[RayClassification["
|
|
23
|
-
RayClassification[RayClassification["
|
|
24
|
+
RayClassification[RayClassification["NoHits"] = 0] = "NoHits";
|
|
25
|
+
RayClassification[RayClassification["TargetOnVertex"] = 1] = "TargetOnVertex";
|
|
26
|
+
RayClassification[RayClassification["TargetOnEdge"] = 2] = "TargetOnEdge";
|
|
27
|
+
RayClassification[RayClassification["Bracket"] = 3] = "Bracket";
|
|
28
|
+
RayClassification[RayClassification["TargetBefore"] = 4] = "TargetBefore";
|
|
29
|
+
RayClassification[RayClassification["TargetAfter"] = 5] = "TargetAfter";
|
|
24
30
|
})(RayClassification || (exports.RayClassification = RayClassification = {}));
|
|
25
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Context for searching for the location of an xy-point in a graph.
|
|
33
|
+
* * Assumptions: interior faces of the graph are convex, no edge has length less than `tol`.
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
26
36
|
class PointSearchContext {
|
|
27
37
|
constructor(tol) {
|
|
28
38
|
this._tol = tol;
|
|
@@ -31,10 +41,26 @@ class PointSearchContext {
|
|
|
31
41
|
return new PointSearchContext(tol);
|
|
32
42
|
}
|
|
33
43
|
panic() {
|
|
44
|
+
// A note on "unexpectedly" found in comments in this file:
|
|
45
|
+
// Though this class assumes all edges of the graph have length at least tolerance, the tests below account for
|
|
46
|
+
// edges with smaller length. This is because we are using two different metrics: Euclidean for distinguishing
|
|
47
|
+
// points matching user expectation, and Chebyshev, aka "max component", for efficiently testing ray-sector
|
|
48
|
+
// inclusion in the reAimXXX methods. In particular, epsilon-balls in the former metric are smaller than in the
|
|
49
|
+
// latter. Thus an edge can be inserted into the graph with Euclidean length (barely) greater than epsilon, but
|
|
50
|
+
// the edge's parallel and perpendicular components with respect to a ray can have Euclidean length *less* than
|
|
51
|
+
// epsilon, yielding a Chebyshev edge length less than epsilon. This discrepancy requires careful analysis below,
|
|
52
|
+
// and if this method is invoked, it is probably because we've missed a case where a dot/cross product lies just
|
|
53
|
+
// beyond the tolerance.
|
|
34
54
|
return HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
|
|
35
55
|
}
|
|
36
|
-
|
|
37
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Reposition `edgeHit` to an adjacent face or vertex, or another position on the edge, that is closer to the
|
|
58
|
+
* target point.
|
|
59
|
+
* @param edgeHit start position on a graph edge, updated and returned.
|
|
60
|
+
* @param ray the ray to the target point. Origin is assumed to lie on the edge.
|
|
61
|
+
* @param targetDistance distance along the ray to the target point.
|
|
62
|
+
* @return detail closer to the target point.
|
|
63
|
+
*/
|
|
38
64
|
reAimFromEdge(edgeHit, ray, targetDistance) {
|
|
39
65
|
const nodeA = edgeHit.node;
|
|
40
66
|
const dataA = HalfEdgeNodeXYZUV_1.NodeXYZUV.createNodeAndRayOrigin(nodeA, ray);
|
|
@@ -42,8 +68,7 @@ class PointSearchContext {
|
|
|
42
68
|
const sideA = -dataA.classifyV(0.0, this._tol);
|
|
43
69
|
const sideB = -dataB.classifyV(0.0, this._tol);
|
|
44
70
|
let result;
|
|
45
|
-
if (sideA * sideB < 0) {
|
|
46
|
-
// Simple crossing -- just aim into a face
|
|
71
|
+
if (sideA * sideB < 0) { // simple crossing; just aim into a face
|
|
47
72
|
if (sideA > 0) {
|
|
48
73
|
result = edgeHit.resetAsFace(dataA.node);
|
|
49
74
|
}
|
|
@@ -52,126 +77,150 @@ class PointSearchContext {
|
|
|
52
77
|
}
|
|
53
78
|
}
|
|
54
79
|
else if (sideA === 0 || sideB === 0) {
|
|
55
|
-
// The usual case is both 0 i.e. ray is clearly along the edge.
|
|
56
80
|
const alongA = dataA.classifyU(targetDistance, this._tol);
|
|
57
81
|
const alongB = dataB.classifyU(targetDistance, this._tol);
|
|
58
|
-
if (
|
|
82
|
+
if (sideA === 0 && alongA === 0) { // hit start vertex
|
|
59
83
|
result = edgeHit.resetAsVertex(dataA.node);
|
|
60
84
|
result.setITag(1);
|
|
61
85
|
}
|
|
62
|
-
else if (
|
|
86
|
+
else if (sideB === 0 && alongB === 0) { // hit end vertex
|
|
63
87
|
result = edgeHit.resetAsVertex(dataB.node);
|
|
64
88
|
result.setITag(1);
|
|
65
89
|
}
|
|
66
|
-
else if (
|
|
67
|
-
// target is within edge
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
result = edgeHit.resetAtEdgeAndFraction(dataA.node, edgeFraction);
|
|
72
|
-
result.setITag(1);
|
|
73
|
-
}
|
|
74
|
-
else if (alongA < 0 && alongB < 0) {
|
|
75
|
-
// target is beyond the edge -- move towards it.
|
|
76
|
-
if (dataA.u > dataB.u)
|
|
77
|
-
result = edgeHit.resetAsVertex(dataA.node);
|
|
78
|
-
else
|
|
79
|
-
result = edgeHit.resetAsVertex(dataB.node);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
// This shouldn't happen -- maybe as if the initial edge point was not within the edge???
|
|
83
|
-
if (Math.abs(dataA.u) < this._tol
|
|
84
|
-
&& Math.abs(dataA.v) < this._tol) {
|
|
85
|
-
result = edgeHit.resetAsVertex(dataA.node); // , dataA);
|
|
90
|
+
else if (sideA === 0 && sideB === 0) { // ray is clearly along the edge
|
|
91
|
+
if (alongA * alongB < 0) { // target is within edge
|
|
92
|
+
const edgeFraction = (targetDistance - dataA.u) / (dataB.u - dataA.u);
|
|
93
|
+
result = edgeHit.resetAtEdgeAndFraction(dataA.node, edgeFraction);
|
|
94
|
+
result.setITag(1);
|
|
86
95
|
}
|
|
87
|
-
else if (
|
|
88
|
-
|
|
89
|
-
|
|
96
|
+
else if (alongA < 0 && alongB < 0) { // target is beyond the edge; move towards it
|
|
97
|
+
if (dataA.u > dataB.u)
|
|
98
|
+
result = edgeHit.resetAsVertex(dataA.node);
|
|
99
|
+
else
|
|
100
|
+
result = edgeHit.resetAsVertex(dataB.node);
|
|
90
101
|
}
|
|
91
|
-
else {
|
|
102
|
+
else { // both vertices lie on the ray before or after the target; shouldn't happen for edgeHit between nodes
|
|
92
103
|
edgeHit.resetAsUnknown();
|
|
93
104
|
result = this.panic();
|
|
94
105
|
}
|
|
95
106
|
}
|
|
107
|
+
else if (sideA === 0) { // ray near start vertex but NOT parallel to the edge
|
|
108
|
+
if (0 === dataA.classifyU(0.0, this._tol))
|
|
109
|
+
result = edgeHit.resetAsVertex(dataA.node);
|
|
110
|
+
else
|
|
111
|
+
result = edgeHit.resetAsFace(sideB > 0 ? dataB.node : dataA.node);
|
|
112
|
+
}
|
|
113
|
+
else { // ray near end vertex but NOT parallel to the edge
|
|
114
|
+
(0, core_bentley_1.assert)(sideB === 0);
|
|
115
|
+
if (0 === dataB.classifyU(0.0, this._tol))
|
|
116
|
+
result = edgeHit.resetAsVertex(dataB.node);
|
|
117
|
+
else
|
|
118
|
+
result = edgeHit.resetAsFace(sideA > 0 ? dataA.node : dataB.node);
|
|
119
|
+
}
|
|
96
120
|
}
|
|
97
|
-
else {
|
|
98
|
-
// Both vertices are to same side of the line. This can't happen for edge point between nodes.
|
|
121
|
+
else { // both vertices are to same side of the ray; shouldn't happen for edgeHit between nodes
|
|
99
122
|
edgeHit.resetAsUnknown();
|
|
100
123
|
result = this.panic();
|
|
101
124
|
}
|
|
102
125
|
return result;
|
|
103
126
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
127
|
+
/**
|
|
128
|
+
* Reposition `vertexHit` to an adjacent face, edge, or vertex hit that is closer to the target point.
|
|
129
|
+
* @param vertexHit start position at a graph vertex, updated and returned.
|
|
130
|
+
* @param ray the ray to the target point, assumed to start exactly at the vertex.
|
|
131
|
+
* @param targetDistance distance along the ray to the target point.
|
|
132
|
+
* @return detail closer to the target point.
|
|
133
|
+
*/
|
|
134
|
+
reAimFromVertex(vertexHit, ray, targetDistance) {
|
|
135
|
+
(0, core_bentley_1.assert)(ray.origin.isExactEqual(vertexHit));
|
|
136
|
+
const vertexNode = vertexHit.node;
|
|
109
137
|
let outboundEdge = vertexNode;
|
|
138
|
+
// lambda to handle the case where the target definitively lies in the same direction as outboundEdge
|
|
139
|
+
const advancePositionAlongOutboundEdge = (rayParam) => {
|
|
140
|
+
if (Math.abs(rayParam - targetDistance) <= this._tol) { // direct hit at far end of outBoundEdge
|
|
141
|
+
vertexHit.resetAsVertex(outboundEdge.faceSuccessor).setITag(1);
|
|
142
|
+
}
|
|
143
|
+
else if (rayParam > targetDistance) { // direct hit within outBoundEdge
|
|
144
|
+
vertexHit.resetAtEdgeAndFraction(outboundEdge, targetDistance / rayParam);
|
|
145
|
+
}
|
|
146
|
+
else if (rayParam > this._tol) { // far end of outBoundEdge is closer to target
|
|
147
|
+
vertexHit.resetAsVertex(outboundEdge.faceSuccessor);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
};
|
|
110
154
|
do {
|
|
111
|
-
//
|
|
112
|
-
// vu_getDPoint3d(& xyzBase, outboundEdge);
|
|
155
|
+
// examine the sector at the outboundEdge node; if ray lies in this sector, return updated detail
|
|
113
156
|
const data0 = HalfEdgeNodeXYZUV_1.NodeXYZUV.createNodeAndRayOrigin(outboundEdge.faceSuccessor, ray);
|
|
114
157
|
const data1 = HalfEdgeNodeXYZUV_1.NodeXYZUV.createNodeAndRayOrigin(outboundEdge.facePredecessor, ray);
|
|
158
|
+
// u0 is the length of projection of faceSuccessor to the ray and v0 is the length of projection of
|
|
159
|
+
// faceSuccessor to the ray perp line (90 degrees CCW). Similarly for u1 and v1 with facePredecessor.
|
|
115
160
|
const u0 = data0.u;
|
|
116
|
-
|
|
161
|
+
const u1 = data1.u;
|
|
117
162
|
const v0 = data0.v;
|
|
118
163
|
const v1 = data1.v;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
else if (u0 > targetDistance) {
|
|
127
|
-
// Direct hig within edge
|
|
128
|
-
const edgeFraction = targetDistance / u0;
|
|
129
|
-
result = searchBase.resetAtEdgeAndFraction(outboundEdge, edgeFraction);
|
|
130
|
-
return result;
|
|
131
|
-
}
|
|
132
|
-
else if (Math.abs(u0) <= this._tol) {
|
|
133
|
-
// Unexpected direct hit on the base of the search, but call it a hit....
|
|
134
|
-
result = searchBase.resetAsVertex(outboundEdge);
|
|
135
|
-
result.setITag(1);
|
|
136
|
-
return result;
|
|
137
|
-
}
|
|
138
|
-
else if (u0 > this._tol) {
|
|
139
|
-
// Advance to vertex ...
|
|
140
|
-
// double edgeFraction = targetDistance / u0;
|
|
141
|
-
result = searchBase.resetAsVertex(data0.node);
|
|
142
|
-
return result;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
// Search direction is exactly opposite this edge.
|
|
146
|
-
// See if the other side of the sector is turned even beyond that ...
|
|
147
|
-
if (v1 > this._tol) {
|
|
148
|
-
result = searchBase.resetAsFace(outboundEdge, outboundEdge);
|
|
149
|
-
return result;
|
|
150
|
-
}
|
|
164
|
+
// examine dot and cross of ray with both edges defining this sector to see if ray lies between them
|
|
165
|
+
if (Math.abs(v0) <= this._tol) { // ray parallel to outBoundEdge
|
|
166
|
+
if (advancePositionAlongOutboundEdge(u0))
|
|
167
|
+
return vertexHit;
|
|
168
|
+
if (Math.abs(u0) <= this._tol) { // edge is unexpectedly* small
|
|
169
|
+
if (v0 <= 0 && v1 > this._tol && (u0 >= 0 || (u0 < 0 && u1 > this._tol)))
|
|
170
|
+
return vertexHit.resetAsFace(outboundEdge, outboundEdge);
|
|
151
171
|
}
|
|
172
|
+
// The only remaining case is u0 < -this._tol: ray points opposite outBoundEdge.
|
|
173
|
+
// By our convexity assumption, the only way that ray lies in this sector is if the lookBack
|
|
174
|
+
// vector points in the same direction as ray, but this would be handled in the next sector.
|
|
152
175
|
}
|
|
153
176
|
else if (v0 < -this._tol) {
|
|
154
|
-
if (v1 > this._tol)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
177
|
+
if (v1 > this._tol) // ray definitely lies in this sector
|
|
178
|
+
return vertexHit.resetAsFace(outboundEdge, outboundEdge);
|
|
179
|
+
if (v1 >= -this._tol) { // ray and lookBack vector are parallel
|
|
180
|
+
// handle special cases not handled in the next sector
|
|
181
|
+
if (Math.abs(u1) <= this._tol) { // lookBack vector is unexpectedly* small...
|
|
182
|
+
if (v1 > 0 && (u1 >= 0 || (u0 > this._tol && u1 < 0))) // ...and ray is in this sector
|
|
183
|
+
return vertexHit.resetAsFace(outboundEdge, outboundEdge);
|
|
184
|
+
}
|
|
185
|
+
else if (u0 > this._tol && u1 < 0) { // ray and lookBack point in opposite directions
|
|
186
|
+
return vertexHit.resetAsVertex(outboundEdge.faceSuccessor); // far end is closer to target
|
|
187
|
+
}
|
|
158
188
|
}
|
|
189
|
+
// The only remaining case is v1 < -this._tol: ray definitely lies outside this sector.
|
|
159
190
|
}
|
|
160
|
-
//
|
|
191
|
+
// Proceed to the next sector around this vertex. We even examine the (concave) exterior sector at a boundary
|
|
192
|
+
// vertex in order to handle the case where the target lies in the direction of an exterior outboundEdge.
|
|
161
193
|
outboundEdge = outboundEdge.vertexSuccessor;
|
|
162
194
|
} while (outboundEdge !== vertexNode);
|
|
163
195
|
return this.panic();
|
|
164
196
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Visit all edges around the face, updating `lastBefore` and `firstAfter` to ray-edge intersections that
|
|
199
|
+
* lie directly before and/or after the target point on the ray, if at all.
|
|
200
|
+
* @param faceNode starting node on a graph face.
|
|
201
|
+
* @param ray the ray to the target point.
|
|
202
|
+
* @param targetDistance distance along the ray to the target point.
|
|
203
|
+
* @param lastBefore the detail to reset as the last hit on the ray before the target point (CALLER CREATED).
|
|
204
|
+
* @param firstAfter the detail to reset as the first hit on the ray after the target point (CALLER CREATED).
|
|
205
|
+
* @returns summary of the updated details:
|
|
206
|
+
* * [[RayClassification.TargetOnVertex]] - target lies at a vertex of the face (details are identical).
|
|
207
|
+
* * [[RayClassification.TargetOnEdge]] - target lies on an edge of the face (details are identical).
|
|
208
|
+
* * [[RayClassification.TargetBefore]] - target lies before the face; the ray intersects the face beyond
|
|
209
|
+
* the target point.
|
|
210
|
+
* * [[RayClassification.TargetAfter]] - target lies after the face; the ray intersects the face before
|
|
211
|
+
* the target point.
|
|
212
|
+
* * [[RayClassification.Bracket]] - target lies between intersections of the ray and the face; if the face
|
|
213
|
+
* is convex, this means the target lies inside the face.
|
|
214
|
+
* * [[RayClassification.NoHits]] - the face does not intersect the ray.
|
|
215
|
+
*/
|
|
216
|
+
reAimAroundFace(faceNode, ray, targetDistance, lastBefore, firstAfter) {
|
|
217
|
+
(0, core_bentley_1.assert)(!faceNode.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR));
|
|
170
218
|
lastBefore.resetAsUndefinedWithTag(-Number.MAX_VALUE);
|
|
171
219
|
firstAfter.resetAsUndefinedWithTag(Number.MAX_VALUE);
|
|
172
220
|
const data0 = HalfEdgeNodeXYZUV_1.NodeXYZUV.createNodeAndRayOrigin(faceNode, ray);
|
|
173
221
|
let data1;
|
|
174
222
|
let node0 = faceNode;
|
|
223
|
+
// find the intersection of the ray with each edge of the face to classify the ray hit
|
|
175
224
|
do {
|
|
176
225
|
const node1 = node0.faceSuccessor;
|
|
177
226
|
data1 = HalfEdgeNodeXYZUV_1.NodeXYZUV.createNodeAndRayOrigin(node1, ray, data1);
|
|
@@ -179,78 +228,70 @@ class PointSearchContext {
|
|
|
179
228
|
const u1 = data1.u;
|
|
180
229
|
const v0 = data0.v;
|
|
181
230
|
const v1 = data1.v;
|
|
182
|
-
if (Math.abs(v1) < this._tol) {
|
|
183
|
-
// Vertex hit ...
|
|
231
|
+
if (Math.abs(v1) < this._tol) { // ray parallel to edge
|
|
184
232
|
const vertexHit = HalfEdgePositionDetail_1.HalfEdgePositionDetail.createVertex(node1);
|
|
185
233
|
vertexHit.setDTag(u1);
|
|
186
234
|
if (Math.abs(u1 - targetDistance) < this._tol) {
|
|
187
235
|
firstAfter.setFrom(vertexHit);
|
|
188
236
|
lastBefore.setFrom(vertexHit);
|
|
189
|
-
return RayClassification.
|
|
237
|
+
return RayClassification.TargetOnVertex;
|
|
190
238
|
}
|
|
191
239
|
if (u1 > targetDistance && u1 < firstAfter.getDTag())
|
|
192
240
|
firstAfter.setFrom(vertexHit);
|
|
193
241
|
if (u1 < targetDistance && u1 > lastBefore.getDTag())
|
|
194
242
|
lastBefore.setFrom(vertexHit);
|
|
195
243
|
}
|
|
196
|
-
else if (v0 * v1 < 0.0) {
|
|
197
|
-
// Edge Crossing ...
|
|
244
|
+
else if (v0 * v1 < 0.0) { // ray crosses edge
|
|
198
245
|
const edgeFraction = -v0 / (v1 - v0);
|
|
199
|
-
const
|
|
246
|
+
const rayFraction = Geometry_1.Geometry.interpolate(u0, edgeFraction, u1);
|
|
200
247
|
const edgeHit = HalfEdgePositionDetail_1.HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);
|
|
201
|
-
edgeHit.setDTag(
|
|
202
|
-
if (Math.abs(
|
|
248
|
+
edgeHit.setDTag(rayFraction);
|
|
249
|
+
if (Math.abs(rayFraction - targetDistance) <= this._tol) {
|
|
203
250
|
firstAfter.setFrom(edgeHit);
|
|
204
251
|
lastBefore.setFrom(edgeHit);
|
|
205
|
-
return RayClassification.
|
|
252
|
+
return RayClassification.TargetOnEdge;
|
|
206
253
|
}
|
|
207
|
-
if (
|
|
254
|
+
if (rayFraction > targetDistance && rayFraction < firstAfter.getDTag())
|
|
208
255
|
firstAfter.setFrom(edgeHit);
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
if (uEdge < targetDistance && uEdge > lastBefore.getDTag()) {
|
|
256
|
+
if (rayFraction < targetDistance && rayFraction > lastBefore.getDTag())
|
|
212
257
|
lastBefore.setFrom(edgeHit);
|
|
213
|
-
lastBefore.setDTag(uEdge);
|
|
214
|
-
}
|
|
215
258
|
}
|
|
216
259
|
data0.setFrom(data1);
|
|
217
260
|
node0 = node0.faceSuccessor;
|
|
218
261
|
} while (node0 !== faceNode);
|
|
219
|
-
//
|
|
220
|
-
const afterTag = firstAfter.getITag();
|
|
262
|
+
// returned to start node
|
|
221
263
|
firstAfter.setITag(0);
|
|
222
264
|
lastBefore.setITag(0);
|
|
223
265
|
if (lastBefore.isUnclassified) {
|
|
224
266
|
if (firstAfter.isUnclassified)
|
|
225
|
-
return RayClassification.
|
|
226
|
-
return RayClassification.
|
|
227
|
-
}
|
|
228
|
-
if (firstAfter.isUnclassified
|
|
229
|
-
|| (firstAfter.isEdge && afterTag && afterTag < 0)) {
|
|
230
|
-
return RayClassification.RC_TargetAfter;
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
return RayClassification.RC_Bracket;
|
|
267
|
+
return RayClassification.NoHits;
|
|
268
|
+
return RayClassification.TargetBefore;
|
|
234
269
|
}
|
|
270
|
+
if (firstAfter.isUnclassified)
|
|
271
|
+
return RayClassification.TargetAfter;
|
|
272
|
+
else
|
|
273
|
+
return RayClassification.Bracket; // face is locally convex; target lies inside this face
|
|
235
274
|
}
|
|
236
|
-
// Return false if target is reached !!!!
|
|
237
275
|
/**
|
|
238
|
-
*
|
|
239
|
-
* * `origin` at start
|
|
240
|
-
* * `direction` is unit vector from start towards target
|
|
241
|
-
* * `a` is distance from start to target
|
|
276
|
+
* Initialize the input ray for topology search:
|
|
277
|
+
* * `origin` is at `start`
|
|
278
|
+
* * `direction` is the unit xy-vector from `start` towards `target`
|
|
279
|
+
* * `a` is the xy-distance from `start` to `target`
|
|
242
280
|
* @param start existing position
|
|
243
281
|
* @param target target xy coordinates
|
|
244
|
-
* @param ray
|
|
282
|
+
* @param ray updated in place
|
|
283
|
+
* @returns false if target is reached.
|
|
245
284
|
*/
|
|
246
285
|
setSearchRay(start, target, ray) {
|
|
247
286
|
ray.origin.setFromPoint3d(start);
|
|
248
287
|
Point3dVector3d_1.Vector3d.createStartEnd(ray.origin, target, ray.direction);
|
|
249
288
|
ray.direction.z = 0.0;
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
289
|
+
const distanceToTargetXY = ray.direction.magnitudeXY();
|
|
290
|
+
if (distanceToTargetXY < this._tol)
|
|
291
|
+
return false; // no searching necessary, we are already at the target point
|
|
292
|
+
ray.a = distanceToTargetXY;
|
|
293
|
+
ray.direction.scaleInPlace(1 / distanceToTargetXY);
|
|
294
|
+
return true;
|
|
254
295
|
}
|
|
255
296
|
}
|
|
256
297
|
exports.PointSearchContext = PointSearchContext;
|
|
@@ -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 { assert } from \"@itwin/core-bentley\";\nimport { Geometry } from \"../Geometry\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { HalfEdge, HalfEdgeMask } from \"./Graph\";\nimport { NodeXYZUV } from \"./HalfEdgeNodeXYZUV\";\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\n\n// cspell:word Chebyshev\n\n/**\n * Return code from [PointSearchContext.reAimAroundFace]\n * @internal\n */\nexport enum RayClassification {\n NoHits,\n TargetOnVertex,\n TargetOnEdge,\n Bracket,\n TargetBefore,\n TargetAfter,\n}\n\n/**\n * Context for searching for the location of an xy-point in a graph.\n * * Assumptions: interior faces of the graph are convex, no edge has length less than `tol`.\n * @internal\n */\nexport class PointSearchContext {\n private _tol: number;\n private constructor(tol: number) {\n this._tol = tol;\n }\n public static create(tol: number = Geometry.smallMetricDistance) {\n return new PointSearchContext(tol);\n }\n private panic(): HalfEdgePositionDetail {\n // A note on \"unexpectedly\" found in comments in this file:\n // Though this class assumes all edges of the graph have length at least tolerance, the tests below account for\n // edges with smaller length. This is because we are using two different metrics: Euclidean for distinguishing\n // points matching user expectation, and Chebyshev, aka \"max component\", for efficiently testing ray-sector\n // inclusion in the reAimXXX methods. In particular, epsilon-balls in the former metric are smaller than in the\n // latter. Thus an edge can be inserted into the graph with Euclidean length (barely) greater than epsilon, but\n // the edge's parallel and perpendicular components with respect to a ray can have Euclidean length *less* than\n // epsilon, yielding a Chebyshev edge length less than epsilon. This discrepancy requires careful analysis below,\n // and if this method is invoked, it is probably because we've missed a case where a dot/cross product lies just\n // beyond the tolerance.\n return HalfEdgePositionDetail.create();\n }\n /**\n * Reposition `edgeHit` to an adjacent face or vertex, or another position on the edge, that is closer to the\n * target point.\n * @param edgeHit start position on a graph edge, updated and returned.\n * @param ray the ray to the target point. Origin is assumed to lie on the edge.\n * @param targetDistance distance along the ray to the target point.\n * @return detail closer to the target point.\n */\n public reAimFromEdge(\n edgeHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\n ): HalfEdgePositionDetail {\n const nodeA = edgeHit.node!;\n const dataA = NodeXYZUV.createNodeAndRayOrigin(nodeA, ray);\n const dataB = NodeXYZUV.createNodeAndRayOrigin(nodeA.edgeMate, ray);\n const sideA = -dataA.classifyV(0.0, this._tol);\n const sideB = -dataB.classifyV(0.0, this._tol);\n let result;\n if (sideA * sideB < 0) { // simple crossing; just aim into a face\n if (sideA > 0) {\n result = edgeHit.resetAsFace(dataA.node);\n } else {\n result = edgeHit.resetAsFace(dataB.node);\n }\n } else if (sideA === 0 || sideB === 0) {\n const alongA = dataA.classifyU(targetDistance, this._tol);\n const alongB = dataB.classifyU(targetDistance, this._tol);\n if (sideA === 0 && alongA === 0) { // hit start vertex\n result = edgeHit.resetAsVertex(dataA.node);\n result.setITag(1);\n } else if (sideB === 0 && alongB === 0) { // hit end vertex\n result = edgeHit.resetAsVertex(dataB.node);\n result.setITag(1);\n } else if (sideA === 0 && sideB === 0) { // ray is clearly along the edge\n if (alongA * alongB < 0) { // target is within edge\n const edgeFraction = (targetDistance - dataA.u) / (dataB.u - dataA.u);\n result = edgeHit.resetAtEdgeAndFraction(dataA.node, edgeFraction);\n result.setITag(1);\n } else if (alongA < 0 && alongB < 0) { // target is beyond the edge; move towards it\n if (dataA.u > dataB.u)\n result = edgeHit.resetAsVertex(dataA.node);\n else\n result = edgeHit.resetAsVertex(dataB.node);\n } else { // both vertices lie on the ray before or after the target; shouldn't happen for edgeHit between nodes\n edgeHit.resetAsUnknown();\n result = this.panic();\n }\n } else if (sideA === 0) { // ray near start vertex but NOT parallel to the edge\n if (0 === dataA.classifyU(0.0, this._tol))\n result = edgeHit.resetAsVertex(dataA.node);\n else\n result = edgeHit.resetAsFace(sideB > 0 ? dataB.node : dataA.node);\n } else { // ray near end vertex but NOT parallel to the edge\n assert(sideB === 0);\n if (0 === dataB.classifyU(0.0, this._tol))\n result = edgeHit.resetAsVertex(dataB.node);\n else\n result = edgeHit.resetAsFace(sideA > 0 ? dataA.node : dataB.node);\n }\n } else { // both vertices are to same side of the ray; shouldn't happen for edgeHit between nodes\n edgeHit.resetAsUnknown();\n result = this.panic();\n }\n return result;\n }\n /**\n * Reposition `vertexHit` to an adjacent face, edge, or vertex hit that is closer to the target point.\n * @param vertexHit start position at a graph vertex, updated and returned.\n * @param ray the ray to the target point, assumed to start exactly at the vertex.\n * @param targetDistance distance along the ray to the target point.\n * @return detail closer to the target point.\n */\n public reAimFromVertex(\n vertexHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\n ): HalfEdgePositionDetail {\n assert(ray.origin.isExactEqual(vertexHit));\n const vertexNode = vertexHit.node;\n let outboundEdge = vertexNode!;\n // lambda to handle the case where the target definitively lies in the same direction as outboundEdge\n const advancePositionAlongOutboundEdge = (rayParam: number): boolean => {\n if (Math.abs(rayParam - targetDistance) <= this._tol) { // direct hit at far end of outBoundEdge\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor).setITag(1);\n } else if (rayParam > targetDistance) { // direct hit within outBoundEdge\n vertexHit.resetAtEdgeAndFraction(outboundEdge, targetDistance / rayParam);\n } else if (rayParam > this._tol) { // far end of outBoundEdge is closer to target\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor);\n } else {\n return false;\n }\n return true;\n };\n do {\n // examine the sector at the outboundEdge node; if ray lies in this sector, return updated detail\n const data0 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.faceSuccessor, ray);\n const data1 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.facePredecessor, ray);\n // u0 is the length of projection of faceSuccessor to the ray and v0 is the length of projection of\n // faceSuccessor to the ray perp line (90 degrees CCW). Similarly for u1 and v1 with facePredecessor.\n const u0 = data0.u;\n const u1 = data1.u;\n const v0 = data0.v;\n const v1 = data1.v;\n // examine dot and cross of ray with both edges defining this sector to see if ray lies between them\n if (Math.abs(v0) <= this._tol) { // ray parallel to outBoundEdge\n if (advancePositionAlongOutboundEdge(u0))\n return vertexHit;\n if (Math.abs(u0) <= this._tol) { // edge is unexpectedly* small\n if (v0 <= 0 && v1 > this._tol && (u0 >= 0 || (u0 < 0 && u1 > this._tol)))\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\n }\n // The only remaining case is u0 < -this._tol: ray points opposite outBoundEdge.\n // By our convexity assumption, the only way that ray lies in this sector is if the lookBack\n // vector points in the same direction as ray, but this would be handled in the next sector.\n } else if (v0 < -this._tol) {\n if (v1 > this._tol) // ray definitely lies in this sector\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\n if (v1 >= -this._tol) { // ray and lookBack vector are parallel\n // handle special cases not handled in the next sector\n if (Math.abs(u1) <= this._tol) { // lookBack vector is unexpectedly* small...\n if (v1 > 0 && (u1 >= 0 || (u0 > this._tol && u1 < 0))) // ...and ray is in this sector\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\n } else if (u0 > this._tol && u1 < 0) { // ray and lookBack point in opposite directions\n return vertexHit.resetAsVertex(outboundEdge.faceSuccessor); // far end is closer to target\n }\n }\n // The only remaining case is v1 < -this._tol: ray definitely lies outside this sector.\n }\n // Proceed to the next sector around this vertex. We even examine the (concave) exterior sector at a boundary\n // vertex in order to handle the case where the target lies in the direction of an exterior outboundEdge.\n outboundEdge = outboundEdge.vertexSuccessor;\n } while (outboundEdge !== vertexNode);\n return this.panic();\n }\n /**\n * Visit all edges around the face, updating `lastBefore` and `firstAfter` to ray-edge intersections that\n * lie directly before and/or after the target point on the ray, if at all.\n * @param faceNode starting node on a graph face.\n * @param ray the ray to the target point.\n * @param targetDistance distance along the ray to the target point.\n * @param lastBefore the detail to reset as the last hit on the ray before the target point (CALLER CREATED).\n * @param firstAfter the detail to reset as the first hit on the ray after the target point (CALLER CREATED).\n * @returns summary of the updated details:\n * * [[RayClassification.TargetOnVertex]] - target lies at a vertex of the face (details are identical).\n * * [[RayClassification.TargetOnEdge]] - target lies on an edge of the face (details are identical).\n * * [[RayClassification.TargetBefore]] - target lies before the face; the ray intersects the face beyond\n * the target point.\n * * [[RayClassification.TargetAfter]] - target lies after the face; the ray intersects the face before\n * the target point.\n * * [[RayClassification.Bracket]] - target lies between intersections of the ray and the face; if the face\n * is convex, this means the target lies inside the face.\n * * [[RayClassification.NoHits]] - the face does not intersect the ray.\n */\n public reAimAroundFace(\n faceNode: HalfEdge,\n ray: Ray3d,\n targetDistance: number,\n lastBefore: HalfEdgePositionDetail,\n firstAfter: HalfEdgePositionDetail,\n ): RayClassification {\n assert(!faceNode.isMaskSet(HalfEdgeMask.EXTERIOR));\n lastBefore.resetAsUndefinedWithTag(-Number.MAX_VALUE);\n firstAfter.resetAsUndefinedWithTag(Number.MAX_VALUE);\n const data0 = NodeXYZUV.createNodeAndRayOrigin(faceNode, ray);\n let data1;\n let node0 = faceNode;\n // find the intersection of the ray with each edge of the face to classify the ray hit\n do {\n const node1 = node0.faceSuccessor;\n data1 = NodeXYZUV.createNodeAndRayOrigin(node1, ray, data1);\n const u0 = data0.u;\n const u1 = data1.u;\n const v0 = data0.v;\n const v1 = data1.v;\n if (Math.abs(v1) < this._tol) { // ray parallel to edge\n const vertexHit = HalfEdgePositionDetail.createVertex(node1);\n vertexHit.setDTag(u1);\n if (Math.abs(u1 - targetDistance) < this._tol) {\n firstAfter.setFrom(vertexHit);\n lastBefore.setFrom(vertexHit);\n return RayClassification.TargetOnVertex;\n }\n if (u1 > targetDistance && u1 < firstAfter.getDTag()!)\n firstAfter.setFrom(vertexHit);\n if (u1 < targetDistance && u1 > lastBefore.getDTag()!)\n lastBefore.setFrom(vertexHit);\n } else if (v0 * v1 < 0.0) { // ray crosses edge\n const edgeFraction = -v0 / (v1 - v0);\n const rayFraction = Geometry.interpolate(u0, edgeFraction, u1);\n const edgeHit = HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);\n edgeHit.setDTag(rayFraction);\n if (Math.abs(rayFraction - targetDistance) <= this._tol) {\n firstAfter.setFrom(edgeHit);\n lastBefore.setFrom(edgeHit);\n return RayClassification.TargetOnEdge;\n }\n if (rayFraction > targetDistance && rayFraction < firstAfter.getDTag()!)\n firstAfter.setFrom(edgeHit);\n if (rayFraction < targetDistance && rayFraction > lastBefore.getDTag()!)\n lastBefore.setFrom(edgeHit);\n }\n data0.setFrom(data1);\n node0 = node0.faceSuccessor;\n } while (node0 !== faceNode);\n // returned to start node\n firstAfter.setITag(0);\n lastBefore.setITag(0);\n if (lastBefore.isUnclassified) {\n if (firstAfter.isUnclassified)\n return RayClassification.NoHits;\n return RayClassification.TargetBefore;\n }\n if (firstAfter.isUnclassified)\n return RayClassification.TargetAfter;\n else\n return RayClassification.Bracket; // face is locally convex; target lies inside this face\n }\n /**\n * Initialize the input ray for topology search:\n * * `origin` is at `start`\n * * `direction` is the unit xy-vector from `start` towards `target`\n * * `a` is the xy-distance from `start` to `target`\n * @param start existing position\n * @param target target xy coordinates\n * @param ray updated in place\n * @returns false if target is reached.\n */\n public setSearchRay(start: HalfEdgePositionDetail, target: Point3d, ray: Ray3d): boolean {\n ray.origin.setFromPoint3d(start);\n Vector3d.createStartEnd(ray.origin, target, ray.direction);\n ray.direction.z = 0.0;\n const distanceToTargetXY = ray.direction.magnitudeXY();\n if (distanceToTargetXY < this._tol)\n return false; // no searching necessary, we are already at the target point\n ray.a = distanceToTargetXY;\n ray.direction.scaleInPlace(1 / distanceToTargetXY);\n return true;\n }\n}\n"]}
|