@itwin/core-geometry 5.2.0-dev.24 → 5.2.0-dev.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
- package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/cjs/bspline/KnotVector.js.map +1 -1
- package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.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/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Plane3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.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/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolyfaceQuery.js","sourceRoot":"","sources":["../../../src/polyface/PolyfaceQuery.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Polyface\n */\n\n// cspell:word internaldocs\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { BagOfCurves, CurveCollection } from \"../curve/CurveCollection\";\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\nimport { CurveOps } from \"../curve/CurveOps\";\nimport { LinearCurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { AnyChain } from \"../curve/CurveTypes\";\nimport { MultiChainCollector } from \"../curve/internalContexts/MultiChainCollector\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Loop } from \"../curve/Loop\";\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { BarycentricTriangle, TriangleLocationDetail } from \"../geometry3d/BarycentricTriangle\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\nimport { Plane3d } from \"../geometry3d/Plane3d\";\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\nimport { PolygonLocationDetail, PolygonOps } from \"../geometry3d/PolygonOps\";\nimport { Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\nimport { MomentData } from \"../geometry4d/MomentData\";\nimport { UnionFindContext } from \"../numerics/UnionFind\";\nimport { ChainMergeContext } from \"../topology/ChainMerge\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../topology/Graph\";\nimport { HalfEdgeGraphFromIndexedLoopsContext } from \"../topology/HalfEdgeGraphFromIndexedLoopsContext\";\nimport { HalfEdgeGraphSearch, HalfEdgeMaskTester } from \"../topology/HalfEdgeGraphSearch\";\nimport { HalfEdgeGraphMerge } from \"../topology/Merging\";\nimport { SpacePolygonTriangulation } from \"../topology/SpaceTriangulation\";\nimport {\n ConvexFacetLocationDetail, FacetIntersectOptions, FacetLocationDetail, NonConvexFacetLocationDetail, TriangularFacetLocationDetail,\n} from \"./FacetLocationDetail\";\nimport { FacetOrientationFixup } from \"./FacetOrientation\";\nimport { IndexedEdgeMatcher, SortableEdge, SortableEdgeCluster } from \"./IndexedEdgeMatcher\";\nimport { BuildAverageNormalsContext } from \"./multiclip/BuildAverageNormalsContext\";\nimport { OffsetMeshContext } from \"./multiclip/OffsetMeshContext\";\nimport { Range2dSearchInterface } from \"./multiclip/Range2dSearchInterface\";\nimport { ClipSweptLineStringContext, EdgeClipData, SweepLineStringToFacetContext } from \"./multiclip/SweepLineStringToFacetContext\";\nimport { XYPointBuckets } from \"./multiclip/XYPointBuckets\";\nimport { IndexedPolyface, Polyface, PolyfaceVisitor } from \"./Polyface\";\nimport { PolyfaceBuilder } from \"./PolyfaceBuilder\";\nimport { RangeLengthData } from \"./RangeLengthData\";\n\n/**\n * Options carrier for sweeping linework onto meshes.\n * * The create method initializes all options.\n * @public\n */\nexport class SweepLineStringToFacetsOptions {\n /**\n * Vector towards the eye.\n * * In the common case of sweeping to an XY (e.g., ground or DTM) mesh, use the positive Z vector as an up vector.\n * * In general case, this is a vector from the mesh towards an eye at infinity.\n */\n public vectorToEye: Vector3d;\n /** True to collect edges from facets that face towards the eye. */\n public collectOnForwardFacets: boolean;\n /** True to collect facets that are \"on the side\", i.e., their outward vector is perpendicular to vectorToEye. */\n public collectOnSideFacets: boolean;\n /** True to collect facets that face away from the eye. */\n public collectOnRearFacets: boolean;\n /**\n * (Small) angle to use as tolerance for deciding if a facet is \"on the side\".\n * * Default (if given in degrees) is `Geometry.smallAngleDegrees`.\n */\n public sideAngle: Angle;\n /** Option to assemble lines into chains. */\n public assembleChains: boolean;\n /**\n * Optional searcher object for vertical sweep speedup. If provided, `vectorToEye` must be the positive Z vector.\n * @example To construct a 5x5 indexed search grid:\n * ````\n * const xyRange = Range2d.createFrom(myPolyface.range());\n * const searcher = GriddedRaggedRange2dSetWithOverflow.create<number>(xyRange, 5, 5)!;\n * for (const visitor = myPolyface.createVisitor(0); visitor.moveToNextFacet();) {\n * searcher.addRange(visitor.point.getRange(), visitor.currentReadIndex());\n * }\n * ````\n */\n public searcher?: Range2dSearchInterface<number>;\n\n /** Constructor. Captures fully-checked parameters from static create method. */\n private constructor(\n vectorToEye: Vector3d,\n sideAngle: Angle,\n assembleChains: boolean,\n collectOnForwardFacets: boolean,\n collectOnSideFacets: boolean,\n collectOnRearFacets: boolean,\n searcher?: Range2dSearchInterface<number>,\n ) {\n this.vectorToEye = vectorToEye;\n this.sideAngle = sideAngle;\n this.assembleChains = assembleChains;\n this.collectOnForwardFacets = collectOnForwardFacets;\n this.collectOnSideFacets = collectOnSideFacets;\n this.collectOnRearFacets = collectOnRearFacets;\n this.searcher = searcher\n }\n /**\n * Create an options structure.\n * * Default `vectorToEye` is (0,0,1).\n * * Default `sideAngle` is `Geometry.smallAngleRadians`.\n * * Default `assembleChains` is `true`.\n * * Default `collectOnForwardFacets`, `collectOnSideFacets`, `collectOnRearFacets` are all `true`.\n */\n public static create(\n vectorToEye?: Vector3d,\n sideAngle?: Angle,\n assembleChains?: boolean,\n collectOnForwardFacets?: boolean,\n collectOnSideFacets?: boolean,\n collectOnRearFacets?: boolean,\n searcher?: Range2dSearchInterface<number>,\n ): SweepLineStringToFacetsOptions {\n return new SweepLineStringToFacetsOptions(\n (!vectorToEye || searcher) ? Vector3d.unitZ() : vectorToEye.clone(),\n sideAngle?.clone() ?? Angle.createRadians(Geometry.smallAngleRadians),\n assembleChains ?? true,\n collectOnForwardFacets ?? true,\n collectOnSideFacets ?? true,\n collectOnRearFacets ?? true,\n searcher,\n );\n }\n /** Return `true` if all outputs are requested. */\n public get collectAll(): boolean {\n return this.collectOnForwardFacets && this.collectOnSideFacets && this.collectOnRearFacets;\n }\n /**\n * Decide if the instance collector flags accept a facet with the given normal.\n * * A facet whose facet normal has a positive, zero, or negative dot product with `vectorToEye` is classified\n * as forward, side, or rear, respectively.\n * * `undefined` facet normal returns `false`.\n */\n public collectFromThisFacetNormal(facetNormal: Vector3d | undefined): boolean {\n if (facetNormal === undefined)\n return false;\n const theta = facetNormal.angleFromPerpendicular(this.vectorToEye);\n if (theta.isMagnitudeLessThanOrEqual(this.sideAngle))\n return this.collectOnSideFacets;\n return facetNormal.dotProduct(this.vectorToEye) > 0 ? this.collectOnForwardFacets : this.collectOnRearFacets;\n }\n}\n\n/**\n * Options carrier for [[PolyfaceQuery.fillSimpleHoles]].\n * @public\n */\nexport interface HoleFillOptions {\n /** Reject hole candidates if its boundary chain is longer than this limit. */\n maxPerimeter?: number;\n /** Reject hole candidates if they have more than this number of edges. */\n maxEdgesAroundHole?: number;\n /**\n * Reject hole candidates if their orientation is not COUNTERCLOCKWISE around this vector.\n * * For instance, use an upward Z vector for a DTM whose facets face upward. This suppresses incorrectly\n * treating the outer boundary as a hole.\n */\n upVector?: Vector3d;\n /** Requests that all content from the original mesh be copied to the mesh with filled holes. */\n includeOriginalMesh?: boolean;\n}\n\n/**\n * Selective output options for [[PolyfaceQuery.cloneOffset]]:\n * * `undefined` means the usual facets in the expected offset mesh.\n * * If present as a json object, the various booleans select respective outputs.\n * * @public\n */\nexport interface OffsetMeshSelectiveOutputOptions {\n outputOffsetsFromFacesBeforeChamfers?: boolean;\n outputOffsetsFromFaces?: boolean;\n outputOffsetsFromEdges?: boolean;\n outputOffsetsFromVertices?: boolean;\n}\n\n/**\n * Options carrier for [[PolyfaceQuery.cloneOffset]].\n * * Default options are strongly recommended.\n * * The option most likely to be changed is `chamferAngleBetweenNormals`.\n * @public\n */\nexport class OffsetMeshOptions {\n /** Max angle between normals to be considered smooth. */\n public smoothSingleAngleBetweenNormals: Angle;\n /** Max accumulation of angle between normals to be considered smooth. */\n public smoothAccumulatedAngleBetweenNormals: Angle;\n /**\n * When facets meet and the turn angle (i.e., angle between facet normals) is larger than\n * `chamferTurnAngleBetweenNormals`, a chamfer edge may be added to prevent offset mesh from having\n * facets that extend out too far away from the source mesh.\n */\n public chamferAngleBetweenNormals: Angle;\n /**\n * Optional control structure for selective output.\n * * If `undefined`, output all expected offset facets.\n */\n public outputSelector?: OffsetMeshSelectiveOutputOptions;\n\n /** Constructor -- CAPTURE parameters. */\n private constructor(\n smoothSingleAngleBetweenNormals: Angle = Angle.createDegrees(25),\n smoothAccumulatedAngleBetweenNormals: Angle = Angle.createDegrees(60),\n chamferAngleBetweenNormals: Angle = Angle.createDegrees(90),\n ) {\n this.smoothSingleAngleBetweenNormals = smoothSingleAngleBetweenNormals.clone();\n this.smoothAccumulatedAngleBetweenNormals = smoothAccumulatedAngleBetweenNormals.clone();\n this.chamferAngleBetweenNormals = chamferAngleBetweenNormals.clone();\n }\n /**\n * Construct and return an `OffsetMeshOptions` with given parameters.\n * * Angles are forced to minimum values.\n * * Clones of the angles are given to the constructor.\n * @param smoothSingleRadiansBetweenNormals an angle larger than this (between facets) is considered a sharp edge.\n * Default value is `25` degrees.\n * @param smoothAccumulatedAngleBetweenNormals angles that sum to this much may be consolidated for average normal.\n * Default value is `60` degrees.\n * @param chamferTurnAngleBetweenNormals when facets meet and the turn angle (i.e., angle between facet normals)\n * is larger than `chamferTurnAngleBetweenNormals`, a chamfer edge may be added to prevent offset mesh from having\n * facets that extend out too far away from the source mesh. Default value is `120` degrees.\n */\n public static create(\n smoothSingleAngleBetweenNormals: Angle = Angle.createDegrees(25),\n smoothAccumulatedAngleBetweenNormals: Angle = Angle.createDegrees(60),\n chamferTurnAngleBetweenNormals: Angle = Angle.createDegrees(120),\n ): OffsetMeshOptions {\n const mySmoothSingleRadiansBetweenNormals = smoothSingleAngleBetweenNormals.clone();\n const mySmoothAccumulatedRadiansBetweenNormals = smoothAccumulatedAngleBetweenNormals.clone();\n const myChamferTurnAngleBetweenNormals = chamferTurnAngleBetweenNormals.clone();\n if (mySmoothSingleRadiansBetweenNormals.degrees < 1)\n mySmoothAccumulatedRadiansBetweenNormals.setDegrees(1.0);\n if (mySmoothAccumulatedRadiansBetweenNormals.degrees < 1.0)\n mySmoothAccumulatedRadiansBetweenNormals.setDegrees(1.0);\n if (mySmoothAccumulatedRadiansBetweenNormals.degrees < 15.0)\n mySmoothAccumulatedRadiansBetweenNormals.setDegrees(15.0);\n return new OffsetMeshOptions(\n mySmoothSingleRadiansBetweenNormals, mySmoothAccumulatedRadiansBetweenNormals, myChamferTurnAngleBetweenNormals,\n );\n }\n}\n\n/**\n * Structure to return multiple results from volume between facets and plane.\n * @public\n */\nexport interface FacetProjectedVolumeSums {\n /** Summed (signed) volume. */\n volume: number;\n /** Summed area moments for positive contributions. */\n positiveProjectedFacetAreaMoments?: MomentData;\n /** Summed area moments for negative contributions. */\n negativeProjectedFacetAreaMoments?: MomentData;\n}\n\n/**\n * Enumeration of cases for retaining facets among duplicates.\n * @public\n */\nexport enum DuplicateFacetClusterSelector {\n /** Retain none of the duplicates. */\n SelectNone = 0,\n /** Retain any one member among duplicates. */\n SelectAny = 1,\n /** Retain all members among duplicates. */\n SelectAll = 2,\n /** Retain one from any cluster with an odd number of faces. */\n SelectOneByParity = 3,\n}\n\n/**\n * Announce the points on a drape panel.\n * * The first two points in the array are always along the draped line segment.\n * * The last two are always on the facet.\n * * If there are 4 points, those two pairs are distinct, i.e. both segment points are to the same side of the facet.\n * * If there are 3 points, those two pairs share an on-facet point.\n * * The panel is ordered so the outward normal is to the right of the draped segment.\n * @param indexAOnFacet index (in points) of the point that is the first facet point for moving forward along the linestring.\n * @param indexBOnFacet index (in points) of the point that is the second facet point for moving forward along the linestring.\n * @public\n */\nexport type AnnounceDrapePanel = (\n linestring: IndexedXYZCollection, segmentIndex: number, polyface: Polyface,\n facetIndex: number, points: Point3d[], indexAOnFacet: number, indexBOnFacet: number,\n) => any;\n\n/**\n * PolyfaceQuery is a static class whose methods implement queries on a `Polyface` or `PolyfaceVisitor` provided as a\n * parameter to each method.\n * @public\n */\nexport class PolyfaceQuery {\n /** Copy the points from a visitor into a linestring loop. */\n public static visitorToLoop(visitor: PolyfaceVisitor): Loop {\n const ls = LineString3d.createPoints(visitor.point.getPoint3dArray());\n return Loop.create(ls);\n }\n /** Create a linestring loop for each facet of the polyface. */\n public static indexedPolyfaceToLoops(polyface: Polyface): BagOfCurves {\n const result = BagOfCurves.create();\n const visitor = polyface.createVisitor(1);\n while (visitor.moveToNextFacet()) {\n const loop = PolyfaceQuery.visitorToLoop(visitor);\n result.tryAddChild(loop);\n }\n return result;\n }\n /**\n * Sum all facet areas.\n * @param source polyface or visitor.\n * @param vectorToEye compute sum of (signed) facet areas projected to a view plane perpendicular to `vectorToEye`.\n * If `vectorToEye` is not provided, actual facet areas are calculated (without any projection).\n * @returns the sum of all facet areas.\n */\n public static sumFacetAreas(source: Polyface | PolyfaceVisitor, vectorToEye?: Vector3d): number {\n let sum = 0;\n if (source instanceof Polyface)\n source = source.createVisitor(1);\n else\n source.setNumWrap(1);\n let unitVectorToEye: Vector3d | undefined;\n if (vectorToEye !== undefined)\n unitVectorToEye = vectorToEye.normalize();\n source.reset();\n while (source.moveToNextFacet()) {\n const areaNormal = PolygonOps.areaNormal(source.point.getPoint3dArray());\n sum += unitVectorToEye ? areaNormal.dotProduct(unitVectorToEye) : areaNormal.magnitude();\n }\n return sum;\n }\n /**\n * Sum volumes of tetrahedra from origin to all facets.\n * * If origin is `undefined`, the first point encountered (by the visitor) is used as origin.\n * * If the mesh is closed, this sum is the volume.\n * * If the mesh is not closed, this sum is the volume of a mesh with various additional facets from the origin\n * to facets.\n */\n public static sumTetrahedralVolumes(source: Polyface | PolyfaceVisitor, origin?: Point3d): number {\n let sum = 0;\n if (source instanceof Polyface)\n return PolyfaceQuery.sumTetrahedralVolumes(source.createVisitor(0), origin);\n let myOrigin = origin;\n const facetOrigin = Point3d.create();\n const targetA = Point3d.create();\n const targetB = Point3d.create();\n source.reset();\n while (source.moveToNextFacet()) {\n if (myOrigin === undefined)\n myOrigin = source.point.getPoint3dAtUncheckedPointIndex(0);\n source.point.getPoint3dAtUncheckedPointIndex(0, facetOrigin);\n for (let i = 1; i + 1 < source.point.length; i++) {\n source.point.getPoint3dAtUncheckedPointIndex(i, targetA);\n source.point.getPoint3dAtUncheckedPointIndex(i + 1, targetB);\n sum += myOrigin.tripleProductToPoints(facetOrigin, targetA, targetB);\n }\n }\n return sum / 6.0;\n }\n /**\n * Sum (signed) volumes between facets and a plane.\n * @param source facet set\n * @param plane infinite plane bounding volume between the input facets and (virtual) side facets perpendicular to the plane.\n * @param skipMoments whether to skip computation of the area moments. Set to `true` if only volume is needed. Default is `false`.\n * @returns a structure with multiple sums:\n * * volume: the sum of (signed) volumes between facets and the plane.\n * * positiveProjectedFacetAreaMoments, negativeProjectedFacetAreaMoments: area moment data (centroid, signed area,\n * and second moments with respect to the centroid), separately computed for the input facets that project with\n * positive/negative area onto the plane.\n */\n public static sumVolumeBetweenFacetsAndPlane(source: Polyface | PolyfaceVisitor, plane: Plane3d, skipMoments?: boolean): FacetProjectedVolumeSums {\n const visitor = source instanceof Polyface ? source.createVisitor(0) : source;\n visitor.setNumWrap(0);\n const workPoint0 = Point3d.create();\n const workPoint1 = Point3d.create();\n const workVector = Vector3d.create();\n const workMatrix = Matrix4d.createZero();\n let signedVolumeTimes6 = 0.0;\n const posSums = skipMoments ? undefined : MomentData.create(undefined, true);\n const negSums = skipMoments ? undefined : MomentData.create(undefined, true);\n // For each facet:\n // - form triangles from facet origin to each far edge.\n // - sum signed area and volume contributions (for non-convex facet, signs can be mixed).\n // - each projected area contribution is twice the area of a triangle.\n // - each volume contribution is 3 times the actual volume -- a third of the altitude sum is the centroid altitude.\n const options = { skipMoments, p0: workPoint0, p1: workPoint1, v0: workVector, m0: workMatrix };\n for (visitor.reset(); visitor.moveToNextFacet();) {\n const facetData = PolygonOps.volumeBetweenPolygonAndPlane(visitor.point, plane, options);\n signedVolumeTimes6 += facetData.volume6;\n if (!skipMoments) {\n assert(posSums !== undefined && negSums !== undefined && facetData.origin !== undefined && facetData.products !== undefined);\n if (facetData.area2 > 0)\n posSums.accumulateProductsFromOrigin(facetData.origin, facetData.products, 1.0);\n else\n negSums.accumulateProductsFromOrigin(facetData.origin, facetData.products, 1.0);\n }\n }\n return {\n volume: signedVolumeTimes6 / 6.0,\n positiveProjectedFacetAreaMoments: posSums ? MomentData.inertiaProductsToPrincipalAxes(posSums.origin, posSums.sums) : undefined,\n negativeProjectedFacetAreaMoments: negSums ? MomentData.inertiaProductsToPrincipalAxes(negSums.origin, negSums.sums) : undefined,\n };\n }\n\n /** Return the inertia products [xx,xy,xz,xw,yw, etc] integrated over all all facets as viewed from origin. */\n public static sumFacetSecondAreaMomentProducts(source: Polyface | PolyfaceVisitor, origin: Point3d): Matrix4d {\n if (source instanceof Polyface)\n return PolyfaceQuery.sumFacetSecondAreaMomentProducts(source.createVisitor(0), origin);\n const products = Matrix4d.createZero();\n source.reset();\n while (source.moveToNextFacet()) {\n PolygonOps.addSecondMomentAreaProducts(source.point, origin, products);\n }\n return products;\n }\n /** Return the inertia products [xx,xy,xz,xw,yw, etc] integrated over all tetrahedral volumes from origin. */\n public static sumFacetSecondVolumeMomentProducts(source: Polyface | PolyfaceVisitor, origin: Point3d): Matrix4d {\n if (source instanceof Polyface)\n return PolyfaceQuery.sumFacetSecondVolumeMomentProducts(source.createVisitor(0), origin);\n const products = Matrix4d.createZero();\n source.reset();\n while (source.moveToNextFacet()) {\n PolygonOps.addSecondMomentVolumeProducts(source.point, origin, products);\n }\n return products;\n }\n /**\n * Compute area moments for the mesh. In the returned `MomentData`:\n * * `origin` is the centroid.\n * * `localToWorldMap` has the origin and principal directions.\n * * `radiiOfGyration` radii for rotation around the x,y,z axes.\n */\n public static computePrincipalAreaMoments(source: Polyface): MomentData | undefined {\n const origin = source.data.getPoint(0);\n if (!origin)\n return undefined;\n const inertiaProducts = PolyfaceQuery.sumFacetSecondAreaMomentProducts(source, origin);\n return MomentData.inertiaProductsToPrincipalAxes(origin, inertiaProducts);\n }\n /**\n * Compute area moments for the mesh. In the returned MomentData:\n * * `origin` is the centroid.\n * * `localToWorldMap` has the origin and principal directions.\n * * `radiiOfGyration` radii for rotation around the x,y,z axes.\n * * The result is only valid if the mesh is closed.\n * * There is no test for closure. Use `PolyfaceQuery.isPolyfaceClosedByEdgePairing(polyface)` to test for closure.\n */\n public static computePrincipalVolumeMoments(source: Polyface): MomentData | undefined {\n const origin = source.data.getPoint(0);\n if (!origin)\n return undefined;\n const inertiaProducts = PolyfaceQuery.sumFacetSecondVolumeMomentProducts(source, origin);\n return MomentData.inertiaProductsToPrincipalAxes(origin, inertiaProducts);\n }\n /**\n * Determine whether all facets are convex.\n * @param source polyface or visitor.\n * @returns `true` if all facets are convex; `false` otherwise.\n */\n public static areFacetsConvex(source: Polyface | PolyfaceVisitor): boolean {\n if (source instanceof Polyface)\n return this.areFacetsConvex(source.createVisitor(0));\n source.setNumWrap(0);\n source.reset();\n while (source.moveToNextFacet()) {\n if (source.pointCount > 3) {\n if (!PolygonOps.isConvex(source.point))\n return false;\n }\n }\n return true;\n }\n /**\n * Compute a number summarizing the dihedral angles in the mesh.\n * * A dihedral angle is the signed angle between adjacent facets' normals. This angle is positive when the cross\n * product `normalA x normalB` has the same direction as facetA's traversal of the facets' shared edge.\n * @param source facets.\n * @param ignoreBoundaries if `true` ignore simple boundary edges, i.e., allow unclosed meshes. Default is `false`.\n * See [[isConvexByDihedralAngleCount]] for comments about passing true when there are multiple\n * connected components.\n * * Return `0` if all dihedral angles are zero (and `ignoreBoundaries === true`). The mesh is planar.\n * * Otherwise, return `1` if all dihedral angles are non-negative. The mesh probably encloses a convex volume and\n * has outward normals.\n * * Otherwise, return `-1` if all dihedral angles are non-positive. The mesh probably encloses a convex volume and\n * has inward normals.\n * * Otherwise, return `-2`. Also return `-2` if a non-manifold condition was detected, or a facet normal could not\n * be computed. A non-manifold condition is a positive-length edge adjacent to more than 2 facets or (if\n * `ignoreBoundaries` is false) adjacent to exactly one facet.\n */\n public static dihedralAngleSummary(source: Polyface | PolyfaceVisitor, ignoreBoundaries: boolean = false): number {\n // more info can be found at geometry/internaldocs/Polyface.md\n const edges = new IndexedEdgeMatcher();\n const vertices = source instanceof Polyface ? source.data.point : undefined;\n const visitor = source instanceof Polyface ? source.createVisitor(1) : source;\n visitor.setNumWrap(1);\n const centroidNormal: Ray3d[] = [];\n let normalCounter = 0;\n for (visitor.reset(); visitor.moveToNextFacet();) {\n const numEdges = visitor.pointCount - 1;\n const normal = PolygonOps.centroidAreaNormal(visitor.point);\n if (normal === undefined)\n return -2;\n centroidNormal.push(normal);\n for (let i = 0; i < numEdges; i++) {\n const edge = edges.addEdge(visitor.clientPointIndex(i), visitor.clientPointIndex(i + 1), normalCounter);\n if (!vertices) // decorate if we don't have vertices to query later\n (edge as any).edgeVector = Vector3d.createStartEnd(visitor.point.getPoint3dAtUncheckedPointIndex(i), visitor.point.getPoint3dAtUncheckedPointIndex(i + 1));\n }\n normalCounter++;\n }\n // find \"manifold clusters\" and \"bad clusters\"\n // manifold clusters are edges adjacent to 2 facets\n // bad clusters are edges adjacent to more than 2 facets or (if ignoreBoundaries is false) adjacent to 1 facet\n const badClusters: SortableEdgeCluster[] = [];\n const manifoldClusters: SortableEdgeCluster[] = [];\n edges.sortAndCollectClusters(manifoldClusters, ignoreBoundaries ? undefined : badClusters, undefined, badClusters);\n if (badClusters.length > 0)\n return -2;\n // find angle between facet centroid normals (dihedral angles)\n let numPositive = 0;\n let numPlanar = 0;\n let numNegative = 0;\n const edgeVector = Vector3d.create();\n for (const cluster of manifoldClusters) {\n if (Array.isArray(cluster) && cluster.length === 2) {\n const sideA = cluster[0];\n const sideB = cluster[1];\n if (vertices)\n vertices.vectorIndexIndex(sideA.startVertex, sideA.endVertex, edgeVector);\n else\n edgeVector.setFrom((sideA as any).edgeVector);\n const facetNormalA = centroidNormal[sideA.facetIndex].direction;\n const facetNormalB = centroidNormal[sideB.facetIndex].direction;\n const dihedralAngle = facetNormalA.signedAngleTo(facetNormalB, edgeVector);\n if (dihedralAngle.isAlmostZero)\n numPlanar++;\n else if (dihedralAngle.radians > 0.0)\n numPositive++;\n else\n numNegative++;\n }\n }\n // categorize the mesh\n if (numPositive > 0 && numNegative === 0)\n return 1;\n if (numNegative > 0 && numPositive === 0)\n return -1;\n if (numPlanar > 0 && numPositive === 0 && numNegative === 0) // planar mesh\n return 0;\n return -2;\n }\n /**\n * Test for convex volume by dihedral angle tests on all edges.\n * * This tests if all dihedral angles of the mesh are positive.\n * * In a closed solid, this is a strong test for overall mesh convexity with outward facing normals.\n * * See [[dihedralAngleSummary]] for the definition of \"dihedral angle\".\n * * With `ignoreBoundaries` true, this may be a useful test when all the facets are in a single edge-connected\n * component, such as a pyramid with no underside.\n * * It is not a correct test if there are multiple, disjoint components.\n * * Take the above-mentioned pyramid with no underside.\n * * Within the same mesh, have a second pyramid placed to the side, still facing upward.\n * * The angles will pass the dihedral convexity test, but the composite thing surely is not convex.\n * @param source mesh.\n * @param ignoreBoundaries if `true` ignore simple boundary edges, i.e., allow unclosed meshes. Default is `false`.\n * @returns true if all dihedral angles of the mesh are positive.\n */\n public static isConvexByDihedralAngleCount(source: Polyface | PolyfaceVisitor, ignoreBoundaries: boolean = false): boolean {\n return this.dihedralAngleSummary(source, ignoreBoundaries) > 0;\n }\n\n /** Helper function to detect a subset visitor. */\n public static isSubsetVisitor(visitor: Polyface | PolyfaceVisitor): boolean {\n if (visitor instanceof Polyface)\n return false;\n const parentFacetCount = visitor.clientPolyface()?.facetCount;\n const visitableFacetCount = visitor.getVisitableFacetCount?.();\n if (parentFacetCount === undefined || visitableFacetCount === undefined)\n return false;\n return parentFacetCount > visitableFacetCount;\n }\n\n /**\n * Faster version of isPolyfaceManifold for specific input.\n * @returns whether the mesh is manifold, or undefined if unsuccessful.\n */\n private static isPolyfaceManifoldFast(source: Polyface | PolyfaceVisitor, allowSimpleBoundaries: boolean): boolean | undefined {\n if (allowSimpleBoundaries)\n return undefined; // edgeMateIndex does not distinguish boundary edges from non-manifold edges so we can only speed things up if we search for both\n if (this.isSubsetVisitor(source))\n return false; // edgeMateIndex doesn't capture the facet subset boundary\n const parentData = IndexedPolyface.hasEdgeMateIndex(source)\n if (!parentData)\n return undefined;\n for (const edgeMate of parentData.edgeMateIndex) {\n if (edgeMate === undefined)\n return false; // found a boundary or non-manifold edge\n }\n return true; // this is a 2-manifold closed surface\n }\n /**\n * Test edge pairing in `source` mesh.\n * * Any edge with 3 or more adjacent facets triggers `false` return.\n * * Any edge with 2 adjacent facets in the same direction triggers `false` return.\n * * Null edges are ignored.\n * @param source facet set to examine\n * @param allowSimpleBoundaries if `false` (default), a return value of `true` means the facets form a closed\n * 2-manifold surface; if `true`, a return value of `true` means the facets form a 2-manifold surface which may\n * have a boundary, but is still properly matched internally.\n */\n public static isPolyfaceManifold(source: Polyface | PolyfaceVisitor, allowSimpleBoundaries: boolean = false): boolean {\n const isManifold = this.isPolyfaceManifoldFast(source, allowSimpleBoundaries);\n if (isManifold !== undefined)\n return isManifold\n const badClusters: SortableEdgeCluster[] = [];\n this.createIndexedEdges(source).sortAndCollectClusters(undefined, allowSimpleBoundaries ? undefined : badClusters, undefined, badClusters);\n return badClusters.length === 0;\n }\n /** Test if the facets in `source` occur in perfectly mated pairs, as is required for a closed manifold volume. */\n public static isPolyfaceClosedByEdgePairing(source: Polyface | PolyfaceVisitor): boolean {\n return this.isPolyfaceManifold(source, false);\n }\n /**\n * Faster version of announceBoundaryEdges for specific input.\n * @returns true if successfully announced boundary edges.\n */\n private static announceBoundaryEdgesFast(\n source: Polyface | PolyfaceVisitor,\n announceEdge: (pointA: Point3d, pointB: Point3d, indexA: number, indexB: number, facetIndex: number) => void,\n includeTypical: boolean,\n includeMismatch: boolean,\n includeNull: boolean,\n ): boolean {\n if (includeTypical !== includeMismatch)\n return false; // edgeMateIndex does not distinguish boundary edges from non-manifold edges\n if (!includeTypical && !includeNull)\n return true;\n if (this.isSubsetVisitor(source))\n return false; // edgeMateIndex doesn't capture the facet subset boundary\n const parentData = IndexedPolyface.hasEdgeMateIndex(source);\n if (!parentData)\n return false;\n const pointA = Point3d.create();\n const pointB = Point3d.create();\n for (let edgeIndex = 0; edgeIndex < parentData.edgeMateIndex.length; edgeIndex++) {\n const edgeMate = parentData.edgeMateIndex[edgeIndex];\n const announceBoundaryOrNonManifoldEdge = includeTypical && edgeMate === undefined;\n const announceNullEdge = includeNull && edgeMate === edgeIndex;\n if (announceBoundaryOrNonManifoldEdge || announceNullEdge) {\n const facetIndex = parentData.parent.edgeIndexToFacetIndex(edgeIndex);\n if (facetIndex !== undefined) { // should always be defined\n const pointIndexA = parentData.parent.data.pointIndex[edgeIndex];\n let nextEdgeIndex = edgeIndex + 1;\n if (nextEdgeIndex >= parentData.parent.facetIndex1(facetIndex))\n nextEdgeIndex = parentData.parent.facetIndex0(facetIndex);\n const pointIndexB = parentData.parent.data.pointIndex[nextEdgeIndex];\n parentData.parent.data.getPoint(pointIndexA, pointA);\n parentData.parent.data.getPoint(pointIndexB, pointB);\n announceEdge(pointA, pointB, pointIndexA, pointIndexB, facetIndex);\n }\n }\n }\n return true;\n }\n /**\n * Announce boundary edges of the facet set as line segments.\n * @param source polyface or visitor.\n * @param announceEdge function to be called with each boundary edge. The announcement is start and end points,\n * start and end vertex indices, and facet index.\n * @param includeTypical true to announce typical boundary edges with a single adjacent facet. Default is true.\n * @param includeMismatch true to announce non-manifold edges (more than 2 adjacent facets, or mismatched\n * orientations). Default is true.\n * @param includeNull true to announce edges with identical start and end vertex indices. Default is true.\n * @see [[announceBoundaryChainsAsLineString3d]] for boundary linestring announcement\n * @see [[collectBoundaryEdges]] for boundary chain collection\n * @see [[boundaryEdges]] for boundary edge collection\n */\n public static announceBoundaryEdges(\n source: Polyface | PolyfaceVisitor,\n announceEdge: (pointA: Point3d, pointB: Point3d, indexA: number, indexB: number, facetIndex: number) => void,\n includeTypical: boolean = true,\n includeMismatch: boolean = true,\n includeNull: boolean = true,\n ): void {\n if (this.announceBoundaryEdgesFast(source, announceEdge, includeTypical, includeMismatch, includeNull))\n return;\n if (!includeTypical && !includeMismatch && !includeNull)\n return;\n const vertices = source instanceof Polyface ? source.data.point : undefined;\n const visitor = source instanceof Polyface ? source.createVisitor(1) : source;\n visitor.setNumWrap(1);\n const edges = new IndexedEdgeMatcher();\n for (visitor.reset(); visitor.moveToNextFacet();) {\n const numEdges = visitor.pointCount - 1;\n for (let i = 0; i < numEdges; i++) {\n const edge = edges.addEdge(visitor.clientPointIndex(i), visitor.clientPointIndex(i + 1), visitor.currentReadIndex());\n if (!vertices) { // decorate if we don't have vertices to query later\n (edge as any).pointA = visitor.point.getPoint3dAtUncheckedPointIndex(i);\n (edge as any).pointB = visitor.point.getPoint3dAtUncheckedPointIndex(i + 1);\n }\n }\n }\n const boundaryEdges: SortableEdgeCluster[] = [];\n const typicalEdges = includeTypical ? boundaryEdges : undefined;\n const nullEdges = includeNull ? boundaryEdges : undefined;\n const mismatchEdges = includeMismatch ? boundaryEdges : undefined;\n edges.sortAndCollectClusters(undefined, typicalEdges, nullEdges, mismatchEdges);\n if (boundaryEdges.length === 0)\n return;\n const pointA = Point3d.create();\n const pointB = Point3d.create();\n for (const e of boundaryEdges) {\n const e1 = e instanceof SortableEdge ? e : e[0]; // only report the first edge in a cluster!\n const indexA = e1.startVertex;\n const indexB = e1.endVertex;\n if (vertices) {\n vertices.getPoint3dAtUncheckedPointIndex(indexA, pointA);\n vertices.getPoint3dAtUncheckedPointIndex(indexB, pointB);\n } else {\n pointA.setFrom((e1 as any).pointA);\n pointB.setFrom((e1 as any).pointB);\n }\n announceEdge(pointA, pointB, indexA, indexB, e1.facetIndex);\n }\n }\n /**\n * Collect boundary edges of the facet set as an unordered collection of line segments.\n * @param source polyface or visitor.\n * @param includeTypical true to include typical boundary edges with a single adjacent facet. Default is true.\n * @param includeMismatch true to include non-manifold edges (more than 2 adjacent facets, or mismatched\n * orientations). Default is true.\n * @param includeNull true to include edges with identical start and end vertex indices. Default is true.\n * @see [[announceBoundaryChainsAsLineString3d]] for boundary linestring announcement\n * @see [[collectBoundaryEdges]] for boundary chain collection\n * @see [[announceBoundaryEdges]] for boundary edge announcement\n */\n public static boundaryEdges(\n source: Polyface | PolyfaceVisitor,\n includeTypical: boolean = true,\n includeMismatch: boolean = true,\n includeNull: boolean = true,\n ): CurveCollection | undefined {\n const result = new BagOfCurves();\n const announceEdge = (pointA: Point3d, pointB: Point3d, _indexA: number, _indexB: number, _readIndex: number) => {\n result.tryAddChild(LineSegment3d.create(pointA, pointB));\n };\n PolyfaceQuery.announceBoundaryEdges(source, announceEdge, includeTypical, includeMismatch, includeNull);\n if (result.children.length === 0)\n return undefined;\n return result;\n }\n /**\n * Collect boundary edges of the facet set as the simplest collection of chains of line segments.\n * @param source polyface or visitor.\n * @param includeTypical true to include typical boundary edges with a single adjacent facet. Default is true.\n * @param includeMismatch true to include non-manifold edges (more than 2 adjacent facets, or mismatched\n * orientations). Default is true.\n * @param includeNull true to include edges with identical start and end vertex indices. Default is true.\n * @see [[announceBoundaryChainsAsLineString3d]] for boundary linestring announcement\n * @see [[announceBoundaryEdges]] for boundary edge announcement\n * @see [[boundaryEdges]] for boundary edge collection\n */\n public static collectBoundaryEdges(\n source: Polyface | PolyfaceVisitor,\n includeTypical: boolean = true,\n includeMismatch: boolean = true,\n includeNull: boolean = true,\n ): AnyChain | undefined {\n const collector = new MultiChainCollector(Geometry.smallMetricDistance, Geometry.smallMetricDistance);\n const announceEdge = (ptA: Point3d, ptB: Point3d) => collector.captureCurve(LineSegment3d.create(ptA, ptB));\n PolyfaceQuery.announceBoundaryEdges(source, announceEdge, includeTypical, includeMismatch, includeNull);\n return collector.grabResult(true);\n }\n /**\n * Load an IndexedEdgeMatcher from the edges of a mesh.\n * @param polyface a mesh or visitor\n */\n public static createIndexedEdges(polyface: Polyface | PolyfaceVisitor): IndexedEdgeMatcher {\n const edges = new IndexedEdgeMatcher();\n const visitor = polyface instanceof Polyface ? polyface.createVisitor(1) : polyface;\n visitor.setNumWrap(1);\n for (visitor.reset(); visitor.moveToNextFacet();)\n edges.addPath(visitor.pointIndex, visitor.currentReadIndex(), false);\n return edges;\n }\n /**\n * Invoke the callback on each manifold edge whose adjacent facet normals form vectorToEye dot products\n * with opposite sign.\n * * The callback is not called on boundary edges.\n * @param source polyface or visitor.\n * @param announce callback function invoked on manifold silhouette edges.\n * @param vectorToEye normal of plane in which to compute silhouette edges.\n * @param sideAngle angular tolerance for perpendicularity test.\n */\n public static announceSilhouetteEdges(\n source: Polyface | PolyfaceVisitor,\n announce: (pointA: Point3d, pointB: Point3d, vertexIndexA: number, vertexIndexB: number, facetIndex: number) => void,\n vectorToEye: Vector3d,\n sideAngle: Angle = Angle.createSmallAngle(),\n ): void {\n if (source instanceof Polyface)\n return this.announceSilhouetteEdges(source.createVisitor(1), announce, vectorToEye, sideAngle);\n const mesh = source.clientPolyface();\n if (undefined === mesh)\n return;\n source.setNumWrap(1);\n const allEdges = this.createIndexedEdges(source);\n const manifoldEdges: SortableEdgeCluster[] = [];\n allEdges.sortAndCollectClusters(manifoldEdges);\n const sideAngleTol = sideAngle.radians < 0.0 ? -sideAngle.radians : sideAngle.radians;\n const pointA = Point3d.create();\n const pointB = Point3d.create();\n const normal = Vector3d.create();\n const analyzeFace = (iFacet: number): { isSideFace: boolean, perpAngle: number } => {\n if (!PolyfaceQuery.computeFacetUnitNormal(source, iFacet, normal))\n return { isSideFace: false, perpAngle: 0.0 };\n const perpAngle = normal.radiansFromPerpendicular(vectorToEye);\n const isSideFace = Math.abs(perpAngle) <= sideAngleTol;\n return { isSideFace, perpAngle };\n };\n for (const pair of manifoldEdges) {\n if (!Array.isArray(pair) || pair.length !== 2)\n continue;\n const indexA = pair[0].startVertex;\n const indexB = pair[0].endVertex;\n if (!mesh.data.getPoint(indexA, pointA) || !mesh.data.getPoint(indexB, pointB))\n continue;\n const face0 = analyzeFace(pair[0].facetIndex);\n if (face0.isSideFace) {\n announce(pointA, pointB, indexA, indexB, pair[0].facetIndex);\n continue;\n }\n const face1 = analyzeFace(pair[1].facetIndex);\n if (face1.isSideFace) {\n announce(pointB, pointA, indexB, indexA, pair[1].facetIndex);\n continue;\n }\n if (face0.perpAngle * face1.perpAngle < 0.0) { // normals straddle plane\n announce(pointA, pointB, indexA, indexB, pair[0].facetIndex);\n continue;\n }\n }\n }\n /**\n * Collect manifold edges whose adjacent facet normals form vectorToEye dot products with opposite sign.\n * * Does not return boundary edges.\n * * Return the edges as chains of line segments.\n * @param source polyface or visitor.\n * @param vectorToEye normal of plane in which to compute silhouette edges.\n * @param sideAngle angular tolerance for perpendicularity test.\n */\n public static collectSilhouetteEdges(\n source: Polyface | PolyfaceVisitor,\n vectorToEye: Vector3d,\n sideAngle: Angle = Angle.createSmallAngle(),\n ): AnyChain | undefined {\n const collector = new MultiChainCollector(Geometry.smallMetricDistance, Geometry.smallMetricDistance);\n PolyfaceQuery.announceSilhouetteEdges(\n source,\n (ptA: Point3d, ptB: Point3d) => collector.captureCurve(LineSegment3d.create(ptA, ptB)),\n vectorToEye,\n sideAngle,\n );\n return collector.grabResult(true);\n }\n /**\n * Find segments (within the linestring) which project to facets.\n * * Announce each pair of linestring segment and on-facet segment through a callback.\n * * Facets are ASSUMED to be convex and planar, and not overlap in the z direction.\n */\n public static announceSweepLinestringToConvexPolyfaceXY(linestringPoints: IndexedXYZCollection, polyface: Polyface, announce: AnnounceDrapePanel): void {\n const context = SweepLineStringToFacetContext.create(linestringPoints);\n if (context) {\n const visitor = polyface.createVisitor(0);\n for (visitor.reset(); visitor.moveToNextFacet();) {\n context.projectToPolygon(visitor.point, announce, polyface, visitor.currentReadIndex());\n }\n }\n }\n // amount of computation to do per step of async methods.\n private static _asyncWorkLimit = 1.e06;\n /**\n * Set the limit on work during an async time blocks, and return the old value.\n * * This should be a large number -- default is 1.0e6\n * @internal\n */\n public static setAsyncWorkLimit(value: number): number {\n const oldValue = this._asyncWorkLimit;\n this._asyncWorkLimit = value;\n return oldValue;\n }\n /**\n * Query the current limit on work during an async time block.\n * @internal\n */\n public static get asyncWorkLimit(): number {\n return this._asyncWorkLimit;\n }\n /**\n * Number of \"await\" steps executed in recent async calls.\n * @internal\n */\n public static awaitBlockCount = 0;\n /** Execute `context.projectToPolygon` until its work estimates accumulate to workLimit. */\n private static async continueAnnounceSweepLinestringToConvexPolyfaceXY(\n context: SweepLineStringToFacetContext, visitor: PolyfaceVisitor, announce: AnnounceDrapePanel,\n ): Promise<number> {\n let workCount = 0;\n while ((workCount < this.asyncWorkLimit) && visitor.moveToNextFacet()) {\n workCount += context.projectToPolygon(visitor.point, announce, visitor.clientPolyface()!, visitor.currentReadIndex());\n }\n return workCount;\n }\n /**\n * Find segments (within the linestring) which project to facets.\n * * Announce each pair of linestring segment and on-facet segment through a callback.\n * * Facets are ASSUMED to be convex and planar, and not overlap in the z direction.\n * * REMARK: Although this is public, the usual use is via slightly higher level public methods, viz:\n * * asyncSweepLinestringToFacetsXYReturnChains\n * @internal\n */\n public static async asyncAnnounceSweepLinestringToConvexPolyfaceXY(\n linestringPoints: IndexedXYZCollection, polyface: Polyface, announce: AnnounceDrapePanel,\n ): Promise<number> {\n const context = SweepLineStringToFacetContext.create(linestringPoints);\n this.awaitBlockCount = 0;\n let workTotal = 0;\n if (context) {\n const visitor = polyface.createVisitor(0);\n let workCount;\n while (0 < (workCount = await Promise.resolve(PolyfaceQuery.continueAnnounceSweepLinestringToConvexPolyfaceXY(context, visitor, announce)))) {\n workTotal += workCount;\n this.awaitBlockCount++;\n // GeometryCoreTestIO.consoleLog({ myWorkCount: workCount, myBlockCount: this.awaitBlockCount });\n }\n }\n // GeometryCoreTestIO.consoleLog({ myWorkTotal: workTotal, myBlockCount: this.awaitBlockCount });\n return workTotal;\n }\n /**\n * Search the facets for facet subsets that are connected with at least vertex contact.\n * * Return array of arrays of facet indices.\n */\n public static partitionFacetIndicesByVertexConnectedComponent(polyface: Polyface | PolyfaceVisitor): number[][] {\n if (polyface instanceof Polyface) {\n return this.partitionFacetIndicesByVertexConnectedComponent(polyface.createVisitor(0));\n }\n // The polyface is really a visitor\n const context = new UnionFindContext(this.visitorClientPointCount(polyface));\n for (polyface.reset(); polyface.moveToNextFacet();) {\n const firstVertexIndexOnThisFacet = polyface.pointIndex[0];\n for (const vertexIndex of polyface.pointIndex)\n context.mergeSubsets(firstVertexIndexOnThisFacet, vertexIndex);\n }\n const roots = context.collectRootIndices();\n const facetsInComponent: number[][] = [];\n const numRoots = roots.length;\n for (let i = 0; i < numRoots; i++) {\n facetsInComponent.push([]);\n }\n for (polyface.reset(); polyface.moveToNextFacet();) {\n const firstVertexIndexOnThisFacet = polyface.pointIndex[0];\n const rootVertexForThisFacet = context.findRoot(firstVertexIndexOnThisFacet);\n for (let rootIndex = 0; rootIndex < numRoots; rootIndex++) {\n if (roots[rootIndex] === rootVertexForThisFacet) {\n facetsInComponent[rootIndex].push(polyface.currentReadIndex());\n break;\n }\n }\n }\n return facetsInComponent;\n }\n /**\n * * Examine the normal orientation for each faces.\n * * Separate to 3 partitions:\n * * Facets with normal in the positive direction of the vectorToEye (partition 0).\n * * Facets with normal in the negative direction of the vectorToEye (partition 1).\n * * Facets nearly perpendicular to the view vector (partition 2).\n * * Return array of arrays of facet indices.\n */\n public static partitionFacetIndicesByVisibilityVector(\n polyface: Polyface | PolyfaceVisitor, vectorToEye: Vector3d, sideAngleTolerance: Angle,\n ): number[][] {\n if (polyface instanceof Polyface) {\n return this.partitionFacetIndicesByVisibilityVector(polyface.createVisitor(0), vectorToEye, sideAngleTolerance);\n }\n const facetsInComponent: number[][] = [];\n for (let i = 0; i < 3; i++) {\n facetsInComponent.push([]);\n }\n const forwardComponent = facetsInComponent[0];\n const rearComponent = facetsInComponent[1];\n const sideComponent = facetsInComponent[2];\n const radiansTol = Math.max(sideAngleTolerance.radians, 1.0e-8);\n for (polyface.reset(); polyface.moveToNextFacet();) {\n const areaNormal = PolygonOps.areaNormalGo(polyface.point);\n const index = polyface.currentReadIndex();\n if (areaNormal) {\n const angle = areaNormal.angleFromPerpendicular(vectorToEye);\n if (Math.abs(angle.radians) < radiansTol) {\n sideComponent.push(index);\n } else if (areaNormal.dotProduct(vectorToEye) < 0) {\n rearComponent.push(index);\n } else {\n forwardComponent.push(index);\n }\n }\n }\n return facetsInComponent;\n }\n /**\n * Return the boundary of facets that are facing the eye.\n * @param source polyface or visitor. Must be capable of constructing a subset visitor.\n * @param visibilitySubset selector among the visible facet sets extracted by partitionFacetIndicesByVisibilityVector\n * * 0 ==> forward facing\n * * 1 ==> rear facing\n * * 2 ==> side facing\n * @param vectorToEye the vector to eye\n * @param sideAngleTolerance the tolerance of side angle\n */\n public static boundaryOfVisibleSubset(\n source: Polyface | PolyfaceVisitor,\n visibilitySelect: 0 | 1 | 2,\n vectorToEye: Vector3d,\n sideAngleTolerance: Angle = Angle.createDegrees(1.0e-3),\n ): CurveCollection | undefined {\n const visitor = source instanceof Polyface ? source.createVisitor(0) : source;\n if (!visitor.createSubsetVisitor)\n return undefined;\n const partitionedIndices = this.partitionFacetIndicesByVisibilityVector(source, vectorToEye, sideAngleTolerance);\n if (partitionedIndices[visibilitySelect].length === 0)\n return undefined;\n const subsetVisitor = visitor.createSubsetVisitor(partitionedIndices[visibilitySelect], 1);\n return this.boundaryEdges(subsetVisitor, true, false, false);\n }\n /**\n * Announce boundary edges of the facet set as linestrings.\n * * Ignores non-manifold interior edges and null edges.\n * @param source polyface or visitor.\n * @param announceChain function to be called with each chain of boundary edges.\n * @see [[collectBoundaryEdges]] for boundary chain collection\n * @see [[announceBoundaryEdges]] for boundary edge announcement\n * @see [[boundaryEdges]] for boundary edge collection\n */\n public static announceBoundaryChainsAsLineString3d(\n source: Polyface | PolyfaceVisitor, announceChain: (points: LineString3d) => void,\n ): void {\n const collector = new MultiChainCollector(Geometry.smallMetricDistance); // no planarity tolerance needed\n const announceEdge = (ptA: Point3d, ptB: Point3d) => collector.captureCurve(LineSegment3d.create(ptA, ptB));\n PolyfaceQuery.announceBoundaryEdges(source, announceEdge, true, false, false);\n collector.announceChainsAsLineString3d(announceChain);\n }\n /**\n * Return a mesh with\n * * clusters of adjacent, coplanar facets merged into larger (possibly non-convex) facets.\n * * other facets are unchanged.\n * @param mesh existing mesh or visitor.\n * @param maxSmoothEdgeAngle maximum dihedral angle across an edge between facets deemed coplanar. If undefined,\n * uses `Geometry.smallAngleRadians`.\n */\n public static cloneWithMaximalPlanarFacets(\n mesh: Polyface | PolyfaceVisitor, maxSmoothEdgeAngle?: Angle,\n ): IndexedPolyface {\n if (mesh instanceof Polyface)\n return this.cloneWithMaximalPlanarFacets(mesh.createVisitor(0), maxSmoothEdgeAngle);\n const numFacets = PolyfaceQuery.visitorClientFacetCount(mesh);\n const smoothEdges = PolyfaceQuery.collectEdgesByDihedralAngle(mesh, maxSmoothEdgeAngle);\n const partitions = PolyfaceQuery.partitionFacetIndicesBySortableEdgeClusters(smoothEdges, numFacets);\n const builder = PolyfaceBuilder.create();\n const visitor = mesh;\n const planarPartitions: number[][] = [];\n const partitionNormals: Ray3d[] = []; // average normal in each nontrivial partition\n const normal = Vector3d.createZero();\n for (const partition of partitions) {\n if (partition.length === 1) {\n if (visitor.moveToReadIndex(partition[0]))\n builder.addFacetFromVisitor(visitor);\n } else if (partition.length > 1) { // nontrivial set of contiguous coplanar facets\n const averageNormal = Vector3d.createZero();\n const point0 = Point3d.createZero();\n if (visitor.moveToReadIndex(partition[0]))\n visitor.point.getPoint3dAtCheckedPointIndex(0, point0);\n for (const facetIndex of partition) {\n if (visitor.moveToReadIndex(facetIndex))\n if (PolygonOps.areaNormalGo(visitor.point, normal))\n averageNormal.addInPlace(normal);\n }\n partitionNormals.push(Ray3d.createCapture(point0, averageNormal));\n planarPartitions.push(partition);\n }\n }\n const fragmentPolyfaces = PolyfaceQuery.clonePartitions(mesh, planarPartitions);\n assert(planarPartitions.length === partitionNormals.length);\n assert(planarPartitions.length === fragmentPolyfaces.length);\n const gapTolerance = 1.0e-4;\n const planarityTolerance = 1.0e-4;\n const localToWorld = Transform.createIdentity();\n const worldToLocal = Transform.createIdentity();\n for (let i = 0; i < fragmentPolyfaces.length; ++i) {\n const fragment = fragmentPolyfaces[i];\n const edges: LineSegment3d[] = [];\n const edgeStrings: Point3d[][] = [];\n PolyfaceQuery.announceBoundaryEdges(fragment,\n (pointA: Point3d, pointB: Point3d, _indexA: number, _indexB: number) => {\n edges.push(LineSegment3d.create(pointA, pointB));\n edgeStrings.push([pointA.clone(), pointB.clone()]);\n }, true, false, false);\n const chains = CurveOps.collectChains(edges, gapTolerance, planarityTolerance);\n if (chains) {\n // avoid FrameBuilder: it can flip the normal of a nonconvex facet!\n partitionNormals[i].toRigidZFrame(localToWorld);\n if (localToWorld.inverse(worldToLocal)) {\n worldToLocal.multiplyPoint3dArrayArrayInPlace(edgeStrings);\n // Regularize adds bridge edges to holes, and adds other edges to aid triangulation.\n // But we aren't triangulating here. So if we don't have holes, we can skip regularization\n // to avoid splitting the loop.\n const regularize = !(chains instanceof Loop);\n const graph = HalfEdgeGraphMerge.formGraphFromChains(edgeStrings, regularize, HalfEdgeMask.BOUNDARY_EDGE);\n if (graph) {\n HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph,\n new HalfEdgeMaskTester(HalfEdgeMask.BOUNDARY_EDGE), HalfEdgeMask.EXTERIOR);\n // this.purgeNullFaces(HalfEdgeMask.EXTERIOR);\n const polyface1 = PolyfaceBuilder.graphToPolyface(graph);\n builder.addIndexedPolyface(polyface1, false, localToWorld);\n }\n }\n }\n }\n return builder.claimPolyface(true);\n }\n /**\n * Return a mesh with \"some\" holes filled in with new facets.\n * * Candidate chains are computed by [[announceBoundaryChainsAsLineString3d]].\n * * Unclosed chains are rejected.\n * * Closed chains are triangulated and returned as a mesh.\n * * The options structure enforces restrictions on how complicated the hole filling can be:\n * * maxEdgesAroundHole -- holes with more edges are skipped.\n * * maxPerimeter -- holes with larger summed edge lengths are skipped.\n * * upVector -- holes that do not have positive area along this view are skipped.\n * * includeOriginalMesh -- includes the original mesh in the output mesh, so the composite mesh is a\n * clone with holes filled.\n * @param mesh existing mesh.\n * @param options options controlling the hole fill.\n * @param unfilledChains optional array to receive the points around holes that were not filled.\n */\n public static fillSimpleHoles(\n mesh: Polyface | PolyfaceVisitor, options: HoleFillOptions, unfilledChains?: LineString3d[],\n ): IndexedPolyface | undefined {\n if (mesh instanceof Polyface)\n return this.fillSimpleHoles(mesh.createVisitor(0), options, unfilledChains);\n const builder = PolyfaceBuilder.create();\n const chains: LineString3d[] = [];\n PolyfaceQuery.announceBoundaryChainsAsLineString3d(\n mesh,\n (ls: LineString3d) => { ls.reverseInPlace(); chains.push(ls); },\n );\n for (const c of chains) {\n const points = c.points;\n let rejected = false;\n if (!c.isPhysicallyClosed)\n rejected = true;\n else if (options.maxEdgesAroundHole !== undefined && points.length > options.maxEdgesAroundHole)\n rejected = true;\n else if (options.maxPerimeter !== undefined && Point3dArray.sumEdgeLengths(points, false) > options.maxPerimeter)\n rejected = true;\n else if (options.upVector !== undefined && PolygonOps.sumTriangleAreasPerpendicularToUpVector(points, options.upVector) <= 0.0)\n rejected = true;\n if (!rejected && SpacePolygonTriangulation.triangulateSimplestSpaceLoop(points,\n (_loop: Point3d[], triangles: Point3d[][]) => {\n for (const t of triangles)\n builder.addPolygon(t);\n },\n )) {\n } else {\n rejected = true;\n }\n if (rejected && unfilledChains !== undefined)\n unfilledChains.push(c); // yes, capture it -- this scope owns the chains and has no further use for it.\n }\n if (options.includeOriginalMesh !== undefined && options.includeOriginalMesh) {\n for (mesh.reset(); mesh.moveToNextFacet();)\n builder.addFacetFromVisitor(mesh);\n }\n return builder.claimPolyface(true);\n }\n /** Clone the facets in each partition to a separate polyface. */\n public static clonePartitions(polyface: Polyface | PolyfaceVisitor, partitions: number[][]): IndexedPolyface[] {\n if (polyface instanceof Polyface) {\n return this.clonePartitions(polyface.createVisitor(0), partitions);\n }\n polyface.setNumWrap(0);\n const polyfaces: IndexedPolyface[] = [];\n const options = StrokeOptions.createForFacets();\n options.needNormals = polyface.normal !== undefined;\n options.needParams = polyface.param !== undefined;\n options.needColors = polyface.color !== undefined;\n options.needTwoSided = polyface.twoSided;\n for (const partition of partitions) {\n const builder = PolyfaceBuilder.create(options);\n polyface.reset();\n for (const facetIndex of partition) {\n polyface.moveToReadIndex(facetIndex);\n builder.addFacetFromVisitor(polyface);\n }\n polyfaces.push(builder.claimPolyface(true));\n }\n return polyfaces;\n }\n /** Clone facets that pass a filter function. */\n public static cloneFiltered(\n source: Polyface | PolyfaceVisitor, filter: (visitor: PolyfaceVisitor) => boolean,\n ): IndexedPolyface {\n if (source instanceof Polyface) {\n return this.cloneFiltered(source.createVisitor(0), filter);\n }\n source.setNumWrap(0);\n const options = StrokeOptions.createForFacets();\n options.needNormals = source.normal !== undefined;\n options.needParams = source.param !== undefined;\n options.needColors = source.color !== undefined;\n options.needTwoSided = source.twoSided;\n const builder = PolyfaceBuilder.create(options);\n source.reset();\n for (; source.moveToNextFacet();) {\n if (filter(source))\n builder.addFacetFromVisitor(source);\n }\n return builder.claimPolyface(true);\n }\n /** Clone the facets with in-facet dangling edges removed. */\n public static cloneWithDanglingEdgesRemoved(source: Polyface | PolyfaceVisitor): IndexedPolyface {\n if (source instanceof Polyface)\n return this.cloneWithDanglingEdgesRemoved(source.createVisitor(0));\n const options = StrokeOptions.createForFacets();\n options.needNormals = source.normal !== undefined;\n options.needParams = source.param !== undefined;\n options.needColors = source.color !== undefined;\n options.needTwoSided = source.twoSided;\n const builder = PolyfaceBuilder.create(options);\n // Finds an odd palindrome in data as indexed by indices.\n // An odd palindrome in a face loop corresponds to dangling edges in the face.\n // If one is found, indices is mutated to excise the palindrome (data is untouched).\n // @returns whether indices array was mutated\n const removeFirstOddPalindrome = (indices: number[], data: number[]): boolean => {\n const n = indices.length;\n for (let i = 0; i < n; ++i) {\n let palLength = 1;\n let i0 = i; // look for odd palindrome centered at i\n let i1 = i; // and with extents i0..i1\n while (palLength + 2 <= n) {\n const iPrev = (i0 === 0) ? n - 1 : i0 - 1;\n const iNext = (i1 === n - 1) ? 0 : i1 + 1;\n if (data[indices[iPrev]] !== data[indices[iNext]])\n break; // the maximal odd palindrome centered at i has length palLength and spans [i0,i1]\n i0 = iPrev;\n i1 = iNext;\n palLength += 2;\n }\n if (palLength > 1) { // excise the palindrome (but keep i1)\n if (i0 < i1) {\n indices.splice(i0, palLength - 1); // remove entries [i0,i1)\n } else if (i0 > i1) {\n indices.splice(i0); // remove entries [i0,n)\n indices.splice(0, i1); // remove entries [0,i1)\n }\n return true;\n }\n }\n return false;\n };\n source.setNumWrap(0);\n source.reset();\n while (source.moveToNextFacet()) {\n const localIndices = [...Array(source.pointIndex.length).keys()]; // 0, 1, ... n-1;\n while (removeFirstOddPalindrome(localIndices, source.pointIndex)) { }\n builder.addFacetFromIndexedVisitor(source, localIndices);\n }\n return builder.claimPolyface(true);\n }\n /**\n * Return the point count of the `source`.\n * * If `source` is a visitor, this is an upper bound on the number of addressed mesh vertices.\n */\n public static visitorClientPointCount(source: Polyface | PolyfaceVisitor): number {\n if (source instanceof Polyface)\n return source.data.point.length;\n const polyface = source.clientPolyface();\n if (polyface !== undefined)\n return polyface.data.point.length;\n const saveReadIndex = source.currentReadIndex();\n source.reset();\n let maxIndex = -1;\n while (source.moveToNextFacet()) {\n for (const pointIndex of source.pointIndex)\n if (pointIndex > maxIndex)\n maxIndex = pointIndex;\n }\n source.moveToReadIndex(saveReadIndex);\n return maxIndex + 1;\n }\n /**\n * Return the facet count of the `source`.\n * * If `source` is a visitor, this is the number of facets it can visit.\n */\n public static visitorClientFacetCount(source: Polyface | PolyfaceVisitor): number {\n if (source instanceof Polyface) {\n if (source.facetCount !== undefined)\n return source.facetCount;\n source = source.createVisitor(0);\n }\n if (source.getVisitableFacetCount)\n return source.getVisitableFacetCount();\n const polyface = source.clientPolyface();\n if (polyface !== undefined && polyface.facetCount !== undefined)\n return polyface.facetCount;\n const saveReadIndex = source.currentReadIndex();\n let facetCount = 0;\n source.reset();\n while (source.moveToNextFacet())\n ++facetCount;\n source.moveToReadIndex(saveReadIndex);\n return facetCount;\n }\n /**\n * Partition the facet set into connected components such that two adjacent facets are in the same component if and\n * only if they are adjacent across a clustered edge.\n * @param edgeClusters sorted and clustered edges (cf. `IndexedEdgeMatcher.sortAndCollectClusters`).\n * @param numFacets facet count in the parent mesh. In particular, `edge.facetIndex < numFacets` for every input edge.\n * @return collection of facet index arrays, one array per connected component.\n */\n private static partitionFacetIndicesBySortableEdgeClusters(\n edgeClusters: SortableEdgeCluster[], numFacets: number,\n ): number[][] {\n const context = new UnionFindContext(numFacets);\n for (const cluster of edgeClusters) {\n if (cluster instanceof SortableEdge) {\n // this edge does not connect anywhere. Ignore it!!\n } else {\n const edge0 = cluster[0];\n for (let i = 1; i < cluster.length; i++)\n context.mergeSubsets(edge0.facetIndex, cluster[i].facetIndex);\n }\n }\n const roots = context.collectRootIndices();\n const facetsInComponent: number[][] = [];\n const numRoots = roots.length;\n for (let i = 0; i < numRoots; i++) {\n facetsInComponent.push([]);\n }\n for (let facetIndex = 0; facetIndex < numFacets; facetIndex++) {\n const rootOfFacet = context.findRoot(facetIndex);\n for (let rootIndex = 0; rootIndex < numRoots; rootIndex++) {\n if (roots[rootIndex] === rootOfFacet) {\n facetsInComponent[rootIndex].push(facetIndex);\n break;\n }\n }\n }\n return facetsInComponent;\n }\n /**\n * Partition the facet set into connected components. Each facet in a given component shares an edge only with\n * other facets in the component (or is a boundary edge).\n * @param polyface facets to partition.\n * @param stopAtVisibleEdges whether to further split connected components by visible edges of the polyface.\n * @return collection of facet index arrays, one per connected component.\n */\n public static partitionFacetIndicesByEdgeConnectedComponent(\n polyface: Polyface | PolyfaceVisitor, stopAtVisibleEdges: boolean = false,\n ): number[][] {\n if (polyface instanceof Polyface) {\n return this.partitionFacetIndicesByEdgeConnectedComponent(polyface.createVisitor(0), stopAtVisibleEdges);\n }\n polyface.setNumWrap(1);\n const matcher = new IndexedEdgeMatcher();\n polyface.reset();\n let numFacets = 0;\n while (polyface.moveToNextFacet()) {\n const numEdges = polyface.pointCount - 1;\n numFacets++;\n for (let i = 0; i < numEdges; i++) {\n if (stopAtVisibleEdges && polyface.edgeVisible[i]) {\n\n } else {\n matcher.addEdge(polyface.clientPointIndex(i), polyface.clientPointIndex(i + 1), polyface.currentReadIndex());\n }\n }\n }\n const allEdges: SortableEdgeCluster[] = [];\n matcher.sortAndCollectClusters(allEdges, allEdges, allEdges, allEdges);\n return this.partitionFacetIndicesBySortableEdgeClusters(allEdges, numFacets);\n }\n /**\n * Find segments (within the line string) which project to facets.\n * * Assemble each input segment paired with its projected segment/point as a quad/triangle facet in a new polyface.\n * * Input facets are ASSUMED to be convex and planar, and not overlap in the z direction.\n */\n public static sweepLineStringToFacetsXYReturnSweptFacets(lineStringPoints: IndexedXYZCollection, polyface: Polyface): Polyface {\n const builder = PolyfaceBuilder.create();\n this.announceSweepLinestringToConvexPolyfaceXY(\n lineStringPoints,\n polyface,\n (_linestring: IndexedXYZCollection, _segmentIndex: number, _polyface: Polyface, _facetIndex: number, points: Point3d[]) => {\n if (points.length === 4)\n builder.addQuadFacet(points);\n else if (points.length === 3)\n builder.addTriangleFacet(points);\n },\n );\n return builder.claimPolyface(true);\n }\n /** @deprecated in 4.7.0 - will not be removed until after 2026-06-13. Use [[sweepLineStringToFacetsXYReturnSweptFacets]] instead. */\n public static sweepLinestringToFacetsXYreturnSweptFacets(linestringPoints: GrowableXYZArray, polyface: Polyface): Polyface {\n return this.sweepLineStringToFacetsXYReturnSweptFacets(linestringPoints, polyface);\n }\n /**\n * Sweep the line string to intersections with a mesh and return collected line segments.\n * * Facets are ASSUMED to be convex and planar, and not overlap in the sweep direction.\n * @param points the linestring to drape onto the mesh.\n * @param source target facet set. For best results, facets should be convex and planar.\n * @param options input, filtering, search, and output options.\n * * If `undefined`, the default sweep direction is the positive z-axis, and chains are assembled and returned.\n * * For faster _vertical_ sweep, a pre-computed range tree can be supplied in `options.searcher`.\n * * For faster _non-vertical_ sweep, first transform inputs with the inverse of the transform\n * `T = Transform.createRigidFromOriginAndVector(undefined, options.vectorToEye)`, construct the searcher on these\n * local facets, call `sweepLineStringToFacets/XY` with these local inputs (and default sweep direction), and lastly,\n * transform the returned draped linework back to world coordinates with `T`.\n */\n public static sweepLineStringToFacets(points: IndexedXYZCollection, source: Polyface | PolyfaceVisitor, options?: SweepLineStringToFacetsOptions): LinearCurvePrimitive[] {\n let result: LinearCurvePrimitive[] = [];\n if (options === undefined)\n options = SweepLineStringToFacetsOptions.create();\n let chainContext: ChainMergeContext | undefined;\n if (options.assembleChains)\n chainContext = ChainMergeContext.create();\n const addSegment = chainContext ? (ptA: Point3d, ptB: Point3d) => chainContext.addSegment(ptA, ptB) : (ptA: Point3d, ptB: Point3d) => result.push(LineSegment3d.create(ptA, ptB));\n const workNormal = Vector3d.createZero();\n const visitor = source instanceof Polyface ? source.createVisitor(0) : source;\n visitor.setNumWrap(0);\n if (options.searcher && options.vectorToEye.isParallelTo(Vector3d.unitZ())) {\n const searchRange = Range3d.createNull();\n const workPoint0 = Point3d.createZero();\n const workPoint1 = Point3d.createZero();\n let edgeClipper: EdgeClipData | undefined;\n const clipEdgeToConvexPolygon = (_facetRange: any, readIndex: number) => {\n if (visitor.moveToReadIndex(readIndex) && (options.collectAll || options.collectFromThisFacetNormal(PolygonOps.areaNormalGo(visitor.point, workNormal))))\n edgeClipper?.processPolygon(visitor.point, (ptA: Point3d, ptB: Point3d) => addSegment(ptA, ptB));\n return true;\n };\n for (let i = 1; i < points.length; i++) {\n points.getPoint3dAtUncheckedPointIndex(i - 1, workPoint0);\n points.getPoint3dAtUncheckedPointIndex(i, workPoint1);\n if (edgeClipper = EdgeClipData.createPointPointSweep(workPoint0, workPoint1, options.vectorToEye)) {\n searchRange.setNull();\n searchRange.extend(workPoint0, workPoint1);\n options.searcher.searchRange2d(searchRange, clipEdgeToConvexPolygon);\n }\n }\n } else {\n const context = ClipSweptLineStringContext.create(points, options.vectorToEye);\n if (context) {\n for (visitor.reset(); visitor.moveToNextFacet();) {\n if (options.collectAll || options.collectFromThisFacetNormal(PolygonOps.areaNormalGo(visitor.point, workNormal)))\n context.processPolygon(visitor.point.getArray(), addSegment);\n }\n }\n }\n if (chainContext) {\n chainContext.clusterAndMergeVerticesXYZ();\n result = chainContext.collectMaximalChains();\n }\n return result;\n }\n /**\n * Sweep the line string in the z-direction to intersections with a mesh, using a search object for speedup.\n * @param points the linestring to drape onto the mesh.\n * @param source target facet set. For best results, facets should be convex and planar.\n * @param searcher object for searching facet 2D ranges tagged by mesh read index.\n * @returns the collected line strings.\n * @see [[sweepLineStringToFacets]] for further options.\n */\n public static sweepLineStringToFacetsXY(points: IndexedXYZCollection | Point3d[], source: Polyface | PolyfaceVisitor, searcher: Range2dSearchInterface<number>): LineString3d[] {\n const chainContext = ChainMergeContext.create();\n const vectorToEye = Vector3d.unitZ();\n const searchRange = Range3d.create();\n const workPoint0 = Point3d.createZero();\n const workPoint1 = Point3d.createZero();\n const visitor = source instanceof Polyface ? source.createVisitor(0) : source;\n visitor.setNumWrap(0);\n let edgeClipper: EdgeClipData | undefined;\n const clipEdgeToConvexPolygon = (_facetRange: any, readIndex: number) => {\n if (visitor.moveToReadIndex(readIndex))\n edgeClipper?.processPolygon(visitor.point, (ptA: Point3d, ptB: Point3d) => chainContext.addSegment(ptA, ptB));\n return true;\n };\n const lineStringSource = Array.isArray(points) ? new Point3dArrayCarrier(points) : points;\n for (let i = 1; i < lineStringSource.length; i++) {\n lineStringSource.getPoint3dAtUncheckedPointIndex(i - 1, workPoint0);\n lineStringSource.getPoint3dAtUncheckedPointIndex(i, workPoint1);\n if (edgeClipper = EdgeClipData.createPointPointSweep(workPoint0, workPoint1, vectorToEye)) {\n searchRange.setNull();\n searchRange.extend(workPoint0, workPoint1);\n searcher.searchRange2d(searchRange, clipEdgeToConvexPolygon);\n }\n }\n chainContext.clusterAndMergeVerticesXYZ();\n return chainContext.collectMaximalChains();\n }\n /**\n * Find segments (within the linestring) which project to facets.\n * * Return collected line segments.\n * * This calls [[sweepLineStringToFacets]] with options created by\n * `const options = SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), Angle.createSmallAngle(), false, true, true, true);`\n * @deprecated in 4.7.0 - will not be removed until after 2026-06-13. Use [[PolyfaceQuery.sweepLineStringToFacets]] to get further options.\n */\n public static sweepLinestringToFacetsXYReturnLines(linestringPoints: GrowableXYZArray, polyface: Polyface): LineSegment3d[] {\n const options = SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), Angle.createSmallAngle(), false, true, true, true);\n return PolyfaceQuery.sweepLineStringToFacets(linestringPoints, polyface, options) as LineSegment3d[];\n }\n /**\n * Find segments (within the linestring) which project to facets.\n * * Return chains.\n * * This calls [[sweepLineStringToFacets]] with default options.\n * @deprecated in 4.7.0 - will not be removed until after 2026-06-13. Use [[PolyfaceQuery.sweepLineStringToFacets]] to get further options.\n */\n public static sweepLinestringToFacetsXYReturnChains(linestringPoints: GrowableXYZArray, polyface: Polyface): LineString3d[] {\n return PolyfaceQuery.sweepLineStringToFacets(linestringPoints, polyface) as LineString3d[];\n }\n /**\n * Find segments (within the linestring) which project to facets.\n * * This is done as a sequence of \"await\" steps.\n * * Each \"await\" step deals with approximately PolyfaceQuery.asyncWorkLimit pairings of \"linestring edge\"\n * with \"facet edge\".\n * * PolyfaceQuery.setAsyncWorkLimit() to change work blocks from default.\n * * Return chains.\n * * Facets are ASSUMED to be convex and planar, and not overlap in the z direction.\n */\n public static async asyncSweepLinestringToFacetsXYReturnChains(\n linestringPoints: IndexedXYZCollection, polyface: Polyface,\n ): Promise<LineString3d[]> {\n const chainContext = ChainMergeContext.create();\n await Promise.resolve(\n this.asyncAnnounceSweepLinestringToConvexPolyfaceXY(\n linestringPoints,\n polyface,\n (_linestring: IndexedXYZCollection, _segmentIndex: number, _polyface: Polyface,\n _facetIndex: number, points: Point3d[], indexA: number, indexB: number) => {\n chainContext.addSegment(points[indexA], points[indexB]);\n },\n ),\n );\n chainContext.clusterAndMergeVerticesXYZ();\n const chains = chainContext.collectMaximalChains();\n return chains;\n }\n /**\n * Examine ranges of facets.\n * * Return statistical summary of x,y,z ranges.\n */\n public static collectRangeLengthData(polyface: Polyface | PolyfaceVisitor): RangeLengthData {\n if (polyface instanceof Polyface) {\n return this.collectRangeLengthData(polyface.createVisitor(0));\n }\n const rangeData = new RangeLengthData();\n // polyface is a visitor\n for (polyface.reset(); polyface.moveToNextFacet();)\n rangeData.accumulateGrowableXYZArrayRange(polyface.point);\n return rangeData;\n }\n /**\n * Clone the facets, inserting vertices (within edges) where points not part of each facet's vertex indices\n * impinge within edges.\n */\n public static cloneWithTVertexFixup(polyface: Polyface): IndexedPolyface {\n const oldFacetVisitor = polyface.createVisitor(1); // this is to visit the existing facets\n const newFacetVisitor = polyface.createVisitor(0); // this is to build the new facets\n const rangeSearcher = XYPointBuckets.create(polyface.data.point, 30)!;\n const builder = PolyfaceBuilder.create();\n const edgeRange = Range3d.createNull();\n const point0 = Point3d.create();\n const point1 = Point3d.create();\n const spacePoint = Point3d.create();\n const segment = LineSegment3d.create(point0, point1);\n\n for (oldFacetVisitor.reset(); oldFacetVisitor.moveToNextFacet();) {\n newFacetVisitor.clearArrays();\n for (let i = 0; i + 1 < oldFacetVisitor.point.length; i++) {\n // each base vertex is part of the result\n oldFacetVisitor.point.getPoint3dAtUncheckedPointIndex(i, point0);\n oldFacetVisitor.point.getPoint3dAtUncheckedPointIndex(i + 1, point1);\n newFacetVisitor.pushDataFrom(oldFacetVisitor, i);\n edgeRange.setNull();\n LineSegment3d.create(point0, point1, segment);\n let detailArray: CurveLocationDetail[] | undefined;\n edgeRange.extend(point0);\n edgeRange.extend(point1);\n edgeRange.ensureMinLengths(Geometry.smallMetricDistance); // add some slop in case segment is axis-aligned\n rangeSearcher.announcePointsInRange(edgeRange, (index: number, _x: number, _y: number, _z: number) => {\n // x,y,z has x,y within the range of the search; test for exact on (in full 3d)\n polyface.data.point.getPoint3dAtUncheckedPointIndex(index, spacePoint);\n const detail = segment.closestPoint(spacePoint, false);\n if (undefined !== detail) {\n if (detail.fraction > 0.0 && detail.fraction < 1.0 && !detail.point.isAlmostEqual(point0) &&\n !detail.point.isAlmostEqual(point1) && spacePoint.isAlmostEqual(detail.point)) {\n if (detailArray === undefined)\n detailArray = [];\n detail.a = index;\n detailArray.push(detail);\n }\n }\n return true;\n });\n if (detailArray !== undefined) {\n detailArray.sort((a: CurveLocationDetail, b: CurveLocationDetail) => (a.fraction - b.fraction));\n for (const d of detailArray) {\n newFacetVisitor.pushInterpolatedDataFrom(oldFacetVisitor, i, d.fraction, i + 1);\n }\n }\n }\n builder.addFacetFromGrowableArrays(\n newFacetVisitor.point, newFacetVisitor.normal, newFacetVisitor.param, newFacetVisitor.color, newFacetVisitor.edgeVisible,\n );\n }\n return builder.claimPolyface();\n }\n /**\n * Compare index arrays formatted as follows. Return 0 if arrays are the same.\n * * Each array input structure is: [facetIndex, vertexIndex0, vertexIndex1, ....]\n * * Vertex indices assumed reversed so:\n * * vertexIndex0 is the lowest index on the facet.\n * * vertexIndex1 is the lowest neighbor of vertex0.\n * * first different entry among vertex indices determines lexical result.\n * * hence facets with duplicate indices (whether forward or reversed) are considered equal.\n */\n private static compareFacetIndexAndVertexIndices(arrayA: number[], arrayB: number[]): number {\n if (arrayA.length !== arrayB.length)\n return arrayA.length - arrayB.length;\n for (let i = 1; i < arrayA.length; i++) {\n if (arrayA[i] !== arrayB[i]) {\n return arrayA[i] - arrayB[i];\n }\n }\n return 0;\n }\n /**\n * Announce facet duplicates.\n * @returns an array of arrays describing facet duplication. Each array `entry` in the output contains read\n * indices of a cluster of facets with the same vertex indices.\n */\n public static announceDuplicateFacetIndices(\n polyface: Polyface, announceCluster: (clusterFacetIndices: number[]) => void,\n ): void {\n const visitor = polyface.createVisitor(0); // this is to visit the existing facets\n const facetIndexAndVertexIndices: number[][] = [];\n for (visitor.reset(); visitor.moveToNextFacet();) {\n const facetIndex = visitor.currentReadIndex();\n const entry = [facetIndex];\n const pointIndex = visitor.pointIndex;\n const numPointsThisFacet = pointIndex.length;\n let lowIndex = 0;\n // find the lowest point index\n for (let i = 1; i < visitor.pointIndex.length; i++) {\n if (pointIndex[i] < pointIndex[lowIndex])\n lowIndex = i;\n }\n // find its lowest neighbor; assemble sort array in that direction\n if (pointIndex[(lowIndex + 1) % numPointsThisFacet] < pointIndex[(lowIndex + numPointsThisFacet - 1) % numPointsThisFacet]) {\n for (let i = 0; i < numPointsThisFacet; i++) {\n entry.push(pointIndex[(lowIndex + i) % numPointsThisFacet]);\n }\n } else {\n for (let i = 0; i < numPointsThisFacet; i++) {\n entry.push(pointIndex[(lowIndex + numPointsThisFacet - i) % numPointsThisFacet]);\n }\n }\n facetIndexAndVertexIndices.push(entry);\n }\n facetIndexAndVertexIndices.sort((arrayA, arrayB) => this.compareFacetIndexAndVertexIndices(arrayA, arrayB));\n let i0, i1;\n const n = facetIndexAndVertexIndices.length;\n const clusterArray = [];\n for (i0 = 0; i0 < n; i0 = i1) {\n i1 = i0 + 1;\n clusterArray.length = 0;\n clusterArray.push(facetIndexAndVertexIndices[i0][0]);\n while (i1 < n && 0 === this.compareFacetIndexAndVertexIndices(facetIndexAndVertexIndices[i0], facetIndexAndVertexIndices[i1])) {\n clusterArray.push(facetIndexAndVertexIndices[i1][0]);\n i1++;\n }\n announceCluster(clusterArray);\n }\n }\n /**\n * Collect facet duplicates.\n * @param polyface the polyface.\n * @param includeSingletons if true, non-duplicated facets are included in the output.\n * @returns an array of arrays describing facet duplication. Each array `entry` in the output contains read\n * indices of a cluster of facets with the same vertex indices.\n */\n public static collectDuplicateFacetIndices(polyface: Polyface, includeSingletons: boolean = false): number[][] {\n const result: number[][] = [];\n this.announceDuplicateFacetIndices(\n polyface,\n (clusterFacetIndices: number[]) => {\n if (includeSingletons || clusterFacetIndices.length > 1)\n result.push(clusterFacetIndices.slice());\n },\n );\n return result;\n }\n /**\n * Return a new facet set from the source facets, specifying how to copy duplicate facets.\n * @param source the polyface.\n * @param includeSingletons true to copy facets that only appear once\n * @param clusterSelector indicates whether to copy 0, 1, or all facets in each cluster of duplicate facets.\n */\n public static cloneByFacetDuplication(\n source: Polyface, includeSingletons: boolean, clusterSelector: DuplicateFacetClusterSelector,\n ): Polyface {\n const builder = PolyfaceBuilder.create();\n const visitor = source.createVisitor(0);\n this.announceDuplicateFacetIndices(\n source,\n (clusterFacetIndices: number[]) => {\n let numToSelect = 0;\n if (clusterFacetIndices.length === 1) {\n if (includeSingletons)\n numToSelect = 1;\n } else if (clusterFacetIndices.length > 1) {\n if (clusterSelector === DuplicateFacetClusterSelector.SelectAny)\n numToSelect = 1;\n else if (clusterSelector === DuplicateFacetClusterSelector.SelectAll)\n numToSelect = clusterFacetIndices.length;\n else if (clusterSelector === DuplicateFacetClusterSelector.SelectOneByParity)\n numToSelect = (clusterFacetIndices.length & 0x01) === 0x01 ? 1 : 0;\n }\n for (let i = 0; i < numToSelect; i++) {\n visitor.moveToReadIndex(clusterFacetIndices[i]);\n builder.addFacetFromVisitor(visitor);\n }\n },\n );\n return builder.claimPolyface();\n }\n /** Clone the facets, removing points that are simply within colinear edges. */\n public static cloneWithColinearEdgeFixup(polyface: Polyface): Polyface {\n const oldFacetVisitor = polyface.createVisitor(2); // this is to visit the existing facets\n const newFacetVisitor = polyface.createVisitor(0); // this is to build the new facets\n const builder = PolyfaceBuilder.create();\n const vector01 = Vector3d.create();\n const vector12 = Vector3d.create();\n const numPoint = polyface.data.point.length;\n const pointState = new Int32Array(numPoint);\n // FIRST PASS: in each sector of each facet, determine if the sector has colinear incoming and outgoing vectors.\n // Mark each point as\n // 0 unvisited\n // -1 adjacent to a non-colinear sector\n // n adjacent to n colinear sectors\n for (oldFacetVisitor.reset(); oldFacetVisitor.moveToNextFacet();) {\n for (let i = 0; i + 2 < oldFacetVisitor.point.length; i++) {\n // each base vertex is part of the result\n oldFacetVisitor.point.vectorIndexIndex(i, i + 1, vector01);\n oldFacetVisitor.point.vectorIndexIndex(i + 1, i + 2, vector12);\n const pointIndex = oldFacetVisitor.clientPointIndex(i + 1);\n if (pointState[pointIndex] >= 0) {\n const theta = vector01.angleTo(vector12);\n if (theta.isAlmostZero) {\n pointState[pointIndex]++;\n } else {\n pointState[pointIndex] = -1;\n }\n }\n }\n }\n // SECOND PASS: make copies, omitting references to points at colinear sectors.\n for (oldFacetVisitor.reset(); oldFacetVisitor.moveToNextFacet();) {\n newFacetVisitor.clearArrays();\n for (let i = 0; i + 2 < oldFacetVisitor.point.length; i++) {\n const pointIndex = oldFacetVisitor.clientPointIndex(i);\n if (pointState[pointIndex] < 0) {\n newFacetVisitor.pushDataFrom(oldFacetVisitor, i);\n }\n }\n if (newFacetVisitor.point.length > 2)\n builder.addFacetFromGrowableArrays(\n newFacetVisitor.point, newFacetVisitor.normal, newFacetVisitor.param, newFacetVisitor.color, newFacetVisitor.edgeVisible,\n );\n }\n return builder.claimPolyface();\n }\n /**\n * Set the edge visibility for specified edges in the polyface.\n * @param polyface mesh to be edited.\n * @param clusters array of edge references.\n * @param value visibility value (true or false).\n */\n private static setEdgeVisibility(polyface: IndexedPolyface, clusters: SortableEdgeCluster[], value: boolean): void {\n for (const cluster of clusters) {\n if (cluster instanceof SortableEdge) {\n this.setSingleEdgeVisibility(polyface, cluster.facetIndex, cluster.startVertex, value);\n } else if (Array.isArray(cluster)) {\n for (const e1 of cluster)\n this.setSingleEdgeVisibility(polyface, e1.facetIndex, e1.startVertex, value);\n }\n }\n }\n /**\n * Set the visibility of a particular edge of a particular facet.\n * @param polyface containing polyface.\n * @param facetIndex facet index.\n * @param vertexIndex vertex index (in vertex array) at which the edge starts.\n * @param value visibility value.\n */\n public static setSingleEdgeVisibility(\n polyface: IndexedPolyface, facetIndex: number, vertexIndex: number, value: boolean,\n ): void {\n const data = polyface.data;\n const index0 = polyface.facetIndex0(facetIndex);\n const index1 = polyface.facetIndex1(facetIndex);\n for (let i = index0; i < index1; i++)\n if (data.pointIndex[i] === vertexIndex)\n data.edgeVisible[i] = value; // actually sets visibility on all edges in the face that start at this vertex\n }\n /**\n * Get the visibility of a particular edge of a particular facet.\n * @param polyface containing polyface.\n * @param facetIndex facet index.\n * @param vertexIndex vertex index (in vertex array) at which the edge starts.\n */\n public static getSingleEdgeVisibility(\n polyface: IndexedPolyface, facetIndex: number, vertexIndex: number,\n ): boolean | undefined {\n const data = polyface.data;\n const index0 = polyface.facetIndex0(facetIndex);\n const index1 = polyface.facetIndex1(facetIndex);\n for (let i = index0; i < index1; i++)\n if (data.pointIndex[i] === vertexIndex)\n return data.edgeVisible[i]; // return visibility of first edge in the face that starts at this vertex\n return undefined;\n }\n /**\n * Return manifold edge pairs whose dihedral angle is bounded by the given angle.\n * * The dihedral angle of a manifold edge is measured between the normals of its two adjacent faces.\n * * Boundary edges are not returned as they are not manifold.\n * @param mesh existing polyface or visitor.\n * @param maxSmoothEdgeAngle maximum dihedral angle of a smooth edge. If `undefined`, uses `Geometry.smallAngleRadians`.\n * @param sharpEdges true to reverse the angle threshold test and return sharp edges; otherwise return smooth edges (default).\n */\n public static collectEdgesByDihedralAngle(\n mesh: Polyface | PolyfaceVisitor, maxSmoothEdgeAngle?: Angle, sharpEdges: boolean = false,\n ): SortableEdgeCluster[] {\n if (mesh instanceof Polyface)\n return this.collectEdgesByDihedralAngle(mesh.createVisitor(1), maxSmoothEdgeAngle, sharpEdges);\n mesh.setNumWrap(1);\n const allEdges = this.createIndexedEdges(mesh);\n const manifoldEdges: SortableEdgeCluster[] = [];\n allEdges.sortAndCollectClusters(manifoldEdges);\n if (undefined === maxSmoothEdgeAngle || maxSmoothEdgeAngle.radians < 0)\n maxSmoothEdgeAngle = Angle.createRadians(Geometry.smallAngleRadians);\n const outEdges: SortableEdgeCluster[] = [];\n const normal0 = Vector3d.create();\n const normal1 = Vector3d.create();\n for (const pair of manifoldEdges) {\n if (Array.isArray(pair) && pair.length === 2) {\n const e0 = pair[0];\n const e1 = pair[1];\n if (undefined !== PolyfaceQuery.computeFacetUnitNormal(mesh, e0.facetIndex, normal0)\n && undefined !== PolyfaceQuery.computeFacetUnitNormal(mesh, e1.facetIndex, normal1)) {\n const edgeAngle = normal0.smallerUnorientedAngleTo(normal1);\n if (sharpEdges) {\n if (edgeAngle.radians > maxSmoothEdgeAngle.radians)\n outEdges.push(pair);\n } else {\n if (edgeAngle.radians <= maxSmoothEdgeAngle.radians)\n outEdges.push(pair);\n }\n }\n }\n }\n return outEdges;\n }\n /**\n * Make paired edges invisible.\n * * Find mated pairs among facet edges.\n * * Mated pairs have the same vertex indices appearing in opposite order.\n * * Mark all non-mated pairs visible.\n * * At mated pairs\n * * if angle across the edge is larger than `sharpEdgeAngle`, mark visible\n * * otherwise mark invisible.\n */\n public static markPairedEdgesInvisible(mesh: IndexedPolyface, sharpEdgeAngle?: Angle) {\n const visitor = mesh.createVisitor(1);\n const edges = this.createIndexedEdges(visitor);\n const pairedEdges: SortableEdgeCluster[] = [];\n const boundaryEdges: SortableEdgeCluster[] = [];\n edges.sortAndCollectClusters(pairedEdges, boundaryEdges, boundaryEdges, boundaryEdges);\n this.markAllEdgeVisibility(mesh, false);\n this.setEdgeVisibility(mesh, boundaryEdges, true);\n if (sharpEdgeAngle !== undefined) {\n const normal0 = Vector3d.create();\n const normal1 = Vector3d.create();\n for (const pair of pairedEdges) {\n if (Array.isArray(pair) && pair.length === 2) {\n const e0 = pair[0];\n const e1 = pair[1];\n if (undefined !== PolyfaceQuery.computeFacetUnitNormal(visitor, e0.facetIndex, normal0)\n && undefined !== PolyfaceQuery.computeFacetUnitNormal(visitor, e1.facetIndex, normal1)) {\n const edgeAngle = normal0.smallerUnorientedAngleTo(normal1);\n if (edgeAngle.radians > sharpEdgeAngle.radians) {\n this.setSingleEdgeVisibility(mesh, e0.facetIndex, e0.startVertex, true);\n this.setSingleEdgeVisibility(mesh, e1.facetIndex, e1.startVertex, true);\n }\n }\n }\n }\n }\n }\n /**\n * Try to compute a unit normal for a facet accessible through a visitor.\n * * Unit normal is computed by `PolygonOps.unitNormal` with the points around the facet.\n */\n public static computeFacetUnitNormal(\n visitor: PolyfaceVisitor, facetIndex: number, result?: Vector3d,\n ): Vector3d | undefined {\n if (!result)\n result = Vector3d.create();\n if (visitor.moveToReadIndex(facetIndex)) {\n if (PolygonOps.unitNormal(visitor.point, result))\n return result;\n }\n return undefined;\n }\n /**\n * * Mark all edge visibilities in the IndexedPolyface.\n * @param mesh mesh to be marked.\n * @param value true for visible, false for hidden.\n */\n public static markAllEdgeVisibility(mesh: IndexedPolyface, value: boolean): void {\n const data = mesh.data;\n for (let i = 0; i < data.edgeVisible.length; i++)\n data.edgeVisible[i] = value;\n }\n /**\n * Create a HalfEdgeGraph with a face for each facet of the IndexedPolyface.\n * @param mesh mesh to convert.\n * @internal\n */\n public static convertToHalfEdgeGraph(mesh: IndexedPolyface): HalfEdgeGraph {\n const builder = new HalfEdgeGraphFromIndexedLoopsContext();\n const visitor = mesh.createVisitor(0);\n for (visitor.reset(); visitor.moveToNextFacet();) {\n builder.insertLoop(visitor.pointIndex);\n }\n const graph = builder.graph;\n const xyz = Point3d.create();\n graph.announceNodes(\n (_graph: HalfEdgeGraph, halfEdge: HalfEdge) => {\n const vertexIndex = halfEdge.i;\n mesh.data.getPoint(vertexIndex, xyz);\n halfEdge.setXYZ(xyz);\n return true;\n },\n );\n return graph;\n }\n /** Examine adjacent facet orientations throughout the mesh. If possible, reverse a subset to achieve proper pairing. */\n public static reorientVertexOrderAroundFacetsForConsistentOrientation(mesh: IndexedPolyface): boolean {\n return FacetOrientationFixup.doFixup(mesh);\n }\n /** Set up indexed normals with one normal in the plane of each facet of the mesh. */\n public static buildPerFaceNormals(polyface: IndexedPolyface): void {\n BuildAverageNormalsContext.buildPerFaceNormals(polyface);\n }\n /**\n * * At each vertex of the mesh:\n * * Find clusters of almost parallel normals.\n * * Compute simple average of those normals.\n * * Index to the averages.\n * * For typical meshes, this correctly clusters adjacent normals.\n * * One can imagine a vertex with multiple \"smooth cone-like\" sets of adjacent facets such that averaging occurs\n * among two nonadjacent cones. But this does not seem to be a problem in practice.\n * @param polyface polyface to update.\n * @param toleranceAngle averaging is done between normals up to this angle.\n */\n public static buildAverageNormals(polyface: IndexedPolyface, toleranceAngle: Angle = Angle.createDegrees(31.0)): void {\n BuildAverageNormalsContext.buildFastAverageNormals(polyface, toleranceAngle);\n }\n /**\n * Offset the faces of the mesh.\n * @param source original mesh.\n * @param signedOffsetDistance distance to offset\n * @param offsetOptions angle options. The default options are recommended.\n * @returns shifted mesh.\n */\n public static cloneOffset(\n source: IndexedPolyface, signedOffsetDistance: number, offsetOptions: OffsetMeshOptions = OffsetMeshOptions.create(),\n ): IndexedPolyface {\n const strokeOptions = StrokeOptions.createForFacets();\n const offsetBuilder = PolyfaceBuilder.create(strokeOptions);\n OffsetMeshContext.buildOffsetMeshWithEdgeChamfers(source, offsetBuilder, signedOffsetDistance, offsetOptions);\n return offsetBuilder.claimPolyface();\n }\n private static _workTriangle?: BarycentricTriangle;\n private static _workTriDetail?: TriangleLocationDetail;\n private static _workPolyDetail?: PolygonLocationDetail;\n private static _workFacetDetail3?: TriangularFacetLocationDetail;\n private static _workFacetDetailC?: ConvexFacetLocationDetail;\n private static _workFacetDetailNC?: NonConvexFacetLocationDetail;\n /**\n * Search facets for the first one that intersects the infinite line.\n * * To process _all_ intersections, callers can supply an `options.acceptIntersection` callback that always\n * returns `false`. In this case, `intersectRay3d` will return `undefined`, but the callback will be invoked for\n * each intersection.\n * * Example callback logic:\n * * Accept the first found facet that intersects the half-line specified by the ray: `return detail.a >= 0.0;`\n * * Collect all intersections: `myIntersections.push(detail.clone()); return false;` Then after `intersectRay3d`\n * returns, sort along `ray` with `myIntersections.sort((d0, d1) => d0.a - d1.a);`\n * @param visitor facet iterator.\n * @param ray infinite line parameterized as a ray. The returned `detail.a` is the intersection parameter on the\n * ray, e.g., zero at `ray.origin` and increasing in `ray.direction`.\n * @param options options for computing and populating an intersection detail, and an optional callback for\n * accepting one.\n * @return detail for the (accepted) intersection with `detail.IsInsideOrOn === true`, or `undefined` if no\n * (accepted) intersection.\n * @see PolygonOps.intersectRay3d\n */\n public static intersectRay3d(\n visitor: Polyface | PolyfaceVisitor, ray: Ray3d, options?: FacetIntersectOptions,\n ): FacetLocationDetail | undefined {\n if (visitor instanceof Polyface)\n return PolyfaceQuery.intersectRay3d(visitor.createVisitor(0), ray, options);\n let detail: FacetLocationDetail;\n const tol: [number, number] | undefined = options ? [options.distanceTolerance, options.parameterTolerance] : undefined;\n visitor.setNumWrap(0);\n while (visitor.moveToNextFacet()) {\n const numEdges = visitor.pointCount; // #vertices = #edges since numWrap is zero\n const vertices = visitor.point;\n if (3 === numEdges) {\n const tri = this._workTriangle = BarycentricTriangle.create(\n vertices.getPoint3dAtUncheckedPointIndex(0),\n vertices.getPoint3dAtUncheckedPointIndex(1),\n vertices.getPoint3dAtUncheckedPointIndex(2),\n this._workTriangle,\n );\n const detail3 = this._workTriDetail = tri.intersectRay3d(ray, this._workTriDetail);\n tri.snapLocationToEdge(detail3, options?.distanceTolerance, options?.parameterTolerance);\n detail = this._workFacetDetail3 = TriangularFacetLocationDetail.create(\n visitor.currentReadIndex(), detail3, this._workFacetDetail3,\n );\n } else {\n const detailN = this._workPolyDetail = PolygonOps.intersectRay3d(vertices, ray, tol, this._workPolyDetail);\n if (PolygonOps.isConvex(vertices))\n detail = this._workFacetDetailC = ConvexFacetLocationDetail.create(\n visitor.currentReadIndex(), numEdges, detailN, this._workFacetDetailC,\n );\n else\n detail = this._workFacetDetailNC = NonConvexFacetLocationDetail.create(\n visitor.currentReadIndex(), numEdges, detailN, this._workFacetDetailNC,\n );\n }\n if (detail.isInsideOrOn) { // set optional caches, process the intersection\n if (options?.needNormal && visitor.normal)\n detail.getNormal(visitor.normal, vertices, options?.distanceTolerance);\n if (options?.needParam && visitor.param)\n detail.getParam(visitor.param, vertices, options?.distanceTolerance);\n if (options?.needColor && visitor.color)\n detail.getColor(visitor.color, vertices, options?.distanceTolerance);\n if (options?.needBarycentricCoordinates)\n detail.getBarycentricCoordinates(vertices, options?.distanceTolerance);\n if (options?.acceptIntersection && !options.acceptIntersection(detail, visitor))\n continue;\n return detail;\n }\n }\n return undefined; // no intersection\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PolyfaceQuery.js","sourceRoot":"","sources":["../../../src/polyface/PolyfaceQuery.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 Polyface\r\n */\r\n\r\n// cspell:word internaldocs\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { BagOfCurves, CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\r\nimport { CurveOps } from \"../curve/CurveOps\";\r\nimport { LinearCurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { AnyChain } from \"../curve/CurveTypes\";\r\nimport { MultiChainCollector } from \"../curve/internalContexts/MultiChainCollector\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { BarycentricTriangle, TriangleLocationDetail } from \"../geometry3d/BarycentricTriangle\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Plane3d } from \"../geometry3d/Plane3d\";\r\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { PolygonLocationDetail, PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\r\nimport { MomentData } from \"../geometry4d/MomentData\";\r\nimport { UnionFindContext } from \"../numerics/UnionFind\";\r\nimport { ChainMergeContext } from \"../topology/ChainMerge\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../topology/Graph\";\r\nimport { HalfEdgeGraphFromIndexedLoopsContext } from \"../topology/HalfEdgeGraphFromIndexedLoopsContext\";\r\nimport { HalfEdgeGraphSearch, HalfEdgeMaskTester } from \"../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge } from \"../topology/Merging\";\r\nimport { SpacePolygonTriangulation } from \"../topology/SpaceTriangulation\";\r\nimport {\r\n ConvexFacetLocationDetail, FacetIntersectOptions, FacetLocationDetail, NonConvexFacetLocationDetail, TriangularFacetLocationDetail,\r\n} from \"./FacetLocationDetail\";\r\nimport { FacetOrientationFixup } from \"./FacetOrientation\";\r\nimport { IndexedEdgeMatcher, SortableEdge, SortableEdgeCluster } from \"./IndexedEdgeMatcher\";\r\nimport { BuildAverageNormalsContext } from \"./multiclip/BuildAverageNormalsContext\";\r\nimport { OffsetMeshContext } from \"./multiclip/OffsetMeshContext\";\r\nimport { Range2dSearchInterface } from \"./multiclip/Range2dSearchInterface\";\r\nimport { ClipSweptLineStringContext, EdgeClipData, SweepLineStringToFacetContext } from \"./multiclip/SweepLineStringToFacetContext\";\r\nimport { XYPointBuckets } from \"./multiclip/XYPointBuckets\";\r\nimport { IndexedPolyface, Polyface, PolyfaceVisitor } from \"./Polyface\";\r\nimport { PolyfaceBuilder } from \"./PolyfaceBuilder\";\r\nimport { RangeLengthData } from \"./RangeLengthData\";\r\n\r\n/**\r\n * Options carrier for sweeping linework onto meshes.\r\n * * The create method initializes all options.\r\n * @public\r\n */\r\nexport class SweepLineStringToFacetsOptions {\r\n /**\r\n * Vector towards the eye.\r\n * * In the common case of sweeping to an XY (e.g., ground or DTM) mesh, use the positive Z vector as an up vector.\r\n * * In general case, this is a vector from the mesh towards an eye at infinity.\r\n */\r\n public vectorToEye: Vector3d;\r\n /** True to collect edges from facets that face towards the eye. */\r\n public collectOnForwardFacets: boolean;\r\n /** True to collect facets that are \"on the side\", i.e., their outward vector is perpendicular to vectorToEye. */\r\n public collectOnSideFacets: boolean;\r\n /** True to collect facets that face away from the eye. */\r\n public collectOnRearFacets: boolean;\r\n /**\r\n * (Small) angle to use as tolerance for deciding if a facet is \"on the side\".\r\n * * Default (if given in degrees) is `Geometry.smallAngleDegrees`.\r\n */\r\n public sideAngle: Angle;\r\n /** Option to assemble lines into chains. */\r\n public assembleChains: boolean;\r\n /**\r\n * Optional searcher object for vertical sweep speedup. If provided, `vectorToEye` must be the positive Z vector.\r\n * @example To construct a 5x5 indexed search grid:\r\n * ````\r\n * const xyRange = Range2d.createFrom(myPolyface.range());\r\n * const searcher = GriddedRaggedRange2dSetWithOverflow.create<number>(xyRange, 5, 5)!;\r\n * for (const visitor = myPolyface.createVisitor(0); visitor.moveToNextFacet();) {\r\n * searcher.addRange(visitor.point.getRange(), visitor.currentReadIndex());\r\n * }\r\n * ````\r\n */\r\n public searcher?: Range2dSearchInterface<number>;\r\n\r\n /** Constructor. Captures fully-checked parameters from static create method. */\r\n private constructor(\r\n vectorToEye: Vector3d,\r\n sideAngle: Angle,\r\n assembleChains: boolean,\r\n collectOnForwardFacets: boolean,\r\n collectOnSideFacets: boolean,\r\n collectOnRearFacets: boolean,\r\n searcher?: Range2dSearchInterface<number>,\r\n ) {\r\n this.vectorToEye = vectorToEye;\r\n this.sideAngle = sideAngle;\r\n this.assembleChains = assembleChains;\r\n this.collectOnForwardFacets = collectOnForwardFacets;\r\n this.collectOnSideFacets = collectOnSideFacets;\r\n this.collectOnRearFacets = collectOnRearFacets;\r\n this.searcher = searcher\r\n }\r\n /**\r\n * Create an options structure.\r\n * * Default `vectorToEye` is (0,0,1).\r\n * * Default `sideAngle` is `Geometry.smallAngleRadians`.\r\n * * Default `assembleChains` is `true`.\r\n * * Default `collectOnForwardFacets`, `collectOnSideFacets`, `collectOnRearFacets` are all `true`.\r\n */\r\n public static create(\r\n vectorToEye?: Vector3d,\r\n sideAngle?: Angle,\r\n assembleChains?: boolean,\r\n collectOnForwardFacets?: boolean,\r\n collectOnSideFacets?: boolean,\r\n collectOnRearFacets?: boolean,\r\n searcher?: Range2dSearchInterface<number>,\r\n ): SweepLineStringToFacetsOptions {\r\n return new SweepLineStringToFacetsOptions(\r\n (!vectorToEye || searcher) ? Vector3d.unitZ() : vectorToEye.clone(),\r\n sideAngle?.clone() ?? Angle.createRadians(Geometry.smallAngleRadians),\r\n assembleChains ?? true,\r\n collectOnForwardFacets ?? true,\r\n collectOnSideFacets ?? true,\r\n collectOnRearFacets ?? true,\r\n searcher,\r\n );\r\n }\r\n /** Return `true` if all outputs are requested. */\r\n public get collectAll(): boolean {\r\n return this.collectOnForwardFacets && this.collectOnSideFacets && this.collectOnRearFacets;\r\n }\r\n /**\r\n * Decide if the instance collector flags accept a facet with the given normal.\r\n * * A facet whose facet normal has a positive, zero, or negative dot product with `vectorToEye` is classified\r\n * as forward, side, or rear, respectively.\r\n * * `undefined` facet normal returns `false`.\r\n */\r\n public collectFromThisFacetNormal(facetNormal: Vector3d | undefined): boolean {\r\n if (facetNormal === undefined)\r\n return false;\r\n const theta = facetNormal.angleFromPerpendicular(this.vectorToEye);\r\n if (theta.isMagnitudeLessThanOrEqual(this.sideAngle))\r\n return this.collectOnSideFacets;\r\n return facetNormal.dotProduct(this.vectorToEye) > 0 ? this.collectOnForwardFacets : this.collectOnRearFacets;\r\n }\r\n}\r\n\r\n/**\r\n * Options carrier for [[PolyfaceQuery.fillSimpleHoles]].\r\n * @public\r\n */\r\nexport interface HoleFillOptions {\r\n /** Reject hole candidates if its boundary chain is longer than this limit. */\r\n maxPerimeter?: number;\r\n /** Reject hole candidates if they have more than this number of edges. */\r\n maxEdgesAroundHole?: number;\r\n /**\r\n * Reject hole candidates if their orientation is not COUNTERCLOCKWISE around this vector.\r\n * * For instance, use an upward Z vector for a DTM whose facets face upward. This suppresses incorrectly\r\n * treating the outer boundary as a hole.\r\n */\r\n upVector?: Vector3d;\r\n /** Requests that all content from the original mesh be copied to the mesh with filled holes. */\r\n includeOriginalMesh?: boolean;\r\n}\r\n\r\n/**\r\n * Selective output options for [[PolyfaceQuery.cloneOffset]]:\r\n * * `undefined` means the usual facets in the expected offset mesh.\r\n * * If present as a json object, the various booleans select respective outputs.\r\n * * @public\r\n */\r\nexport interface OffsetMeshSelectiveOutputOptions {\r\n outputOffsetsFromFacesBeforeChamfers?: boolean;\r\n outputOffsetsFromFaces?: boolean;\r\n outputOffsetsFromEdges?: boolean;\r\n outputOffsetsFromVertices?: boolean;\r\n}\r\n\r\n/**\r\n * Options carrier for [[PolyfaceQuery.cloneOffset]].\r\n * * Default options are strongly recommended.\r\n * * The option most likely to be changed is `chamferAngleBetweenNormals`.\r\n * @public\r\n */\r\nexport class OffsetMeshOptions {\r\n /** Max angle between normals to be considered smooth. */\r\n public smoothSingleAngleBetweenNormals: Angle;\r\n /** Max accumulation of angle between normals to be considered smooth. */\r\n public smoothAccumulatedAngleBetweenNormals: Angle;\r\n /**\r\n * When facets meet and the turn angle (i.e., angle between facet normals) is larger than\r\n * `chamferTurnAngleBetweenNormals`, a chamfer edge may be added to prevent offset mesh from having\r\n * facets that extend out too far away from the source mesh.\r\n */\r\n public chamferAngleBetweenNormals: Angle;\r\n /**\r\n * Optional control structure for selective output.\r\n * * If `undefined`, output all expected offset facets.\r\n */\r\n public outputSelector?: OffsetMeshSelectiveOutputOptions;\r\n\r\n /** Constructor -- CAPTURE parameters. */\r\n private constructor(\r\n smoothSingleAngleBetweenNormals: Angle = Angle.createDegrees(25),\r\n smoothAccumulatedAngleBetweenNormals: Angle = Angle.createDegrees(60),\r\n chamferAngleBetweenNormals: Angle = Angle.createDegrees(90),\r\n ) {\r\n this.smoothSingleAngleBetweenNormals = smoothSingleAngleBetweenNormals.clone();\r\n this.smoothAccumulatedAngleBetweenNormals = smoothAccumulatedAngleBetweenNormals.clone();\r\n this.chamferAngleBetweenNormals = chamferAngleBetweenNormals.clone();\r\n }\r\n /**\r\n * Construct and return an `OffsetMeshOptions` with given parameters.\r\n * * Angles are forced to minimum values.\r\n * * Clones of the angles are given to the constructor.\r\n * @param smoothSingleRadiansBetweenNormals an angle larger than this (between facets) is considered a sharp edge.\r\n * Default value is `25` degrees.\r\n * @param smoothAccumulatedAngleBetweenNormals angles that sum to this much may be consolidated for average normal.\r\n * Default value is `60` degrees.\r\n * @param chamferTurnAngleBetweenNormals when facets meet and the turn angle (i.e., angle between facet normals)\r\n * is larger than `chamferTurnAngleBetweenNormals`, a chamfer edge may be added to prevent offset mesh from having\r\n * facets that extend out too far away from the source mesh. Default value is `120` degrees.\r\n */\r\n public static create(\r\n smoothSingleAngleBetweenNormals: Angle = Angle.createDegrees(25),\r\n smoothAccumulatedAngleBetweenNormals: Angle = Angle.createDegrees(60),\r\n chamferTurnAngleBetweenNormals: Angle = Angle.createDegrees(120),\r\n ): OffsetMeshOptions {\r\n const mySmoothSingleRadiansBetweenNormals = smoothSingleAngleBetweenNormals.clone();\r\n const mySmoothAccumulatedRadiansBetweenNormals = smoothAccumulatedAngleBetweenNormals.clone();\r\n const myChamferTurnAngleBetweenNormals = chamferTurnAngleBetweenNormals.clone();\r\n if (mySmoothSingleRadiansBetweenNormals.degrees < 1)\r\n mySmoothAccumulatedRadiansBetweenNormals.setDegrees(1.0);\r\n if (mySmoothAccumulatedRadiansBetweenNormals.degrees < 1.0)\r\n mySmoothAccumulatedRadiansBetweenNormals.setDegrees(1.0);\r\n if (mySmoothAccumulatedRadiansBetweenNormals.degrees < 15.0)\r\n mySmoothAccumulatedRadiansBetweenNormals.setDegrees(15.0);\r\n return new OffsetMeshOptions(\r\n mySmoothSingleRadiansBetweenNormals, mySmoothAccumulatedRadiansBetweenNormals, myChamferTurnAngleBetweenNormals,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Structure to return multiple results from volume between facets and plane.\r\n * @public\r\n */\r\nexport interface FacetProjectedVolumeSums {\r\n /** Summed (signed) volume. */\r\n volume: number;\r\n /** Summed area moments for positive contributions. */\r\n positiveProjectedFacetAreaMoments?: MomentData;\r\n /** Summed area moments for negative contributions. */\r\n negativeProjectedFacetAreaMoments?: MomentData;\r\n}\r\n\r\n/**\r\n * Enumeration of cases for retaining facets among duplicates.\r\n * @public\r\n */\r\nexport enum DuplicateFacetClusterSelector {\r\n /** Retain none of the duplicates. */\r\n SelectNone = 0,\r\n /** Retain any one member among duplicates. */\r\n SelectAny = 1,\r\n /** Retain all members among duplicates. */\r\n SelectAll = 2,\r\n /** Retain one from any cluster with an odd number of faces. */\r\n SelectOneByParity = 3,\r\n}\r\n\r\n/**\r\n * Announce the points on a drape panel.\r\n * * The first two points in the array are always along the draped line segment.\r\n * * The last two are always on the facet.\r\n * * If there are 4 points, those two pairs are distinct, i.e. both segment points are to the same side of the facet.\r\n * * If there are 3 points, those two pairs share an on-facet point.\r\n * * The panel is ordered so the outward normal is to the right of the draped segment.\r\n * @param indexAOnFacet index (in points) of the point that is the first facet point for moving forward along the linestring.\r\n * @param indexBOnFacet index (in points) of the point that is the second facet point for moving forward along the linestring.\r\n * @public\r\n */\r\nexport type AnnounceDrapePanel = (\r\n linestring: IndexedXYZCollection, segmentIndex: number, polyface: Polyface,\r\n facetIndex: number, points: Point3d[], indexAOnFacet: number, indexBOnFacet: number,\r\n) => any;\r\n\r\n/**\r\n * PolyfaceQuery is a static class whose methods implement queries on a `Polyface` or `PolyfaceVisitor` provided as a\r\n * parameter to each method.\r\n * @public\r\n */\r\nexport class PolyfaceQuery {\r\n /** Copy the points from a visitor into a linestring loop. */\r\n public static visitorToLoop(visitor: PolyfaceVisitor): Loop {\r\n const ls = LineString3d.createPoints(visitor.point.getPoint3dArray());\r\n return Loop.create(ls);\r\n }\r\n /** Create a linestring loop for each facet of the polyface. */\r\n public static indexedPolyfaceToLoops(polyface: Polyface): BagOfCurves {\r\n const result = BagOfCurves.create();\r\n const visitor = polyface.createVisitor(1);\r\n while (visitor.moveToNextFacet()) {\r\n const loop = PolyfaceQuery.visitorToLoop(visitor);\r\n result.tryAddChild(loop);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Sum all facet areas.\r\n * @param source polyface or visitor.\r\n * @param vectorToEye compute sum of (signed) facet areas projected to a view plane perpendicular to `vectorToEye`.\r\n * If `vectorToEye` is not provided, actual facet areas are calculated (without any projection).\r\n * @returns the sum of all facet areas.\r\n */\r\n public static sumFacetAreas(source: Polyface | PolyfaceVisitor, vectorToEye?: Vector3d): number {\r\n let sum = 0;\r\n if (source instanceof Polyface)\r\n source = source.createVisitor(1);\r\n else\r\n source.setNumWrap(1);\r\n let unitVectorToEye: Vector3d | undefined;\r\n if (vectorToEye !== undefined)\r\n unitVectorToEye = vectorToEye.normalize();\r\n source.reset();\r\n while (source.moveToNextFacet()) {\r\n const areaNormal = PolygonOps.areaNormal(source.point.getPoint3dArray());\r\n sum += unitVectorToEye ? areaNormal.dotProduct(unitVectorToEye) : areaNormal.magnitude();\r\n }\r\n return sum;\r\n }\r\n /**\r\n * Sum volumes of tetrahedra from origin to all facets.\r\n * * If origin is `undefined`, the first point encountered (by the visitor) is used as origin.\r\n * * If the mesh is closed, this sum is the volume.\r\n * * If the mesh is not closed, this sum is the volume of a mesh with various additional facets from the origin\r\n * to facets.\r\n */\r\n public static sumTetrahedralVolumes(source: Polyface | PolyfaceVisitor, origin?: Point3d): number {\r\n let sum = 0;\r\n if (source instanceof Polyface)\r\n return PolyfaceQuery.sumTetrahedralVolumes(source.createVisitor(0), origin);\r\n let myOrigin = origin;\r\n const facetOrigin = Point3d.create();\r\n const targetA = Point3d.create();\r\n const targetB = Point3d.create();\r\n source.reset();\r\n while (source.moveToNextFacet()) {\r\n if (myOrigin === undefined)\r\n myOrigin = source.point.getPoint3dAtUncheckedPointIndex(0);\r\n source.point.getPoint3dAtUncheckedPointIndex(0, facetOrigin);\r\n for (let i = 1; i + 1 < source.point.length; i++) {\r\n source.point.getPoint3dAtUncheckedPointIndex(i, targetA);\r\n source.point.getPoint3dAtUncheckedPointIndex(i + 1, targetB);\r\n sum += myOrigin.tripleProductToPoints(facetOrigin, targetA, targetB);\r\n }\r\n }\r\n return sum / 6.0;\r\n }\r\n /**\r\n * Sum (signed) volumes between facets and a plane.\r\n * @param source facet set\r\n * @param plane infinite plane bounding volume between the input facets and (virtual) side facets perpendicular to the plane.\r\n * @param skipMoments whether to skip computation of the area moments. Set to `true` if only volume is needed. Default is `false`.\r\n * @returns a structure with multiple sums:\r\n * * volume: the sum of (signed) volumes between facets and the plane.\r\n * * positiveProjectedFacetAreaMoments, negativeProjectedFacetAreaMoments: area moment data (centroid, signed area,\r\n * and second moments with respect to the centroid), separately computed for the input facets that project with\r\n * positive/negative area onto the plane.\r\n */\r\n public static sumVolumeBetweenFacetsAndPlane(source: Polyface | PolyfaceVisitor, plane: Plane3d, skipMoments?: boolean): FacetProjectedVolumeSums {\r\n const visitor = source instanceof Polyface ? source.createVisitor(0) : source;\r\n visitor.setNumWrap(0);\r\n const workPoint0 = Point3d.create();\r\n const workPoint1 = Point3d.create();\r\n const workVector = Vector3d.create();\r\n const workMatrix = Matrix4d.createZero();\r\n let signedVolumeTimes6 = 0.0;\r\n const posSums = skipMoments ? undefined : MomentData.create(undefined, true);\r\n const negSums = skipMoments ? undefined : MomentData.create(undefined, true);\r\n // For each facet:\r\n // - form triangles from facet origin to each far edge.\r\n // - sum signed area and volume contributions (for non-convex facet, signs can be mixed).\r\n // - each projected area contribution is twice the area of a triangle.\r\n // - each volume contribution is 3 times the actual volume -- a third of the altitude sum is the centroid altitude.\r\n const options = { skipMoments, p0: workPoint0, p1: workPoint1, v0: workVector, m0: workMatrix };\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n const facetData = PolygonOps.volumeBetweenPolygonAndPlane(visitor.point, plane, options);\r\n signedVolumeTimes6 += facetData.volume6;\r\n if (!skipMoments) {\r\n assert(posSums !== undefined && negSums !== undefined && facetData.origin !== undefined && facetData.products !== undefined);\r\n if (facetData.area2 > 0)\r\n posSums.accumulateProductsFromOrigin(facetData.origin, facetData.products, 1.0);\r\n else\r\n negSums.accumulateProductsFromOrigin(facetData.origin, facetData.products, 1.0);\r\n }\r\n }\r\n return {\r\n volume: signedVolumeTimes6 / 6.0,\r\n positiveProjectedFacetAreaMoments: posSums ? MomentData.inertiaProductsToPrincipalAxes(posSums.origin, posSums.sums) : undefined,\r\n negativeProjectedFacetAreaMoments: negSums ? MomentData.inertiaProductsToPrincipalAxes(negSums.origin, negSums.sums) : undefined,\r\n };\r\n }\r\n\r\n /** Return the inertia products [xx,xy,xz,xw,yw, etc] integrated over all all facets as viewed from origin. */\r\n public static sumFacetSecondAreaMomentProducts(source: Polyface | PolyfaceVisitor, origin: Point3d): Matrix4d {\r\n if (source instanceof Polyface)\r\n return PolyfaceQuery.sumFacetSecondAreaMomentProducts(source.createVisitor(0), origin);\r\n const products = Matrix4d.createZero();\r\n source.reset();\r\n while (source.moveToNextFacet()) {\r\n PolygonOps.addSecondMomentAreaProducts(source.point, origin, products);\r\n }\r\n return products;\r\n }\r\n /** Return the inertia products [xx,xy,xz,xw,yw, etc] integrated over all tetrahedral volumes from origin. */\r\n public static sumFacetSecondVolumeMomentProducts(source: Polyface | PolyfaceVisitor, origin: Point3d): Matrix4d {\r\n if (source instanceof Polyface)\r\n return PolyfaceQuery.sumFacetSecondVolumeMomentProducts(source.createVisitor(0), origin);\r\n const products = Matrix4d.createZero();\r\n source.reset();\r\n while (source.moveToNextFacet()) {\r\n PolygonOps.addSecondMomentVolumeProducts(source.point, origin, products);\r\n }\r\n return products;\r\n }\r\n /**\r\n * Compute area moments for the mesh. In the returned `MomentData`:\r\n * * `origin` is the centroid.\r\n * * `localToWorldMap` has the origin and principal directions.\r\n * * `radiiOfGyration` radii for rotation around the x,y,z axes.\r\n */\r\n public static computePrincipalAreaMoments(source: Polyface): MomentData | undefined {\r\n const origin = source.data.getPoint(0);\r\n if (!origin)\r\n return undefined;\r\n const inertiaProducts = PolyfaceQuery.sumFacetSecondAreaMomentProducts(source, origin);\r\n return MomentData.inertiaProductsToPrincipalAxes(origin, inertiaProducts);\r\n }\r\n /**\r\n * Compute area moments for the mesh. In the returned MomentData:\r\n * * `origin` is the centroid.\r\n * * `localToWorldMap` has the origin and principal directions.\r\n * * `radiiOfGyration` radii for rotation around the x,y,z axes.\r\n * * The result is only valid if the mesh is closed.\r\n * * There is no test for closure. Use `PolyfaceQuery.isPolyfaceClosedByEdgePairing(polyface)` to test for closure.\r\n */\r\n public static computePrincipalVolumeMoments(source: Polyface): MomentData | undefined {\r\n const origin = source.data.getPoint(0);\r\n if (!origin)\r\n return undefined;\r\n const inertiaProducts = PolyfaceQuery.sumFacetSecondVolumeMomentProducts(source, origin);\r\n return MomentData.inertiaProductsToPrincipalAxes(origin, inertiaProducts);\r\n }\r\n /**\r\n * Determine whether all facets are convex.\r\n * @param source polyface or visitor.\r\n * @returns `true` if all facets are convex; `false` otherwise.\r\n */\r\n public static areFacetsConvex(source: Polyface | PolyfaceVisitor): boolean {\r\n if (source instanceof Polyface)\r\n return this.areFacetsConvex(source.createVisitor(0));\r\n source.setNumWrap(0);\r\n source.reset();\r\n while (source.moveToNextFacet()) {\r\n if (source.pointCount > 3) {\r\n if (!PolygonOps.isConvex(source.point))\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Compute a number summarizing the dihedral angles in the mesh.\r\n * * A dihedral angle is the signed angle between adjacent facets' normals. This angle is positive when the cross\r\n * product `normalA x normalB` has the same direction as facetA's traversal of the facets' shared edge.\r\n * @param source facets.\r\n * @param ignoreBoundaries if `true` ignore simple boundary edges, i.e., allow unclosed meshes. Default is `false`.\r\n * See [[isConvexByDihedralAngleCount]] for comments about passing true when there are multiple\r\n * connected components.\r\n * * Return `0` if all dihedral angles are zero (and `ignoreBoundaries === true`). The mesh is planar.\r\n * * Otherwise, return `1` if all dihedral angles are non-negative. The mesh probably encloses a convex volume and\r\n * has outward normals.\r\n * * Otherwise, return `-1` if all dihedral angles are non-positive. The mesh probably encloses a convex volume and\r\n * has inward normals.\r\n * * Otherwise, return `-2`. Also return `-2` if a non-manifold condition was detected, or a facet normal could not\r\n * be computed. A non-manifold condition is a positive-length edge adjacent to more than 2 facets or (if\r\n * `ignoreBoundaries` is false) adjacent to exactly one facet.\r\n */\r\n public static dihedralAngleSummary(source: Polyface | PolyfaceVisitor, ignoreBoundaries: boolean = false): number {\r\n // more info can be found at geometry/internaldocs/Polyface.md\r\n const edges = new IndexedEdgeMatcher();\r\n const vertices = source instanceof Polyface ? source.data.point : undefined;\r\n const visitor = source instanceof Polyface ? source.createVisitor(1) : source;\r\n visitor.setNumWrap(1);\r\n const centroidNormal: Ray3d[] = [];\r\n let normalCounter = 0;\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n const numEdges = visitor.pointCount - 1;\r\n const normal = PolygonOps.centroidAreaNormal(visitor.point);\r\n if (normal === undefined)\r\n return -2;\r\n centroidNormal.push(normal);\r\n for (let i = 0; i < numEdges; i++) {\r\n const edge = edges.addEdge(visitor.clientPointIndex(i), visitor.clientPointIndex(i + 1), normalCounter);\r\n if (!vertices) // decorate if we don't have vertices to query later\r\n (edge as any).edgeVector = Vector3d.createStartEnd(visitor.point.getPoint3dAtUncheckedPointIndex(i), visitor.point.getPoint3dAtUncheckedPointIndex(i + 1));\r\n }\r\n normalCounter++;\r\n }\r\n // find \"manifold clusters\" and \"bad clusters\"\r\n // manifold clusters are edges adjacent to 2 facets\r\n // bad clusters are edges adjacent to more than 2 facets or (if ignoreBoundaries is false) adjacent to 1 facet\r\n const badClusters: SortableEdgeCluster[] = [];\r\n const manifoldClusters: SortableEdgeCluster[] = [];\r\n edges.sortAndCollectClusters(manifoldClusters, ignoreBoundaries ? undefined : badClusters, undefined, badClusters);\r\n if (badClusters.length > 0)\r\n return -2;\r\n // find angle between facet centroid normals (dihedral angles)\r\n let numPositive = 0;\r\n let numPlanar = 0;\r\n let numNegative = 0;\r\n const edgeVector = Vector3d.create();\r\n for (const cluster of manifoldClusters) {\r\n if (Array.isArray(cluster) && cluster.length === 2) {\r\n const sideA = cluster[0];\r\n const sideB = cluster[1];\r\n if (vertices)\r\n vertices.vectorIndexIndex(sideA.startVertex, sideA.endVertex, edgeVector);\r\n else\r\n edgeVector.setFrom((sideA as any).edgeVector);\r\n const facetNormalA = centroidNormal[sideA.facetIndex].direction;\r\n const facetNormalB = centroidNormal[sideB.facetIndex].direction;\r\n const dihedralAngle = facetNormalA.signedAngleTo(facetNormalB, edgeVector);\r\n if (dihedralAngle.isAlmostZero)\r\n numPlanar++;\r\n else if (dihedralAngle.radians > 0.0)\r\n numPositive++;\r\n else\r\n numNegative++;\r\n }\r\n }\r\n // categorize the mesh\r\n if (numPositive > 0 && numNegative === 0)\r\n return 1;\r\n if (numNegative > 0 && numPositive === 0)\r\n return -1;\r\n if (numPlanar > 0 && numPositive === 0 && numNegative === 0) // planar mesh\r\n return 0;\r\n return -2;\r\n }\r\n /**\r\n * Test for convex volume by dihedral angle tests on all edges.\r\n * * This tests if all dihedral angles of the mesh are positive.\r\n * * In a closed solid, this is a strong test for overall mesh convexity with outward facing normals.\r\n * * See [[dihedralAngleSummary]] for the definition of \"dihedral angle\".\r\n * * With `ignoreBoundaries` true, this may be a useful test when all the facets are in a single edge-connected\r\n * component, such as a pyramid with no underside.\r\n * * It is not a correct test if there are multiple, disjoint components.\r\n * * Take the above-mentioned pyramid with no underside.\r\n * * Within the same mesh, have a second pyramid placed to the side, still facing upward.\r\n * * The angles will pass the dihedral convexity test, but the composite thing surely is not convex.\r\n * @param source mesh.\r\n * @param ignoreBoundaries if `true` ignore simple boundary edges, i.e., allow unclosed meshes. Default is `false`.\r\n * @returns true if all dihedral angles of the mesh are positive.\r\n */\r\n public static isConvexByDihedralAngleCount(source: Polyface | PolyfaceVisitor, ignoreBoundaries: boolean = false): boolean {\r\n return this.dihedralAngleSummary(source, ignoreBoundaries) > 0;\r\n }\r\n\r\n /** Helper function to detect a subset visitor. */\r\n public static isSubsetVisitor(visitor: Polyface | PolyfaceVisitor): boolean {\r\n if (visitor instanceof Polyface)\r\n return false;\r\n const parentFacetCount = visitor.clientPolyface()?.facetCount;\r\n const visitableFacetCount = visitor.getVisitableFacetCount?.();\r\n if (parentFacetCount === undefined || visitableFacetCount === undefined)\r\n return false;\r\n return parentFacetCount > visitableFacetCount;\r\n }\r\n\r\n /**\r\n * Faster version of isPolyfaceManifold for specific input.\r\n * @returns whether the mesh is manifold, or undefined if unsuccessful.\r\n */\r\n private static isPolyfaceManifoldFast(source: Polyface | PolyfaceVisitor, allowSimpleBoundaries: boolean): boolean | undefined {\r\n if (allowSimpleBoundaries)\r\n return undefined; // edgeMateIndex does not distinguish boundary edges from non-manifold edges so we can only speed things up if we search for both\r\n if (this.isSubsetVisitor(source))\r\n return false; // edgeMateIndex doesn't capture the facet subset boundary\r\n const parentData = IndexedPolyface.hasEdgeMateIndex(source)\r\n if (!parentData)\r\n return undefined;\r\n for (const edgeMate of parentData.edgeMateIndex) {\r\n if (edgeMate === undefined)\r\n return false; // found a boundary or non-manifold edge\r\n }\r\n return true; // this is a 2-manifold closed surface\r\n }\r\n /**\r\n * Test edge pairing in `source` mesh.\r\n * * Any edge with 3 or more adjacent facets triggers `false` return.\r\n * * Any edge with 2 adjacent facets in the same direction triggers `false` return.\r\n * * Null edges are ignored.\r\n * @param source facet set to examine\r\n * @param allowSimpleBoundaries if `false` (default), a return value of `true` means the facets form a closed\r\n * 2-manifold surface; if `true`, a return value of `true` means the facets form a 2-manifold surface which may\r\n * have a boundary, but is still properly matched internally.\r\n */\r\n public static isPolyfaceManifold(source: Polyface | PolyfaceVisitor, allowSimpleBoundaries: boolean = false): boolean {\r\n const isManifold = this.isPolyfaceManifoldFast(source, allowSimpleBoundaries);\r\n if (isManifold !== undefined)\r\n return isManifold\r\n const badClusters: SortableEdgeCluster[] = [];\r\n this.createIndexedEdges(source).sortAndCollectClusters(undefined, allowSimpleBoundaries ? undefined : badClusters, undefined, badClusters);\r\n return badClusters.length === 0;\r\n }\r\n /** Test if the facets in `source` occur in perfectly mated pairs, as is required for a closed manifold volume. */\r\n public static isPolyfaceClosedByEdgePairing(source: Polyface | PolyfaceVisitor): boolean {\r\n return this.isPolyfaceManifold(source, false);\r\n }\r\n /**\r\n * Faster version of announceBoundaryEdges for specific input.\r\n * @returns true if successfully announced boundary edges.\r\n */\r\n private static announceBoundaryEdgesFast(\r\n source: Polyface | PolyfaceVisitor,\r\n announceEdge: (pointA: Point3d, pointB: Point3d, indexA: number, indexB: number, facetIndex: number) => void,\r\n includeTypical: boolean,\r\n includeMismatch: boolean,\r\n includeNull: boolean,\r\n ): boolean {\r\n if (includeTypical !== includeMismatch)\r\n return false; // edgeMateIndex does not distinguish boundary edges from non-manifold edges\r\n if (!includeTypical && !includeNull)\r\n return true;\r\n if (this.isSubsetVisitor(source))\r\n return false; // edgeMateIndex doesn't capture the facet subset boundary\r\n const parentData = IndexedPolyface.hasEdgeMateIndex(source);\r\n if (!parentData)\r\n return false;\r\n const pointA = Point3d.create();\r\n const pointB = Point3d.create();\r\n for (let edgeIndex = 0; edgeIndex < parentData.edgeMateIndex.length; edgeIndex++) {\r\n const edgeMate = parentData.edgeMateIndex[edgeIndex];\r\n const announceBoundaryOrNonManifoldEdge = includeTypical && edgeMate === undefined;\r\n const announceNullEdge = includeNull && edgeMate === edgeIndex;\r\n if (announceBoundaryOrNonManifoldEdge || announceNullEdge) {\r\n const facetIndex = parentData.parent.edgeIndexToFacetIndex(edgeIndex);\r\n if (facetIndex !== undefined) { // should always be defined\r\n const pointIndexA = parentData.parent.data.pointIndex[edgeIndex];\r\n let nextEdgeIndex = edgeIndex + 1;\r\n if (nextEdgeIndex >= parentData.parent.facetIndex1(facetIndex))\r\n nextEdgeIndex = parentData.parent.facetIndex0(facetIndex);\r\n const pointIndexB = parentData.parent.data.pointIndex[nextEdgeIndex];\r\n parentData.parent.data.getPoint(pointIndexA, pointA);\r\n parentData.parent.data.getPoint(pointIndexB, pointB);\r\n announceEdge(pointA, pointB, pointIndexA, pointIndexB, facetIndex);\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Announce boundary edges of the facet set as line segments.\r\n * @param source polyface or visitor.\r\n * @param announceEdge function to be called with each boundary edge. The announcement is start and end points,\r\n * start and end vertex indices, and facet index.\r\n * @param includeTypical true to announce typical boundary edges with a single adjacent facet. Default is true.\r\n * @param includeMismatch true to announce non-manifold edges (more than 2 adjacent facets, or mismatched\r\n * orientations). Default is true.\r\n * @param includeNull true to announce edges with identical start and end vertex indices. Default is true.\r\n * @see [[announceBoundaryChainsAsLineString3d]] for boundary linestring announcement\r\n * @see [[collectBoundaryEdges]] for boundary chain collection\r\n * @see [[boundaryEdges]] for boundary edge collection\r\n */\r\n public static announceBoundaryEdges(\r\n source: Polyface | PolyfaceVisitor,\r\n announceEdge: (pointA: Point3d, pointB: Point3d, indexA: number, indexB: number, facetIndex: number) => void,\r\n includeTypical: boolean = true,\r\n includeMismatch: boolean = true,\r\n includeNull: boolean = true,\r\n ): void {\r\n if (this.announceBoundaryEdgesFast(source, announceEdge, includeTypical, includeMismatch, includeNull))\r\n return;\r\n if (!includeTypical && !includeMismatch && !includeNull)\r\n return;\r\n const vertices = source instanceof Polyface ? source.data.point : undefined;\r\n const visitor = source instanceof Polyface ? source.createVisitor(1) : source;\r\n visitor.setNumWrap(1);\r\n const edges = new IndexedEdgeMatcher();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n const numEdges = visitor.pointCount - 1;\r\n for (let i = 0; i < numEdges; i++) {\r\n const edge = edges.addEdge(visitor.clientPointIndex(i), visitor.clientPointIndex(i + 1), visitor.currentReadIndex());\r\n if (!vertices) { // decorate if we don't have vertices to query later\r\n (edge as any).pointA = visitor.point.getPoint3dAtUncheckedPointIndex(i);\r\n (edge as any).pointB = visitor.point.getPoint3dAtUncheckedPointIndex(i + 1);\r\n }\r\n }\r\n }\r\n const boundaryEdges: SortableEdgeCluster[] = [];\r\n const typicalEdges = includeTypical ? boundaryEdges : undefined;\r\n const nullEdges = includeNull ? boundaryEdges : undefined;\r\n const mismatchEdges = includeMismatch ? boundaryEdges : undefined;\r\n edges.sortAndCollectClusters(undefined, typicalEdges, nullEdges, mismatchEdges);\r\n if (boundaryEdges.length === 0)\r\n return;\r\n const pointA = Point3d.create();\r\n const pointB = Point3d.create();\r\n for (const e of boundaryEdges) {\r\n const e1 = e instanceof SortableEdge ? e : e[0]; // only report the first edge in a cluster!\r\n const indexA = e1.startVertex;\r\n const indexB = e1.endVertex;\r\n if (vertices) {\r\n vertices.getPoint3dAtUncheckedPointIndex(indexA, pointA);\r\n vertices.getPoint3dAtUncheckedPointIndex(indexB, pointB);\r\n } else {\r\n pointA.setFrom((e1 as any).pointA);\r\n pointB.setFrom((e1 as any).pointB);\r\n }\r\n announceEdge(pointA, pointB, indexA, indexB, e1.facetIndex);\r\n }\r\n }\r\n /**\r\n * Collect boundary edges of the facet set as an unordered collection of line segments.\r\n * @param source polyface or visitor.\r\n * @param includeTypical true to include typical boundary edges with a single adjacent facet. Default is true.\r\n * @param includeMismatch true to include non-manifold edges (more than 2 adjacent facets, or mismatched\r\n * orientations). Default is true.\r\n * @param includeNull true to include edges with identical start and end vertex indices. Default is true.\r\n * @see [[announceBoundaryChainsAsLineString3d]] for boundary linestring announcement\r\n * @see [[collectBoundaryEdges]] for boundary chain collection\r\n * @see [[announceBoundaryEdges]] for boundary edge announcement\r\n */\r\n public static boundaryEdges(\r\n source: Polyface | PolyfaceVisitor,\r\n includeTypical: boolean = true,\r\n includeMismatch: boolean = true,\r\n includeNull: boolean = true,\r\n ): CurveCollection | undefined {\r\n const result = new BagOfCurves();\r\n const announceEdge = (pointA: Point3d, pointB: Point3d, _indexA: number, _indexB: number, _readIndex: number) => {\r\n result.tryAddChild(LineSegment3d.create(pointA, pointB));\r\n };\r\n PolyfaceQuery.announceBoundaryEdges(source, announceEdge, includeTypical, includeMismatch, includeNull);\r\n if (result.children.length === 0)\r\n return undefined;\r\n return result;\r\n }\r\n /**\r\n * Collect boundary edges of the facet set as the simplest collection of chains of line segments.\r\n * @param source polyface or visitor.\r\n * @param includeTypical true to include typical boundary edges with a single adjacent facet. Default is true.\r\n * @param includeMismatch true to include non-manifold edges (more than 2 adjacent facets, or mismatched\r\n * orientations). Default is true.\r\n * @param includeNull true to include edges with identical start and end vertex indices. Default is true.\r\n * @see [[announceBoundaryChainsAsLineString3d]] for boundary linestring announcement\r\n * @see [[announceBoundaryEdges]] for boundary edge announcement\r\n * @see [[boundaryEdges]] for boundary edge collection\r\n */\r\n public static collectBoundaryEdges(\r\n source: Polyface | PolyfaceVisitor,\r\n includeTypical: boolean = true,\r\n includeMismatch: boolean = true,\r\n includeNull: boolean = true,\r\n ): AnyChain | undefined {\r\n const collector = new MultiChainCollector(Geometry.smallMetricDistance, Geometry.smallMetricDistance);\r\n const announceEdge = (ptA: Point3d, ptB: Point3d) => collector.captureCurve(LineSegment3d.create(ptA, ptB));\r\n PolyfaceQuery.announceBoundaryEdges(source, announceEdge, includeTypical, includeMismatch, includeNull);\r\n return collector.grabResult(true);\r\n }\r\n /**\r\n * Load an IndexedEdgeMatcher from the edges of a mesh.\r\n * @param polyface a mesh or visitor\r\n */\r\n public static createIndexedEdges(polyface: Polyface | PolyfaceVisitor): IndexedEdgeMatcher {\r\n const edges = new IndexedEdgeMatcher();\r\n const visitor = polyface instanceof Polyface ? polyface.createVisitor(1) : polyface;\r\n visitor.setNumWrap(1);\r\n for (visitor.reset(); visitor.moveToNextFacet();)\r\n edges.addPath(visitor.pointIndex, visitor.currentReadIndex(), false);\r\n return edges;\r\n }\r\n /**\r\n * Invoke the callback on each manifold edge whose adjacent facet normals form vectorToEye dot products\r\n * with opposite sign.\r\n * * The callback is not called on boundary edges.\r\n * @param source polyface or visitor.\r\n * @param announce callback function invoked on manifold silhouette edges.\r\n * @param vectorToEye normal of plane in which to compute silhouette edges.\r\n * @param sideAngle angular tolerance for perpendicularity test.\r\n */\r\n public static announceSilhouetteEdges(\r\n source: Polyface | PolyfaceVisitor,\r\n announce: (pointA: Point3d, pointB: Point3d, vertexIndexA: number, vertexIndexB: number, facetIndex: number) => void,\r\n vectorToEye: Vector3d,\r\n sideAngle: Angle = Angle.createSmallAngle(),\r\n ): void {\r\n if (source instanceof Polyface)\r\n return this.announceSilhouetteEdges(source.createVisitor(1), announce, vectorToEye, sideAngle);\r\n const mesh = source.clientPolyface();\r\n if (undefined === mesh)\r\n return;\r\n source.setNumWrap(1);\r\n const allEdges = this.createIndexedEdges(source);\r\n const manifoldEdges: SortableEdgeCluster[] = [];\r\n allEdges.sortAndCollectClusters(manifoldEdges);\r\n const sideAngleTol = sideAngle.radians < 0.0 ? -sideAngle.radians : sideAngle.radians;\r\n const pointA = Point3d.create();\r\n const pointB = Point3d.create();\r\n const normal = Vector3d.create();\r\n const analyzeFace = (iFacet: number): { isSideFace: boolean, perpAngle: number } => {\r\n if (!PolyfaceQuery.computeFacetUnitNormal(source, iFacet, normal))\r\n return { isSideFace: false, perpAngle: 0.0 };\r\n const perpAngle = normal.radiansFromPerpendicular(vectorToEye);\r\n const isSideFace = Math.abs(perpAngle) <= sideAngleTol;\r\n return { isSideFace, perpAngle };\r\n };\r\n for (const pair of manifoldEdges) {\r\n if (!Array.isArray(pair) || pair.length !== 2)\r\n continue;\r\n const indexA = pair[0].startVertex;\r\n const indexB = pair[0].endVertex;\r\n if (!mesh.data.getPoint(indexA, pointA) || !mesh.data.getPoint(indexB, pointB))\r\n continue;\r\n const face0 = analyzeFace(pair[0].facetIndex);\r\n if (face0.isSideFace) {\r\n announce(pointA, pointB, indexA, indexB, pair[0].facetIndex);\r\n continue;\r\n }\r\n const face1 = analyzeFace(pair[1].facetIndex);\r\n if (face1.isSideFace) {\r\n announce(pointB, pointA, indexB, indexA, pair[1].facetIndex);\r\n continue;\r\n }\r\n if (face0.perpAngle * face1.perpAngle < 0.0) { // normals straddle plane\r\n announce(pointA, pointB, indexA, indexB, pair[0].facetIndex);\r\n continue;\r\n }\r\n }\r\n }\r\n /**\r\n * Collect manifold edges whose adjacent facet normals form vectorToEye dot products with opposite sign.\r\n * * Does not return boundary edges.\r\n * * Return the edges as chains of line segments.\r\n * @param source polyface or visitor.\r\n * @param vectorToEye normal of plane in which to compute silhouette edges.\r\n * @param sideAngle angular tolerance for perpendicularity test.\r\n */\r\n public static collectSilhouetteEdges(\r\n source: Polyface | PolyfaceVisitor,\r\n vectorToEye: Vector3d,\r\n sideAngle: Angle = Angle.createSmallAngle(),\r\n ): AnyChain | undefined {\r\n const collector = new MultiChainCollector(Geometry.smallMetricDistance, Geometry.smallMetricDistance);\r\n PolyfaceQuery.announceSilhouetteEdges(\r\n source,\r\n (ptA: Point3d, ptB: Point3d) => collector.captureCurve(LineSegment3d.create(ptA, ptB)),\r\n vectorToEye,\r\n sideAngle,\r\n );\r\n return collector.grabResult(true);\r\n }\r\n /**\r\n * Find segments (within the linestring) which project to facets.\r\n * * Announce each pair of linestring segment and on-facet segment through a callback.\r\n * * Facets are ASSUMED to be convex and planar, and not overlap in the z direction.\r\n */\r\n public static announceSweepLinestringToConvexPolyfaceXY(linestringPoints: IndexedXYZCollection, polyface: Polyface, announce: AnnounceDrapePanel): void {\r\n const context = SweepLineStringToFacetContext.create(linestringPoints);\r\n if (context) {\r\n const visitor = polyface.createVisitor(0);\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n context.projectToPolygon(visitor.point, announce, polyface, visitor.currentReadIndex());\r\n }\r\n }\r\n }\r\n // amount of computation to do per step of async methods.\r\n private static _asyncWorkLimit = 1.e06;\r\n /**\r\n * Set the limit on work during an async time blocks, and return the old value.\r\n * * This should be a large number -- default is 1.0e6\r\n * @internal\r\n */\r\n public static setAsyncWorkLimit(value: number): number {\r\n const oldValue = this._asyncWorkLimit;\r\n this._asyncWorkLimit = value;\r\n return oldValue;\r\n }\r\n /**\r\n * Query the current limit on work during an async time block.\r\n * @internal\r\n */\r\n public static get asyncWorkLimit(): number {\r\n return this._asyncWorkLimit;\r\n }\r\n /**\r\n * Number of \"await\" steps executed in recent async calls.\r\n * @internal\r\n */\r\n public static awaitBlockCount = 0;\r\n /** Execute `context.projectToPolygon` until its work estimates accumulate to workLimit. */\r\n private static async continueAnnounceSweepLinestringToConvexPolyfaceXY(\r\n context: SweepLineStringToFacetContext, visitor: PolyfaceVisitor, announce: AnnounceDrapePanel,\r\n ): Promise<number> {\r\n let workCount = 0;\r\n while ((workCount < this.asyncWorkLimit) && visitor.moveToNextFacet()) {\r\n workCount += context.projectToPolygon(visitor.point, announce, visitor.clientPolyface()!, visitor.currentReadIndex());\r\n }\r\n return workCount;\r\n }\r\n /**\r\n * Find segments (within the linestring) which project to facets.\r\n * * Announce each pair of linestring segment and on-facet segment through a callback.\r\n * * Facets are ASSUMED to be convex and planar, and not overlap in the z direction.\r\n * * REMARK: Although this is public, the usual use is via slightly higher level public methods, viz:\r\n * * asyncSweepLinestringToFacetsXYReturnChains\r\n * @internal\r\n */\r\n public static async asyncAnnounceSweepLinestringToConvexPolyfaceXY(\r\n linestringPoints: IndexedXYZCollection, polyface: Polyface, announce: AnnounceDrapePanel,\r\n ): Promise<number> {\r\n const context = SweepLineStringToFacetContext.create(linestringPoints);\r\n this.awaitBlockCount = 0;\r\n let workTotal = 0;\r\n if (context) {\r\n const visitor = polyface.createVisitor(0);\r\n let workCount;\r\n while (0 < (workCount = await Promise.resolve(PolyfaceQuery.continueAnnounceSweepLinestringToConvexPolyfaceXY(context, visitor, announce)))) {\r\n workTotal += workCount;\r\n this.awaitBlockCount++;\r\n // GeometryCoreTestIO.consoleLog({ myWorkCount: workCount, myBlockCount: this.awaitBlockCount });\r\n }\r\n }\r\n // GeometryCoreTestIO.consoleLog({ myWorkTotal: workTotal, myBlockCount: this.awaitBlockCount });\r\n return workTotal;\r\n }\r\n /**\r\n * Search the facets for facet subsets that are connected with at least vertex contact.\r\n * * Return array of arrays of facet indices.\r\n */\r\n public static partitionFacetIndicesByVertexConnectedComponent(polyface: Polyface | PolyfaceVisitor): number[][] {\r\n if (polyface instanceof Polyface) {\r\n return this.partitionFacetIndicesByVertexConnectedComponent(polyface.createVisitor(0));\r\n }\r\n // The polyface is really a visitor\r\n const context = new UnionFindContext(this.visitorClientPointCount(polyface));\r\n for (polyface.reset(); polyface.moveToNextFacet();) {\r\n const firstVertexIndexOnThisFacet = polyface.pointIndex[0];\r\n for (const vertexIndex of polyface.pointIndex)\r\n context.mergeSubsets(firstVertexIndexOnThisFacet, vertexIndex);\r\n }\r\n const roots = context.collectRootIndices();\r\n const facetsInComponent: number[][] = [];\r\n const numRoots = roots.length;\r\n for (let i = 0; i < numRoots; i++) {\r\n facetsInComponent.push([]);\r\n }\r\n for (polyface.reset(); polyface.moveToNextFacet();) {\r\n const firstVertexIndexOnThisFacet = polyface.pointIndex[0];\r\n const rootVertexForThisFacet = context.findRoot(firstVertexIndexOnThisFacet);\r\n for (let rootIndex = 0; rootIndex < numRoots; rootIndex++) {\r\n if (roots[rootIndex] === rootVertexForThisFacet) {\r\n facetsInComponent[rootIndex].push(polyface.currentReadIndex());\r\n break;\r\n }\r\n }\r\n }\r\n return facetsInComponent;\r\n }\r\n /**\r\n * * Examine the normal orientation for each faces.\r\n * * Separate to 3 partitions:\r\n * * Facets with normal in the positive direction of the vectorToEye (partition 0).\r\n * * Facets with normal in the negative direction of the vectorToEye (partition 1).\r\n * * Facets nearly perpendicular to the view vector (partition 2).\r\n * * Return array of arrays of facet indices.\r\n */\r\n public static partitionFacetIndicesByVisibilityVector(\r\n polyface: Polyface | PolyfaceVisitor, vectorToEye: Vector3d, sideAngleTolerance: Angle,\r\n ): number[][] {\r\n if (polyface instanceof Polyface) {\r\n return this.partitionFacetIndicesByVisibilityVector(polyface.createVisitor(0), vectorToEye, sideAngleTolerance);\r\n }\r\n const facetsInComponent: number[][] = [];\r\n for (let i = 0; i < 3; i++) {\r\n facetsInComponent.push([]);\r\n }\r\n const forwardComponent = facetsInComponent[0];\r\n const rearComponent = facetsInComponent[1];\r\n const sideComponent = facetsInComponent[2];\r\n const radiansTol = Math.max(sideAngleTolerance.radians, 1.0e-8);\r\n for (polyface.reset(); polyface.moveToNextFacet();) {\r\n const areaNormal = PolygonOps.areaNormalGo(polyface.point);\r\n const index = polyface.currentReadIndex();\r\n if (areaNormal) {\r\n const angle = areaNormal.angleFromPerpendicular(vectorToEye);\r\n if (Math.abs(angle.radians) < radiansTol) {\r\n sideComponent.push(index);\r\n } else if (areaNormal.dotProduct(vectorToEye) < 0) {\r\n rearComponent.push(index);\r\n } else {\r\n forwardComponent.push(index);\r\n }\r\n }\r\n }\r\n return facetsInComponent;\r\n }\r\n /**\r\n * Return the boundary of facets that are facing the eye.\r\n * @param source polyface or visitor. Must be capable of constructing a subset visitor.\r\n * @param visibilitySubset selector among the visible facet sets extracted by partitionFacetIndicesByVisibilityVector\r\n * * 0 ==> forward facing\r\n * * 1 ==> rear facing\r\n * * 2 ==> side facing\r\n * @param vectorToEye the vector to eye\r\n * @param sideAngleTolerance the tolerance of side angle\r\n */\r\n public static boundaryOfVisibleSubset(\r\n source: Polyface | PolyfaceVisitor,\r\n visibilitySelect: 0 | 1 | 2,\r\n vectorToEye: Vector3d,\r\n sideAngleTolerance: Angle = Angle.createDegrees(1.0e-3),\r\n ): CurveCollection | undefined {\r\n const visitor = source instanceof Polyface ? source.createVisitor(0) : source;\r\n if (!visitor.createSubsetVisitor)\r\n return undefined;\r\n const partitionedIndices = this.partitionFacetIndicesByVisibilityVector(source, vectorToEye, sideAngleTolerance);\r\n if (partitionedIndices[visibilitySelect].length === 0)\r\n return undefined;\r\n const subsetVisitor = visitor.createSubsetVisitor(partitionedIndices[visibilitySelect], 1);\r\n return this.boundaryEdges(subsetVisitor, true, false, false);\r\n }\r\n /**\r\n * Announce boundary edges of the facet set as linestrings.\r\n * * Ignores non-manifold interior edges and null edges.\r\n * @param source polyface or visitor.\r\n * @param announceChain function to be called with each chain of boundary edges.\r\n * @see [[collectBoundaryEdges]] for boundary chain collection\r\n * @see [[announceBoundaryEdges]] for boundary edge announcement\r\n * @see [[boundaryEdges]] for boundary edge collection\r\n */\r\n public static announceBoundaryChainsAsLineString3d(\r\n source: Polyface | PolyfaceVisitor, announceChain: (points: LineString3d) => void,\r\n ): void {\r\n const collector = new MultiChainCollector(Geometry.smallMetricDistance); // no planarity tolerance needed\r\n const announceEdge = (ptA: Point3d, ptB: Point3d) => collector.captureCurve(LineSegment3d.create(ptA, ptB));\r\n PolyfaceQuery.announceBoundaryEdges(source, announceEdge, true, false, false);\r\n collector.announceChainsAsLineString3d(announceChain);\r\n }\r\n /**\r\n * Return a mesh with\r\n * * clusters of adjacent, coplanar facets merged into larger (possibly non-convex) facets.\r\n * * other facets are unchanged.\r\n * @param mesh existing mesh or visitor.\r\n * @param maxSmoothEdgeAngle maximum dihedral angle across an edge between facets deemed coplanar. If undefined,\r\n * uses `Geometry.smallAngleRadians`.\r\n */\r\n public static cloneWithMaximalPlanarFacets(\r\n mesh: Polyface | PolyfaceVisitor, maxSmoothEdgeAngle?: Angle,\r\n ): IndexedPolyface {\r\n if (mesh instanceof Polyface)\r\n return this.cloneWithMaximalPlanarFacets(mesh.createVisitor(0), maxSmoothEdgeAngle);\r\n const numFacets = PolyfaceQuery.visitorClientFacetCount(mesh);\r\n const smoothEdges = PolyfaceQuery.collectEdgesByDihedralAngle(mesh, maxSmoothEdgeAngle);\r\n const partitions = PolyfaceQuery.partitionFacetIndicesBySortableEdgeClusters(smoothEdges, numFacets);\r\n const builder = PolyfaceBuilder.create();\r\n const visitor = mesh;\r\n const planarPartitions: number[][] = [];\r\n const partitionNormals: Ray3d[] = []; // average normal in each nontrivial partition\r\n const normal = Vector3d.createZero();\r\n for (const partition of partitions) {\r\n if (partition.length === 1) {\r\n if (visitor.moveToReadIndex(partition[0]))\r\n builder.addFacetFromVisitor(visitor);\r\n } else if (partition.length > 1) { // nontrivial set of contiguous coplanar facets\r\n const averageNormal = Vector3d.createZero();\r\n const point0 = Point3d.createZero();\r\n if (visitor.moveToReadIndex(partition[0]))\r\n visitor.point.getPoint3dAtCheckedPointIndex(0, point0);\r\n for (const facetIndex of partition) {\r\n if (visitor.moveToReadIndex(facetIndex))\r\n if (PolygonOps.areaNormalGo(visitor.point, normal))\r\n averageNormal.addInPlace(normal);\r\n }\r\n partitionNormals.push(Ray3d.createCapture(point0, averageNormal));\r\n planarPartitions.push(partition);\r\n }\r\n }\r\n const fragmentPolyfaces = PolyfaceQuery.clonePartitions(mesh, planarPartitions);\r\n assert(planarPartitions.length === partitionNormals.length);\r\n assert(planarPartitions.length === fragmentPolyfaces.length);\r\n const gapTolerance = 1.0e-4;\r\n const planarityTolerance = 1.0e-4;\r\n const localToWorld = Transform.createIdentity();\r\n const worldToLocal = Transform.createIdentity();\r\n for (let i = 0; i < fragmentPolyfaces.length; ++i) {\r\n const fragment = fragmentPolyfaces[i];\r\n const edges: LineSegment3d[] = [];\r\n const edgeStrings: Point3d[][] = [];\r\n PolyfaceQuery.announceBoundaryEdges(fragment,\r\n (pointA: Point3d, pointB: Point3d, _indexA: number, _indexB: number) => {\r\n edges.push(LineSegment3d.create(pointA, pointB));\r\n edgeStrings.push([pointA.clone(), pointB.clone()]);\r\n }, true, false, false);\r\n const chains = CurveOps.collectChains(edges, gapTolerance, planarityTolerance);\r\n if (chains) {\r\n // avoid FrameBuilder: it can flip the normal of a nonconvex facet!\r\n partitionNormals[i].toRigidZFrame(localToWorld);\r\n if (localToWorld.inverse(worldToLocal)) {\r\n worldToLocal.multiplyPoint3dArrayArrayInPlace(edgeStrings);\r\n // Regularize adds bridge edges to holes, and adds other edges to aid triangulation.\r\n // But we aren't triangulating here. So if we don't have holes, we can skip regularization\r\n // to avoid splitting the loop.\r\n const regularize = !(chains instanceof Loop);\r\n const graph = HalfEdgeGraphMerge.formGraphFromChains(edgeStrings, regularize, HalfEdgeMask.BOUNDARY_EDGE);\r\n if (graph) {\r\n HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph,\r\n new HalfEdgeMaskTester(HalfEdgeMask.BOUNDARY_EDGE), HalfEdgeMask.EXTERIOR);\r\n // this.purgeNullFaces(HalfEdgeMask.EXTERIOR);\r\n const polyface1 = PolyfaceBuilder.graphToPolyface(graph);\r\n builder.addIndexedPolyface(polyface1, false, localToWorld);\r\n }\r\n }\r\n }\r\n }\r\n return builder.claimPolyface(true);\r\n }\r\n /**\r\n * Return a mesh with \"some\" holes filled in with new facets.\r\n * * Candidate chains are computed by [[announceBoundaryChainsAsLineString3d]].\r\n * * Unclosed chains are rejected.\r\n * * Closed chains are triangulated and returned as a mesh.\r\n * * The options structure enforces restrictions on how complicated the hole filling can be:\r\n * * maxEdgesAroundHole -- holes with more edges are skipped.\r\n * * maxPerimeter -- holes with larger summed edge lengths are skipped.\r\n * * upVector -- holes that do not have positive area along this view are skipped.\r\n * * includeOriginalMesh -- includes the original mesh in the output mesh, so the composite mesh is a\r\n * clone with holes filled.\r\n * @param mesh existing mesh.\r\n * @param options options controlling the hole fill.\r\n * @param unfilledChains optional array to receive the points around holes that were not filled.\r\n */\r\n public static fillSimpleHoles(\r\n mesh: Polyface | PolyfaceVisitor, options: HoleFillOptions, unfilledChains?: LineString3d[],\r\n ): IndexedPolyface | undefined {\r\n if (mesh instanceof Polyface)\r\n return this.fillSimpleHoles(mesh.createVisitor(0), options, unfilledChains);\r\n const builder = PolyfaceBuilder.create();\r\n const chains: LineString3d[] = [];\r\n PolyfaceQuery.announceBoundaryChainsAsLineString3d(\r\n mesh,\r\n (ls: LineString3d) => { ls.reverseInPlace(); chains.push(ls); },\r\n );\r\n for (const c of chains) {\r\n const points = c.points;\r\n let rejected = false;\r\n if (!c.isPhysicallyClosed)\r\n rejected = true;\r\n else if (options.maxEdgesAroundHole !== undefined && points.length > options.maxEdgesAroundHole)\r\n rejected = true;\r\n else if (options.maxPerimeter !== undefined && Point3dArray.sumEdgeLengths(points, false) > options.maxPerimeter)\r\n rejected = true;\r\n else if (options.upVector !== undefined && PolygonOps.sumTriangleAreasPerpendicularToUpVector(points, options.upVector) <= 0.0)\r\n rejected = true;\r\n if (!rejected && SpacePolygonTriangulation.triangulateSimplestSpaceLoop(points,\r\n (_loop: Point3d[], triangles: Point3d[][]) => {\r\n for (const t of triangles)\r\n builder.addPolygon(t);\r\n },\r\n )) {\r\n } else {\r\n rejected = true;\r\n }\r\n if (rejected && unfilledChains !== undefined)\r\n unfilledChains.push(c); // yes, capture it -- this scope owns the chains and has no further use for it.\r\n }\r\n if (options.includeOriginalMesh !== undefined && options.includeOriginalMesh) {\r\n for (mesh.reset(); mesh.moveToNextFacet();)\r\n builder.addFacetFromVisitor(mesh);\r\n }\r\n return builder.claimPolyface(true);\r\n }\r\n /** Clone the facets in each partition to a separate polyface. */\r\n public static clonePartitions(polyface: Polyface | PolyfaceVisitor, partitions: number[][]): IndexedPolyface[] {\r\n if (polyface instanceof Polyface) {\r\n return this.clonePartitions(polyface.createVisitor(0), partitions);\r\n }\r\n polyface.setNumWrap(0);\r\n const polyfaces: IndexedPolyface[] = [];\r\n const options = StrokeOptions.createForFacets();\r\n options.needNormals = polyface.normal !== undefined;\r\n options.needParams = polyface.param !== undefined;\r\n options.needColors = polyface.color !== undefined;\r\n options.needTwoSided = polyface.twoSided;\r\n for (const partition of partitions) {\r\n const builder = PolyfaceBuilder.create(options);\r\n polyface.reset();\r\n for (const facetIndex of partition) {\r\n polyface.moveToReadIndex(facetIndex);\r\n builder.addFacetFromVisitor(polyface);\r\n }\r\n polyfaces.push(builder.claimPolyface(true));\r\n }\r\n return polyfaces;\r\n }\r\n /** Clone facets that pass a filter function. */\r\n public static cloneFiltered(\r\n source: Polyface | PolyfaceVisitor, filter: (visitor: PolyfaceVisitor) => boolean,\r\n ): IndexedPolyface {\r\n if (source instanceof Polyface) {\r\n return this.cloneFiltered(source.createVisitor(0), filter);\r\n }\r\n source.setNumWrap(0);\r\n const options = StrokeOptions.createForFacets();\r\n options.needNormals = source.normal !== undefined;\r\n options.needParams = source.param !== undefined;\r\n options.needColors = source.color !== undefined;\r\n options.needTwoSided = source.twoSided;\r\n const builder = PolyfaceBuilder.create(options);\r\n source.reset();\r\n for (; source.moveToNextFacet();) {\r\n if (filter(source))\r\n builder.addFacetFromVisitor(source);\r\n }\r\n return builder.claimPolyface(true);\r\n }\r\n /** Clone the facets with in-facet dangling edges removed. */\r\n public static cloneWithDanglingEdgesRemoved(source: Polyface | PolyfaceVisitor): IndexedPolyface {\r\n if (source instanceof Polyface)\r\n return this.cloneWithDanglingEdgesRemoved(source.createVisitor(0));\r\n const options = StrokeOptions.createForFacets();\r\n options.needNormals = source.normal !== undefined;\r\n options.needParams = source.param !== undefined;\r\n options.needColors = source.color !== undefined;\r\n options.needTwoSided = source.twoSided;\r\n const builder = PolyfaceBuilder.create(options);\r\n // Finds an odd palindrome in data as indexed by indices.\r\n // An odd palindrome in a face loop corresponds to dangling edges in the face.\r\n // If one is found, indices is mutated to excise the palindrome (data is untouched).\r\n // @returns whether indices array was mutated\r\n const removeFirstOddPalindrome = (indices: number[], data: number[]): boolean => {\r\n const n = indices.length;\r\n for (let i = 0; i < n; ++i) {\r\n let palLength = 1;\r\n let i0 = i; // look for odd palindrome centered at i\r\n let i1 = i; // and with extents i0..i1\r\n while (palLength + 2 <= n) {\r\n const iPrev = (i0 === 0) ? n - 1 : i0 - 1;\r\n const iNext = (i1 === n - 1) ? 0 : i1 + 1;\r\n if (data[indices[iPrev]] !== data[indices[iNext]])\r\n break; // the maximal odd palindrome centered at i has length palLength and spans [i0,i1]\r\n i0 = iPrev;\r\n i1 = iNext;\r\n palLength += 2;\r\n }\r\n if (palLength > 1) { // excise the palindrome (but keep i1)\r\n if (i0 < i1) {\r\n indices.splice(i0, palLength - 1); // remove entries [i0,i1)\r\n } else if (i0 > i1) {\r\n indices.splice(i0); // remove entries [i0,n)\r\n indices.splice(0, i1); // remove entries [0,i1)\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n source.setNumWrap(0);\r\n source.reset();\r\n while (source.moveToNextFacet()) {\r\n const localIndices = [...Array(source.pointIndex.length).keys()]; // 0, 1, ... n-1;\r\n while (removeFirstOddPalindrome(localIndices, source.pointIndex)) { }\r\n builder.addFacetFromIndexedVisitor(source, localIndices);\r\n }\r\n return builder.claimPolyface(true);\r\n }\r\n /**\r\n * Return the point count of the `source`.\r\n * * If `source` is a visitor, this is an upper bound on the number of addressed mesh vertices.\r\n */\r\n public static visitorClientPointCount(source: Polyface | PolyfaceVisitor): number {\r\n if (source instanceof Polyface)\r\n return source.data.point.length;\r\n const polyface = source.clientPolyface();\r\n if (polyface !== undefined)\r\n return polyface.data.point.length;\r\n const saveReadIndex = source.currentReadIndex();\r\n source.reset();\r\n let maxIndex = -1;\r\n while (source.moveToNextFacet()) {\r\n for (const pointIndex of source.pointIndex)\r\n if (pointIndex > maxIndex)\r\n maxIndex = pointIndex;\r\n }\r\n source.moveToReadIndex(saveReadIndex);\r\n return maxIndex + 1;\r\n }\r\n /**\r\n * Return the facet count of the `source`.\r\n * * If `source` is a visitor, this is the number of facets it can visit.\r\n */\r\n public static visitorClientFacetCount(source: Polyface | PolyfaceVisitor): number {\r\n if (source instanceof Polyface) {\r\n if (source.facetCount !== undefined)\r\n return source.facetCount;\r\n source = source.createVisitor(0);\r\n }\r\n if (source.getVisitableFacetCount)\r\n return source.getVisitableFacetCount();\r\n const polyface = source.clientPolyface();\r\n if (polyface !== undefined && polyface.facetCount !== undefined)\r\n return polyface.facetCount;\r\n const saveReadIndex = source.currentReadIndex();\r\n let facetCount = 0;\r\n source.reset();\r\n while (source.moveToNextFacet())\r\n ++facetCount;\r\n source.moveToReadIndex(saveReadIndex);\r\n return facetCount;\r\n }\r\n /**\r\n * Partition the facet set into connected components such that two adjacent facets are in the same component if and\r\n * only if they are adjacent across a clustered edge.\r\n * @param edgeClusters sorted and clustered edges (cf. `IndexedEdgeMatcher.sortAndCollectClusters`).\r\n * @param numFacets facet count in the parent mesh. In particular, `edge.facetIndex < numFacets` for every input edge.\r\n * @return collection of facet index arrays, one array per connected component.\r\n */\r\n private static partitionFacetIndicesBySortableEdgeClusters(\r\n edgeClusters: SortableEdgeCluster[], numFacets: number,\r\n ): number[][] {\r\n const context = new UnionFindContext(numFacets);\r\n for (const cluster of edgeClusters) {\r\n if (cluster instanceof SortableEdge) {\r\n // this edge does not connect anywhere. Ignore it!!\r\n } else {\r\n const edge0 = cluster[0];\r\n for (let i = 1; i < cluster.length; i++)\r\n context.mergeSubsets(edge0.facetIndex, cluster[i].facetIndex);\r\n }\r\n }\r\n const roots = context.collectRootIndices();\r\n const facetsInComponent: number[][] = [];\r\n const numRoots = roots.length;\r\n for (let i = 0; i < numRoots; i++) {\r\n facetsInComponent.push([]);\r\n }\r\n for (let facetIndex = 0; facetIndex < numFacets; facetIndex++) {\r\n const rootOfFacet = context.findRoot(facetIndex);\r\n for (let rootIndex = 0; rootIndex < numRoots; rootIndex++) {\r\n if (roots[rootIndex] === rootOfFacet) {\r\n facetsInComponent[rootIndex].push(facetIndex);\r\n break;\r\n }\r\n }\r\n }\r\n return facetsInComponent;\r\n }\r\n /**\r\n * Partition the facet set into connected components. Each facet in a given component shares an edge only with\r\n * other facets in the component (or is a boundary edge).\r\n * @param polyface facets to partition.\r\n * @param stopAtVisibleEdges whether to further split connected components by visible edges of the polyface.\r\n * @return collection of facet index arrays, one per connected component.\r\n */\r\n public static partitionFacetIndicesByEdgeConnectedComponent(\r\n polyface: Polyface | PolyfaceVisitor, stopAtVisibleEdges: boolean = false,\r\n ): number[][] {\r\n if (polyface instanceof Polyface) {\r\n return this.partitionFacetIndicesByEdgeConnectedComponent(polyface.createVisitor(0), stopAtVisibleEdges);\r\n }\r\n polyface.setNumWrap(1);\r\n const matcher = new IndexedEdgeMatcher();\r\n polyface.reset();\r\n let numFacets = 0;\r\n while (polyface.moveToNextFacet()) {\r\n const numEdges = polyface.pointCount - 1;\r\n numFacets++;\r\n for (let i = 0; i < numEdges; i++) {\r\n if (stopAtVisibleEdges && polyface.edgeVisible[i]) {\r\n\r\n } else {\r\n matcher.addEdge(polyface.clientPointIndex(i), polyface.clientPointIndex(i + 1), polyface.currentReadIndex());\r\n }\r\n }\r\n }\r\n const allEdges: SortableEdgeCluster[] = [];\r\n matcher.sortAndCollectClusters(allEdges, allEdges, allEdges, allEdges);\r\n return this.partitionFacetIndicesBySortableEdgeClusters(allEdges, numFacets);\r\n }\r\n /**\r\n * Find segments (within the line string) which project to facets.\r\n * * Assemble each input segment paired with its projected segment/point as a quad/triangle facet in a new polyface.\r\n * * Input facets are ASSUMED to be convex and planar, and not overlap in the z direction.\r\n */\r\n public static sweepLineStringToFacetsXYReturnSweptFacets(lineStringPoints: IndexedXYZCollection, polyface: Polyface): Polyface {\r\n const builder = PolyfaceBuilder.create();\r\n this.announceSweepLinestringToConvexPolyfaceXY(\r\n lineStringPoints,\r\n polyface,\r\n (_linestring: IndexedXYZCollection, _segmentIndex: number, _polyface: Polyface, _facetIndex: number, points: Point3d[]) => {\r\n if (points.length === 4)\r\n builder.addQuadFacet(points);\r\n else if (points.length === 3)\r\n builder.addTriangleFacet(points);\r\n },\r\n );\r\n return builder.claimPolyface(true);\r\n }\r\n /** @deprecated in 4.7.0 - will not be removed until after 2026-06-13. Use [[sweepLineStringToFacetsXYReturnSweptFacets]] instead. */\r\n public static sweepLinestringToFacetsXYreturnSweptFacets(linestringPoints: GrowableXYZArray, polyface: Polyface): Polyface {\r\n return this.sweepLineStringToFacetsXYReturnSweptFacets(linestringPoints, polyface);\r\n }\r\n /**\r\n * Sweep the line string to intersections with a mesh and return collected line segments.\r\n * * Facets are ASSUMED to be convex and planar, and not overlap in the sweep direction.\r\n * @param points the linestring to drape onto the mesh.\r\n * @param source target facet set. For best results, facets should be convex and planar.\r\n * @param options input, filtering, search, and output options.\r\n * * If `undefined`, the default sweep direction is the positive z-axis, and chains are assembled and returned.\r\n * * For faster _vertical_ sweep, a pre-computed range tree can be supplied in `options.searcher`.\r\n * * For faster _non-vertical_ sweep, first transform inputs with the inverse of the transform\r\n * `T = Transform.createRigidFromOriginAndVector(undefined, options.vectorToEye)`, construct the searcher on these\r\n * local facets, call `sweepLineStringToFacets/XY` with these local inputs (and default sweep direction), and lastly,\r\n * transform the returned draped linework back to world coordinates with `T`.\r\n */\r\n public static sweepLineStringToFacets(points: IndexedXYZCollection, source: Polyface | PolyfaceVisitor, options?: SweepLineStringToFacetsOptions): LinearCurvePrimitive[] {\r\n let result: LinearCurvePrimitive[] = [];\r\n if (options === undefined)\r\n options = SweepLineStringToFacetsOptions.create();\r\n let chainContext: ChainMergeContext | undefined;\r\n if (options.assembleChains)\r\n chainContext = ChainMergeContext.create();\r\n const addSegment = chainContext ? (ptA: Point3d, ptB: Point3d) => chainContext.addSegment(ptA, ptB) : (ptA: Point3d, ptB: Point3d) => result.push(LineSegment3d.create(ptA, ptB));\r\n const workNormal = Vector3d.createZero();\r\n const visitor = source instanceof Polyface ? source.createVisitor(0) : source;\r\n visitor.setNumWrap(0);\r\n if (options.searcher && options.vectorToEye.isParallelTo(Vector3d.unitZ())) {\r\n const searchRange = Range3d.createNull();\r\n const workPoint0 = Point3d.createZero();\r\n const workPoint1 = Point3d.createZero();\r\n let edgeClipper: EdgeClipData | undefined;\r\n const clipEdgeToConvexPolygon = (_facetRange: any, readIndex: number) => {\r\n if (visitor.moveToReadIndex(readIndex) && (options.collectAll || options.collectFromThisFacetNormal(PolygonOps.areaNormalGo(visitor.point, workNormal))))\r\n edgeClipper?.processPolygon(visitor.point, (ptA: Point3d, ptB: Point3d) => addSegment(ptA, ptB));\r\n return true;\r\n };\r\n for (let i = 1; i < points.length; i++) {\r\n points.getPoint3dAtUncheckedPointIndex(i - 1, workPoint0);\r\n points.getPoint3dAtUncheckedPointIndex(i, workPoint1);\r\n if (edgeClipper = EdgeClipData.createPointPointSweep(workPoint0, workPoint1, options.vectorToEye)) {\r\n searchRange.setNull();\r\n searchRange.extend(workPoint0, workPoint1);\r\n options.searcher.searchRange2d(searchRange, clipEdgeToConvexPolygon);\r\n }\r\n }\r\n } else {\r\n const context = ClipSweptLineStringContext.create(points, options.vectorToEye);\r\n if (context) {\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n if (options.collectAll || options.collectFromThisFacetNormal(PolygonOps.areaNormalGo(visitor.point, workNormal)))\r\n context.processPolygon(visitor.point.getArray(), addSegment);\r\n }\r\n }\r\n }\r\n if (chainContext) {\r\n chainContext.clusterAndMergeVerticesXYZ();\r\n result = chainContext.collectMaximalChains();\r\n }\r\n return result;\r\n }\r\n /**\r\n * Sweep the line string in the z-direction to intersections with a mesh, using a search object for speedup.\r\n * @param points the linestring to drape onto the mesh.\r\n * @param source target facet set. For best results, facets should be convex and planar.\r\n * @param searcher object for searching facet 2D ranges tagged by mesh read index.\r\n * @returns the collected line strings.\r\n * @see [[sweepLineStringToFacets]] for further options.\r\n */\r\n public static sweepLineStringToFacetsXY(points: IndexedXYZCollection | Point3d[], source: Polyface | PolyfaceVisitor, searcher: Range2dSearchInterface<number>): LineString3d[] {\r\n const chainContext = ChainMergeContext.create();\r\n const vectorToEye = Vector3d.unitZ();\r\n const searchRange = Range3d.create();\r\n const workPoint0 = Point3d.createZero();\r\n const workPoint1 = Point3d.createZero();\r\n const visitor = source instanceof Polyface ? source.createVisitor(0) : source;\r\n visitor.setNumWrap(0);\r\n let edgeClipper: EdgeClipData | undefined;\r\n const clipEdgeToConvexPolygon = (_facetRange: any, readIndex: number) => {\r\n if (visitor.moveToReadIndex(readIndex))\r\n edgeClipper?.processPolygon(visitor.point, (ptA: Point3d, ptB: Point3d) => chainContext.addSegment(ptA, ptB));\r\n return true;\r\n };\r\n const lineStringSource = Array.isArray(points) ? new Point3dArrayCarrier(points) : points;\r\n for (let i = 1; i < lineStringSource.length; i++) {\r\n lineStringSource.getPoint3dAtUncheckedPointIndex(i - 1, workPoint0);\r\n lineStringSource.getPoint3dAtUncheckedPointIndex(i, workPoint1);\r\n if (edgeClipper = EdgeClipData.createPointPointSweep(workPoint0, workPoint1, vectorToEye)) {\r\n searchRange.setNull();\r\n searchRange.extend(workPoint0, workPoint1);\r\n searcher.searchRange2d(searchRange, clipEdgeToConvexPolygon);\r\n }\r\n }\r\n chainContext.clusterAndMergeVerticesXYZ();\r\n return chainContext.collectMaximalChains();\r\n }\r\n /**\r\n * Find segments (within the linestring) which project to facets.\r\n * * Return collected line segments.\r\n * * This calls [[sweepLineStringToFacets]] with options created by\r\n * `const options = SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), Angle.createSmallAngle(), false, true, true, true);`\r\n * @deprecated in 4.7.0 - will not be removed until after 2026-06-13. Use [[PolyfaceQuery.sweepLineStringToFacets]] to get further options.\r\n */\r\n public static sweepLinestringToFacetsXYReturnLines(linestringPoints: GrowableXYZArray, polyface: Polyface): LineSegment3d[] {\r\n const options = SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), Angle.createSmallAngle(), false, true, true, true);\r\n return PolyfaceQuery.sweepLineStringToFacets(linestringPoints, polyface, options) as LineSegment3d[];\r\n }\r\n /**\r\n * Find segments (within the linestring) which project to facets.\r\n * * Return chains.\r\n * * This calls [[sweepLineStringToFacets]] with default options.\r\n * @deprecated in 4.7.0 - will not be removed until after 2026-06-13. Use [[PolyfaceQuery.sweepLineStringToFacets]] to get further options.\r\n */\r\n public static sweepLinestringToFacetsXYReturnChains(linestringPoints: GrowableXYZArray, polyface: Polyface): LineString3d[] {\r\n return PolyfaceQuery.sweepLineStringToFacets(linestringPoints, polyface) as LineString3d[];\r\n }\r\n /**\r\n * Find segments (within the linestring) which project to facets.\r\n * * This is done as a sequence of \"await\" steps.\r\n * * Each \"await\" step deals with approximately PolyfaceQuery.asyncWorkLimit pairings of \"linestring edge\"\r\n * with \"facet edge\".\r\n * * PolyfaceQuery.setAsyncWorkLimit() to change work blocks from default.\r\n * * Return chains.\r\n * * Facets are ASSUMED to be convex and planar, and not overlap in the z direction.\r\n */\r\n public static async asyncSweepLinestringToFacetsXYReturnChains(\r\n linestringPoints: IndexedXYZCollection, polyface: Polyface,\r\n ): Promise<LineString3d[]> {\r\n const chainContext = ChainMergeContext.create();\r\n await Promise.resolve(\r\n this.asyncAnnounceSweepLinestringToConvexPolyfaceXY(\r\n linestringPoints,\r\n polyface,\r\n (_linestring: IndexedXYZCollection, _segmentIndex: number, _polyface: Polyface,\r\n _facetIndex: number, points: Point3d[], indexA: number, indexB: number) => {\r\n chainContext.addSegment(points[indexA], points[indexB]);\r\n },\r\n ),\r\n );\r\n chainContext.clusterAndMergeVerticesXYZ();\r\n const chains = chainContext.collectMaximalChains();\r\n return chains;\r\n }\r\n /**\r\n * Examine ranges of facets.\r\n * * Return statistical summary of x,y,z ranges.\r\n */\r\n public static collectRangeLengthData(polyface: Polyface | PolyfaceVisitor): RangeLengthData {\r\n if (polyface instanceof Polyface) {\r\n return this.collectRangeLengthData(polyface.createVisitor(0));\r\n }\r\n const rangeData = new RangeLengthData();\r\n // polyface is a visitor\r\n for (polyface.reset(); polyface.moveToNextFacet();)\r\n rangeData.accumulateGrowableXYZArrayRange(polyface.point);\r\n return rangeData;\r\n }\r\n /**\r\n * Clone the facets, inserting vertices (within edges) where points not part of each facet's vertex indices\r\n * impinge within edges.\r\n */\r\n public static cloneWithTVertexFixup(polyface: Polyface): IndexedPolyface {\r\n const oldFacetVisitor = polyface.createVisitor(1); // this is to visit the existing facets\r\n const newFacetVisitor = polyface.createVisitor(0); // this is to build the new facets\r\n const rangeSearcher = XYPointBuckets.create(polyface.data.point, 30)!;\r\n const builder = PolyfaceBuilder.create();\r\n const edgeRange = Range3d.createNull();\r\n const point0 = Point3d.create();\r\n const point1 = Point3d.create();\r\n const spacePoint = Point3d.create();\r\n const segment = LineSegment3d.create(point0, point1);\r\n\r\n for (oldFacetVisitor.reset(); oldFacetVisitor.moveToNextFacet();) {\r\n newFacetVisitor.clearArrays();\r\n for (let i = 0; i + 1 < oldFacetVisitor.point.length; i++) {\r\n // each base vertex is part of the result\r\n oldFacetVisitor.point.getPoint3dAtUncheckedPointIndex(i, point0);\r\n oldFacetVisitor.point.getPoint3dAtUncheckedPointIndex(i + 1, point1);\r\n newFacetVisitor.pushDataFrom(oldFacetVisitor, i);\r\n edgeRange.setNull();\r\n LineSegment3d.create(point0, point1, segment);\r\n let detailArray: CurveLocationDetail[] | undefined;\r\n edgeRange.extend(point0);\r\n edgeRange.extend(point1);\r\n edgeRange.ensureMinLengths(Geometry.smallMetricDistance); // add some slop in case segment is axis-aligned\r\n rangeSearcher.announcePointsInRange(edgeRange, (index: number, _x: number, _y: number, _z: number) => {\r\n // x,y,z has x,y within the range of the search; test for exact on (in full 3d)\r\n polyface.data.point.getPoint3dAtUncheckedPointIndex(index, spacePoint);\r\n const detail = segment.closestPoint(spacePoint, false);\r\n if (undefined !== detail) {\r\n if (detail.fraction > 0.0 && detail.fraction < 1.0 && !detail.point.isAlmostEqual(point0) &&\r\n !detail.point.isAlmostEqual(point1) && spacePoint.isAlmostEqual(detail.point)) {\r\n if (detailArray === undefined)\r\n detailArray = [];\r\n detail.a = index;\r\n detailArray.push(detail);\r\n }\r\n }\r\n return true;\r\n });\r\n if (detailArray !== undefined) {\r\n detailArray.sort((a: CurveLocationDetail, b: CurveLocationDetail) => (a.fraction - b.fraction));\r\n for (const d of detailArray) {\r\n newFacetVisitor.pushInterpolatedDataFrom(oldFacetVisitor, i, d.fraction, i + 1);\r\n }\r\n }\r\n }\r\n builder.addFacetFromGrowableArrays(\r\n newFacetVisitor.point, newFacetVisitor.normal, newFacetVisitor.param, newFacetVisitor.color, newFacetVisitor.edgeVisible,\r\n );\r\n }\r\n return builder.claimPolyface();\r\n }\r\n /**\r\n * Compare index arrays formatted as follows. Return 0 if arrays are the same.\r\n * * Each array input structure is: [facetIndex, vertexIndex0, vertexIndex1, ....]\r\n * * Vertex indices assumed reversed so:\r\n * * vertexIndex0 is the lowest index on the facet.\r\n * * vertexIndex1 is the lowest neighbor of vertex0.\r\n * * first different entry among vertex indices determines lexical result.\r\n * * hence facets with duplicate indices (whether forward or reversed) are considered equal.\r\n */\r\n private static compareFacetIndexAndVertexIndices(arrayA: number[], arrayB: number[]): number {\r\n if (arrayA.length !== arrayB.length)\r\n return arrayA.length - arrayB.length;\r\n for (let i = 1; i < arrayA.length; i++) {\r\n if (arrayA[i] !== arrayB[i]) {\r\n return arrayA[i] - arrayB[i];\r\n }\r\n }\r\n return 0;\r\n }\r\n /**\r\n * Announce facet duplicates.\r\n * @returns an array of arrays describing facet duplication. Each array `entry` in the output contains read\r\n * indices of a cluster of facets with the same vertex indices.\r\n */\r\n public static announceDuplicateFacetIndices(\r\n polyface: Polyface, announceCluster: (clusterFacetIndices: number[]) => void,\r\n ): void {\r\n const visitor = polyface.createVisitor(0); // this is to visit the existing facets\r\n const facetIndexAndVertexIndices: number[][] = [];\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n const facetIndex = visitor.currentReadIndex();\r\n const entry = [facetIndex];\r\n const pointIndex = visitor.pointIndex;\r\n const numPointsThisFacet = pointIndex.length;\r\n let lowIndex = 0;\r\n // find the lowest point index\r\n for (let i = 1; i < visitor.pointIndex.length; i++) {\r\n if (pointIndex[i] < pointIndex[lowIndex])\r\n lowIndex = i;\r\n }\r\n // find its lowest neighbor; assemble sort array in that direction\r\n if (pointIndex[(lowIndex + 1) % numPointsThisFacet] < pointIndex[(lowIndex + numPointsThisFacet - 1) % numPointsThisFacet]) {\r\n for (let i = 0; i < numPointsThisFacet; i++) {\r\n entry.push(pointIndex[(lowIndex + i) % numPointsThisFacet]);\r\n }\r\n } else {\r\n for (let i = 0; i < numPointsThisFacet; i++) {\r\n entry.push(pointIndex[(lowIndex + numPointsThisFacet - i) % numPointsThisFacet]);\r\n }\r\n }\r\n facetIndexAndVertexIndices.push(entry);\r\n }\r\n facetIndexAndVertexIndices.sort((arrayA, arrayB) => this.compareFacetIndexAndVertexIndices(arrayA, arrayB));\r\n let i0, i1;\r\n const n = facetIndexAndVertexIndices.length;\r\n const clusterArray = [];\r\n for (i0 = 0; i0 < n; i0 = i1) {\r\n i1 = i0 + 1;\r\n clusterArray.length = 0;\r\n clusterArray.push(facetIndexAndVertexIndices[i0][0]);\r\n while (i1 < n && 0 === this.compareFacetIndexAndVertexIndices(facetIndexAndVertexIndices[i0], facetIndexAndVertexIndices[i1])) {\r\n clusterArray.push(facetIndexAndVertexIndices[i1][0]);\r\n i1++;\r\n }\r\n announceCluster(clusterArray);\r\n }\r\n }\r\n /**\r\n * Collect facet duplicates.\r\n * @param polyface the polyface.\r\n * @param includeSingletons if true, non-duplicated facets are included in the output.\r\n * @returns an array of arrays describing facet duplication. Each array `entry` in the output contains read\r\n * indices of a cluster of facets with the same vertex indices.\r\n */\r\n public static collectDuplicateFacetIndices(polyface: Polyface, includeSingletons: boolean = false): number[][] {\r\n const result: number[][] = [];\r\n this.announceDuplicateFacetIndices(\r\n polyface,\r\n (clusterFacetIndices: number[]) => {\r\n if (includeSingletons || clusterFacetIndices.length > 1)\r\n result.push(clusterFacetIndices.slice());\r\n },\r\n );\r\n return result;\r\n }\r\n /**\r\n * Return a new facet set from the source facets, specifying how to copy duplicate facets.\r\n * @param source the polyface.\r\n * @param includeSingletons true to copy facets that only appear once\r\n * @param clusterSelector indicates whether to copy 0, 1, or all facets in each cluster of duplicate facets.\r\n */\r\n public static cloneByFacetDuplication(\r\n source: Polyface, includeSingletons: boolean, clusterSelector: DuplicateFacetClusterSelector,\r\n ): Polyface {\r\n const builder = PolyfaceBuilder.create();\r\n const visitor = source.createVisitor(0);\r\n this.announceDuplicateFacetIndices(\r\n source,\r\n (clusterFacetIndices: number[]) => {\r\n let numToSelect = 0;\r\n if (clusterFacetIndices.length === 1) {\r\n if (includeSingletons)\r\n numToSelect = 1;\r\n } else if (clusterFacetIndices.length > 1) {\r\n if (clusterSelector === DuplicateFacetClusterSelector.SelectAny)\r\n numToSelect = 1;\r\n else if (clusterSelector === DuplicateFacetClusterSelector.SelectAll)\r\n numToSelect = clusterFacetIndices.length;\r\n else if (clusterSelector === DuplicateFacetClusterSelector.SelectOneByParity)\r\n numToSelect = (clusterFacetIndices.length & 0x01) === 0x01 ? 1 : 0;\r\n }\r\n for (let i = 0; i < numToSelect; i++) {\r\n visitor.moveToReadIndex(clusterFacetIndices[i]);\r\n builder.addFacetFromVisitor(visitor);\r\n }\r\n },\r\n );\r\n return builder.claimPolyface();\r\n }\r\n /** Clone the facets, removing points that are simply within colinear edges. */\r\n public static cloneWithColinearEdgeFixup(polyface: Polyface): Polyface {\r\n const oldFacetVisitor = polyface.createVisitor(2); // this is to visit the existing facets\r\n const newFacetVisitor = polyface.createVisitor(0); // this is to build the new facets\r\n const builder = PolyfaceBuilder.create();\r\n const vector01 = Vector3d.create();\r\n const vector12 = Vector3d.create();\r\n const numPoint = polyface.data.point.length;\r\n const pointState = new Int32Array(numPoint);\r\n // FIRST PASS: in each sector of each facet, determine if the sector has colinear incoming and outgoing vectors.\r\n // Mark each point as\r\n // 0 unvisited\r\n // -1 adjacent to a non-colinear sector\r\n // n adjacent to n colinear sectors\r\n for (oldFacetVisitor.reset(); oldFacetVisitor.moveToNextFacet();) {\r\n for (let i = 0; i + 2 < oldFacetVisitor.point.length; i++) {\r\n // each base vertex is part of the result\r\n oldFacetVisitor.point.vectorIndexIndex(i, i + 1, vector01);\r\n oldFacetVisitor.point.vectorIndexIndex(i + 1, i + 2, vector12);\r\n const pointIndex = oldFacetVisitor.clientPointIndex(i + 1);\r\n if (pointState[pointIndex] >= 0) {\r\n const theta = vector01.angleTo(vector12);\r\n if (theta.isAlmostZero) {\r\n pointState[pointIndex]++;\r\n } else {\r\n pointState[pointIndex] = -1;\r\n }\r\n }\r\n }\r\n }\r\n // SECOND PASS: make copies, omitting references to points at colinear sectors.\r\n for (oldFacetVisitor.reset(); oldFacetVisitor.moveToNextFacet();) {\r\n newFacetVisitor.clearArrays();\r\n for (let i = 0; i + 2 < oldFacetVisitor.point.length; i++) {\r\n const pointIndex = oldFacetVisitor.clientPointIndex(i);\r\n if (pointState[pointIndex] < 0) {\r\n newFacetVisitor.pushDataFrom(oldFacetVisitor, i);\r\n }\r\n }\r\n if (newFacetVisitor.point.length > 2)\r\n builder.addFacetFromGrowableArrays(\r\n newFacetVisitor.point, newFacetVisitor.normal, newFacetVisitor.param, newFacetVisitor.color, newFacetVisitor.edgeVisible,\r\n );\r\n }\r\n return builder.claimPolyface();\r\n }\r\n /**\r\n * Set the edge visibility for specified edges in the polyface.\r\n * @param polyface mesh to be edited.\r\n * @param clusters array of edge references.\r\n * @param value visibility value (true or false).\r\n */\r\n private static setEdgeVisibility(polyface: IndexedPolyface, clusters: SortableEdgeCluster[], value: boolean): void {\r\n for (const cluster of clusters) {\r\n if (cluster instanceof SortableEdge) {\r\n this.setSingleEdgeVisibility(polyface, cluster.facetIndex, cluster.startVertex, value);\r\n } else if (Array.isArray(cluster)) {\r\n for (const e1 of cluster)\r\n this.setSingleEdgeVisibility(polyface, e1.facetIndex, e1.startVertex, value);\r\n }\r\n }\r\n }\r\n /**\r\n * Set the visibility of a particular edge of a particular facet.\r\n * @param polyface containing polyface.\r\n * @param facetIndex facet index.\r\n * @param vertexIndex vertex index (in vertex array) at which the edge starts.\r\n * @param value visibility value.\r\n */\r\n public static setSingleEdgeVisibility(\r\n polyface: IndexedPolyface, facetIndex: number, vertexIndex: number, value: boolean,\r\n ): void {\r\n const data = polyface.data;\r\n const index0 = polyface.facetIndex0(facetIndex);\r\n const index1 = polyface.facetIndex1(facetIndex);\r\n for (let i = index0; i < index1; i++)\r\n if (data.pointIndex[i] === vertexIndex)\r\n data.edgeVisible[i] = value; // actually sets visibility on all edges in the face that start at this vertex\r\n }\r\n /**\r\n * Get the visibility of a particular edge of a particular facet.\r\n * @param polyface containing polyface.\r\n * @param facetIndex facet index.\r\n * @param vertexIndex vertex index (in vertex array) at which the edge starts.\r\n */\r\n public static getSingleEdgeVisibility(\r\n polyface: IndexedPolyface, facetIndex: number, vertexIndex: number,\r\n ): boolean | undefined {\r\n const data = polyface.data;\r\n const index0 = polyface.facetIndex0(facetIndex);\r\n const index1 = polyface.facetIndex1(facetIndex);\r\n for (let i = index0; i < index1; i++)\r\n if (data.pointIndex[i] === vertexIndex)\r\n return data.edgeVisible[i]; // return visibility of first edge in the face that starts at this vertex\r\n return undefined;\r\n }\r\n /**\r\n * Return manifold edge pairs whose dihedral angle is bounded by the given angle.\r\n * * The dihedral angle of a manifold edge is measured between the normals of its two adjacent faces.\r\n * * Boundary edges are not returned as they are not manifold.\r\n * @param mesh existing polyface or visitor.\r\n * @param maxSmoothEdgeAngle maximum dihedral angle of a smooth edge. If `undefined`, uses `Geometry.smallAngleRadians`.\r\n * @param sharpEdges true to reverse the angle threshold test and return sharp edges; otherwise return smooth edges (default).\r\n */\r\n public static collectEdgesByDihedralAngle(\r\n mesh: Polyface | PolyfaceVisitor, maxSmoothEdgeAngle?: Angle, sharpEdges: boolean = false,\r\n ): SortableEdgeCluster[] {\r\n if (mesh instanceof Polyface)\r\n return this.collectEdgesByDihedralAngle(mesh.createVisitor(1), maxSmoothEdgeAngle, sharpEdges);\r\n mesh.setNumWrap(1);\r\n const allEdges = this.createIndexedEdges(mesh);\r\n const manifoldEdges: SortableEdgeCluster[] = [];\r\n allEdges.sortAndCollectClusters(manifoldEdges);\r\n if (undefined === maxSmoothEdgeAngle || maxSmoothEdgeAngle.radians < 0)\r\n maxSmoothEdgeAngle = Angle.createRadians(Geometry.smallAngleRadians);\r\n const outEdges: SortableEdgeCluster[] = [];\r\n const normal0 = Vector3d.create();\r\n const normal1 = Vector3d.create();\r\n for (const pair of manifoldEdges) {\r\n if (Array.isArray(pair) && pair.length === 2) {\r\n const e0 = pair[0];\r\n const e1 = pair[1];\r\n if (undefined !== PolyfaceQuery.computeFacetUnitNormal(mesh, e0.facetIndex, normal0)\r\n && undefined !== PolyfaceQuery.computeFacetUnitNormal(mesh, e1.facetIndex, normal1)) {\r\n const edgeAngle = normal0.smallerUnorientedAngleTo(normal1);\r\n if (sharpEdges) {\r\n if (edgeAngle.radians > maxSmoothEdgeAngle.radians)\r\n outEdges.push(pair);\r\n } else {\r\n if (edgeAngle.radians <= maxSmoothEdgeAngle.radians)\r\n outEdges.push(pair);\r\n }\r\n }\r\n }\r\n }\r\n return outEdges;\r\n }\r\n /**\r\n * Make paired edges invisible.\r\n * * Find mated pairs among facet edges.\r\n * * Mated pairs have the same vertex indices appearing in opposite order.\r\n * * Mark all non-mated pairs visible.\r\n * * At mated pairs\r\n * * if angle across the edge is larger than `sharpEdgeAngle`, mark visible\r\n * * otherwise mark invisible.\r\n */\r\n public static markPairedEdgesInvisible(mesh: IndexedPolyface, sharpEdgeAngle?: Angle) {\r\n const visitor = mesh.createVisitor(1);\r\n const edges = this.createIndexedEdges(visitor);\r\n const pairedEdges: SortableEdgeCluster[] = [];\r\n const boundaryEdges: SortableEdgeCluster[] = [];\r\n edges.sortAndCollectClusters(pairedEdges, boundaryEdges, boundaryEdges, boundaryEdges);\r\n this.markAllEdgeVisibility(mesh, false);\r\n this.setEdgeVisibility(mesh, boundaryEdges, true);\r\n if (sharpEdgeAngle !== undefined) {\r\n const normal0 = Vector3d.create();\r\n const normal1 = Vector3d.create();\r\n for (const pair of pairedEdges) {\r\n if (Array.isArray(pair) && pair.length === 2) {\r\n const e0 = pair[0];\r\n const e1 = pair[1];\r\n if (undefined !== PolyfaceQuery.computeFacetUnitNormal(visitor, e0.facetIndex, normal0)\r\n && undefined !== PolyfaceQuery.computeFacetUnitNormal(visitor, e1.facetIndex, normal1)) {\r\n const edgeAngle = normal0.smallerUnorientedAngleTo(normal1);\r\n if (edgeAngle.radians > sharpEdgeAngle.radians) {\r\n this.setSingleEdgeVisibility(mesh, e0.facetIndex, e0.startVertex, true);\r\n this.setSingleEdgeVisibility(mesh, e1.facetIndex, e1.startVertex, true);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Try to compute a unit normal for a facet accessible through a visitor.\r\n * * Unit normal is computed by `PolygonOps.unitNormal` with the points around the facet.\r\n */\r\n public static computeFacetUnitNormal(\r\n visitor: PolyfaceVisitor, facetIndex: number, result?: Vector3d,\r\n ): Vector3d | undefined {\r\n if (!result)\r\n result = Vector3d.create();\r\n if (visitor.moveToReadIndex(facetIndex)) {\r\n if (PolygonOps.unitNormal(visitor.point, result))\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * * Mark all edge visibilities in the IndexedPolyface.\r\n * @param mesh mesh to be marked.\r\n * @param value true for visible, false for hidden.\r\n */\r\n public static markAllEdgeVisibility(mesh: IndexedPolyface, value: boolean): void {\r\n const data = mesh.data;\r\n for (let i = 0; i < data.edgeVisible.length; i++)\r\n data.edgeVisible[i] = value;\r\n }\r\n /**\r\n * Create a HalfEdgeGraph with a face for each facet of the IndexedPolyface.\r\n * @param mesh mesh to convert.\r\n * @internal\r\n */\r\n public static convertToHalfEdgeGraph(mesh: IndexedPolyface): HalfEdgeGraph {\r\n const builder = new HalfEdgeGraphFromIndexedLoopsContext();\r\n const visitor = mesh.createVisitor(0);\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n builder.insertLoop(visitor.pointIndex);\r\n }\r\n const graph = builder.graph;\r\n const xyz = Point3d.create();\r\n graph.announceNodes(\r\n (_graph: HalfEdgeGraph, halfEdge: HalfEdge) => {\r\n const vertexIndex = halfEdge.i;\r\n mesh.data.getPoint(vertexIndex, xyz);\r\n halfEdge.setXYZ(xyz);\r\n return true;\r\n },\r\n );\r\n return graph;\r\n }\r\n /** Examine adjacent facet orientations throughout the mesh. If possible, reverse a subset to achieve proper pairing. */\r\n public static reorientVertexOrderAroundFacetsForConsistentOrientation(mesh: IndexedPolyface): boolean {\r\n return FacetOrientationFixup.doFixup(mesh);\r\n }\r\n /** Set up indexed normals with one normal in the plane of each facet of the mesh. */\r\n public static buildPerFaceNormals(polyface: IndexedPolyface): void {\r\n BuildAverageNormalsContext.buildPerFaceNormals(polyface);\r\n }\r\n /**\r\n * * At each vertex of the mesh:\r\n * * Find clusters of almost parallel normals.\r\n * * Compute simple average of those normals.\r\n * * Index to the averages.\r\n * * For typical meshes, this correctly clusters adjacent normals.\r\n * * One can imagine a vertex with multiple \"smooth cone-like\" sets of adjacent facets such that averaging occurs\r\n * among two nonadjacent cones. But this does not seem to be a problem in practice.\r\n * @param polyface polyface to update.\r\n * @param toleranceAngle averaging is done between normals up to this angle.\r\n */\r\n public static buildAverageNormals(polyface: IndexedPolyface, toleranceAngle: Angle = Angle.createDegrees(31.0)): void {\r\n BuildAverageNormalsContext.buildFastAverageNormals(polyface, toleranceAngle);\r\n }\r\n /**\r\n * Offset the faces of the mesh.\r\n * @param source original mesh.\r\n * @param signedOffsetDistance distance to offset\r\n * @param offsetOptions angle options. The default options are recommended.\r\n * @returns shifted mesh.\r\n */\r\n public static cloneOffset(\r\n source: IndexedPolyface, signedOffsetDistance: number, offsetOptions: OffsetMeshOptions = OffsetMeshOptions.create(),\r\n ): IndexedPolyface {\r\n const strokeOptions = StrokeOptions.createForFacets();\r\n const offsetBuilder = PolyfaceBuilder.create(strokeOptions);\r\n OffsetMeshContext.buildOffsetMeshWithEdgeChamfers(source, offsetBuilder, signedOffsetDistance, offsetOptions);\r\n return offsetBuilder.claimPolyface();\r\n }\r\n private static _workTriangle?: BarycentricTriangle;\r\n private static _workTriDetail?: TriangleLocationDetail;\r\n private static _workPolyDetail?: PolygonLocationDetail;\r\n private static _workFacetDetail3?: TriangularFacetLocationDetail;\r\n private static _workFacetDetailC?: ConvexFacetLocationDetail;\r\n private static _workFacetDetailNC?: NonConvexFacetLocationDetail;\r\n /**\r\n * Search facets for the first one that intersects the infinite line.\r\n * * To process _all_ intersections, callers can supply an `options.acceptIntersection` callback that always\r\n * returns `false`. In this case, `intersectRay3d` will return `undefined`, but the callback will be invoked for\r\n * each intersection.\r\n * * Example callback logic:\r\n * * Accept the first found facet that intersects the half-line specified by the ray: `return detail.a >= 0.0;`\r\n * * Collect all intersections: `myIntersections.push(detail.clone()); return false;` Then after `intersectRay3d`\r\n * returns, sort along `ray` with `myIntersections.sort((d0, d1) => d0.a - d1.a);`\r\n * @param visitor facet iterator.\r\n * @param ray infinite line parameterized as a ray. The returned `detail.a` is the intersection parameter on the\r\n * ray, e.g., zero at `ray.origin` and increasing in `ray.direction`.\r\n * @param options options for computing and populating an intersection detail, and an optional callback for\r\n * accepting one.\r\n * @return detail for the (accepted) intersection with `detail.IsInsideOrOn === true`, or `undefined` if no\r\n * (accepted) intersection.\r\n * @see PolygonOps.intersectRay3d\r\n */\r\n public static intersectRay3d(\r\n visitor: Polyface | PolyfaceVisitor, ray: Ray3d, options?: FacetIntersectOptions,\r\n ): FacetLocationDetail | undefined {\r\n if (visitor instanceof Polyface)\r\n return PolyfaceQuery.intersectRay3d(visitor.createVisitor(0), ray, options);\r\n let detail: FacetLocationDetail;\r\n const tol: [number, number] | undefined = options ? [options.distanceTolerance, options.parameterTolerance] : undefined;\r\n visitor.setNumWrap(0);\r\n while (visitor.moveToNextFacet()) {\r\n const numEdges = visitor.pointCount; // #vertices = #edges since numWrap is zero\r\n const vertices = visitor.point;\r\n if (3 === numEdges) {\r\n const tri = this._workTriangle = BarycentricTriangle.create(\r\n vertices.getPoint3dAtUncheckedPointIndex(0),\r\n vertices.getPoint3dAtUncheckedPointIndex(1),\r\n vertices.getPoint3dAtUncheckedPointIndex(2),\r\n this._workTriangle,\r\n );\r\n const detail3 = this._workTriDetail = tri.intersectRay3d(ray, this._workTriDetail);\r\n tri.snapLocationToEdge(detail3, options?.distanceTolerance, options?.parameterTolerance);\r\n detail = this._workFacetDetail3 = TriangularFacetLocationDetail.create(\r\n visitor.currentReadIndex(), detail3, this._workFacetDetail3,\r\n );\r\n } else {\r\n const detailN = this._workPolyDetail = PolygonOps.intersectRay3d(vertices, ray, tol, this._workPolyDetail);\r\n if (PolygonOps.isConvex(vertices))\r\n detail = this._workFacetDetailC = ConvexFacetLocationDetail.create(\r\n visitor.currentReadIndex(), numEdges, detailN, this._workFacetDetailC,\r\n );\r\n else\r\n detail = this._workFacetDetailNC = NonConvexFacetLocationDetail.create(\r\n visitor.currentReadIndex(), numEdges, detailN, this._workFacetDetailNC,\r\n );\r\n }\r\n if (detail.isInsideOrOn) { // set optional caches, process the intersection\r\n if (options?.needNormal && visitor.normal)\r\n detail.getNormal(visitor.normal, vertices, options?.distanceTolerance);\r\n if (options?.needParam && visitor.param)\r\n detail.getParam(visitor.param, vertices, options?.distanceTolerance);\r\n if (options?.needColor && visitor.color)\r\n detail.getColor(visitor.color, vertices, options?.distanceTolerance);\r\n if (options?.needBarycentricCoordinates)\r\n detail.getBarycentricCoordinates(vertices, options?.distanceTolerance);\r\n if (options?.acceptIntersection && !options.acceptIntersection(detail, visitor))\r\n continue;\r\n return detail;\r\n }\r\n }\r\n return undefined; // no intersection\r\n }\r\n}\r\n"]}
|