@itwin/core-geometry 5.3.0-dev.12 → 5.3.0-dev.15
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 +11 -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.d.ts +25 -8
- package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +51 -55
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +96 -98
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +121 -110
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +135 -142
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +165 -160
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.d.ts +51 -34
- package/lib/cjs/geometry3d/IndexedXYCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js +16 -6
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +78 -77
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +38 -35
- 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/SmallSystem.js.map +1 -1
- package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/cjs/numerics/UnionFind.js.map +1 -1
- package/lib/cjs/numerics/UsageSums.js.map +1 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/BoxTopology.js.map +1 -1
- package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
- package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/Voronoi.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts +25 -8
- package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
- package/lib/esm/curve/CurveFactory.js +51 -55
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +96 -98
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +122 -111
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +135 -142
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +165 -160
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.d.ts +51 -34
- package/lib/esm/geometry3d/IndexedXYCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js +14 -5
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +78 -77
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +38 -35
- 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/SmallSystem.js.map +1 -1
- package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/esm/numerics/UnionFind.js.map +1 -1
- package/lib/esm/numerics/UsageSums.js.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/BoxTopology.js.map +1 -1
- package/lib/esm/polyface/FacetFaceData.js.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/esm/polyface/FacetOrientation.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeLengthData.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
- package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SolidPrimitive.js.map +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/Voronoi.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Voronoi.js","sourceRoot":"","sources":["../../../src/topology/Voronoi.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 Bspline\r\n */\r\n\r\nimport { assert, Dictionary, DuplicatePolicy, SortedArray } from \"@itwin/core-bentley\";\r\nimport { ClipPlane } from \"../clipping/ClipPlane\";\r\nimport { ConvexClipPlaneSet } from \"../clipping/ConvexClipPlaneSet\";\r\nimport { UnionOfConvexClipPlaneSets } from \"../clipping/UnionOfConvexClipPlaneSets\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveChain } from \"../curve/CurveCollection\";\r\nimport { CurveCurve } from \"../curve/CurveCurve\";\r\nimport { CurveOps } from \"../curve/CurveOps\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point2d, Vector2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolylineOps } from \"../geometry3d/PolylineOps\";\r\nimport { Range2d } from \"../geometry3d/Range\";\r\nimport { Ray2d } from \"../geometry3d/Ray2d\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { LowAndHighXY, XAndY } from \"../geometry3d/XYZProps\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { HalfEdgeGraphSearch } from \"./HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge, HalfEdgeGraphOps } from \"./Merging\";\r\nimport { Triangulator } from \"./Triangulation\";\r\n\r\n/**\r\n * A class to represent a Voronoi diagram in the xy-plane.\r\n * * A Voronoi diagram is a partitioning of the plane into regions of points closest to a given generating point or curve.\r\n * * It is constructed from the circumcenters of its dual Delaunay triangulation.\r\n * * Static construction methods take Delaunay, points, and CurveChain input.\r\n * * More info can be found here: https://en.wikipedia.org/wiki/Voronoi_diagram and\r\n * https://en.wikipedia.org/wiki/Delaunay_triangulation\r\n * @internal\r\n */\r\nexport class Voronoi {\r\n private _voronoiGraph: HalfEdgeGraph;\r\n private _inputGraph: HalfEdgeGraph;\r\n private _inputGraphIsTriangulation;\r\n private _inputGraphRange: Range2d;\r\n private _idToIndexMap: Map<number, number>;\r\n private _circumcenterMap: Map<number, XAndY>;\r\n private _circumcenterRange: Range2d;\r\n private _isCurveBased: boolean;\r\n private _superFaceMask: HalfEdgeMask;\r\n private static _workXY0 = Point2d.createZero();\r\n private static _workXY1 = Point2d.createZero();\r\n private static _workRay = Ray2d.createZero();\r\n private static _workArc = Arc3d.createUnitCircle();\r\n /** Construct an empty Voronoi graph and minimally validate input (use [[isValid]] to check). */\r\n private constructor(inputGraph: HalfEdgeGraph, isColinear = false) {\r\n this._voronoiGraph = new HalfEdgeGraph();\r\n this._inputGraph = inputGraph;\r\n this._inputGraphRange = HalfEdgeGraphOps.graphRangeXY(inputGraph);\r\n this._idToIndexMap = inputGraph.constructIdToVertexIndexMap();\r\n this._circumcenterMap = new Map<number, XAndY>();\r\n this._inputGraphIsTriangulation = isColinear ? false : this.populateCircumcenters(this._circumcenterMap);\r\n this._circumcenterRange = Range2d.createArray(Array.from(this._circumcenterMap.values()));\r\n this._isCurveBased = false;\r\n this._superFaceMask = HalfEdgeMask.NULL_MASK;\r\n }\r\n /**\r\n * Accessor for the graph passed into the private constructor.\r\n * * It is either a triangulation (assumed Delaunay) or a graph with no interior faces (assumed colinear path).\r\n */\r\n public get getInputGraph(): HalfEdgeGraph {\r\n return this._inputGraph;\r\n }\r\n /** Accessor for the input graph's range */\r\n public get getInputGraphRange(): Range2d {\r\n return this._inputGraphRange;\r\n }\r\n /**\r\n * Accessor for the Voronoi graph constructed from the input graph.\r\n * * The Voronoi graph is typically constructed by static createFromXXX methods.\r\n */\r\n public get getVoronoiGraph(): HalfEdgeGraph {\r\n return this._voronoiGraph;\r\n }\r\n /** Whether or not this instance represents a curve-based Voronoi diagram. */\r\n public get isCurveBased(): boolean {\r\n return this._isCurveBased;\r\n }\r\n /** Accessor for the super face mask used for constructing a curve-based Voronoi diagram. */\r\n public get getSuperFaceMask(): HalfEdgeMask {\r\n return this._superFaceMask;\r\n }\r\n /** Whether the constructor has created a minimally valid instance. */\r\n protected get isValid(): boolean {\r\n if (this._inputGraph.allHalfEdges.length < 2)\r\n return false;\r\n if (this._idToIndexMap.size === 0)\r\n return false;\r\n if (!this._inputGraphIsTriangulation)\r\n return true;\r\n return this._circumcenterMap.size > 0;\r\n }\r\n /** Add an edge to the graph and set its edgeTags. */\r\n private static addEdgeWithEdgeTags(graph: HalfEdgeGraph, p0: XAndY, p1: XAndY, edgeTag0?: number, edgeTag1?: number): HalfEdge {\r\n return graph.addEdgeXY(p0.x, p0.y, p1.x, p1.y, edgeTag0, edgeTag1);\r\n }\r\n /** Add an edge to the graph and set its faceTags. */\r\n private static addEdgeWithFaceTags(graph: HalfEdgeGraph, p0: XAndY, p1: XAndY, faceTag0?: number, faceTag1?: number): HalfEdge {\r\n return graph.addEdgeXY(p0.x, p0.y, p1.x, p1.y, undefined, undefined, faceTag0, faceTag1);\r\n }\r\n /** Return the smallest HalfEdge id in the face, or -1 if not a triangle. */\r\n private getTriangleId(face: HalfEdge): number {\r\n if (face !== face.faceSuccessor.faceSuccessor.faceSuccessor)\r\n return -1;\r\n return Math.min(face.id, face.faceSuccessor.id, face.facePredecessor.id);\r\n }\r\n /**\r\n * Populate a mapping from a triangle's id to its circumcircle.\r\n * @returns whether the input graph is a triangulation.\r\n */\r\n private populateCircumcenters(circumcenterMap: Map<number, XAndY>): boolean {\r\n circumcenterMap.clear();\r\n let isValid = true;\r\n const p0 = Point3d.createZero();\r\n const p1 = Point3d.createZero();\r\n const p2 = Point3d.createZero();\r\n this._inputGraph.announceFaceLoops(\r\n (_g: HalfEdgeGraph, face: HalfEdge) => {\r\n if (face.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return true;\r\n if (face.countEdgesAroundFace() !== 3)\r\n return isValid = false;\r\n face.getPoint3d(p0);\r\n face.faceSuccessor.getPoint3d(p1);\r\n face.facePredecessor.getPoint3d(p2);\r\n p0.z = p1.z = p2.z = 0;\r\n const circumcircle = Arc3d.createCircularStartMiddleEnd(p0, p1, p2, Voronoi._workArc);\r\n if (circumcircle instanceof Arc3d) // ignore a degenerate triangle\r\n circumcenterMap.set(this.getTriangleId(face), circumcircle.center); // getter clones center\r\n return true;\r\n },\r\n );\r\n if (!isValid)\r\n circumcenterMap.clear();\r\n return isValid;\r\n }\r\n /**\r\n * Return a segment along the bisector of the given triangle edge with the following properties:\r\n * * start point is the triangle's circumcenter\r\n * * end point is on the Voronoi boundary\r\n * * direction vector has positive dot product with the vector from triangle centroid to edge midpoint\r\n * @returns bisector segment, or undefined if the triangle circumcenter lies outside the Voronoi boundary\r\n */\r\n private getTriangleEdgeBisector(edge: HalfEdge, circumcenter: XAndY, box: VoronoiBoundary): Voronoi.Segment2d | undefined {\r\n const v0 = edge;\r\n const v1 = edge.faceSuccessor;\r\n const v2 = edge.facePredecessor;\r\n const oneThird = 1.0 / 3.0;\r\n const midPoint = Point2d.createAdd2ScaledXY(v0.x, v0.y, 0.5, v1.x, v1.y, 0.5);\r\n const centroid = Point2d.createAdd3ScaledXY(v0.x, v0.y, oneThird, v1.x, v1.y, oneThird, v2.x, v2.y, oneThird);\r\n const direction = Vector2d.createStartEnd(circumcenter, midPoint);\r\n if (midPoint.dotVectorsToTargets(circumcenter, centroid) < 0)\r\n direction.negate(direction); // ensure direction points away from triangle\r\n const bisector = Ray2d.createOriginAndDirectionCapture(Point2d.createFrom(circumcenter), direction, Voronoi._workRay);\r\n const fractions = box.intersect(bisector);\r\n const haveTwoIntersections = undefined !== fractions && fractions.length === 2;\r\n if (!haveTwoIntersections || (fractions[0] <= 0 && fractions[1] <= 0) || (fractions[0] >= 1 && fractions[1] >= 1))\r\n return undefined; // bisector ray lies outside box\r\n const start = bisector.fractionToPoint(Geometry.clamp(fractions[0], 0, 1), Voronoi._workXY0);\r\n const end = bisector.fractionToPoint(fractions[1], Voronoi._workXY1);\r\n return {start, end};\r\n }\r\n /** Add the edge of an unbounded Voronoi region that corresponds to a Delaunay boundary edge; clip it at the boundary. */\r\n private addVoronoiEdgeForDelaunayBoundaryEdge(edge: HalfEdge, box: VoronoiBoundary): boolean {\r\n const triangleId = this.getTriangleId(edge);\r\n if (triangleId < 0)\r\n return false; // invalid graph (not a triangulation)\r\n const circumcenter = this._circumcenterMap.get(triangleId);\r\n if (!circumcenter)\r\n return true; // skip Delaunay edge (degenerate boundary triangle)\r\n const bisector = this.getTriangleEdgeBisector(edge, circumcenter, box);\r\n if (!bisector)\r\n return true; // skip Delaunay edge (bisector ray outside box)\r\n const faceTag0 = this._idToIndexMap.get(edge.edgeMate.id);\r\n const faceTag1 = this._idToIndexMap.get(edge.id);\r\n Voronoi.addEdgeWithFaceTags(this._voronoiGraph, bisector.start, bisector.end, faceTag0, faceTag1);\r\n return true;\r\n }\r\n /** Add the edge of a bounded Voronoi region that corresponds to a Delaunay interior edge. */\r\n private addVoronoiEdgeForDelaunayInteriorEdge(edge: HalfEdge, box: VoronoiBoundary, distanceTol: number): boolean {\r\n const triangleId0 = this.getTriangleId(edge);\r\n const triangleId1 = this.getTriangleId(edge.edgeMate);\r\n if (triangleId0 < 0 || triangleId1 < 0)\r\n return false; // invalid graph (not a triangulation)\r\n const circumcenter0 = this._circumcenterMap.get(triangleId0);\r\n const circumcenter1 = this._circumcenterMap.get(triangleId1);\r\n if (!circumcenter0 && !circumcenter1)\r\n return true; // skip Delaunay edge between degenerate triangles\r\n if (!circumcenter0 || !circumcenter1) {\r\n // only one triangle is degenerate; if it is a boundary triangle, treat the opposite edge as a boundary\r\n if (!circumcenter0 && edge.findMaskAroundFace(HalfEdgeMask.BOUNDARY_EDGE))\r\n return this.addVoronoiEdgeForDelaunayBoundaryEdge(edge.edgeMate, box);\r\n if (!circumcenter1 && edge.edgeMate.findMaskAroundFace(HalfEdgeMask.BOUNDARY_EDGE))\r\n return this.addVoronoiEdgeForDelaunayBoundaryEdge(edge, box);\r\n return false; // invalid graph (interior degenerate triangle)\r\n }\r\n if (XAndY.almostEqual(circumcenter0, circumcenter1, distanceTol))\r\n return true; // skip trivial Voronoi edge (it will collapse during clustering)\r\n const segment = Ray2d.createOriginAndTarget(circumcenter0, circumcenter1, Voronoi._workRay);\r\n const fractions = box.intersect(segment);\r\n const haveTwoIntersections = undefined !== fractions && fractions.length === 2;\r\n if (!haveTwoIntersections || (fractions[0] <= 0 && fractions[1] <= 0) || (fractions[0] >= 1 && fractions[1] >= 1))\r\n return true; // skip Delaunay edge whose Voronoi segment is outside box\r\n const pt0 = segment.fractionToPoint(Geometry.clamp(fractions[0], 0, 1), Voronoi._workXY0);\r\n const pt1 = segment.fractionToPoint(Geometry.clamp(fractions[1], 0, 1), Voronoi._workXY1);\r\n const faceTag0 = this._idToIndexMap.get(edge.edgeMate.id);\r\n const faceTag1 = this._idToIndexMap.get(edge.id);\r\n Voronoi.addEdgeWithFaceTags(this._voronoiGraph, pt0, pt1, faceTag0, faceTag1);\r\n return true;\r\n }\r\n /** Mask the exterior face, and set missing interior face tags */\r\n private populateMasksAndFaceTags(): void {\r\n this._voronoiGraph.announceFaceLoops(\r\n (_g, face: HalfEdge) => {\r\n let faceTag: number | undefined;\r\n let edge = face;\r\n do { // look around the face for a faceTag\r\n faceTag = edge.faceTag;\r\n edge = edge.faceSuccessor;\r\n } while (faceTag === undefined && edge !== face);\r\n if (faceTag !== undefined) // ensure faceTag is set around the interior face\r\n face.announceEdgesInFace((e: HalfEdge) => e.faceTag = faceTag);\r\n else // mask the edges of the exterior face\r\n face.announceEdgesInFace((e: HalfEdge) => { e.setMask(HalfEdgeMask.EXTERIOR); e.setMaskAroundEdge(HalfEdgeMask.BOUNDARY_EDGE); });\r\n return true;\r\n },\r\n );\r\n }\r\n /**\r\n * Construct a Voronoi instance from a Delaunay triangulation.\r\n * * The Delaunay generating vertex `v` for a returned Voronoi region `R` is encoded thusly:\r\n * * For each [[HalfEdge]] `e` in the face loop of `R`, `delaunayGraph.allHalfEdges[e.faceTag]` is a HalfEdge in the\r\n * vertex loop of `v`.\r\n * * The same `faceTag` is assigned to all HalfEdges in the face loop of `R`.\r\n * * For best results:\r\n * * The input triangulation should be Delaunay and have convex boundary.\r\n * * Each HalfEdge in the exterior face loop of the input graph should have `HalfEdgeMask.BOUNDARY_EDGE` set on both edge mates.\r\n * * Each HalfEdge in the exterior face loop of the input graph should have `HalfEdgeMask.EXTERIOR` set.\r\n * * The input graph should not contain any pair of vertices closer than `distanceTol`.\r\n * * The input graph should not contain any triangle altitude smaller than `distanceTol` (this is a degenerate triangle).\r\n * @param delaunayGraph A HalfEdgeGraph representing a Delaunay triangulation. Z-coordinates are ignored.\r\n * @param distanceTol Optional distance tolerance to use when comparing points; default is `Geometry.smallMetricDistance`.\r\n * @param boundingBox Optional nominal xy-bounding box for the Voronoi diagram. Default uses the Delaunay circumcenter range so\r\n * that interior Voronoi regions are maximal.\r\n * @returns a new instance containing the Voronoi diagram derived from the input graph, or `undefined` if invalid input.\r\n */\r\n public static createFromDelaunayGraph(\r\n delaunayGraph: HalfEdgeGraph,\r\n distanceTol: number = Geometry.smallMetricDistance,\r\n boundingBox?: LowAndHighXY,\r\n ): Voronoi | undefined {\r\n const instance = new Voronoi(delaunayGraph);\r\n if (!instance.isValid)\r\n return undefined;\r\n let isValidVoronoi = true;\r\n const box = new VoronoiBoundary(instance._inputGraphRange, boundingBox ? boundingBox : instance._circumcenterRange);\r\n // iterate Delaunay edges and add Voronoi edges:\r\n // * for each boundary edge, add a bisector separating unbounded Voronoi cells\r\n // * for each interior edge, add a segment joining the adjacent triangles' circumcenters\r\n instance._inputGraph.announceEdges(\r\n (_g, edge: HalfEdge) => {\r\n if (edge.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE)) {\r\n if (edge.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n edge = edge.edgeMate;\r\n return isValidVoronoi = instance.addVoronoiEdgeForDelaunayBoundaryEdge(edge, box);\r\n }\r\n return isValidVoronoi = instance.addVoronoiEdgeForDelaunayInteriorEdge(edge, box, distanceTol);\r\n },\r\n );\r\n if (!isValidVoronoi)\r\n return undefined;\r\n box.addEdgesToGraph(instance._voronoiGraph);\r\n HalfEdgeGraphMerge.splitIntersectingEdges(instance._voronoiGraph, distanceTol);\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(instance._voronoiGraph, undefined, distanceTol);\r\n instance.populateMasksAndFaceTags();\r\n return instance;\r\n }\r\n /** Create a graph from ordered colinear points; optional Dictionary supplies edgeTag for the HalfEdges at each vertex. */\r\n private static createColinearXYGraph(points: XAndY[] | Dictionary<Point3d, number>): HalfEdgeGraph {\r\n const colinearGraph = new HalfEdgeGraph();\r\n let indices: number[] | undefined;\r\n if (!Array.isArray(points)) {\r\n indices = Array.from(points.values());\r\n points = Array.from(points.keys());\r\n }\r\n if (points.length < 2)\r\n return colinearGraph; // empty\r\n let prevNode = this.addEdgeWithEdgeTags(colinearGraph, points[0], points[1], indices ? indices[0] : 0, indices ? indices[1] : 0,)\r\n for (let i = 1; i < points.length - 1; i++) {\r\n const nextNode = this.addEdgeWithEdgeTags(colinearGraph, points[i], points[i + 1], indices ? indices[i] : 0, indices ? indices[i + 1] : 0);\r\n HalfEdge.pinch(prevNode.faceSuccessor, nextNode);\r\n prevNode = nextNode;\r\n }\r\n colinearGraph.setMask(HalfEdgeMask.EXTERIOR | HalfEdgeMask.BOUNDARY_EDGE);\r\n return colinearGraph;\r\n }\r\n /** Return a segment along the bisector of the given edge. Clip the bisector to the Voronoi boundary. */\r\n private static getEdgeBisector(edge: HalfEdge, box: VoronoiBoundary): Voronoi.Segment2d | undefined {\r\n const v0 = edge;\r\n const v1 = edge.faceSuccessor;\r\n const midPoint = Point2d.createAdd2ScaledXY(v0.x, v0.y, 0.5, v1.x, v1.y, 0.5);\r\n const perpendicular = Vector2d.createStartEnd(v0, v1);\r\n [perpendicular.x, perpendicular.y] = [-perpendicular.y, perpendicular.x];\r\n const bisector = Ray2d.createOriginAndDirectionCapture(midPoint, perpendicular);\r\n const fractions = box.intersect(bisector);\r\n const haveIntersections = undefined !== fractions && fractions.length > 1 && fractions[0] < 0 && fractions[1] > 0;\r\n assert(haveIntersections, \"Midpoints should be strictly inside bounding box\");\r\n return haveIntersections ? { start: bisector.fractionToPoint(fractions[0]), end: bisector.fractionToPoint(fractions[1]) } : undefined;\r\n }\r\n /** Construct a Voronoi instance from a graph representing a colinear linestring. */\r\n private static createFromColinearGraph(\r\n colinearGraph: HalfEdgeGraph,\r\n distanceTol: number = Geometry.smallMetricDistance,\r\n boundingBox?: LowAndHighXY,\r\n ): Voronoi | undefined {\r\n const instance = new Voronoi(colinearGraph, true);\r\n if (!instance.isValid)\r\n return undefined;\r\n let isValidVoronoi = true;\r\n const box = new VoronoiBoundary(instance._inputGraphRange, boundingBox);\r\n instance._inputGraph.announceEdges(\r\n (_g, edge: HalfEdge) => {\r\n const bisector = Voronoi.getEdgeBisector(edge, box);\r\n if (!bisector)\r\n return isValidVoronoi = false; // edge midpoint outside box (shouldn't happen)\r\n const faceTag0 = instance._idToIndexMap.get(edge.id);\r\n const faceTag1 = instance._idToIndexMap.get(edge.edgeMate.id);\r\n this.addEdgeWithFaceTags(instance._voronoiGraph, bisector.start, bisector.end, faceTag0, faceTag1);\r\n return true;\r\n },\r\n );\r\n if (!isValidVoronoi)\r\n return undefined;\r\n box.addEdgesToGraph(instance._voronoiGraph);\r\n HalfEdgeGraphMerge.splitIntersectingEdges(instance._voronoiGraph, distanceTol);\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(instance._voronoiGraph, undefined, distanceTol);\r\n instance.populateMasksAndFaceTags();\r\n return instance;\r\n }\r\n /**\r\n * Construct a Voronoi instance from a set of points.\r\n * @param points An array of points. Z-coordinates are ignored. Points can be colinear.\r\n * @param distanceTol Optional distance tolerance to use when comparing points; default is [[Geometry.smallMetricDistance]].\r\n * @param boundingBox Optional nominal xy-bounding box for the Voronoi diagram. If unspecified, interior Voronoi cells are maximal.\r\n * @returns a new instance containing the Voronoi diagram derived from the input points, or `undefined` if invalid input.\r\n */\r\n public static createFromPoints(\r\n points: Point3d[],\r\n distanceTol: number = Geometry.smallMetricDistance,\r\n boundingBox?: LowAndHighXY,\r\n ): Voronoi | undefined {\r\n const sortedPoints = new SortedArray<Point3d>(Geometry.compareXY(distanceTol), DuplicatePolicy.Retain, (p: Point3d) => p.clone());\r\n points.forEach((pt: Point3d) => sortedPoints.insert(pt));\r\n const uniquePoints = sortedPoints.extractArray();\r\n if (uniquePoints.length < 2)\r\n return undefined;\r\n if (PolylineOps.isColinear(uniquePoints, distanceTol, true)) {\r\n const colinearGraph = Voronoi.createColinearXYGraph(uniquePoints);\r\n return colinearGraph ? Voronoi.createFromColinearGraph(colinearGraph, distanceTol, boundingBox) : undefined;\r\n } else {\r\n const delaunayGraph = Triangulator.createTriangulatedGraphFromPoints(uniquePoints, undefined, distanceTol);\r\n return delaunayGraph ? Voronoi.createFromDelaunayGraph(delaunayGraph, distanceTol, boundingBox) : undefined;\r\n }\r\n }\r\n /** Stroke the curve interior, and associate the stroke points to the given index. Return first and last point. */\r\n private static pushInteriorStrokePoints(pointToIndex: Dictionary<Point3d, number>, curve: CurvePrimitive, index: number, strokeOptions?: StrokeOptions, workPoint?: Point3d): Voronoi.Stroke01 {\r\n const strokes = LineString3d.create();\r\n curve.emitStrokes(strokes, strokeOptions);\r\n let pt: Point3d | undefined;\r\n const n = strokes.numPoints();\r\n for (let i = 1; i < n - 1; ++i) { // skip first and last point\r\n if (pt = strokes.pointAt(i, workPoint))\r\n pointToIndex.insert(pt, index);\r\n }\r\n assert(() => n > 2, \"Expect at least 1 interior stroke point\");\r\n const p0 = (n > 2 ? strokes.pointAt(1) : undefined) ?? curve.fractionToPoint(0.5);\r\n const p1 = (n > 2 ? strokes.pointAt(n - 2) : undefined) ?? p0;\r\n return {p0, p1};\r\n }\r\n /** Intersect the circle with the curve and return the intersection closest to the desired curve endpoint. */\r\n private static computeCircleIntersection(circle: Arc3d, curve: CurvePrimitive, atCurveStart: boolean, distanceTol?: number): Point3d | undefined {\r\n const intersections = CurveCurve.intersectionProjectedXYPairs(undefined, circle, false, curve, false, distanceTol);\r\n if (!intersections.length)\r\n return undefined;\r\n if (intersections.length > 1) { // detailB has the info for curve\r\n if (atCurveStart)\r\n intersections.sort((a, b) => a.detailB.fraction - b.detailB.fraction); // first intersection is closest to curve start\r\n else\r\n intersections.sort((a, b) => b.detailB.fraction - a.detailB.fraction); // first intersection is closest to curve end\r\n }\r\n return intersections[0].detailB.point;\r\n };\r\n /** Intersect two consecutive curves with a tiny circle centered at their joint, and associate the intersection on each curve with its respective index. */\r\n private static pushSymmetricPointPairAtJoint = (pointToIndex: Dictionary<Point3d, number>, prevStroke: Voronoi.StrokeData, nextStroke: Voronoi.StrokeData, distanceTol?: number, workArc?: Arc3d): boolean => {\r\n const circle = Arc3d.createUnitCircle(workArc);\r\n const joint = nextStroke.cp.startPoint(circle.centerRef);\r\n // ensure the symmetric pair we add will be the last/first stroke points on prev/next curve\r\n const radius = 0.5 * Math.min(prevStroke.pt.distance(joint), nextStroke.pt.distance(joint));\r\n circle.matrixRef.setAt(0, 0, radius);\r\n circle.matrixRef.setAt(1, 1, radius);\r\n const prevPt = this.computeCircleIntersection(circle, prevStroke.cp, false, distanceTol);\r\n const nextPt = this.computeCircleIntersection(circle, nextStroke.cp, true, distanceTol);\r\n if (!prevPt || !nextPt) {\r\n assert(() => false, \"Failed to add symmetric strokes at joint\");\r\n return false;\r\n }\r\n pointToIndex.set(prevPt, prevStroke.i);\r\n pointToIndex.set(nextPt, nextStroke.i);\r\n return true;\r\n }\r\n /** Stroke each curve in the chain and associate each point with the index of its generating curve in the chain. */\r\n private static createStrokePointsWithIndices(\r\n curveChain: CurveChain, strokeOptions?: StrokeOptions, distanceTol: number = Geometry.smallMetricDistance\r\n ): Dictionary<Point3d, number> | undefined {\r\n const children = curveChain.children;\r\n if (!children)\r\n return undefined;\r\n const numChildren = children.length;\r\n if (numChildren < 2)\r\n return undefined;\r\n strokeOptions = strokeOptions?.clone() ?? StrokeOptions.createForCurves();\r\n if (!strokeOptions.minStrokesPerPrimitive || strokeOptions.minStrokesPerPrimitive < 2)\r\n strokeOptions.minStrokesPerPrimitive = 2; // ensure at least one interior point per primitive\r\n const workPoint = Point3d.createZero();\r\n const workCircle = Arc3d.createUnitCircle(Voronoi._workArc);\r\n const workSegment0 = LineSegment3d.createXYXY(0, 0, 0, 0);\r\n const workRay = Ray3d.createZero();\r\n let stroke0: Voronoi.StrokeData | undefined;\r\n let prevStroke: Voronoi.StrokeData | undefined;\r\n let firstLastStroke: Voronoi.Stroke01;\r\n // lambda for iterating the chain, splitting a linestring primitive into segments\r\n const getNextCurve = (cp: CurvePrimitive, index: number): CurvePrimitive | undefined => cp instanceof LineString3d ? cp.getIndexedSegment(index, workSegment0) : index ? undefined : cp;\r\n const pointToIndex = new Dictionary<Point3d, number>(Geometry.compareXY(distanceTol), (p: Point3d) => p.clone());\r\n // Step 1: add open chain start/end point\r\n const isClosedChain = curveChain.isPhysicallyClosedCurve(distanceTol, true);\r\n if (!isClosedChain) {\r\n if (curveChain.startPoint(workPoint))\r\n pointToIndex.insert(workPoint, 0);\r\n if (curveChain.endPoint(workPoint))\r\n pointToIndex.insert(workPoint, numChildren - 1);\r\n }\r\n // Step 2: add interior stroke points for each chain primitive\r\n // To ensure Voronoi edges exactly hit the chain joints, the joints themselves are omitted from the strokes\r\n for (let i = 0; i < numChildren; i++) {\r\n let child = children[i];\r\n if (CurveOps.isColinear(child, { colinearRay: workRay, xyColinear: true, maxDeviation: distanceTol }))\r\n child = LineSegment3d.createCapture(child.startPoint(), child.endPoint());\r\n let j = 0;\r\n for (let currCurve: CurvePrimitive | undefined; currCurve = getNextCurve(child, j); j++) {\r\n firstLastStroke = this.pushInteriorStrokePoints(pointToIndex, currCurve, i, strokeOptions, workPoint);\r\n const currStroke = { pt: firstLastStroke.p0, cp: currCurve, i };\r\n if (prevStroke)\r\n this.pushSymmetricPointPairAtJoint(pointToIndex, prevStroke, currStroke, distanceTol, workCircle);\r\n stroke0 = (isClosedChain && i === 0 && j === 0) ? currStroke : stroke0;\r\n prevStroke = { pt: firstLastStroke.p1, cp: currCurve, i };\r\n }\r\n }\r\n // Step 3: handle the seam if necessary\r\n if (prevStroke && stroke0)\r\n this.pushSymmetricPointPairAtJoint(pointToIndex, prevStroke, stroke0, distanceTol, workCircle);\r\n return pointToIndex;\r\n }\r\n /** Construct a graph from unique xy points. */\r\n private static createGraphFromPointsWithIndices(\r\n pointToIndex: Dictionary<Point3d, number>, distanceTol: number,\r\n ): { graph: HalfEdgeGraph, isTriangulation: boolean } | undefined {\r\n if (pointToIndex.size < 2)\r\n return undefined;\r\n let graph: HalfEdgeGraph | undefined;\r\n let isTriangulation = false;\r\n const workPoint = Point3d.createZero();\r\n const points = Array.from(pointToIndex.keys());\r\n if (PolylineOps.isColinear(points, distanceTol, true)) {\r\n graph = Voronoi.createColinearXYGraph(pointToIndex);\r\n isTriangulation = false;\r\n } else {\r\n // tighter triangulation tolerance to reduce vertex consolidation that might result in dictionary misses\r\n graph = Triangulator.createTriangulatedGraphFromPoints(points, undefined, 0.1 * distanceTol);\r\n if (isTriangulation = (graph !== undefined)) {\r\n // tag every edge of the Delaunay graph with the index associated to its start vertex\r\n graph.announceVertexLoops(\r\n (_g, vertex: HalfEdge): boolean => {\r\n const index = pointToIndex.get(vertex.getPoint3d(workPoint));\r\n assert(index !== undefined, \"Delaunay vertex must know its generating curve\");\r\n if (index !== undefined)\r\n vertex.announceEdgesAroundVertex((edge: HalfEdge) => edge.edgeTag = index);\r\n return true;\r\n }\r\n );\r\n }\r\n }\r\n return graph ? { graph, isTriangulation } : undefined;\r\n }\r\n /**\r\n * Create a Voronoi instance from a curve chain.\r\n * * This is the curve-based analog for point-based Voronoi cells.\r\n * * Each curve in the chain is sampled and a Voronoi diagram is generated from the Delaunay triangulation of all samples.\r\n * * The union of Voronoi cells generated by a single curve's samples is:\r\n * * an approximation to the xy-region of points closest to the curve\r\n * * represented in the Voronoi graph by a _super face_, a loop of edges from multiple adjacent faces\r\n * * not necessarily convex\r\n * * The generating curve with chain index `i` for the returned Voronoi super face `R` is encoded thusly:\r\n * * Each Voronoi edge has `faceTag` set as per [[createFromDelaunayGraph]], referring to its generating Delaunay vertex.\r\n * * Each Delaunay edge has `edgeTag` set to the index in `curveChain` of its generating curve.\r\n * * For each [[HalfEdge]] `e` in the super face loop of `R`, `delaunayGraph.allHalfEdges[e.faceTag].edgeTag === i`.\r\n * @param curveChain A curve chain consisting of at least two [[CurvePrimitive]]s. Z-coordinates are ignored.\r\n * The length of each child should exceed `distanceTol`.\r\n * @param strokeOptions Optional stroke options to control the sampling of the curve chain.\r\n * @param distanceTol Optional distance tolerance to use when comparing points; default is [[Geometry.smallMetricDistance]].\r\n * @param boundingBox Optional nominal xy-bounding box for the Voronoi diagram. If unspecified, interior Voronoi cells are maximal.\r\n * @returns a new instance, or `undefined` for invalid input.\r\n */\r\n public static createFromCurveChain(\r\n curveChain: CurveChain,\r\n strokeOptions?: StrokeOptions,\r\n distanceTol: number = Geometry.smallMetricDistance,\r\n boundingBox?: LowAndHighXY,\r\n ): Voronoi | undefined {\r\n const pointsWithIndices = Voronoi.createStrokePointsWithIndices(curveChain, strokeOptions);\r\n if (!pointsWithIndices)\r\n return undefined; // no points created from the curve chain\r\n const inputGraph = Voronoi.createGraphFromPointsWithIndices(pointsWithIndices, distanceTol);\r\n if (!inputGraph)\r\n return undefined; // no graph created from points\r\n const instance = inputGraph.isTriangulation ?\r\n Voronoi.createFromDelaunayGraph(inputGraph.graph, distanceTol, boundingBox) :\r\n Voronoi.createFromColinearGraph(inputGraph.graph, distanceTol, boundingBox);\r\n if (instance)\r\n instance._isCurveBased = true;\r\n return instance;\r\n }\r\n /**\r\n * Test whether the edge is part of a curve-based Voronoi graph super face.\r\n * @param curveIndex optional test for a _specific_ super face associated with the curve with the given index.\r\n */\r\n private isEdgeInVoronoiSuperFace(edge: HalfEdge, curveIndex?: number): boolean {\r\n if (!this._isCurveBased || edge.faceTag === undefined)\r\n return false;\r\n const edgeIndex = this._inputGraph.allHalfEdges[edge.faceTag].edgeTag;\r\n if (edge.edgeMate.isMaskSet(HalfEdgeMask.EXTERIOR)) // edge is part of an unbounded Voronoi super face clipped by the bounding box\r\n return curveIndex === undefined ? true : curveIndex === edgeIndex;\r\n if (edge.edgeMate.faceTag === undefined)\r\n return false;\r\n const mateIndex = this._inputGraph.allHalfEdges[edge.edgeMate.faceTag].edgeTag;\r\n if (curveIndex !== undefined)\r\n return edgeIndex === curveIndex && mateIndex !== curveIndex; // edge is in a specific super face\r\n return edgeIndex !== mateIndex; // edge is part of a bounded Voronoi super face\r\n }\r\n /** Examine all edges in the curve-based Voronoi graph and return the first edge in an unvisited Voronoi super face. */\r\n private findNextVoronoiSuperFaceStart(): HalfEdge | undefined {\r\n if (!this._isCurveBased)\r\n return undefined;\r\n let start: HalfEdge | undefined;\r\n this._voronoiGraph.announceEdges((_g, edge: HalfEdge) => {\r\n if (edge.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return true; // skip exterior face\r\n if (edge.isMaskSet(this._superFaceMask))\r\n return true; // skip previously visited super face\r\n if (!this.isEdgeInVoronoiSuperFace(edge))\r\n return true; // skip edge; keep searching\r\n assert(() => edge.faceTag !== undefined, \"Voronoi edge must know its generating Delaunay vertex\");\r\n assert(() => this._inputGraph.allHalfEdges[edge.faceTag].edgeTag !== undefined, \"Delaunay vertex must know its generating curve\");\r\n start = edge;\r\n return false; // stop search; we found an unvisited super face\r\n });\r\n return start;\r\n }\r\n /**\r\n * Traverse the curve-based Voronoi graph and collect the edges comprising the Voronoi super face that starts with\r\n * the given seed edge.\r\n */\r\n private collectVoronoiSuperFace(seed: HalfEdge): HalfEdge[] | undefined {\r\n if (!this._isCurveBased || seed.faceTag === undefined)\r\n return undefined;\r\n const superFace: HalfEdge[] = [];\r\n const curveIndex = this._inputGraph.allHalfEdges[seed.faceTag].edgeTag;\r\n const foundSuperFace = seed.announceEdgesInSuperFace(\r\n (e: HalfEdge) => !this.isEdgeInVoronoiSuperFace(e, curveIndex), // skipEdge\r\n (e: HalfEdge) => { superFace.push(e); e.setMask(this._superFaceMask); }, // announceEdge\r\n );\r\n return (foundSuperFace && superFace.length > 2) ? superFace : undefined;\r\n }\r\n /**\r\n * Compute super faces of a curve-based Voronoi diagram.\r\n * * The instance must have been constructed with [[createFromCurveChain]].\r\n * * Each super face corresponds to the planar region of points closer to one curve in the generating chain than to any other.\r\n * * Each returned edge is masked for querying by subsequent methods.\r\n * @param numSuperFaces maximum number of super faces to return.\r\n * @returns up to `numSuperFaces` Voronoi super faces, sorted by curve index, or `undefined` if invalid input.\r\n * Each super face is an array of HalfEdges that form a loop.\r\n */\r\n public computeVoronoiSuperFaces(numSuperFaces: number): HalfEdge[][] | undefined {\r\n if (!this._isCurveBased || numSuperFaces < 1)\r\n return undefined;\r\n const superFaces: HalfEdge[][] = [];\r\n if (this._superFaceMask === HalfEdgeMask.NULL_MASK)\r\n this._superFaceMask = this._voronoiGraph.grabMask(false);\r\n this._voronoiGraph.clearMask(this._superFaceMask);\r\n for (let i = 0; i < numSuperFaces; i++) {\r\n const start = this.findNextVoronoiSuperFaceStart();\r\n if (!start)\r\n break; // no more super faces to find\r\n const superFace = this.collectVoronoiSuperFace(start);\r\n if (!superFace)\r\n return undefined; // invalid Voronoi graph\r\n superFaces.push(superFace);\r\n }\r\n superFaces.sort((a, b) => {\r\n const tagA = this._inputGraph.allHalfEdges[a[0].faceTag].edgeTag;\r\n const tagB = this._inputGraph.allHalfEdges[b[0].faceTag].edgeTag;\r\n return tagA - tagB;\r\n });\r\n return (superFaces.length > 0) ? superFaces : undefined;\r\n }\r\n /**\r\n * Construct a clipper for each curve-based Voronoi super face in the input array.\r\n * @param superFaces array returned by [[collectVoronoiSuperFaces]].\r\n * @returns array of clippers; the i_th clipper corresponds to the i_th input super face.\r\n * Returns `undefined` if input is invalid, or if a clipper construction failed.\r\n */\r\n public generateClippersFromVoronoiSuperFaces(superFaces: HalfEdge[][]): UnionOfConvexClipPlaneSets[] | undefined {\r\n if (!this._isCurveBased || this._superFaceMask === HalfEdgeMask.NULL_MASK)\r\n return undefined;\r\n const allClippers: UnionOfConvexClipPlaneSets[] = [];\r\n const superFaceOutsideMask = this._voronoiGraph.grabMask();\r\n const visitedMask = this._voronoiGraph.grabMask();\r\n const maskOutsideOfSuperFace = (startEdge: HalfEdge, clearMask: boolean): boolean => {\r\n return startEdge.announceEdgesInSuperFace(\r\n (e: HalfEdge) => !e.isMaskSet(this._superFaceMask),\r\n (e: HalfEdge) => e.edgeMate.applyMask(superFaceOutsideMask, clearMask),\r\n );\r\n };\r\n // Step 0: split each super face into convex faces (clipper prerequisite)\r\n // Disable triangle-flipping; we don't care about aspect ratio here.\r\n Triangulator.triangulateAllInteriorFaces(this._voronoiGraph, false, true);\r\n HalfEdgeGraphOps.expandConvexFaces(this._voronoiGraph, this._superFaceMask);\r\n for (const superFace of superFaces) {\r\n if (superFace.length < 3) {\r\n allClippers.length = 0;\r\n break; // invalid Voronoi graph\r\n }\r\n // Step 1: collect the convex faces for this super face\r\n const convexFaces: HalfEdge[] = [];\r\n if (!maskOutsideOfSuperFace(superFace[0], false)) {\r\n allClippers.length = 0;\r\n break; // invalid Voronoi graph\r\n }\r\n HalfEdgeGraphSearch.exploreComponent(superFace[0], visitedMask, superFaceOutsideMask, undefined, convexFaces);\r\n maskOutsideOfSuperFace(superFace[0], true);\r\n // Step 2: generate a clipper for each convex face\r\n const clippers: ConvexClipPlaneSet[] = [];\r\n for (const face of convexFaces) {\r\n const clipPlanes: ClipPlane[] = [];\r\n face.announceEdgesInFace((edge: HalfEdge) => {\r\n if (!edge.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE)) {\r\n const clipPlane = ClipPlane.createMidPointEdgeXY(edge, edge.faceSuccessor);\r\n if (clipPlane)\r\n clipPlanes.push(clipPlane);\r\n }\r\n });\r\n if (clipPlanes.length === face.countMaskAroundFace(HalfEdgeMask.BOUNDARY_EDGE, false))\r\n clippers.push(ConvexClipPlaneSet.createPlanes(clipPlanes));\r\n }\r\n // Step 3: assemble the clippers for this super face\r\n if (clippers.length === convexFaces.length)\r\n allClippers.push(UnionOfConvexClipPlaneSets.createConvexSets(clippers));\r\n }\r\n this._voronoiGraph.dropMask(visitedMask);\r\n this._voronoiGraph.dropMask(superFaceOutsideMask);\r\n return allClippers.length === superFaces.length ? allClippers : undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Interfaces used by the Voronoi class.\r\n * @internal\r\n */\r\nexport namespace Voronoi {\r\n /** An interface to represent a 2D line segment */\r\n export interface Segment2d { start: XAndY; end: XAndY };\r\n /** An interface to represent a single stroke point with an associated index. */\r\n export interface StrokeData { pt: Point3d, cp: CurvePrimitive, i: number };\r\n /** An interface to represent two stroke points, e.g., first and last. */\r\n export interface Stroke01 { p0: Point3d, p1: Point3d };\r\n}\r\n\r\n/**\r\n * A class to represent a bounding box for a Voronoi diagram.\r\n * * A Voronoi diagram is unbounded, so we create a large rectangle around the diagram to limit it.\r\n * * To avoid clipping bounded Voronoi cells, this boundary should be large enough to contain the\r\n * circumcenters of the Delaunay triangles.\r\n * @internal\r\n */\r\nclass VoronoiBoundary {\r\n public bbox: Range2d;\r\n /**\r\n * Constructor that takes up to two ranges to union and expand by a margin.\r\n * * For example, Delaunay graph range and circumcenter range.\r\n */\r\n public constructor(r0: LowAndHighXY, r1?: LowAndHighXY) {\r\n this.bbox = Range2d.createFrom(r0);\r\n if (r1)\r\n this.bbox.union(r1, this.bbox);\r\n if (!this.bbox.isNull && !this.bbox.isSinglePoint) {\r\n const pad = 0.02473 * (this.bbox.xLength() + this.bbox.yLength()); // ~5% of average side length\r\n this.bbox.expandInPlace(pad);\r\n }\r\n }\r\n /** Compute the intersection fractions of the ray and this boundary. */\r\n public intersect(ray: Ray2d): number[] | undefined {\r\n const fractionalRange = ray.intersectionWithRange2d(this.bbox);\r\n if (fractionalRange.isNull)\r\n return undefined;\r\n if (fractionalRange.isSinglePoint)\r\n return [fractionalRange.low];\r\n return [fractionalRange.low, fractionalRange.high];\r\n }\r\n /** Add edges of this boundary to the graph. */\r\n public addEdgesToGraph(graph: HalfEdgeGraph) {\r\n graph.addEdgeXY(this.bbox.low.x, this.bbox.low.y, this.bbox.high.x, this.bbox.low.y);\r\n graph.addEdgeXY(this.bbox.high.x, this.bbox.low.y, this.bbox.high.x, this.bbox.high.y);\r\n graph.addEdgeXY(this.bbox.high.x, this.bbox.high.y, this.bbox.low.x, this.bbox.high.y);\r\n graph.addEdgeXY(this.bbox.low.x, this.bbox.high.y, this.bbox.low.x, this.bbox.low.y);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Voronoi.js","sourceRoot":"","sources":["../../../src/topology/Voronoi.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 Bspline\n */\n\nimport { assert, Dictionary, DuplicatePolicy, SortedArray } from \"@itwin/core-bentley\";\nimport { ClipPlane } from \"../clipping/ClipPlane\";\nimport { ConvexClipPlaneSet } from \"../clipping/ConvexClipPlaneSet\";\nimport { UnionOfConvexClipPlaneSets } from \"../clipping/UnionOfConvexClipPlaneSets\";\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CurveChain } from \"../curve/CurveCollection\";\nimport { CurveCurve } from \"../curve/CurveCurve\";\nimport { CurveOps } from \"../curve/CurveOps\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\nimport { Geometry } from \"../Geometry\";\nimport { Point2d, Vector2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { PolylineOps } from \"../geometry3d/PolylineOps\";\nimport { Range2d } from \"../geometry3d/Range\";\nimport { Ray2d } from \"../geometry3d/Ray2d\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { LowAndHighXY, XAndY } from \"../geometry3d/XYZProps\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { HalfEdgeGraphSearch } from \"./HalfEdgeGraphSearch\";\nimport { HalfEdgeGraphMerge, HalfEdgeGraphOps } from \"./Merging\";\nimport { Triangulator } from \"./Triangulation\";\n\n/**\n * A class to represent a Voronoi diagram in the xy-plane.\n * * A Voronoi diagram is a partitioning of the plane into regions of points closest to a given generating point or curve.\n * * It is constructed from the circumcenters of its dual Delaunay triangulation.\n * * Static construction methods take Delaunay, points, and CurveChain input.\n * * More info can be found here: https://en.wikipedia.org/wiki/Voronoi_diagram and\n * https://en.wikipedia.org/wiki/Delaunay_triangulation\n * @internal\n */\nexport class Voronoi {\n private _voronoiGraph: HalfEdgeGraph;\n private _inputGraph: HalfEdgeGraph;\n private _inputGraphIsTriangulation;\n private _inputGraphRange: Range2d;\n private _idToIndexMap: Map<number, number>;\n private _circumcenterMap: Map<number, XAndY>;\n private _circumcenterRange: Range2d;\n private _isCurveBased: boolean;\n private _superFaceMask: HalfEdgeMask;\n private static _workXY0 = Point2d.createZero();\n private static _workXY1 = Point2d.createZero();\n private static _workRay = Ray2d.createZero();\n private static _workArc = Arc3d.createUnitCircle();\n /** Construct an empty Voronoi graph and minimally validate input (use [[isValid]] to check). */\n private constructor(inputGraph: HalfEdgeGraph, isColinear = false) {\n this._voronoiGraph = new HalfEdgeGraph();\n this._inputGraph = inputGraph;\n this._inputGraphRange = HalfEdgeGraphOps.graphRangeXY(inputGraph);\n this._idToIndexMap = inputGraph.constructIdToVertexIndexMap();\n this._circumcenterMap = new Map<number, XAndY>();\n this._inputGraphIsTriangulation = isColinear ? false : this.populateCircumcenters(this._circumcenterMap);\n this._circumcenterRange = Range2d.createArray(Array.from(this._circumcenterMap.values()));\n this._isCurveBased = false;\n this._superFaceMask = HalfEdgeMask.NULL_MASK;\n }\n /**\n * Accessor for the graph passed into the private constructor.\n * * It is either a triangulation (assumed Delaunay) or a graph with no interior faces (assumed colinear path).\n */\n public get getInputGraph(): HalfEdgeGraph {\n return this._inputGraph;\n }\n /** Accessor for the input graph's range */\n public get getInputGraphRange(): Range2d {\n return this._inputGraphRange;\n }\n /**\n * Accessor for the Voronoi graph constructed from the input graph.\n * * The Voronoi graph is typically constructed by static createFromXXX methods.\n */\n public get getVoronoiGraph(): HalfEdgeGraph {\n return this._voronoiGraph;\n }\n /** Whether or not this instance represents a curve-based Voronoi diagram. */\n public get isCurveBased(): boolean {\n return this._isCurveBased;\n }\n /** Accessor for the super face mask used for constructing a curve-based Voronoi diagram. */\n public get getSuperFaceMask(): HalfEdgeMask {\n return this._superFaceMask;\n }\n /** Whether the constructor has created a minimally valid instance. */\n protected get isValid(): boolean {\n if (this._inputGraph.allHalfEdges.length < 2)\n return false;\n if (this._idToIndexMap.size === 0)\n return false;\n if (!this._inputGraphIsTriangulation)\n return true;\n return this._circumcenterMap.size > 0;\n }\n /** Add an edge to the graph and set its edgeTags. */\n private static addEdgeWithEdgeTags(graph: HalfEdgeGraph, p0: XAndY, p1: XAndY, edgeTag0?: number, edgeTag1?: number): HalfEdge {\n return graph.addEdgeXY(p0.x, p0.y, p1.x, p1.y, edgeTag0, edgeTag1);\n }\n /** Add an edge to the graph and set its faceTags. */\n private static addEdgeWithFaceTags(graph: HalfEdgeGraph, p0: XAndY, p1: XAndY, faceTag0?: number, faceTag1?: number): HalfEdge {\n return graph.addEdgeXY(p0.x, p0.y, p1.x, p1.y, undefined, undefined, faceTag0, faceTag1);\n }\n /** Return the smallest HalfEdge id in the face, or -1 if not a triangle. */\n private getTriangleId(face: HalfEdge): number {\n if (face !== face.faceSuccessor.faceSuccessor.faceSuccessor)\n return -1;\n return Math.min(face.id, face.faceSuccessor.id, face.facePredecessor.id);\n }\n /**\n * Populate a mapping from a triangle's id to its circumcircle.\n * @returns whether the input graph is a triangulation.\n */\n private populateCircumcenters(circumcenterMap: Map<number, XAndY>): boolean {\n circumcenterMap.clear();\n let isValid = true;\n const p0 = Point3d.createZero();\n const p1 = Point3d.createZero();\n const p2 = Point3d.createZero();\n this._inputGraph.announceFaceLoops(\n (_g: HalfEdgeGraph, face: HalfEdge) => {\n if (face.isMaskSet(HalfEdgeMask.EXTERIOR))\n return true;\n if (face.countEdgesAroundFace() !== 3)\n return isValid = false;\n face.getPoint3d(p0);\n face.faceSuccessor.getPoint3d(p1);\n face.facePredecessor.getPoint3d(p2);\n p0.z = p1.z = p2.z = 0;\n const circumcircle = Arc3d.createCircularStartMiddleEnd(p0, p1, p2, Voronoi._workArc);\n if (circumcircle instanceof Arc3d) // ignore a degenerate triangle\n circumcenterMap.set(this.getTriangleId(face), circumcircle.center); // getter clones center\n return true;\n },\n );\n if (!isValid)\n circumcenterMap.clear();\n return isValid;\n }\n /**\n * Return a segment along the bisector of the given triangle edge with the following properties:\n * * start point is the triangle's circumcenter\n * * end point is on the Voronoi boundary\n * * direction vector has positive dot product with the vector from triangle centroid to edge midpoint\n * @returns bisector segment, or undefined if the triangle circumcenter lies outside the Voronoi boundary\n */\n private getTriangleEdgeBisector(edge: HalfEdge, circumcenter: XAndY, box: VoronoiBoundary): Voronoi.Segment2d | undefined {\n const v0 = edge;\n const v1 = edge.faceSuccessor;\n const v2 = edge.facePredecessor;\n const oneThird = 1.0 / 3.0;\n const midPoint = Point2d.createAdd2ScaledXY(v0.x, v0.y, 0.5, v1.x, v1.y, 0.5);\n const centroid = Point2d.createAdd3ScaledXY(v0.x, v0.y, oneThird, v1.x, v1.y, oneThird, v2.x, v2.y, oneThird);\n const direction = Vector2d.createStartEnd(circumcenter, midPoint);\n if (midPoint.dotVectorsToTargets(circumcenter, centroid) < 0)\n direction.negate(direction); // ensure direction points away from triangle\n const bisector = Ray2d.createOriginAndDirectionCapture(Point2d.createFrom(circumcenter), direction, Voronoi._workRay);\n const fractions = box.intersect(bisector);\n const haveTwoIntersections = undefined !== fractions && fractions.length === 2;\n if (!haveTwoIntersections || (fractions[0] <= 0 && fractions[1] <= 0) || (fractions[0] >= 1 && fractions[1] >= 1))\n return undefined; // bisector ray lies outside box\n const start = bisector.fractionToPoint(Geometry.clamp(fractions[0], 0, 1), Voronoi._workXY0);\n const end = bisector.fractionToPoint(fractions[1], Voronoi._workXY1);\n return {start, end};\n }\n /** Add the edge of an unbounded Voronoi region that corresponds to a Delaunay boundary edge; clip it at the boundary. */\n private addVoronoiEdgeForDelaunayBoundaryEdge(edge: HalfEdge, box: VoronoiBoundary): boolean {\n const triangleId = this.getTriangleId(edge);\n if (triangleId < 0)\n return false; // invalid graph (not a triangulation)\n const circumcenter = this._circumcenterMap.get(triangleId);\n if (!circumcenter)\n return true; // skip Delaunay edge (degenerate boundary triangle)\n const bisector = this.getTriangleEdgeBisector(edge, circumcenter, box);\n if (!bisector)\n return true; // skip Delaunay edge (bisector ray outside box)\n const faceTag0 = this._idToIndexMap.get(edge.edgeMate.id);\n const faceTag1 = this._idToIndexMap.get(edge.id);\n Voronoi.addEdgeWithFaceTags(this._voronoiGraph, bisector.start, bisector.end, faceTag0, faceTag1);\n return true;\n }\n /** Add the edge of a bounded Voronoi region that corresponds to a Delaunay interior edge. */\n private addVoronoiEdgeForDelaunayInteriorEdge(edge: HalfEdge, box: VoronoiBoundary, distanceTol: number): boolean {\n const triangleId0 = this.getTriangleId(edge);\n const triangleId1 = this.getTriangleId(edge.edgeMate);\n if (triangleId0 < 0 || triangleId1 < 0)\n return false; // invalid graph (not a triangulation)\n const circumcenter0 = this._circumcenterMap.get(triangleId0);\n const circumcenter1 = this._circumcenterMap.get(triangleId1);\n if (!circumcenter0 && !circumcenter1)\n return true; // skip Delaunay edge between degenerate triangles\n if (!circumcenter0 || !circumcenter1) {\n // only one triangle is degenerate; if it is a boundary triangle, treat the opposite edge as a boundary\n if (!circumcenter0 && edge.findMaskAroundFace(HalfEdgeMask.BOUNDARY_EDGE))\n return this.addVoronoiEdgeForDelaunayBoundaryEdge(edge.edgeMate, box);\n if (!circumcenter1 && edge.edgeMate.findMaskAroundFace(HalfEdgeMask.BOUNDARY_EDGE))\n return this.addVoronoiEdgeForDelaunayBoundaryEdge(edge, box);\n return false; // invalid graph (interior degenerate triangle)\n }\n if (XAndY.almostEqual(circumcenter0, circumcenter1, distanceTol))\n return true; // skip trivial Voronoi edge (it will collapse during clustering)\n const segment = Ray2d.createOriginAndTarget(circumcenter0, circumcenter1, Voronoi._workRay);\n const fractions = box.intersect(segment);\n const haveTwoIntersections = undefined !== fractions && fractions.length === 2;\n if (!haveTwoIntersections || (fractions[0] <= 0 && fractions[1] <= 0) || (fractions[0] >= 1 && fractions[1] >= 1))\n return true; // skip Delaunay edge whose Voronoi segment is outside box\n const pt0 = segment.fractionToPoint(Geometry.clamp(fractions[0], 0, 1), Voronoi._workXY0);\n const pt1 = segment.fractionToPoint(Geometry.clamp(fractions[1], 0, 1), Voronoi._workXY1);\n const faceTag0 = this._idToIndexMap.get(edge.edgeMate.id);\n const faceTag1 = this._idToIndexMap.get(edge.id);\n Voronoi.addEdgeWithFaceTags(this._voronoiGraph, pt0, pt1, faceTag0, faceTag1);\n return true;\n }\n /** Mask the exterior face, and set missing interior face tags */\n private populateMasksAndFaceTags(): void {\n this._voronoiGraph.announceFaceLoops(\n (_g, face: HalfEdge) => {\n let faceTag: number | undefined;\n let edge = face;\n do { // look around the face for a faceTag\n faceTag = edge.faceTag;\n edge = edge.faceSuccessor;\n } while (faceTag === undefined && edge !== face);\n if (faceTag !== undefined) // ensure faceTag is set around the interior face\n face.announceEdgesInFace((e: HalfEdge) => e.faceTag = faceTag);\n else // mask the edges of the exterior face\n face.announceEdgesInFace((e: HalfEdge) => { e.setMask(HalfEdgeMask.EXTERIOR); e.setMaskAroundEdge(HalfEdgeMask.BOUNDARY_EDGE); });\n return true;\n },\n );\n }\n /**\n * Construct a Voronoi instance from a Delaunay triangulation.\n * * The Delaunay generating vertex `v` for a returned Voronoi region `R` is encoded thusly:\n * * For each [[HalfEdge]] `e` in the face loop of `R`, `delaunayGraph.allHalfEdges[e.faceTag]` is a HalfEdge in the\n * vertex loop of `v`.\n * * The same `faceTag` is assigned to all HalfEdges in the face loop of `R`.\n * * For best results:\n * * The input triangulation should be Delaunay and have convex boundary.\n * * Each HalfEdge in the exterior face loop of the input graph should have `HalfEdgeMask.BOUNDARY_EDGE` set on both edge mates.\n * * Each HalfEdge in the exterior face loop of the input graph should have `HalfEdgeMask.EXTERIOR` set.\n * * The input graph should not contain any pair of vertices closer than `distanceTol`.\n * * The input graph should not contain any triangle altitude smaller than `distanceTol` (this is a degenerate triangle).\n * @param delaunayGraph A HalfEdgeGraph representing a Delaunay triangulation. Z-coordinates are ignored.\n * @param distanceTol Optional distance tolerance to use when comparing points; default is `Geometry.smallMetricDistance`.\n * @param boundingBox Optional nominal xy-bounding box for the Voronoi diagram. Default uses the Delaunay circumcenter range so\n * that interior Voronoi regions are maximal.\n * @returns a new instance containing the Voronoi diagram derived from the input graph, or `undefined` if invalid input.\n */\n public static createFromDelaunayGraph(\n delaunayGraph: HalfEdgeGraph,\n distanceTol: number = Geometry.smallMetricDistance,\n boundingBox?: LowAndHighXY,\n ): Voronoi | undefined {\n const instance = new Voronoi(delaunayGraph);\n if (!instance.isValid)\n return undefined;\n let isValidVoronoi = true;\n const box = new VoronoiBoundary(instance._inputGraphRange, boundingBox ? boundingBox : instance._circumcenterRange);\n // iterate Delaunay edges and add Voronoi edges:\n // * for each boundary edge, add a bisector separating unbounded Voronoi cells\n // * for each interior edge, add a segment joining the adjacent triangles' circumcenters\n instance._inputGraph.announceEdges(\n (_g, edge: HalfEdge) => {\n if (edge.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE)) {\n if (edge.isMaskSet(HalfEdgeMask.EXTERIOR))\n edge = edge.edgeMate;\n return isValidVoronoi = instance.addVoronoiEdgeForDelaunayBoundaryEdge(edge, box);\n }\n return isValidVoronoi = instance.addVoronoiEdgeForDelaunayInteriorEdge(edge, box, distanceTol);\n },\n );\n if (!isValidVoronoi)\n return undefined;\n box.addEdgesToGraph(instance._voronoiGraph);\n HalfEdgeGraphMerge.splitIntersectingEdges(instance._voronoiGraph, distanceTol);\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(instance._voronoiGraph, undefined, distanceTol);\n instance.populateMasksAndFaceTags();\n return instance;\n }\n /** Create a graph from ordered colinear points; optional Dictionary supplies edgeTag for the HalfEdges at each vertex. */\n private static createColinearXYGraph(points: XAndY[] | Dictionary<Point3d, number>): HalfEdgeGraph {\n const colinearGraph = new HalfEdgeGraph();\n let indices: number[] | undefined;\n if (!Array.isArray(points)) {\n indices = Array.from(points.values());\n points = Array.from(points.keys());\n }\n if (points.length < 2)\n return colinearGraph; // empty\n let prevNode = this.addEdgeWithEdgeTags(colinearGraph, points[0], points[1], indices ? indices[0] : 0, indices ? indices[1] : 0,)\n for (let i = 1; i < points.length - 1; i++) {\n const nextNode = this.addEdgeWithEdgeTags(colinearGraph, points[i], points[i + 1], indices ? indices[i] : 0, indices ? indices[i + 1] : 0);\n HalfEdge.pinch(prevNode.faceSuccessor, nextNode);\n prevNode = nextNode;\n }\n colinearGraph.setMask(HalfEdgeMask.EXTERIOR | HalfEdgeMask.BOUNDARY_EDGE);\n return colinearGraph;\n }\n /** Return a segment along the bisector of the given edge. Clip the bisector to the Voronoi boundary. */\n private static getEdgeBisector(edge: HalfEdge, box: VoronoiBoundary): Voronoi.Segment2d | undefined {\n const v0 = edge;\n const v1 = edge.faceSuccessor;\n const midPoint = Point2d.createAdd2ScaledXY(v0.x, v0.y, 0.5, v1.x, v1.y, 0.5);\n const perpendicular = Vector2d.createStartEnd(v0, v1);\n [perpendicular.x, perpendicular.y] = [-perpendicular.y, perpendicular.x];\n const bisector = Ray2d.createOriginAndDirectionCapture(midPoint, perpendicular);\n const fractions = box.intersect(bisector);\n const haveIntersections = undefined !== fractions && fractions.length > 1 && fractions[0] < 0 && fractions[1] > 0;\n assert(haveIntersections, \"Midpoints should be strictly inside bounding box\");\n return haveIntersections ? { start: bisector.fractionToPoint(fractions[0]), end: bisector.fractionToPoint(fractions[1]) } : undefined;\n }\n /** Construct a Voronoi instance from a graph representing a colinear linestring. */\n private static createFromColinearGraph(\n colinearGraph: HalfEdgeGraph,\n distanceTol: number = Geometry.smallMetricDistance,\n boundingBox?: LowAndHighXY,\n ): Voronoi | undefined {\n const instance = new Voronoi(colinearGraph, true);\n if (!instance.isValid)\n return undefined;\n let isValidVoronoi = true;\n const box = new VoronoiBoundary(instance._inputGraphRange, boundingBox);\n instance._inputGraph.announceEdges(\n (_g, edge: HalfEdge) => {\n const bisector = Voronoi.getEdgeBisector(edge, box);\n if (!bisector)\n return isValidVoronoi = false; // edge midpoint outside box (shouldn't happen)\n const faceTag0 = instance._idToIndexMap.get(edge.id);\n const faceTag1 = instance._idToIndexMap.get(edge.edgeMate.id);\n this.addEdgeWithFaceTags(instance._voronoiGraph, bisector.start, bisector.end, faceTag0, faceTag1);\n return true;\n },\n );\n if (!isValidVoronoi)\n return undefined;\n box.addEdgesToGraph(instance._voronoiGraph);\n HalfEdgeGraphMerge.splitIntersectingEdges(instance._voronoiGraph, distanceTol);\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(instance._voronoiGraph, undefined, distanceTol);\n instance.populateMasksAndFaceTags();\n return instance;\n }\n /**\n * Construct a Voronoi instance from a set of points.\n * @param points An array of points. Z-coordinates are ignored. Points can be colinear.\n * @param distanceTol Optional distance tolerance to use when comparing points; default is [[Geometry.smallMetricDistance]].\n * @param boundingBox Optional nominal xy-bounding box for the Voronoi diagram. If unspecified, interior Voronoi cells are maximal.\n * @returns a new instance containing the Voronoi diagram derived from the input points, or `undefined` if invalid input.\n */\n public static createFromPoints(\n points: Point3d[],\n distanceTol: number = Geometry.smallMetricDistance,\n boundingBox?: LowAndHighXY,\n ): Voronoi | undefined {\n const sortedPoints = new SortedArray<Point3d>(Geometry.compareXY(distanceTol), DuplicatePolicy.Retain, (p: Point3d) => p.clone());\n points.forEach((pt: Point3d) => sortedPoints.insert(pt));\n const uniquePoints = sortedPoints.extractArray();\n if (uniquePoints.length < 2)\n return undefined;\n if (PolylineOps.isColinear(uniquePoints, distanceTol, true)) {\n const colinearGraph = Voronoi.createColinearXYGraph(uniquePoints);\n return colinearGraph ? Voronoi.createFromColinearGraph(colinearGraph, distanceTol, boundingBox) : undefined;\n } else {\n const delaunayGraph = Triangulator.createTriangulatedGraphFromPoints(uniquePoints, undefined, distanceTol);\n return delaunayGraph ? Voronoi.createFromDelaunayGraph(delaunayGraph, distanceTol, boundingBox) : undefined;\n }\n }\n /** Stroke the curve interior, and associate the stroke points to the given index. Return first and last point. */\n private static pushInteriorStrokePoints(pointToIndex: Dictionary<Point3d, number>, curve: CurvePrimitive, index: number, strokeOptions?: StrokeOptions, workPoint?: Point3d): Voronoi.Stroke01 {\n const strokes = LineString3d.create();\n curve.emitStrokes(strokes, strokeOptions);\n let pt: Point3d | undefined;\n const n = strokes.numPoints();\n for (let i = 1; i < n - 1; ++i) { // skip first and last point\n if (pt = strokes.pointAt(i, workPoint))\n pointToIndex.insert(pt, index);\n }\n assert(() => n > 2, \"Expect at least 1 interior stroke point\");\n const p0 = (n > 2 ? strokes.pointAt(1) : undefined) ?? curve.fractionToPoint(0.5);\n const p1 = (n > 2 ? strokes.pointAt(n - 2) : undefined) ?? p0;\n return {p0, p1};\n }\n /** Intersect the circle with the curve and return the intersection closest to the desired curve endpoint. */\n private static computeCircleIntersection(circle: Arc3d, curve: CurvePrimitive, atCurveStart: boolean, distanceTol?: number): Point3d | undefined {\n const intersections = CurveCurve.intersectionProjectedXYPairs(undefined, circle, false, curve, false, distanceTol);\n if (!intersections.length)\n return undefined;\n if (intersections.length > 1) { // detailB has the info for curve\n if (atCurveStart)\n intersections.sort((a, b) => a.detailB.fraction - b.detailB.fraction); // first intersection is closest to curve start\n else\n intersections.sort((a, b) => b.detailB.fraction - a.detailB.fraction); // first intersection is closest to curve end\n }\n return intersections[0].detailB.point;\n };\n /** Intersect two consecutive curves with a tiny circle centered at their joint, and associate the intersection on each curve with its respective index. */\n private static pushSymmetricPointPairAtJoint = (pointToIndex: Dictionary<Point3d, number>, prevStroke: Voronoi.StrokeData, nextStroke: Voronoi.StrokeData, distanceTol?: number, workArc?: Arc3d): boolean => {\n const circle = Arc3d.createUnitCircle(workArc);\n const joint = nextStroke.cp.startPoint(circle.centerRef);\n // ensure the symmetric pair we add will be the last/first stroke points on prev/next curve\n const radius = 0.5 * Math.min(prevStroke.pt.distance(joint), nextStroke.pt.distance(joint));\n circle.matrixRef.setAt(0, 0, radius);\n circle.matrixRef.setAt(1, 1, radius);\n const prevPt = this.computeCircleIntersection(circle, prevStroke.cp, false, distanceTol);\n const nextPt = this.computeCircleIntersection(circle, nextStroke.cp, true, distanceTol);\n if (!prevPt || !nextPt) {\n assert(() => false, \"Failed to add symmetric strokes at joint\");\n return false;\n }\n pointToIndex.set(prevPt, prevStroke.i);\n pointToIndex.set(nextPt, nextStroke.i);\n return true;\n }\n /** Stroke each curve in the chain and associate each point with the index of its generating curve in the chain. */\n private static createStrokePointsWithIndices(\n curveChain: CurveChain, strokeOptions?: StrokeOptions, distanceTol: number = Geometry.smallMetricDistance\n ): Dictionary<Point3d, number> | undefined {\n const children = curveChain.children;\n if (!children)\n return undefined;\n const numChildren = children.length;\n if (numChildren < 2)\n return undefined;\n strokeOptions = strokeOptions?.clone() ?? StrokeOptions.createForCurves();\n if (!strokeOptions.minStrokesPerPrimitive || strokeOptions.minStrokesPerPrimitive < 2)\n strokeOptions.minStrokesPerPrimitive = 2; // ensure at least one interior point per primitive\n const workPoint = Point3d.createZero();\n const workCircle = Arc3d.createUnitCircle(Voronoi._workArc);\n const workSegment0 = LineSegment3d.createXYXY(0, 0, 0, 0);\n const workRay = Ray3d.createZero();\n let stroke0: Voronoi.StrokeData | undefined;\n let prevStroke: Voronoi.StrokeData | undefined;\n let firstLastStroke: Voronoi.Stroke01;\n // lambda for iterating the chain, splitting a linestring primitive into segments\n const getNextCurve = (cp: CurvePrimitive, index: number): CurvePrimitive | undefined => cp instanceof LineString3d ? cp.getIndexedSegment(index, workSegment0) : index ? undefined : cp;\n const pointToIndex = new Dictionary<Point3d, number>(Geometry.compareXY(distanceTol), (p: Point3d) => p.clone());\n // Step 1: add open chain start/end point\n const isClosedChain = curveChain.isPhysicallyClosedCurve(distanceTol, true);\n if (!isClosedChain) {\n if (curveChain.startPoint(workPoint))\n pointToIndex.insert(workPoint, 0);\n if (curveChain.endPoint(workPoint))\n pointToIndex.insert(workPoint, numChildren - 1);\n }\n // Step 2: add interior stroke points for each chain primitive\n // To ensure Voronoi edges exactly hit the chain joints, the joints themselves are omitted from the strokes\n for (let i = 0; i < numChildren; i++) {\n let child = children[i];\n if (CurveOps.isColinear(child, { colinearRay: workRay, xyColinear: true, maxDeviation: distanceTol }))\n child = LineSegment3d.createCapture(child.startPoint(), child.endPoint());\n let j = 0;\n for (let currCurve: CurvePrimitive | undefined; currCurve = getNextCurve(child, j); j++) {\n firstLastStroke = this.pushInteriorStrokePoints(pointToIndex, currCurve, i, strokeOptions, workPoint);\n const currStroke = { pt: firstLastStroke.p0, cp: currCurve, i };\n if (prevStroke)\n this.pushSymmetricPointPairAtJoint(pointToIndex, prevStroke, currStroke, distanceTol, workCircle);\n stroke0 = (isClosedChain && i === 0 && j === 0) ? currStroke : stroke0;\n prevStroke = { pt: firstLastStroke.p1, cp: currCurve, i };\n }\n }\n // Step 3: handle the seam if necessary\n if (prevStroke && stroke0)\n this.pushSymmetricPointPairAtJoint(pointToIndex, prevStroke, stroke0, distanceTol, workCircle);\n return pointToIndex;\n }\n /** Construct a graph from unique xy points. */\n private static createGraphFromPointsWithIndices(\n pointToIndex: Dictionary<Point3d, number>, distanceTol: number,\n ): { graph: HalfEdgeGraph, isTriangulation: boolean } | undefined {\n if (pointToIndex.size < 2)\n return undefined;\n let graph: HalfEdgeGraph | undefined;\n let isTriangulation = false;\n const workPoint = Point3d.createZero();\n const points = Array.from(pointToIndex.keys());\n if (PolylineOps.isColinear(points, distanceTol, true)) {\n graph = Voronoi.createColinearXYGraph(pointToIndex);\n isTriangulation = false;\n } else {\n // tighter triangulation tolerance to reduce vertex consolidation that might result in dictionary misses\n graph = Triangulator.createTriangulatedGraphFromPoints(points, undefined, 0.1 * distanceTol);\n if (isTriangulation = (graph !== undefined)) {\n // tag every edge of the Delaunay graph with the index associated to its start vertex\n graph.announceVertexLoops(\n (_g, vertex: HalfEdge): boolean => {\n const index = pointToIndex.get(vertex.getPoint3d(workPoint));\n assert(index !== undefined, \"Delaunay vertex must know its generating curve\");\n if (index !== undefined)\n vertex.announceEdgesAroundVertex((edge: HalfEdge) => edge.edgeTag = index);\n return true;\n }\n );\n }\n }\n return graph ? { graph, isTriangulation } : undefined;\n }\n /**\n * Create a Voronoi instance from a curve chain.\n * * This is the curve-based analog for point-based Voronoi cells.\n * * Each curve in the chain is sampled and a Voronoi diagram is generated from the Delaunay triangulation of all samples.\n * * The union of Voronoi cells generated by a single curve's samples is:\n * * an approximation to the xy-region of points closest to the curve\n * * represented in the Voronoi graph by a _super face_, a loop of edges from multiple adjacent faces\n * * not necessarily convex\n * * The generating curve with chain index `i` for the returned Voronoi super face `R` is encoded thusly:\n * * Each Voronoi edge has `faceTag` set as per [[createFromDelaunayGraph]], referring to its generating Delaunay vertex.\n * * Each Delaunay edge has `edgeTag` set to the index in `curveChain` of its generating curve.\n * * For each [[HalfEdge]] `e` in the super face loop of `R`, `delaunayGraph.allHalfEdges[e.faceTag].edgeTag === i`.\n * @param curveChain A curve chain consisting of at least two [[CurvePrimitive]]s. Z-coordinates are ignored.\n * The length of each child should exceed `distanceTol`.\n * @param strokeOptions Optional stroke options to control the sampling of the curve chain.\n * @param distanceTol Optional distance tolerance to use when comparing points; default is [[Geometry.smallMetricDistance]].\n * @param boundingBox Optional nominal xy-bounding box for the Voronoi diagram. If unspecified, interior Voronoi cells are maximal.\n * @returns a new instance, or `undefined` for invalid input.\n */\n public static createFromCurveChain(\n curveChain: CurveChain,\n strokeOptions?: StrokeOptions,\n distanceTol: number = Geometry.smallMetricDistance,\n boundingBox?: LowAndHighXY,\n ): Voronoi | undefined {\n const pointsWithIndices = Voronoi.createStrokePointsWithIndices(curveChain, strokeOptions);\n if (!pointsWithIndices)\n return undefined; // no points created from the curve chain\n const inputGraph = Voronoi.createGraphFromPointsWithIndices(pointsWithIndices, distanceTol);\n if (!inputGraph)\n return undefined; // no graph created from points\n const instance = inputGraph.isTriangulation ?\n Voronoi.createFromDelaunayGraph(inputGraph.graph, distanceTol, boundingBox) :\n Voronoi.createFromColinearGraph(inputGraph.graph, distanceTol, boundingBox);\n if (instance)\n instance._isCurveBased = true;\n return instance;\n }\n /**\n * Test whether the edge is part of a curve-based Voronoi graph super face.\n * @param curveIndex optional test for a _specific_ super face associated with the curve with the given index.\n */\n private isEdgeInVoronoiSuperFace(edge: HalfEdge, curveIndex?: number): boolean {\n if (!this._isCurveBased || edge.faceTag === undefined)\n return false;\n const edgeIndex = this._inputGraph.allHalfEdges[edge.faceTag].edgeTag;\n if (edge.edgeMate.isMaskSet(HalfEdgeMask.EXTERIOR)) // edge is part of an unbounded Voronoi super face clipped by the bounding box\n return curveIndex === undefined ? true : curveIndex === edgeIndex;\n if (edge.edgeMate.faceTag === undefined)\n return false;\n const mateIndex = this._inputGraph.allHalfEdges[edge.edgeMate.faceTag].edgeTag;\n if (curveIndex !== undefined)\n return edgeIndex === curveIndex && mateIndex !== curveIndex; // edge is in a specific super face\n return edgeIndex !== mateIndex; // edge is part of a bounded Voronoi super face\n }\n /** Examine all edges in the curve-based Voronoi graph and return the first edge in an unvisited Voronoi super face. */\n private findNextVoronoiSuperFaceStart(): HalfEdge | undefined {\n if (!this._isCurveBased)\n return undefined;\n let start: HalfEdge | undefined;\n this._voronoiGraph.announceEdges((_g, edge: HalfEdge) => {\n if (edge.isMaskSet(HalfEdgeMask.EXTERIOR))\n return true; // skip exterior face\n if (edge.isMaskSet(this._superFaceMask))\n return true; // skip previously visited super face\n if (!this.isEdgeInVoronoiSuperFace(edge))\n return true; // skip edge; keep searching\n assert(() => edge.faceTag !== undefined, \"Voronoi edge must know its generating Delaunay vertex\");\n assert(() => this._inputGraph.allHalfEdges[edge.faceTag].edgeTag !== undefined, \"Delaunay vertex must know its generating curve\");\n start = edge;\n return false; // stop search; we found an unvisited super face\n });\n return start;\n }\n /**\n * Traverse the curve-based Voronoi graph and collect the edges comprising the Voronoi super face that starts with\n * the given seed edge.\n */\n private collectVoronoiSuperFace(seed: HalfEdge): HalfEdge[] | undefined {\n if (!this._isCurveBased || seed.faceTag === undefined)\n return undefined;\n const superFace: HalfEdge[] = [];\n const curveIndex = this._inputGraph.allHalfEdges[seed.faceTag].edgeTag;\n const foundSuperFace = seed.announceEdgesInSuperFace(\n (e: HalfEdge) => !this.isEdgeInVoronoiSuperFace(e, curveIndex), // skipEdge\n (e: HalfEdge) => { superFace.push(e); e.setMask(this._superFaceMask); }, // announceEdge\n );\n return (foundSuperFace && superFace.length > 2) ? superFace : undefined;\n }\n /**\n * Compute super faces of a curve-based Voronoi diagram.\n * * The instance must have been constructed with [[createFromCurveChain]].\n * * Each super face corresponds to the planar region of points closer to one curve in the generating chain than to any other.\n * * Each returned edge is masked for querying by subsequent methods.\n * @param numSuperFaces maximum number of super faces to return.\n * @returns up to `numSuperFaces` Voronoi super faces, sorted by curve index, or `undefined` if invalid input.\n * Each super face is an array of HalfEdges that form a loop.\n */\n public computeVoronoiSuperFaces(numSuperFaces: number): HalfEdge[][] | undefined {\n if (!this._isCurveBased || numSuperFaces < 1)\n return undefined;\n const superFaces: HalfEdge[][] = [];\n if (this._superFaceMask === HalfEdgeMask.NULL_MASK)\n this._superFaceMask = this._voronoiGraph.grabMask(false);\n this._voronoiGraph.clearMask(this._superFaceMask);\n for (let i = 0; i < numSuperFaces; i++) {\n const start = this.findNextVoronoiSuperFaceStart();\n if (!start)\n break; // no more super faces to find\n const superFace = this.collectVoronoiSuperFace(start);\n if (!superFace)\n return undefined; // invalid Voronoi graph\n superFaces.push(superFace);\n }\n superFaces.sort((a, b) => {\n const tagA = this._inputGraph.allHalfEdges[a[0].faceTag].edgeTag;\n const tagB = this._inputGraph.allHalfEdges[b[0].faceTag].edgeTag;\n return tagA - tagB;\n });\n return (superFaces.length > 0) ? superFaces : undefined;\n }\n /**\n * Construct a clipper for each curve-based Voronoi super face in the input array.\n * @param superFaces array returned by [[collectVoronoiSuperFaces]].\n * @returns array of clippers; the i_th clipper corresponds to the i_th input super face.\n * Returns `undefined` if input is invalid, or if a clipper construction failed.\n */\n public generateClippersFromVoronoiSuperFaces(superFaces: HalfEdge[][]): UnionOfConvexClipPlaneSets[] | undefined {\n if (!this._isCurveBased || this._superFaceMask === HalfEdgeMask.NULL_MASK)\n return undefined;\n const allClippers: UnionOfConvexClipPlaneSets[] = [];\n const superFaceOutsideMask = this._voronoiGraph.grabMask();\n const visitedMask = this._voronoiGraph.grabMask();\n const maskOutsideOfSuperFace = (startEdge: HalfEdge, clearMask: boolean): boolean => {\n return startEdge.announceEdgesInSuperFace(\n (e: HalfEdge) => !e.isMaskSet(this._superFaceMask),\n (e: HalfEdge) => e.edgeMate.applyMask(superFaceOutsideMask, clearMask),\n );\n };\n // Step 0: split each super face into convex faces (clipper prerequisite)\n // Disable triangle-flipping; we don't care about aspect ratio here.\n Triangulator.triangulateAllInteriorFaces(this._voronoiGraph, false, true);\n HalfEdgeGraphOps.expandConvexFaces(this._voronoiGraph, this._superFaceMask);\n for (const superFace of superFaces) {\n if (superFace.length < 3) {\n allClippers.length = 0;\n break; // invalid Voronoi graph\n }\n // Step 1: collect the convex faces for this super face\n const convexFaces: HalfEdge[] = [];\n if (!maskOutsideOfSuperFace(superFace[0], false)) {\n allClippers.length = 0;\n break; // invalid Voronoi graph\n }\n HalfEdgeGraphSearch.exploreComponent(superFace[0], visitedMask, superFaceOutsideMask, undefined, convexFaces);\n maskOutsideOfSuperFace(superFace[0], true);\n // Step 2: generate a clipper for each convex face\n const clippers: ConvexClipPlaneSet[] = [];\n for (const face of convexFaces) {\n const clipPlanes: ClipPlane[] = [];\n face.announceEdgesInFace((edge: HalfEdge) => {\n if (!edge.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE)) {\n const clipPlane = ClipPlane.createMidPointEdgeXY(edge, edge.faceSuccessor);\n if (clipPlane)\n clipPlanes.push(clipPlane);\n }\n });\n if (clipPlanes.length === face.countMaskAroundFace(HalfEdgeMask.BOUNDARY_EDGE, false))\n clippers.push(ConvexClipPlaneSet.createPlanes(clipPlanes));\n }\n // Step 3: assemble the clippers for this super face\n if (clippers.length === convexFaces.length)\n allClippers.push(UnionOfConvexClipPlaneSets.createConvexSets(clippers));\n }\n this._voronoiGraph.dropMask(visitedMask);\n this._voronoiGraph.dropMask(superFaceOutsideMask);\n return allClippers.length === superFaces.length ? allClippers : undefined;\n }\n}\n\n/**\n * Interfaces used by the Voronoi class.\n * @internal\n */\nexport namespace Voronoi {\n /** An interface to represent a 2D line segment */\n export interface Segment2d { start: XAndY; end: XAndY };\n /** An interface to represent a single stroke point with an associated index. */\n export interface StrokeData { pt: Point3d, cp: CurvePrimitive, i: number };\n /** An interface to represent two stroke points, e.g., first and last. */\n export interface Stroke01 { p0: Point3d, p1: Point3d };\n}\n\n/**\n * A class to represent a bounding box for a Voronoi diagram.\n * * A Voronoi diagram is unbounded, so we create a large rectangle around the diagram to limit it.\n * * To avoid clipping bounded Voronoi cells, this boundary should be large enough to contain the\n * circumcenters of the Delaunay triangles.\n * @internal\n */\nclass VoronoiBoundary {\n public bbox: Range2d;\n /**\n * Constructor that takes up to two ranges to union and expand by a margin.\n * * For example, Delaunay graph range and circumcenter range.\n */\n public constructor(r0: LowAndHighXY, r1?: LowAndHighXY) {\n this.bbox = Range2d.createFrom(r0);\n if (r1)\n this.bbox.union(r1, this.bbox);\n if (!this.bbox.isNull && !this.bbox.isSinglePoint) {\n const pad = 0.02473 * (this.bbox.xLength() + this.bbox.yLength()); // ~5% of average side length\n this.bbox.expandInPlace(pad);\n }\n }\n /** Compute the intersection fractions of the ray and this boundary. */\n public intersect(ray: Ray2d): number[] | undefined {\n const fractionalRange = ray.intersectionWithRange2d(this.bbox);\n if (fractionalRange.isNull)\n return undefined;\n if (fractionalRange.isSinglePoint)\n return [fractionalRange.low];\n return [fractionalRange.low, fractionalRange.high];\n }\n /** Add edges of this boundary to the graph. */\n public addEdgesToGraph(graph: HalfEdgeGraph) {\n graph.addEdgeXY(this.bbox.low.x, this.bbox.low.y, this.bbox.high.x, this.bbox.low.y);\n graph.addEdgeXY(this.bbox.high.x, this.bbox.low.y, this.bbox.high.x, this.bbox.high.y);\n graph.addEdgeXY(this.bbox.high.x, this.bbox.high.y, this.bbox.low.x, this.bbox.high.y);\n graph.addEdgeXY(this.bbox.low.x, this.bbox.high.y, this.bbox.low.x, this.bbox.low.y);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XYParitySearchContext.js","sourceRoot":"","sources":["../../../src/topology/XYParitySearchContext.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\n/**\r\n * `XYParitySearchContext` is an internal class for callers that can feed points (without extracting to array structures)\r\n * * Most will be via static methods which handle a specific data source.\r\n * * PolygonOps.classifyPointInPolygon(x,y,points: XAndY[])\r\n * * HalfEdgeGraphSearch.pointInOrOnFaceXY(halfEdgeOnFace, x, y)\r\n * Use pattern:\r\n * * Caller must be able to walk around polygon producing x,y coordinates (possibly transformed from actual polygon).\r\n * * Caller announce edges to tryStartEdge until finding one acceptable to the search.\r\n * * Caller then passes additional points up to and including both x0,y0 and x1, y1 of the accepted start edge.\r\n * Call sequence is:\r\n * * `context = new XYParitySearchContext`\r\n * * `repeat { acquire edge (x0,y0) (x1,y1) } until context.tryStartEdge(x0,y0,x1,y1);`\r\n * * `for each (x,y) beginning AFTER x1,y1 and ending with (x1,y1) context.advance (x,y)`\r\n * * `return context.classifyCounts();`\r\n */\r\nexport class XYParitySearchContext {\r\n public xTest: number;\r\n public yTest: number;\r\n /** local x-coordinate of the start of the previous (or earlier) edge */\r\n public u0: number;\r\n /** local y-coordinate of the start of the previous (or earlier) edge */\r\n public v0: number;\r\n /** local x-coordinate of the end of the previous edge (and start of current edge) */\r\n public u1: number;\r\n /** local y-coordinate of the end of the previous edge (and start of current edge) */\r\n public v1: number;\r\n public numLeftCrossing: number;\r\n public numRightCrossing: number;\r\n public numHit: number;\r\n /**\r\n * Create a new searcher for specified test point.\r\n * @param xTest x coordinate of test point.\r\n * @param yTest y coordinate of test point.\r\n */\r\n public constructor(xTest: number, yTest: number) {\r\n this.xTest = xTest;\r\n this.yTest = yTest;\r\n this.u0 = this.v0 = this.u1 = this.v1 = 0; // not valid for search; caller must satisfy tryStartEdge\r\n this.numLeftCrossing = this.numRightCrossing = 0;\r\n this.numHit = 0;\r\n }\r\n /** Test if parity processing can begin with this edge. */\r\n public tryStartEdge(x0: number, y0: number, x1: number, y1: number): boolean {\r\n if (y0 !== this.yTest) {\r\n this.u0 = x0 - this.xTest;\r\n this.v0 = y0 - this.yTest;\r\n this.u1 = x1 - this.xTest;\r\n this.v1 = y1 - this.yTest;\r\n return true; // we won't need wraparound logic to process the final edge ending at (x0,y0)\r\n }\r\n return false;\r\n }\r\n /** Update local coordinates: the current edge becomes the previous edge. */\r\n private updateUV01(u2: number, v2: number) {\r\n this.u0 = this.u1;\r\n this.v0 = this.v1;\r\n this.u1 = u2;\r\n this.v1 = v2;\r\n return true;\r\n }\r\n /**\r\n * Process the current edge ending at (x2,y2).\r\n * * Accumulate left/right parity of the test point wrt to the polygon. These counts track the number of polygon crossings\r\n * of the left and right horizontal rays emanating from the test point. After all edges are processed, if either count is\r\n * odd/even, the test point is inside/outside the polygon (see [[classifyCounts]]).\r\n * * Check whether the test point lies on the edge.\r\n * @returns whether caller should continue processing with the next edge. In particular, `false` if we have an exact hit.\r\n */\r\n public advance(x2: number, y2: number): boolean {\r\n // In this method we use local u,v coordinates obtained by translating the test point to the origin.\r\n // This simplifies our computations:\r\n // * left (right) parity is incremented if the current edge crosses the u-axis at u<0 (u>0)\r\n // * we have an exact hit if the current edge crosses the u-axis at u=0\r\n const u2 = x2 - this.xTest;\r\n const v2 = y2 - this.yTest;\r\n const p = v2 * this.v1;\r\n if (p > 0) {\r\n // Current edge does not cross u-axis.\r\n return this.updateUV01(u2, v2);\r\n }\r\n if (p < 0) {\r\n // Current edge crosses the u-axis at edge parameter 0 < lambda < 1 by the Intermediate Value Theorem.\r\n // Solve for lambda in 0 = v1 + lambda (v2 - v1), then use it to compute the u-value of the crossing.\r\n const lambda = -this.v1 / (v2 - this.v1);\r\n const uCross = this.u1 + lambda * (u2 - this.u1);\r\n if (uCross === 0.0) {\r\n this.numHit++; // Current edge crosses at the origin.\r\n return false;\r\n }\r\n if (uCross > 0)\r\n this.numRightCrossing++;\r\n else\r\n this.numLeftCrossing++;\r\n return this.updateUV01(u2, v2);\r\n }\r\n // At this point, at least one endpoint of the current edge lies on the u-axis.\r\n if (v2 === 0.0) {\r\n if (this.v1 === 0.0) {\r\n if (u2 * this.u1 <= 0.0) {\r\n this.numHit++; // Current edge lies on u-axis and contains the origin.\r\n return false;\r\n }\r\n // Current edge lies on the u-axis to one side of the origin.\r\n // This edge doesn't contribute to parity computations, so advance past it.\r\n this.u1 = u2;\r\n this.v1 = v2;\r\n return true;\r\n }\r\n if (u2 === 0.0) {\r\n this.numHit++; // Current edge ends at the origin.\r\n return false;\r\n }\r\n // Current edge ends on the u-axis away from the origin.\r\n return this.updateUV01(u2, v2);\r\n }\r\n // At this point, the current edge starts at the u-axis.\r\n if (this.u1 === 0.0) {\r\n this.numHit++; // Current edge starts at the origin.\r\n return false;\r\n }\r\n // At this point, the current edge starts on the u-axis away from the origin.\r\n const q = this.v0 * v2;\r\n if (q < 0) {\r\n // The current edge and the previous edge lie on opposite sides of the u-axis, so we have a parity change.\r\n if (this.u1 > 0)\r\n this.numRightCrossing++;\r\n else\r\n this.numLeftCrossing++;\r\n }\r\n // The current edge and the previous edge lie on the same sides of the u-axis, so no parity change.\r\n return this.updateUV01(u2, v2);\r\n }\r\n /**\r\n * Return classification as ON, IN, or OUT according to hit and crossing counts.\r\n * * Any nonzero hit count is ON.\r\n * * Otherwise IN if left crossing count is odd.\r\n * @return 0 if ON, 1 if IN, -1 if OUT.\r\n */\r\n public classifyCounts(): number {\r\n if (this.numHit > 0)\r\n return 0;\r\n const parity = this.numLeftCrossing & 0x01;\r\n return (parity === 1) ? 1 : -1;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"XYParitySearchContext.js","sourceRoot":"","sources":["../../../src/topology/XYParitySearchContext.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,qBAAqB;IACzB,KAAK,CAAS;IACd,KAAK,CAAS;IACrB,wEAAwE;IACjE,EAAE,CAAS;IAClB,wEAAwE;IACjE,EAAE,CAAS;IAClB,qFAAqF;IAC9E,EAAE,CAAS;IAClB,qFAAqF;IAC9E,EAAE,CAAS;IACX,eAAe,CAAS;IACxB,gBAAgB,CAAS;IACzB,MAAM,CAAS;IACtB;;;;OAIG;IACH,YAAmB,KAAa,EAAE,KAAa;QAC7C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,yDAAyD;QACpG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,0DAA0D;IACnD,YAAY,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;QAChE,IAAI,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1B,OAAO,IAAI,CAAC,CAAE,6EAA6E;QAC7F,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,4EAA4E;IACpE,UAAU,CAAC,EAAU,EAAE,EAAU;QACvC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;;;OAOG;IACI,OAAO,CAAC,EAAU,EAAE,EAAU;QACnC,oGAAoG;QACpG,oCAAoC;QACpC,2FAA2F;QAC3F,uEAAuE;QACvE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,sCAAsC;YACtC,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,sGAAsG;YACtG,qGAAqG;YACrG,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAE,sCAAsC;gBACtD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,MAAM,GAAG,CAAC;gBACZ,IAAI,CAAC,gBAAgB,EAAE,CAAC;;gBAExB,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,+EAA+E;QAC/E,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;gBACpB,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAE,uDAAuD;oBACvE,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,6DAA6D;gBAC7D,2EAA2E;gBAC3E,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,EAAE,CAAC,CAAE,mCAAmC;gBACnD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,wDAAwD;YACxD,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,wDAAwD;QACxD,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAE,qCAAqC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,6EAA6E;QAC7E,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,0GAA0G;YAC1G,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC;gBACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;;gBAExB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,mGAAmG;QACnG,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IACD;;;;;OAKG;IACI,cAAc;QACnB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YACjB,OAAO,CAAC,CAAC;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC3C,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\n/**\n * `XYParitySearchContext` is an internal class for callers that can feed points (without extracting to array structures)\n * * Most will be via static methods which handle a specific data source.\n * * PolygonOps.classifyPointInPolygon(x,y,points: XAndY[])\n * * HalfEdgeGraphSearch.pointInOrOnFaceXY(halfEdgeOnFace, x, y)\n * Use pattern:\n * * Caller must be able to walk around polygon producing x,y coordinates (possibly transformed from actual polygon).\n * * Caller announce edges to tryStartEdge until finding one acceptable to the search.\n * * Caller then passes additional points up to and including both x0,y0 and x1, y1 of the accepted start edge.\n * Call sequence is:\n * * `context = new XYParitySearchContext`\n * * `repeat { acquire edge (x0,y0) (x1,y1) } until context.tryStartEdge(x0,y0,x1,y1);`\n * * `for each (x,y) beginning AFTER x1,y1 and ending with (x1,y1) context.advance (x,y)`\n * * `return context.classifyCounts();`\n */\nexport class XYParitySearchContext {\n public xTest: number;\n public yTest: number;\n /** local x-coordinate of the start of the previous (or earlier) edge */\n public u0: number;\n /** local y-coordinate of the start of the previous (or earlier) edge */\n public v0: number;\n /** local x-coordinate of the end of the previous edge (and start of current edge) */\n public u1: number;\n /** local y-coordinate of the end of the previous edge (and start of current edge) */\n public v1: number;\n public numLeftCrossing: number;\n public numRightCrossing: number;\n public numHit: number;\n /**\n * Create a new searcher for specified test point.\n * @param xTest x coordinate of test point.\n * @param yTest y coordinate of test point.\n */\n public constructor(xTest: number, yTest: number) {\n this.xTest = xTest;\n this.yTest = yTest;\n this.u0 = this.v0 = this.u1 = this.v1 = 0; // not valid for search; caller must satisfy tryStartEdge\n this.numLeftCrossing = this.numRightCrossing = 0;\n this.numHit = 0;\n }\n /** Test if parity processing can begin with this edge. */\n public tryStartEdge(x0: number, y0: number, x1: number, y1: number): boolean {\n if (y0 !== this.yTest) {\n this.u0 = x0 - this.xTest;\n this.v0 = y0 - this.yTest;\n this.u1 = x1 - this.xTest;\n this.v1 = y1 - this.yTest;\n return true; // we won't need wraparound logic to process the final edge ending at (x0,y0)\n }\n return false;\n }\n /** Update local coordinates: the current edge becomes the previous edge. */\n private updateUV01(u2: number, v2: number) {\n this.u0 = this.u1;\n this.v0 = this.v1;\n this.u1 = u2;\n this.v1 = v2;\n return true;\n }\n /**\n * Process the current edge ending at (x2,y2).\n * * Accumulate left/right parity of the test point wrt to the polygon. These counts track the number of polygon crossings\n * of the left and right horizontal rays emanating from the test point. After all edges are processed, if either count is\n * odd/even, the test point is inside/outside the polygon (see [[classifyCounts]]).\n * * Check whether the test point lies on the edge.\n * @returns whether caller should continue processing with the next edge. In particular, `false` if we have an exact hit.\n */\n public advance(x2: number, y2: number): boolean {\n // In this method we use local u,v coordinates obtained by translating the test point to the origin.\n // This simplifies our computations:\n // * left (right) parity is incremented if the current edge crosses the u-axis at u<0 (u>0)\n // * we have an exact hit if the current edge crosses the u-axis at u=0\n const u2 = x2 - this.xTest;\n const v2 = y2 - this.yTest;\n const p = v2 * this.v1;\n if (p > 0) {\n // Current edge does not cross u-axis.\n return this.updateUV01(u2, v2);\n }\n if (p < 0) {\n // Current edge crosses the u-axis at edge parameter 0 < lambda < 1 by the Intermediate Value Theorem.\n // Solve for lambda in 0 = v1 + lambda (v2 - v1), then use it to compute the u-value of the crossing.\n const lambda = -this.v1 / (v2 - this.v1);\n const uCross = this.u1 + lambda * (u2 - this.u1);\n if (uCross === 0.0) {\n this.numHit++; // Current edge crosses at the origin.\n return false;\n }\n if (uCross > 0)\n this.numRightCrossing++;\n else\n this.numLeftCrossing++;\n return this.updateUV01(u2, v2);\n }\n // At this point, at least one endpoint of the current edge lies on the u-axis.\n if (v2 === 0.0) {\n if (this.v1 === 0.0) {\n if (u2 * this.u1 <= 0.0) {\n this.numHit++; // Current edge lies on u-axis and contains the origin.\n return false;\n }\n // Current edge lies on the u-axis to one side of the origin.\n // This edge doesn't contribute to parity computations, so advance past it.\n this.u1 = u2;\n this.v1 = v2;\n return true;\n }\n if (u2 === 0.0) {\n this.numHit++; // Current edge ends at the origin.\n return false;\n }\n // Current edge ends on the u-axis away from the origin.\n return this.updateUV01(u2, v2);\n }\n // At this point, the current edge starts at the u-axis.\n if (this.u1 === 0.0) {\n this.numHit++; // Current edge starts at the origin.\n return false;\n }\n // At this point, the current edge starts on the u-axis away from the origin.\n const q = this.v0 * v2;\n if (q < 0) {\n // The current edge and the previous edge lie on opposite sides of the u-axis, so we have a parity change.\n if (this.u1 > 0)\n this.numRightCrossing++;\n else\n this.numLeftCrossing++;\n }\n // The current edge and the previous edge lie on the same sides of the u-axis, so no parity change.\n return this.updateUV01(u2, v2);\n }\n /**\n * Return classification as ON, IN, or OUT according to hit and crossing counts.\n * * Any nonzero hit count is ON.\n * * Otherwise IN if left crossing count is odd.\n * @return 0 if ON, 1 if IN, -1 if OUT.\n */\n public classifyCounts(): number {\n if (this.numHit > 0)\n return 0;\n const parity = this.numLeftCrossing & 0x01;\n return (parity === 1) ? 1 : -1;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-geometry",
|
|
3
|
-
"version": "5.3.0-dev.
|
|
3
|
+
"version": "5.3.0-dev.15",
|
|
4
4
|
"description": "iTwin.js Core Geometry library",
|
|
5
5
|
"main": "lib/cjs/core-geometry.js",
|
|
6
6
|
"module": "lib/esm/core-geometry.js",
|
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
"rimraf": "^6.0.1",
|
|
32
32
|
"typescript": "~5.6.2",
|
|
33
33
|
"vitest": "^3.0.6",
|
|
34
|
-
"@itwin/build-tools": "5.3.0-dev.
|
|
34
|
+
"@itwin/build-tools": "5.3.0-dev.15"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"flatbuffers": "~1.12.0",
|
|
38
|
-
"@itwin/core-bentley": "5.3.0-dev.
|
|
38
|
+
"@itwin/core-bentley": "5.3.0-dev.15"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "npm run -s build:cjs && npm run -s build:esm",
|