@itwin/core-geometry 5.2.0-dev.8 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -1
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.d.ts +30 -10
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +74 -10
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.d.ts +19 -6
- package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js +21 -5
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.d.ts +3 -3
- package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +6 -6
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js +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.d.ts +2 -2
- package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js +4 -6
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.d.ts +27 -17
- package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js +17 -7
- 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.d.ts +19 -6
- package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js +17 -2
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.d.ts +14 -1
- package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +21 -3
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +14 -11
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +23 -16
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +22 -5
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts +27 -17
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +61 -35
- 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.d.ts +1 -0
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +1 -0
- 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.d.ts +8 -7
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.d.ts +51 -1
- package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
- package/lib/cjs/curve/CurveOps.js +97 -3
- 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.d.ts +4 -4
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +8 -8
- 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 +3 -3
- 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.d.ts +6 -2
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +12 -7
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +9 -4
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +10 -5
- 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.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +2 -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.d.ts +4 -4
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js +21 -18
- 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.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +30 -50
- 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.d.ts +2 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +6 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +6 -2
- 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.d.ts +5 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js +0 -3
- 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.d.ts +6 -2
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +12 -3
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts +2 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +14 -18
- 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.d.ts +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +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.d.ts +18 -2
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js +37 -4
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +1 -0
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.d.ts +8 -0
- package/lib/cjs/geometry3d/PointStreaming.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js +18 -2
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +18 -9
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +53 -26
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts +14 -3
- package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js +20 -4
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +34 -32
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js +28 -21
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.d.ts +16 -6
- package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js +28 -4
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js +3 -4
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +1 -1
- package/lib/cjs/geometry3d/Transform.js +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.d.ts +12 -1
- package/lib/cjs/geometry3d/XYZProps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.js +17 -2
- 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.d.ts +16 -0
- package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js +26 -0
- 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.d.ts.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js +5 -9
- 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.d.ts +13 -7
- package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
- package/lib/cjs/numerics/SmallSystem.js +13 -7
- 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.d.ts +1 -3
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js +2 -6
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +25 -6
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +59 -8
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.d.ts +2 -0
- package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js +7 -3
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +8 -10
- 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.d.ts +8 -5
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +9 -12
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
- 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 +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts +2 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js +2 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +38 -12
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +91 -23
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +20 -11
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js +43 -39
- 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.d.ts +7 -4
- package/lib/cjs/topology/Merging.d.ts.map +1 -1
- package/lib/cjs/topology/Merging.js +16 -11
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
- package/lib/cjs/topology/Triangulation.d.ts +13 -11
- package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
- package/lib/cjs/topology/Triangulation.js +40 -36
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/Voronoi.d.ts +195 -0
- package/lib/cjs/topology/Voronoi.d.ts.map +1 -0
- package/lib/cjs/topology/Voronoi.js +700 -0
- package/lib/cjs/topology/Voronoi.js.map +1 -0
- package/lib/cjs/topology/XYParitySearchContext.d.ts +1 -1
- package/lib/cjs/topology/XYParitySearchContext.d.ts.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.d.ts +30 -10
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +74 -10
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.d.ts +19 -6
- package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js +21 -5
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts +3 -3
- package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js +6 -6
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js +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.d.ts +2 -2
- package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js +4 -6
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.d.ts +27 -17
- package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js +17 -7
- 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.d.ts +19 -6
- package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPlane.js +17 -2
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.d.ts +14 -1
- package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +21 -3
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +14 -11
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +23 -16
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +22 -5
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +27 -17
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +61 -35
- 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.d.ts +1 -0
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +1 -0
- 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.d.ts +8 -7
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.d.ts +51 -1
- package/lib/esm/curve/CurveOps.d.ts.map +1 -1
- package/lib/esm/curve/CurveOps.js +98 -4
- 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.d.ts +4 -4
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +8 -8
- 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 +3 -3
- 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.d.ts +6 -2
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +12 -7
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +9 -4
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +10 -5
- 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.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +2 -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.d.ts +4 -4
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js +21 -18
- 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.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +30 -50
- 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.d.ts +2 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +6 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +6 -2
- 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.d.ts +5 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js +0 -3
- 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.d.ts +6 -2
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +12 -3
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts +2 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +14 -18
- 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.d.ts +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +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.d.ts +18 -2
- package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js +37 -4
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +1 -0
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.d.ts +8 -0
- package/lib/esm/geometry3d/PointStreaming.d.ts.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js +18 -2
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +18 -9
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +53 -26
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts +14 -3
- package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js +20 -4
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +34 -32
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js +28 -21
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.d.ts +16 -6
- package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js +28 -4
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js +3 -4
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/Segment1d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +1 -1
- package/lib/esm/geometry3d/Transform.js +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/esm/geometry3d/XYZProps.d.ts +12 -1
- package/lib/esm/geometry3d/XYZProps.d.ts.map +1 -1
- package/lib/esm/geometry3d/XYZProps.js +16 -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.d.ts +16 -0
- package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js +26 -0
- 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.d.ts.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js +5 -9
- 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.d.ts +13 -7
- package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
- package/lib/esm/numerics/SmallSystem.js +13 -7
- 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.d.ts +1 -3
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js +2 -6
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +25 -6
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +59 -8
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.d.ts +2 -0
- package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js +7 -3
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +8 -10
- 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.d.ts +8 -5
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js +9 -12
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
- 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 +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.d.ts +2 -1
- package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js +2 -1
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SolidPrimitive.js.map +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +38 -12
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +92 -24
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +20 -11
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js +43 -39
- 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.d.ts +7 -4
- package/lib/esm/topology/Merging.d.ts.map +1 -1
- package/lib/esm/topology/Merging.js +17 -12
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
- package/lib/esm/topology/Triangulation.d.ts +13 -11
- package/lib/esm/topology/Triangulation.d.ts.map +1 -1
- package/lib/esm/topology/Triangulation.js +40 -36
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/Voronoi.d.ts +195 -0
- package/lib/esm/topology/Voronoi.d.ts.map +1 -0
- package/lib/esm/topology/Voronoi.js +696 -0
- package/lib/esm/topology/Voronoi.js.map +1 -0
- package/lib/esm/topology/XYParitySearchContext.d.ts +1 -1
- package/lib/esm/topology/XYParitySearchContext.d.ts.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolyfaceBuilder.js","sourceRoot":"","sources":["../../../src/polyface/PolyfaceBuilder.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\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { ConstructCurveBetweenCurves } from \"../curve/ConstructCurveBetweenCurves\";\nimport { CurveChain, CurveCollection } from \"../curve/CurveCollection\";\nimport { CurveFactory, MiteredSweepOutputSelect } from \"../curve/CurveFactory\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { AnyCurve, AnyRegion } from \"../curve/CurveTypes\";\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Loop } from \"../curve/Loop\";\nimport { ParityRegion } from \"../curve/ParityRegion\";\nimport { CylindricalRangeQuery } from \"../curve/Query/CylindricalRange\";\nimport { StrokeCountSection } from \"../curve/Query/StrokeCountChain\";\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\nimport { UnionRegion } from \"../curve/UnionRegion\";\nimport { AxisOrder, Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { BarycentricTriangle } from \"../geometry3d/BarycentricTriangle\";\nimport { BilinearPatch } from \"../geometry3d/BilinearPatch\";\nimport { FrameBuilder } from \"../geometry3d/FrameBuilder\";\nimport { NullGeometryHandler, UVSurface } from \"../geometry3d/GeometryHandler\";\nimport { GrowableFloat64Array } from \"../geometry3d/GrowableFloat64Array\";\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\nimport { Point3d, Vector3d, XYZ } from \"../geometry3d/Point3dVector3d\";\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Segment1d } from \"../geometry3d/Segment1d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { UVSurfaceOps } from \"../geometry3d/UVSurfaceOps\";\nimport { XAndY } from \"../geometry3d/XYZProps\";\nimport { Box } from \"../solid/Box\";\nimport { Cone } from \"../solid/Cone\";\nimport { LinearSweep } from \"../solid/LinearSweep\";\nimport { RotationalSweep } from \"../solid/RotationalSweep\";\nimport { RuledSweep } from \"../solid/RuledSweep\";\nimport { Sphere } from \"../solid/Sphere\";\nimport { SweepContour } from \"../solid/SweepContour\";\nimport { TorusPipe } from \"../solid/TorusPipe\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeToBooleanFunction } from \"../topology/Graph\";\nimport { InsertedVertexZOptions } from \"../topology/InsertAndRetriangulateContext\";\nimport { Triangulator } from \"../topology/Triangulation\";\nimport { BoxTopology } from \"./BoxTopology\";\nimport { GreedyTriangulationBetweenLineStrings } from \"./GreedyTriangulationBetweenLineStrings\";\nimport { SortableEdge, SortableEdgeCluster } from \"./IndexedEdgeMatcher\";\nimport { IndexedPolyfaceSubsetVisitor } from \"./IndexedPolyfaceVisitor\";\nimport { IndexedPolyface, PolyfaceVisitor } from \"./Polyface\";\nimport { PolyfaceQuery } from \"./PolyfaceQuery\";\n\n/**\n * A FacetSector.\n * * Initially holds coordinate data for a place where xyz and sectionDerivative are known.\n * * Normal is computed as a deferred step using an edge to adjacent place on ruled surface.\n * * Indices are set up even later.\n */\nclass FacetSector {\n public xyz: Point3d;\n public xyzIndex: number;\n public normal?: Vector3d;\n public normalIndex: number;\n public uv?: Point2d;\n public uvIndex: number;\n public sectionDerivative?: Vector3d;\n public constructor(needNormal: boolean = false, needUV: boolean = false, needSectionDerivative: boolean = false) {\n this.xyz = Point3d.create();\n this.normalIndex = -1;\n this.uvIndex = -1;\n this.xyzIndex = -1;\n if (needNormal) {\n this.normal = Vector3d.create();\n }\n if (needUV) {\n this.uv = Point2d.create();\n this.uvIndex = -1;\n }\n if (needSectionDerivative) {\n this.sectionDerivative = Vector3d.create();\n }\n }\n /**\n * Copy contents (not pointers) from `other`.\n * * ASSUME all fields defined in the instance are defined in `other`.\n */\n public copyContentsFrom(other: FacetSector) {\n this.xyz.setFromPoint3d(other.xyz);\n this.xyzIndex = other.xyzIndex;\n if (this.normal)\n this.normal.setFromVector3d(other.normal);\n this.normalIndex = other.normalIndex;\n if (this.uv)\n this.uv.setFrom(other.uv);\n this.uvIndex = other.uvIndex;\n if (this.sectionDerivative)\n this.sectionDerivative.setFrom(other.sectionDerivative);\n }\n /**\n * Access xyz, derivative from given arrays.\n * * ASSUME corresponding defined conditions.\n * * xyz and derivative are set.\n * * Index fields for updated data are cleared to -1.\n */\n public loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(\n i: number,\n packedXYZ: GrowableXYZArray,\n packedDerivatives?: GrowableXYZArray,\n fractions?: GrowableFloat64Array,\n v?: number,\n ): void {\n packedXYZ.getPoint3dAtCheckedPointIndex(i, this.xyz);\n if (this.uv && fractions && v !== undefined)\n this.uv.set(fractions.atUncheckedIndex(i), v);\n this.xyzIndex = -1;\n this.normalIndex = -1;\n this.uvIndex = -1;\n if (this.sectionDerivative !== undefined && packedDerivatives !== undefined)\n packedDerivatives.getVector3dAtCheckedVectorIndex(i, this.sectionDerivative);\n }\n private static suppressSmallUnitVectorComponents(uvw: XYZ): void {\n const tol = Geometry.smallFloatingPoint;\n if (Math.abs(uvw.x) < tol)\n uvw.x = 0.0;\n if (Math.abs(uvw.y) < tol)\n uvw.y = 0.0;\n if (Math.abs(uvw.z) < tol)\n uvw.z = 0.0;\n }\n private static _edgeVector: Vector3d = Vector3d.create();\n /**\n * Given two sectors with xyz and sectionDerivative (u derivative), use the edge from A to B as v direction\n * in-surface derivative. Compute cross products (and normalize).\n * @param sectorA \"lower\" sector.\n * @param sectorB \"upper\" sector.\n */\n public static computeNormalsAlongRuleLine(sectorA: FacetSector, sectorB: FacetSector) {\n // We expect that if a sector's sectionDerivative is defined, then so is its normal. If a normal is undefined, the\n // crossProduct returns an object that goes unused---not good, but the garbage collector will clean it up.\n if (sectorA.sectionDerivative && sectorB.sectionDerivative) {\n const vectorAB = FacetSector._edgeVector;\n Vector3d.createStartEnd(sectorA.xyz, sectorB.xyz, vectorAB);\n sectorA.sectionDerivative.crossProduct(vectorAB, sectorA.normal);\n sectorB.sectionDerivative.crossProduct(vectorAB, sectorB.normal);\n sectorA.normal!.normalizeInPlace();\n sectorB.normal!.normalizeInPlace();\n FacetSector.suppressSmallUnitVectorComponents(sectorA.normal!);\n FacetSector.suppressSmallUnitVectorComponents(sectorB.normal!);\n }\n }\n}\n\n/**\n * * Simple construction for strongly typed GeometryQuery objects:\n *\n * * Create a builder with `builder = PolyfaceBuilder.create()`\n * * Add GeometryQuery objects:\n * * `builder.addGeometryQuery(g: GeometryQuery)`\n * * `builder.addCone(cone: Cone)`\n * * `builder.addTorusPipe(surface: TorusPipe)`\n * * `builder.addLinearSweepLineStringsXYZOnly(surface: LinearSweep)`\n * * `builder.addRotationalSweep(surface: RotationalSweep)`\n * * `builder.addLinearSweep(surface: LinearSweep)`\n * * `builder.addRuledSweep(surface: RuledSweep)`\n * * `builder.addSphere(sphere: Sphere)`\n * * `builder.addBox(box: Box)`\n * * `builder.addIndexedPolyface(polyface)`\n * * Extract with `builder.claimPolyface(true)`\n *\n * * Simple construction for ephemeral constructive data:\n *\n * * Create a builder with `builder = PolyfaceBuilder.create()`\n * * Add from fragmentary data:\n * * `builder.addBetweenLineStringsWithStoredIndices(linestringA linestringB)`\n * * `builder.addBetweenLineStringsWithRuleEdgeNormals(linestringA, vA, linestringB, vB, addClosure)`\n * * `builder.addBetweenTransformedLineStrings(curves, transformA, transformB, addClosure)`\n * * `builder.addLinearSweepLineStringsXYZOnly(contour, vector)`\n * * `builder.addPolygon(points, numPointsToUse)`\n * * `builder.addTransformedUnitBox(transform)`\n * * `builder.addTriangleFan(conePoint, linestring, toggleOrientation)`\n * * `builder.addTrianglesInUncheckedConvexPolygon(linestring, toggle)`\n * * `builder.addUVGridBody(surface,numU, numV, createFanInCaps)`\n * * `builder.addGraph(Graph, acceptFaceFunction)`\n * * Extract with `builder.claimPolyface(true)`\n *\n * * Low-level detail construction -- direct use of indices:\n *\n * * Create a builder with `builder = PolyfaceBuilder.create()`\n * * Add GeometryQuery objects\n * * `builder.addPoint(point)`\n * * `builder.findOrAddPointInLineString(linestring, index)`\n * * `builder.addPointXYZ(x,y,z)`\n * * `builder.addTriangleFacet(points)`\n * * `builder.addQuadFacet(points)`\n * @public\n */\nexport class PolyfaceBuilder extends NullGeometryHandler {\n private _polyface: IndexedPolyface;\n private _options: StrokeOptions;\n /** Return (pointer to) the `StrokeOptions` in use by the builder. */\n public get options(): StrokeOptions {\n return this._options;\n }\n /** State data that affects the current construction. **/\n private _reversed: boolean;\n /** Ask if this builder is reversing vertex order as loops are received. */\n public get reversedFlag(): boolean {\n return this._reversed;\n }\n /**\n * Extract the polyface.\n * @param compress whether to cluster vertices (default `true`).\n * @param tolerance compression tolerance (default `Geometry.smallMetricDistance`).\n */\n public claimPolyface(compress: boolean = true, tolerance: number = Geometry.smallMetricDistance): IndexedPolyface {\n if (compress)\n this._polyface.data.compress(tolerance);\n return this._polyface;\n }\n /** Toggle (reverse) the flag controlling orientation flips for newly added facets. */\n public toggleReversedFacetFlag() {\n this._reversed = !this._reversed;\n }\n private constructor(options?: StrokeOptions) {\n super();\n this._options = options ? options : StrokeOptions.createForFacets();\n this._polyface = IndexedPolyface.create(\n this._options.needNormals, this._options.needParams, this._options.needColors, this._options.needTwoSided,\n );\n this._reversed = false;\n }\n /**\n * Create a builder with given StrokeOptions.\n * @param options StrokeOptions (captured).\n */\n public static create(options?: StrokeOptions): PolyfaceBuilder {\n return new PolyfaceBuilder(options);\n }\n /** Add facets for a transformed unit box. */\n public addTransformedUnitBox(transform: Transform) {\n this.addTransformedRangeMesh(transform, Range3d.createXYZXYZ(0, 0, 0, 1, 1, 1));\n }\n /**\n * Add facets for a transformed range box.\n * * For best results, the transformed range corners should define a nonzero volume or area.\n * @param transform applied to the range points before adding to the polyface.\n * @param range sides become 6 quad polyface facets.\n * @param faceSelector for each face in the order of `BoxTopology.cornerIndexCCW`, `faceSelector[i] === false` skips\n * that facet.\n */\n public addTransformedRangeMesh(transform: Transform, range: Range3d, faceSelector?: boolean[]): void {\n const pointIndex0 = this._polyface.data.pointCount;\n // these will have sequential indices starting at pointIndex0\n const points = range.corners();\n for (const p of points)\n this._polyface.addPoint(transform.multiplyPoint3d(p));\n let faceCounter = 0;\n for (const facet of BoxTopology.cornerIndexCCW) {\n if (!faceSelector || (faceCounter < faceSelector.length && faceSelector[faceCounter])) {\n const myFacet = facet.map((pointIndex) => pointIndex + pointIndex0);\n if (this._reversed)\n myFacet.reverse();\n if (this._options.shouldTriangulate) {\n this.addIndexedTrianglePointIndexes(myFacet[0], myFacet[1], myFacet[2], false);\n this.addIndexedTrianglePointIndexes(myFacet[0], myFacet[2], myFacet[3], false);\n } else {\n this.addIndexedQuadPointIndexes(myFacet[0], myFacet[1], myFacet[3], myFacet[2], false);\n }\n this._polyface.terminateFacet();\n }\n faceCounter++;\n }\n }\n /**\n * Add triangles from `conePoint` to each far edge.\n * @param conePoint the common vertex of all triangles.\n * @param ls linestring with point coordinates.\n * @param toggle if `true`, wrap the triangle creation in toggleReversedFacetFlag.\n */\n public addTriangleFan(conePoint: Point3d, ls: LineString3d, toggle: boolean): void {\n const n = ls.numPoints();\n if (n > 2) {\n if (toggle)\n this.toggleReversedFacetFlag();\n const index0 = this.addPoint(conePoint);\n let index1 = this.findOrAddPointInLineString(ls, 0)!;\n let index2 = 0;\n for (let i = 1; i < n; i++) {\n index2 = this.findOrAddPointInLineString(ls, i)!;\n this.addIndexedTrianglePointIndexes(index0, index1, index2);\n index1 = index2;\n }\n if (toggle)\n this.toggleReversedFacetFlag();\n }\n }\n /**\n * Add triangles from the first point of the linestring to the subsequent edges of the linestring.\n * * No checks are made for polygon convexity or edge collinearity, conditions which would ensure positive area triangles.\n * @param ls linestring with point coordinates.\n * @param reverse if `true`, wrap the triangle creation in toggleReversedFacetFlag.\n */\n public addTrianglesInUncheckedConvexPolygon(ls: LineString3d, toggle: boolean): void {\n const n = ls.numPoints();\n if (n > 2) {\n if (toggle)\n this.toggleReversedFacetFlag();\n let normal;\n let normalIndex;\n if (this._options.needNormals) {\n normal = ls.quickUnitNormal(PolyfaceBuilder._workVectorFindOrAdd)!;\n if (toggle)\n normal.scaleInPlace(-1.0);\n normalIndex = this._polyface.addNormal(normal);\n }\n const needParams = this._options.needParams;\n const packedUV = needParams ? ls.packedUVParams : undefined;\n let paramIndex0 = -1;\n let paramIndex1 = -1;\n let paramIndex2 = -1;\n if (packedUV) {\n paramIndex0 = this.addParamInGrowableXYArray(packedUV, 0)!;\n paramIndex1 = this.addParamInGrowableXYArray(packedUV, 1)!;\n }\n const pointIndex0 = this.findOrAddPointInLineString(ls, 0)!;\n let pointIndex1 = this.findOrAddPointInLineString(ls, 1)!;\n let pointIndex2 = 0;\n let numEdge = n;\n if (ls.isPhysicallyClosed)\n numEdge--;\n for (let i = 2; i < numEdge; i++, pointIndex1 = pointIndex2, paramIndex1 = paramIndex2) {\n pointIndex2 = this.findOrAddPointInLineString(ls, i)!;\n this.addIndexedTrianglePointIndexes(pointIndex0, pointIndex1, pointIndex2, false);\n if (normalIndex !== undefined)\n this.addIndexedTriangleNormalIndexes(normalIndex, normalIndex, normalIndex);\n if (packedUV) {\n paramIndex2 = this.addParamInGrowableXYArray(packedUV, i)!;\n this.addIndexedTriangleParamIndexes(paramIndex0, paramIndex1, paramIndex2);\n }\n this._polyface.terminateFacet();\n }\n if (toggle)\n this.toggleReversedFacetFlag();\n }\n }\n /** Add a point to the polyface. */\n public addPoint(xyz: Point3d): number {\n return this._polyface.addPoint(xyz);\n }\n /** Add a uv parameter to the polyface. */\n public addParamXY(x: number, y: number): number {\n return this._polyface.addParamUV(x, y);\n }\n private static _workPointFindOrAddA = Point3d.create();\n private static _workVectorFindOrAdd = Vector3d.create();\n private static _workUVFindOrAdd = Point2d.create();\n /**\n * Add a point to the polyface. The implementation is free to either create a new point or return the index of a\n * prior point with the same coordinates.\n * @param ls the linestring.\n * @param index index of the point in the linestring.\n * @param transform (optional) transform to be applied.\n * @param priorIndex (optional) index of a prior point to check for possible duplicate value.\n * @returns the point index in the polyface.\n */\n public findOrAddPointInLineString(\n ls: LineString3d, index: number, transform?: Transform, priorIndex?: number,\n ): number | undefined {\n const q = ls.pointAt(index, PolyfaceBuilder._workPointFindOrAddA);\n if (q) {\n if (transform)\n transform.multiplyPoint3d(q, q);\n return this._polyface.addPoint(q, priorIndex);\n }\n return undefined;\n }\n /**\n * Add a point to the polyface. The implementation is free to either create a new point or return the index of a\n * prior point with the same coordinates.\n * @param xyz the array of points.\n * @param index index of the point in the array.\n * @param transform (optional) transform to be applied.\n * @param priorIndex (optional) index of a prior point to check for possible duplicate value.\n * @returns the point index in the polyface.\n */\n public findOrAddPointInGrowableXYZArray(\n xyz: GrowableXYZArray, index: number, transform?: Transform, priorIndex?: number,\n ): number | undefined {\n const q = xyz.getPoint3dAtCheckedPointIndex(index, PolyfaceBuilder._workPointFindOrAddA);\n if (q) {\n if (transform)\n transform.multiplyPoint3d(q, q);\n return this._polyface.addPoint(q, priorIndex);\n }\n return undefined;\n }\n /**\n * Add a normal to the polyface. The implementation is free to either create a new normal or return the index of a\n * prior normal with the same coordinates.\n * @param xyz the array of normals.\n * @param index index of the normal in the array.\n * @param transform (optional) transform to be applied.\n * @param priorIndex (optional) index of a prior point to check for possible duplicate value.\n * @returns the normal index in the polyface.\n */\n public findOrAddNormalInGrowableXYZArray(\n xyz: GrowableXYZArray, index: number, transform?: Transform, priorIndex?: number,\n ): number | undefined {\n const q = xyz.getVector3dAtCheckedVectorIndex(index, PolyfaceBuilder._workVectorFindOrAdd);\n if (q) {\n if (transform)\n transform.multiplyVector(q, q);\n return this._polyface.addNormal(q, priorIndex);\n }\n return undefined;\n }\n /**\n * Add a uv parameter to the polyface.\n * @param data the array of uv data.\n * @param index index of the param in the array.\n * @returns the uv parameter index in the polyface.\n */\n public addParamInGrowableXYArray(data: GrowableXYArray, index: number): number | undefined {\n if (!data)\n return undefined;\n const q = data.getPoint2dAtCheckedPointIndex(index, PolyfaceBuilder._workUVFindOrAdd);\n if (q)\n return this._polyface.addParam(q);\n return undefined;\n }\n /**\n * Add a uv parameter to the polyface, taking `u` from `ls.fractions` and `v` from input. The implementation is\n * free to either create a new param or return the index of a prior param with the same coordinates.\n * @param ls the linestring.\n * @param index index of the point in the linestring.\n * @param v the v parameter.\n * @param priorIndexA (optional) an index of a prior param to check for possible duplicate value.\n * @param priorIndexB (optional) another index of a prior param to check for possible duplicate value.\n * @returns the uv parameter index in the polyface.\n */\n public findOrAddParamInLineString(\n ls: LineString3d, index: number, v: number, priorIndexA?: number, priorIndexB?: number,\n ): number | undefined {\n const u = (ls.fractions && index < ls.fractions.length) ?\n ls.fractions.atUncheckedIndex(index) : index / ls.points.length;\n return this._polyface.addParamUV(u, v, priorIndexA, priorIndexB);\n }\n /**\n * Add a normal to the polyface.\n * @param ls the linestring.\n * @param index Index of the normal in the linestring's surface normal array.\n * @param transform (optional) transform to be applied.\n * @param priorIndexA (optional) an index of a prior normal to check for possible duplicate value.\n * @param priorIndexB (optional) another index of a prior normal to check for possible duplicate value.\n * @returns the normal index in the polyface.\n */\n public findOrAddNormalInLineString(\n ls: LineString3d, index: number, transform?: Transform, priorIndexA?: number, priorIndexB?: number,\n ): number | undefined {\n const linestringNormals = ls.packedSurfaceNormals;\n if (linestringNormals) {\n const q = linestringNormals.getVector3dAtCheckedVectorIndex(index, PolyfaceBuilder._workVectorFindOrAdd);\n if (q) {\n if (transform)\n transform.multiplyVector(q, q);\n return this._polyface.addNormal(q, priorIndexA, priorIndexB);\n }\n }\n return undefined;\n }\n /** Add a point to the polyface. */\n public addPointXYZ(x: number, y: number, z: number): number {\n return this._polyface.addPointXYZ(x, y, z);\n }\n /** Returns a transform who can be applied to points on a triangular facet in order to obtain UV parameters. */\n private getUVTransformForTriangleFacet(pointA: Point3d, pointB: Point3d, pointC: Point3d): Transform | undefined {\n const vectorAB = pointA.vectorTo(pointB);\n const vectorAC = pointA.vectorTo(pointC);\n const unitAxes = Matrix3d.createRigidFromColumns(vectorAB, vectorAC, AxisOrder.XYZ);\n const localToWorld = Transform.createOriginAndMatrix(pointA, unitAxes);\n return localToWorld.inverse();\n }\n /** Returns the normal to a triangular facet. */\n private getNormalForTriangularFacet(pointA: Point3d, pointB: Point3d, pointC: Point3d): Vector3d {\n const vectorAB = pointA.vectorTo(pointB);\n const vectorAC = pointA.vectorTo(pointC);\n let normal = vectorAB.crossProduct(vectorAC).normalize();\n normal = normal ? normal : Vector3d.create();\n return normal;\n }\n // ### TODO: Consider case where normals will be reversed and point through the other end of the facet.\n /**\n * Add a quad to the polyface given its points in order around the edges.\n * @param points array of at least four vertices.\n * @param params (optional) array of at least four uv parameters (if `undefined`, params are calculated without\n * reference data).\n * @param normals (optional) array of at least four vectors (if `undefined`, the quad is assumed to be planar and its\n * normal is calculated).\n * @param colors (optional) array of at least four colors.\n */\n public addQuadFacet(\n points: Point3d[] | GrowableXYZArray, params?: Point2d[], normals?: Vector3d[], colors?: number[],\n ): void {\n if (points instanceof GrowableXYZArray)\n points = points.getPoint3dArray();\n if (points.length < 4)\n return;\n // if params and/or normals are needed, calculate them first\n const needParams = this.options.needParams;\n const needNormals = this.options.needNormals;\n const needColors = this.options.needColors;\n let param0: Point2d, param1: Point2d, param2: Point2d, param3: Point2d;\n let normal0: Vector3d, normal1: Vector3d, normal2: Vector3d, normal3: Vector3d;\n let color0: number, color1: number, color2: number, color3: number;\n if (needParams) {\n if (params !== undefined && params.length > 3) {\n param0 = params[0];\n param1 = params[1];\n param2 = params[2];\n param3 = params[3];\n } else {\n const paramTransform = this.getUVTransformForTriangleFacet(points[0], points[1], points[2]);\n if (paramTransform === undefined) {\n param0 = param1 = param2 = param3 = Point2d.createZero();\n } else {\n param0 = Point2d.createFrom(paramTransform.multiplyPoint3d(points[0]));\n param1 = Point2d.createFrom(paramTransform.multiplyPoint3d(points[1]));\n param2 = Point2d.createFrom(paramTransform.multiplyPoint3d(points[2]));\n param3 = Point2d.createFrom(paramTransform.multiplyPoint3d(points[3]));\n }\n }\n }\n if (needNormals) {\n if (normals !== undefined && normals.length > 3) {\n normal0 = normals[0];\n normal1 = normals[1];\n normal2 = normals[2];\n normal3 = normals[3];\n } else {\n normal0 = this.getNormalForTriangularFacet(points[0], points[1], points[2]);\n normal1 = this.getNormalForTriangularFacet(points[0], points[1], points[2]);\n normal2 = this.getNormalForTriangularFacet(points[0], points[1], points[2]);\n normal3 = this.getNormalForTriangularFacet(points[0], points[1], points[2]);\n }\n }\n if (needColors) {\n if (colors !== undefined && colors.length > 3) {\n color0 = colors[0];\n color1 = colors[1];\n color2 = colors[2];\n color3 = colors[3];\n }\n }\n if (this._options.shouldTriangulate) {\n // add as two triangles, with a diagonal along the shortest distance\n const vectorAC = points[0].vectorTo(points[2]);\n const vectorBD = points[1].vectorTo(points[3]);\n // Note: We pass along any values for normals or params that we calculated\n if (vectorAC.magnitude() >= vectorBD.magnitude()) {\n this.addTriangleFacet(\n [points[0], points[1], points[2]],\n needParams ? [param0!, param1!, param2!] : undefined,\n needNormals ? [normal0!, normal1!, normal2!] : undefined,\n needColors ? [color0!, color1!, color2!] : undefined,\n );\n this.addTriangleFacet(\n [points[0], points[2], points[3]],\n needParams ? [param0!, param2!, param3!] : undefined,\n needNormals ? [normal0!, normal2!, normal3!] : undefined,\n needColors ? [color0!, color2!, color3!] : undefined,\n );\n } else {\n this.addTriangleFacet(\n [points[0], points[1], points[3]],\n needParams ? [param0!, param1!, param3!] : undefined,\n needNormals ? [normal0!, normal1!, normal3!] : undefined,\n needColors ? [color0!, color1!, color3!] : undefined,\n );\n this.addTriangleFacet(\n [points[1], points[2], points[3]],\n needParams ? [param1!, param2!, param3!] : undefined,\n needNormals ? [normal1!, normal2!, normal3!] : undefined,\n needColors ? [color1!, color2!, color3!] : undefined,\n );\n }\n return;\n }\n let idx0, idx1, idx2, idx3;\n // add params if needed\n if (needParams) {\n idx0 = this._polyface.addParam(param0!);\n idx1 = this._polyface.addParam(param1!);\n idx2 = this._polyface.addParam(param2!);\n idx3 = this._polyface.addParam(param3!);\n this.addIndexedQuadParamIndexes(idx0, idx1, idx3, idx2);\n }\n // add normals if needed\n if (needNormals) {\n idx0 = this._polyface.addNormal(normal0!);\n idx1 = this._polyface.addNormal(normal1!);\n idx2 = this._polyface.addNormal(normal2!);\n idx3 = this._polyface.addNormal(normal3!);\n this.addIndexedQuadNormalIndexes(idx0, idx1, idx3, idx2);\n }\n // add colors if needed\n if (needColors) {\n idx0 = this._polyface.addColor(color0!);\n idx1 = this._polyface.addColor(color1!);\n idx2 = this._polyface.addColor(color2!);\n idx3 = this._polyface.addColor(color3!);\n this.addIndexedQuadColorIndexes(idx0, idx1, idx3, idx2);\n }\n // add point and point indexes last (terminates the facet)\n idx0 = this.addPoint(points[0]);\n idx1 = this.addPoint(points[1]);\n idx2 = this.addPoint(points[2]);\n idx3 = this.addPoint(points[3]);\n this.addIndexedQuadPointIndexes(idx0, idx1, idx3, idx2);\n }\n /**\n * Add a single quad facet from existing points to the polyface.\n * * The actual quad may be reversed or triangulated based on builder setup.\n * * `indexA0` and `indexA1` are in the forward order at the \"A\" end of the quad\n * * `indexB0` and `indexB1` are in the forward order at the \"B\" end of the quad.\n * * This means ccw/cw ordered vertices v[i] should be passed into this function as i=[0,1,3,2].\n */\n private addIndexedQuadPointIndexes(\n indexA0: number, indexA1: number, indexB0: number, indexB1: number, terminate: boolean = true,\n ): void {\n if (this._reversed) {\n this._polyface.addPointIndex(indexA0);\n this._polyface.addPointIndex(indexB0);\n this._polyface.addPointIndex(indexB1);\n this._polyface.addPointIndex(indexA1);\n } else {\n this._polyface.addPointIndex(indexA0);\n this._polyface.addPointIndex(indexA1);\n this._polyface.addPointIndex(indexB1);\n this._polyface.addPointIndex(indexB0);\n }\n if (terminate)\n this._polyface.terminateFacet();\n }\n /** For a single quad facet, add the indexes of the corresponding param points. */\n private addIndexedQuadParamIndexes(indexA0: number, indexA1: number, indexB0: number, indexB1: number): void {\n if (this._reversed) {\n this._polyface.addParamIndex(indexA0);\n this._polyface.addParamIndex(indexB0);\n this._polyface.addParamIndex(indexB1);\n this._polyface.addParamIndex(indexA1);\n } else {\n this._polyface.addParamIndex(indexA0);\n this._polyface.addParamIndex(indexA1);\n this._polyface.addParamIndex(indexB1);\n this._polyface.addParamIndex(indexB0);\n }\n }\n /** For a single quad facet, add the indexes of the corresponding normal vectors. */\n private addIndexedQuadNormalIndexes(indexA0: number, indexA1: number, indexB0: number, indexB1: number): void {\n if (this._reversed) {\n this._polyface.addNormalIndex(indexA0);\n this._polyface.addNormalIndex(indexB0);\n this._polyface.addNormalIndex(indexB1);\n this._polyface.addNormalIndex(indexA1);\n } else {\n this._polyface.addNormalIndex(indexA0);\n this._polyface.addNormalIndex(indexA1);\n this._polyface.addNormalIndex(indexB1);\n this._polyface.addNormalIndex(indexB0);\n }\n }\n /** For a single quad facet, add the indexes of the corresponding colors. */\n private addIndexedQuadColorIndexes(indexA0: number, indexA1: number, indexB0: number, indexB1: number): void {\n if (this._reversed) {\n this._polyface.addColorIndex(indexA0);\n this._polyface.addColorIndex(indexB0);\n this._polyface.addColorIndex(indexB1);\n this._polyface.addColorIndex(indexA1);\n } else {\n this._polyface.addColorIndex(indexA0);\n this._polyface.addColorIndex(indexA1);\n this._polyface.addColorIndex(indexB1);\n this._polyface.addColorIndex(indexB0);\n }\n }\n // ### TODO: Consider case where normals will be reversed and point through the other end of the facet.\n /**\n * Add a triangle to the polyface given its points in order around the edges.\n * @param points array of at least three vertices.\n * @param params (optional) array of at least three uv parameters (if `undefined`, params are calculated without\n * reference data).\n * @param normals (optional) array of at least three vectors (if `undefined`, the normal is calculated).\n * @param colors (optional) array of at least three colors.\n */\n public addTriangleFacet(\n points: Point3d[] | GrowableXYZArray, params?: Point2d[], normals?: Vector3d[], colors?: number[],\n ): void {\n if (points.length < 3)\n return;\n let idx0: number;\n let idx1: number;\n let idx2: number;\n let point0, point1, point2;\n if (points instanceof GrowableXYZArray) {\n point0 = points.getPoint3dAtCheckedPointIndex(0)!;\n point1 = points.getPoint3dAtCheckedPointIndex(1)!;\n point2 = points.getPoint3dAtCheckedPointIndex(2)!;\n } else {\n point0 = points[0];\n point1 = points[1];\n point2 = points[2];\n }\n // add params if needed\n if (this._options.needParams) {\n if (params && params.length >= 3) { // params were given\n idx0 = this._polyface.addParam(params[0]);\n idx1 = this._polyface.addParam(params[1]);\n idx2 = this._polyface.addParam(params[2]);\n } else { // compute params\n const paramTransform = this.getUVTransformForTriangleFacet(point0, point1, point2);\n idx0 = this._polyface.addParam(\n Point2d.createFrom(paramTransform ? paramTransform.multiplyPoint3d(point0) : undefined),\n );\n idx1 = this._polyface.addParam(\n Point2d.createFrom(paramTransform ? paramTransform.multiplyPoint3d(point1) : undefined),\n );\n idx2 = this._polyface.addParam(\n Point2d.createFrom(paramTransform ? paramTransform.multiplyPoint3d(point1) : undefined),\n );\n }\n this.addIndexedTriangleParamIndexes(idx0, idx1, idx2);\n }\n // add normals if needed\n if (this._options.needNormals) {\n if (normals !== undefined && normals.length > 2) { // normals were given\n idx0 = this._polyface.addNormal(normals[0]);\n idx1 = this._polyface.addNormal(normals[1]);\n idx2 = this._polyface.addNormal(normals[2]);\n } else { // compute normals\n const normal = this.getNormalForTriangularFacet(point0, point1, point2);\n idx0 = this._polyface.addNormal(normal);\n idx1 = this._polyface.addNormal(normal);\n idx2 = this._polyface.addNormal(normal);\n }\n this.addIndexedTriangleNormalIndexes(idx0, idx1, idx2);\n }\n // add colors if needed and provided\n if (this._options.needColors) {\n if (colors !== undefined && colors.length > 2) {\n idx0 = this._polyface.addColor(colors[0]);\n idx1 = this._polyface.addColor(colors[1]);\n idx2 = this._polyface.addColor(colors[2]);\n this.addIndexedTriangleColorIndexes(idx0, idx1, idx2);\n }\n }\n // add point and point indexes last (terminates the facet)\n idx0 = this.addPoint(point0);\n idx1 = this.addPoint(point1);\n idx2 = this.addPoint(point2);\n this.addIndexedTrianglePointIndexes(idx0, idx1, idx2);\n }\n /**\n * Add a single triangular facet from existing points to the polyface.\n * * The added triangle may be reversed based on builder setup.\n */\n private addIndexedTrianglePointIndexes(\n indexA: number, indexB: number, indexC: number, terminateFacet: boolean = true,\n ) {\n if (!this._reversed) {\n this._polyface.addPointIndex(indexA);\n this._polyface.addPointIndex(indexB);\n this._polyface.addPointIndex(indexC);\n } else {\n this._polyface.addPointIndex(indexA);\n this._polyface.addPointIndex(indexC);\n this._polyface.addPointIndex(indexB);\n }\n if (terminateFacet)\n this._polyface.terminateFacet();\n }\n /** For a single triangle facet, add the indexes of the corresponding params. */\n private addIndexedTriangleParamIndexes(indexA: number, indexB: number, indexC: number): void {\n if (!this._reversed) {\n this._polyface.addParamIndex(indexA);\n this._polyface.addParamIndex(indexB);\n this._polyface.addParamIndex(indexC);\n } else {\n this._polyface.addParamIndex(indexA);\n this._polyface.addParamIndex(indexC);\n this._polyface.addParamIndex(indexB);\n }\n }\n /** For a single triangle facet, add the indexes of the corresponding params. */\n private addIndexedTriangleNormalIndexes(indexA: number, indexB: number, indexC: number): void {\n if (!this._reversed) {\n this._polyface.addNormalIndex(indexA);\n this._polyface.addNormalIndex(indexB);\n this._polyface.addNormalIndex(indexC);\n } else {\n this._polyface.addNormalIndex(indexA);\n this._polyface.addNormalIndex(indexC);\n this._polyface.addNormalIndex(indexB);\n }\n }\n /** For a single triangle facet, add the indexes of the corresponding colors. */\n private addIndexedTriangleColorIndexes(indexA: number, indexB: number, indexC: number): void {\n if (!this._reversed) {\n this._polyface.addColorIndex(indexA);\n this._polyface.addColorIndex(indexB);\n this._polyface.addColorIndex(indexC);\n } else {\n this._polyface.addColorIndex(indexA);\n this._polyface.addColorIndex(indexC);\n this._polyface.addColorIndex(indexB);\n }\n }\n /** Find or add xyzIndex and normalIndex for coordinates in the sector. */\n private setSectorIndices(sector: FacetSector): void {\n sector.xyzIndex = this.addPoint(sector.xyz);\n if (sector.normal)\n sector.normalIndex = this._polyface.addNormal(sector.normal);\n if (sector.uv)\n sector.uvIndex = this._polyface.addParam(sector.uv);\n }\n private addSectorTriangle(sectorA0: FacetSector, sectorA1: FacetSector, sectorA2: FacetSector): void {\n if (sectorA0.xyz.isAlmostEqual(sectorA1.xyz)\n || sectorA1.xyz.isAlmostEqual(sectorA2.xyz)\n || sectorA2.xyz.isAlmostEqual(sectorA0.xyz)) {\n // trivially degenerate triangle; skip!!!\n } else {\n if (this._options.needNormals)\n this.addIndexedTriangleNormalIndexes(sectorA0.normalIndex, sectorA1.normalIndex, sectorA2.normalIndex);\n if (this._options.needParams)\n this.addIndexedTriangleParamIndexes(sectorA0.uvIndex, sectorA1.uvIndex, sectorA2.uvIndex);\n this.addIndexedTrianglePointIndexes(sectorA0.xyzIndex, sectorA1.xyzIndex, sectorA2.xyzIndex, true);\n }\n }\n private addSectorQuadA01B01(\n sectorA0: FacetSector, sectorA1: FacetSector, sectorB0: FacetSector, sectorB1: FacetSector,\n ): void {\n if (sectorA0.xyz.isAlmostEqual(sectorA1.xyz) && sectorB0.xyz.isAlmostEqual(sectorB1.xyz)) {\n // ignore null quad\n } else if (this._options.shouldTriangulate) {\n this.addSectorTriangle(sectorA0, sectorA1, sectorB1);\n this.addSectorTriangle(sectorB1, sectorB0, sectorA0);\n } else {\n if (this._options.needNormals)\n this.addIndexedQuadNormalIndexes(sectorA0.normalIndex, sectorA1.normalIndex, sectorB0.normalIndex, sectorB1.normalIndex);\n if (this._options.needParams)\n this.addIndexedQuadParamIndexes(sectorA0.uvIndex, sectorA1.uvIndex, sectorB0.uvIndex, sectorB1.uvIndex);\n this.addIndexedQuadPointIndexes(sectorA0.xyzIndex, sectorA1.xyzIndex, sectorB0.xyzIndex, sectorB1.xyzIndex, true);\n }\n }\n /**\n * Add facets between lineStrings with matched point counts.\n * * Surface normals are computed from (a) curve tangents in the linestrings and (b) rule line between linestrings.\n */\n public addBetweenLineStringsWithRuleEdgeNormals(\n lineStringA: LineString3d, vA: number, lineStringB: LineString3d, vB: number, addClosure: boolean = false,\n ): void {\n const pointA = lineStringA.packedPoints;\n const pointB = lineStringB.packedPoints;\n const derivativeA = lineStringA.packedDerivatives;\n const derivativeB = lineStringB.packedDerivatives;\n const fractionA = lineStringA.fractions;\n const fractionB = lineStringB.fractions;\n const needNormals = this._options.needNormals;\n const needParams = this._options.needParams;\n const sectorA0 = new FacetSector(needNormals, needParams, needNormals);\n const sectorA1 = new FacetSector(needNormals, needParams, needNormals);\n const sectorB0 = new FacetSector(needNormals, needParams, needNormals);\n const sectorB1 = new FacetSector(needNormals, needParams, needNormals);\n const sectorA00 = new FacetSector(needNormals, needParams, needNormals);\n const sectorB00 = new FacetSector(needNormals, needParams, needNormals);\n const numPoints = pointA.length;\n if (numPoints < 2 || numPoints !== pointB.length)\n return;\n sectorA0.loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(0, pointA, derivativeA, fractionA, vA);\n sectorB0.loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(0, pointB, derivativeB, fractionB, vB);\n if (needNormals)\n FacetSector.computeNormalsAlongRuleLine(sectorA0, sectorB0);\n this.setSectorIndices(sectorA0);\n this.setSectorIndices(sectorB0);\n sectorA00.copyContentsFrom(sectorA0);\n sectorB00.copyContentsFrom(sectorB0);\n for (let i = 1; i < numPoints; i++) {\n sectorA1.loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(i, pointA, derivativeA, fractionA, vA);\n sectorB1.loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(i, pointB, derivativeA, fractionB, vB);\n FacetSector.computeNormalsAlongRuleLine(sectorA1, sectorB1);\n this.setSectorIndices(sectorA1);\n this.setSectorIndices(sectorB1);\n // create the facet\n this.addSectorQuadA01B01(sectorA0, sectorA1, sectorB0, sectorB1);\n sectorA0.copyContentsFrom(sectorA1);\n sectorB0.copyContentsFrom(sectorB1);\n }\n if (addClosure)\n this.addSectorQuadA01B01(sectorA0, sectorA00, sectorB0, sectorB00);\n }\n /**\n * Add facets between lineStrings with matched point counts.\n * * Indices of points, normals, and uv parameters are pre-stored in the linestrings.\n */\n public addBetweenLineStringsWithStoredIndices(lineStringA: LineString3d, lineStringB: LineString3d): void {\n const pointA = lineStringA.pointIndices!;\n const pointB = lineStringB.pointIndices!;\n let normalA: GrowableFloat64Array | undefined = lineStringA.normalIndices;\n let normalB: GrowableFloat64Array | undefined = lineStringB.normalIndices;\n if (!this._options.needNormals) {\n normalA = undefined;\n normalB = undefined;\n }\n let paramA: GrowableFloat64Array | undefined = lineStringA.paramIndices;\n let paramB: GrowableFloat64Array | undefined = lineStringB.paramIndices;\n if (!this._options.needParams) {\n paramA = undefined;\n paramB = undefined;\n }\n const numPoints = pointA.length;\n for (let i = 1; i < numPoints; i++) {\n if (this.options.shouldTriangulate) {\n if (distinctIndices(pointA.atUncheckedIndex(i - 1), pointA.atUncheckedIndex(i), pointB.atUncheckedIndex(i))) {\n this.addIndexedTrianglePointIndexes(\n pointA.atUncheckedIndex(i - 1), pointA.atUncheckedIndex(i), pointB.atUncheckedIndex(i), false,\n );\n if (normalA && normalB)\n this.addIndexedTriangleNormalIndexes(\n normalA.atUncheckedIndex(i - 1), normalA.atUncheckedIndex(i), normalB.atUncheckedIndex(i - 1),\n );\n if (paramA && paramB)\n this.addIndexedTriangleParamIndexes(\n paramA.atUncheckedIndex(i - 1), paramA.atUncheckedIndex(i), paramB.atUncheckedIndex(i - 1),\n );\n }\n if (distinctIndices(pointB.atUncheckedIndex(i), pointB.atUncheckedIndex(i - 1), pointA.atUncheckedIndex(i - 1))) {\n this.addIndexedTrianglePointIndexes(\n pointA.atUncheckedIndex(i - 1), pointB.atUncheckedIndex(i), pointB.atUncheckedIndex(i - 1), false,\n );\n if (normalA && normalB)\n this.addIndexedTriangleNormalIndexes(\n normalA.atUncheckedIndex(i - 1), normalB.atUncheckedIndex(i), normalB.atUncheckedIndex(i - 1),\n );\n if (paramA && paramB)\n this.addIndexedTriangleParamIndexes(\n paramA.atUncheckedIndex(i - 1), paramB.atUncheckedIndex(i), paramB.atUncheckedIndex(i - 1),\n );\n }\n } else {\n if (pointA.atUncheckedIndex(i - 1) !== pointA.atUncheckedIndex(i) ||\n pointB.atUncheckedIndex(i - 1) !== pointB.atUncheckedIndex(i)) {\n this.addIndexedQuadPointIndexes(\n pointA.atUncheckedIndex(i - 1), pointA.atUncheckedIndex(i),\n pointB.atUncheckedIndex(i - 1), pointB.atUncheckedIndex(i),\n false,\n );\n if (normalA && normalB)\n this.addIndexedQuadNormalIndexes(\n normalA.atUncheckedIndex(i - 1), normalA.atUncheckedIndex(i),\n normalB.atUncheckedIndex(i - 1), normalB.atUncheckedIndex(i),\n );\n if (paramA && paramB)\n this.addIndexedQuadParamIndexes(\n paramA.atUncheckedIndex(i - 1), paramA.atUncheckedIndex(i),\n paramB.atUncheckedIndex(i - 1), paramB.atUncheckedIndex(i),\n );\n }\n }\n this._polyface.terminateFacet();\n }\n }\n /**\n * Add facets between lineStrings with matched point counts.\n * * Facets are announced to addIndexedQuad.\n * * addIndexedQuad is free to apply reversal or triangulation options.\n */\n public addBetweenTransformedLineStrings(\n curves: AnyCurve, transformA: Transform, transformB: Transform, addClosure: boolean = false,\n ): void {\n if (curves instanceof LineString3d) {\n const pointA = curves.points;\n const numPoints = pointA.length;\n let indexA0 = this.findOrAddPointInLineString(curves, 0, transformA)!;\n let indexB0 = this.findOrAddPointInLineString(curves, 0, transformB)!;\n const indexA00 = indexA0;\n const indexB00 = indexB0;\n let indexA1 = 0;\n let indexB1 = 0;\n for (let i = 1; i < numPoints; i++) {\n indexA1 = this.findOrAddPointInLineString(curves, i, transformA)!;\n indexB1 = this.findOrAddPointInLineString(curves, i, transformB)!;\n this.addIndexedQuadPointIndexes(indexA0, indexA1, indexB0, indexB1);\n indexA0 = indexA1;\n indexB0 = indexB1;\n }\n if (addClosure)\n this.addIndexedQuadPointIndexes(indexA0, indexA00, indexB0, indexB00);\n } else {\n const children = curves.children;\n // just send the children individually; final compress will fix things??\n if (children)\n for (const c of children) {\n this.addBetweenTransformedLineStrings(c as AnyCurve, transformA, transformB);\n }\n }\n }\n private addBetweenStrokeSetPair(dataA: AnyCurve, vA: number, dataB: AnyCurve, vB: number) {\n if (dataA instanceof LineString3d && dataB instanceof LineString3d) {\n this.addBetweenLineStringsWithRuleEdgeNormals(dataA, vA, dataB, vB, false);\n } else if (dataA instanceof ParityRegion && dataB instanceof ParityRegion) {\n if (dataA.children.length === dataB.children.length) {\n for (let i = 0; i < dataA.children.length; i++) {\n this.addBetweenStrokeSetPair(dataA.children[i], vA, dataB.children[i], vB);\n }\n }\n } else if (dataA instanceof CurveChain && dataB instanceof CurveChain) {\n const chainA = dataA.children;\n const chainB = dataB.children;\n if (chainA.length === chainB.length) {\n for (let i = 0; i < chainA.length; i++) {\n const cpA = chainA[i];\n const cpB = chainB[i];\n if (cpA instanceof LineString3d && cpB instanceof LineString3d) {\n this.addBetweenLineStringsWithRuleEdgeNormals(cpA, vA, cpB, vB);\n }\n }\n }\n }\n }\n /** Add facets from a Cone. */\n public addCone(cone: Cone): void {\n // ensure identical stroke counts at each end\n let strokeCount = 16;\n if (this._options)\n strokeCount = this._options.applyTolerancesToArc(cone.getMaxRadius());\n let axisStrokeCount = 1;\n const lineStringA = cone.strokeConstantVSection(0.0, strokeCount, this._options);\n const lineStringB = cone.strokeConstantVSection(1.0, strokeCount, this._options);\n if (this._options) {\n const vDistanceRange = GrowableXYZArray.distanceRangeBetweenCorrespondingPoints(\n lineStringA.packedPoints, lineStringB.packedPoints,\n );\n axisStrokeCount = this._options.applyMaxEdgeLength(1, vDistanceRange.low);\n }\n const sizes = cone.maxIsoParametricDistance();\n this.addUVGridBody(cone, strokeCount, axisStrokeCount, Segment1d.create(0, sizes.x), Segment1d.create(0, sizes.y));\n this.endFace();\n if (cone.capped) {\n if (!Geometry.isSmallMetricDistance(cone.getRadiusA())) {\n this.addTrianglesInUncheckedConvexPolygon(lineStringA, true); // lower triangles flip\n this.endFace();\n }\n if (!Geometry.isSmallMetricDistance(cone.getRadiusB())) {\n this.addTrianglesInUncheckedConvexPolygon(lineStringB, false); // upper triangles to not flip.\n this.endFace();\n }\n }\n }\n /** Add facets for a TorusPipe. */\n public addTorusPipe(surface: TorusPipe, phiStrokeCount?: number, thetaStrokeCount?: number): void {\n const thetaFraction = surface.getThetaFraction();\n let numU = Geometry.clamp(Geometry.resolveNumber(phiStrokeCount, 8), 4, 64);\n let numV = Geometry.clamp(\n Geometry.resolveNumber(thetaStrokeCount, Math.ceil(16 * thetaFraction)), 2, 64);\n if (this._options) {\n numU = this._options.applyTolerancesToArc(surface.getMinorRadius());\n numV = this._options.applyTolerancesToArc(surface.getMajorRadius(), surface.getSweepAngle().radians);\n }\n this.toggleReversedFacetFlag();\n const sizes = surface.maxIsoParametricDistance();\n this.addUVGridBody(surface, numU, numV, Segment1d.create(0, sizes.x), Segment1d.create(0, sizes.y));\n this.toggleReversedFacetFlag();\n if (surface.capped && thetaFraction < 1.0) {\n const centerFrame = surface.getConstructiveFrame()!;\n const minorRadius = surface.getMinorRadius();\n const majorRadius = surface.getMajorRadius();\n const a = 2 * minorRadius;\n const r0 = majorRadius - minorRadius;\n const r1 = majorRadius + minorRadius;\n const z0 = -minorRadius;\n const cap0ToLocal = Transform.createRowValues(\n a, 0, 0, r0,\n 0, 0, -1, 0,\n 0, a, 0, z0,\n );\n const cap0ToWorld = centerFrame.multiplyTransformTransform(cap0ToLocal);\n const worldToCap0 = cap0ToWorld.inverse();\n if (worldToCap0) {\n const ls0 = UVSurfaceOps.createLinestringOnUVLine(surface, 0, 0, 1, 0, numU, false, true);\n ls0.computeUVFromXYZTransform(worldToCap0);\n this.addTrianglesInUncheckedConvexPolygon(ls0, false);\n }\n const thetaRadians = surface.getSweepAngle().radians;\n const cc = Math.cos(thetaRadians);\n const ss = Math.sin(thetaRadians);\n const cap1ToLocal = Transform.createRowValues(\n -cc * a, 0, -ss, r1 * cc,\n -ss * a, 0, cc, r1 * ss,\n 0, a, 0, z0,\n );\n const cap1ToWorld = centerFrame.multiplyTransformTransform(cap1ToLocal);\n const worldToCap1 = cap1ToWorld.inverse();\n if (worldToCap1) {\n const ls1 = UVSurfaceOps.createLinestringOnUVLine(surface, 1, 1, 0, 1, numU, false, true);\n ls1.computeUVFromXYZTransform(worldToCap1);\n this.addTrianglesInUncheckedConvexPolygon(ls1, false);\n }\n }\n }\n /**\n * Add point data (no params, normals) for linestrings.\n * * This recurses through curve chains (loops and paths).\n * * LineStrings are swept.\n * * All other curve types are ignored.\n * @param contour contour which contains only linestrings.\n * @param vector sweep vector.\n */\n public addLinearSweepLineStringsXYZOnly(contour: AnyCurve, vector: Vector3d): void {\n if (contour instanceof LineString3d) {\n let pointA = Point3d.create();\n let pointB = Point3d.create();\n let indexA0 = 0;\n let indexA1 = 0;\n let indexB0 = 0;\n let indexB1 = 0;\n const n = contour.numPoints();\n for (let i = 0; i < n; i++) {\n pointA = contour.pointAt(i, pointA)!;\n pointB = pointA.plus(vector, pointB);\n indexA1 = this.addPoint(pointA);\n indexB1 = this.addPoint(pointB);\n if (i > 0)\n this.addIndexedQuadPointIndexes(indexA0, indexA1, indexB0, indexB1);\n indexA0 = indexA1;\n indexB0 = indexB1;\n }\n } else if (contour instanceof CurveChain) {\n for (const ls of contour.children)\n this.addLinearSweepLineStringsXYZOnly(ls, vector);\n }\n }\n /** Construct facets for a rotational sweep. */\n public addRotationalSweep(surface: RotationalSweep): void {\n const contour = surface.getSweepContourRef();\n const section0 = StrokeCountSection.create(contour.getCurves(), this._options);\n const baseStrokes = section0.getStrokes();\n // ensure sweep is positive for buildRotationalNormalsInLineStrings\n const axis = surface.cloneAxisRay();\n const sweepAngle = surface.getSweep();\n if (sweepAngle.radians < 0.0) {\n axis.direction.scaleInPlace(-1);\n sweepAngle.setRadians(-sweepAngle.radians);\n }\n // swingVector points in the direction of positive sweep\n const perpendicularVector = CylindricalRangeQuery.computeMaxVectorFromRay(axis, baseStrokes);\n const swingVector = axis.direction.crossProduct(perpendicularVector);\n // ensure contour computed normal is aligned with swingVector for buildRotationalNormalsInLineStrings\n const contourNormalAgreesWithSwingDir = contour.localToWorld.matrix.dotColumnZ(swingVector) > 0;\n if (!contourNormalAgreesWithSwingDir)\n baseStrokes.reverseInPlace();\n if (this._options.needNormals)\n CylindricalRangeQuery.buildRotationalNormalsInLineStrings(baseStrokes, axis, swingVector);\n const maxDistance = perpendicularVector.magnitude();\n const maxPath = Math.abs(maxDistance * sweepAngle.radians);\n let numStep = StrokeOptions.applyAngleTol(this._options, 1, sweepAngle.radians, undefined);\n numStep = StrokeOptions.applyMaxEdgeLength(this._options, numStep, maxPath);\n for (let i = 1; i <= numStep; i++) {\n const transformA = surface.getFractionalRotationTransform((i - 1) / numStep);\n const transformB = surface.getFractionalRotationTransform(i / numStep);\n this.addBetweenRotatedStrokeSets(baseStrokes, transformA, i - 1, transformB, i);\n }\n if (surface.capped) {\n contour.purgeFacets();\n const reverseNearCap = contourNormalAgreesWithSwingDir;\n contour.emitFacets(this, reverseNearCap, undefined);\n contour.emitFacets(this, !reverseNearCap, surface.getFractionalRotationTransform(1.0));\n }\n }\n /** Construct facets for any planar region. */\n public addTriangulatedRegion(region: AnyRegion): void {\n const contour = SweepContour.createForLinearSweep(region);\n if (contour)\n contour.emitFacets(this, this.reversedFlag, undefined);\n }\n /**\n * Apply stroke counts to curve primitives.\n * * Recursively visit all children of data.\n * * At each primitive, invoke `computeStrokeCountForOptions` method with options from the builder.\n * @deprecated in 4.8.0 - will not be removed until after 2026-06-13. This method does nothing and is unneeded.\n */\n public applyStrokeCountsToCurvePrimitives(data: AnyCurve | GeometryQuery): void {\n const options = this._options;\n if (data instanceof CurvePrimitive) {\n data.computeStrokeCountForOptions(options);\n } else if (data instanceof CurveCollection) {\n const children = data.children;\n if (children)\n for (const child of children)\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.applyStrokeCountsToCurvePrimitives(child);\n }\n }\n private addBetweenStrokeSetsWithRuledNormals(stroke0: AnyCurve, stroke1: AnyCurve, numVEdge: number): void {\n const strokeSets = [stroke0];\n const fractions = [0.0];\n for (let vIndex = 1; vIndex < numVEdge; vIndex++) {\n const vFraction = vIndex / numVEdge;\n const strokeA = ConstructCurveBetweenCurves.interpolateBetween(stroke0, vIndex / numVEdge, stroke1) as AnyCurve;\n strokeSets.push(strokeA);\n fractions.push(vFraction);\n }\n strokeSets.push(stroke1);\n fractions.push(1.0);\n for (let vIndex = 0; vIndex < numVEdge; vIndex++) {\n this.addBetweenStrokeSetPair(strokeSets[vIndex], fractions[vIndex], strokeSets[vIndex + 1], fractions[vIndex + 1]);\n }\n }\n private createIndicesInLineString(ls: LineString3d, vParam: number, transform?: Transform) {\n const n = ls.numPoints();\n const pointIndices = ls.ensureEmptyPointIndices();\n const index0 = this.findOrAddPointInLineString(ls, 0, transform);\n pointIndices.push(index0!);\n if (n > 1) {\n let indexA = index0;\n let indexB: number | undefined;\n for (let i = 1; i + 1 < n; i++) {\n indexB = this.findOrAddPointInLineString(ls, i, transform, indexA);\n pointIndices.push(indexB!);\n indexA = indexB;\n }\n // assume last point can only repeat back to zero\n indexB = this.findOrAddPointInLineString(ls, n - 1, transform, index0);\n pointIndices.push(indexB!);\n }\n if (this._options.needNormals && ls.packedSurfaceNormals !== undefined) {\n const normalIndices = ls.ensureEmptyNormalIndices();\n const normalIndex0 = this.findOrAddNormalInLineString(ls, 0, transform);\n normalIndices.push(normalIndex0!);\n if (n > 1) {\n let normalIndexA = normalIndex0;\n let normalIndexB: number | undefined;\n for (let i = 1; i + 1 < n; i++) {\n normalIndexB = this.findOrAddNormalInLineString(ls, i, transform, normalIndexA);\n normalIndices.push(normalIndexB!);\n normalIndexA = normalIndexB;\n }\n // assume last point can only repeat back to zero\n normalIndexB = this.findOrAddNormalInLineString(ls, n - 1, transform, normalIndex0, normalIndexA);\n normalIndices.push(normalIndexB!);\n }\n }\n if (this._options.needParams && ls.packedUVParams !== undefined) {\n const uvIndices = ls.ensureEmptyUVIndices();\n const uvIndex0 = this.findOrAddParamInLineString(ls, 0, vParam);\n uvIndices.push(uvIndex0!);\n if (n > 1) {\n let uvIndexA = uvIndex0;\n let uvIndexB: number | undefined;\n for (let i = 1; i + 1 < n; i++) {\n uvIndexB = this.findOrAddParamInLineString(ls, i, vParam, uvIndexA);\n uvIndices.push(uvIndexB!);\n uvIndexA = uvIndexB;\n }\n // assume last point can only repeat back to zero\n uvIndexB = this.findOrAddParamInLineString(ls, n - 1, vParam, uvIndexA, uvIndex0);\n uvIndices.push(uvIndexB!);\n }\n }\n }\n private addBetweenRotatedStrokeSets(\n stroke0: AnyCurve, transformA: Transform, vA: number, transformB: Transform, vB: number,\n ): void {\n if (stroke0 instanceof LineString3d) {\n const strokeA = stroke0.cloneTransformed(transformA);\n this.createIndicesInLineString(strokeA, vA);\n const strokeB = stroke0.cloneTransformed(transformB);\n this.createIndicesInLineString(strokeB, vB);\n this.addBetweenLineStringsWithStoredIndices(strokeA, strokeB);\n } else if (stroke0 instanceof ParityRegion) {\n for (const child of stroke0.children) {\n this.addBetweenRotatedStrokeSets(child, transformA, vA, transformB, vB);\n }\n } else if (stroke0 instanceof CurveChain) {\n for (const child of stroke0.children) {\n if (child instanceof LineString3d) {\n this.addBetweenRotatedStrokeSets(child, transformA, vA, transformB, vB);\n }\n }\n }\n }\n /** Add facets from the linear sweep. */\n public addLinearSweep(surface: LinearSweep): void {\n const contour = surface.getCurvesRef();\n const section0 = StrokeCountSection.create(contour, this._options);\n const stroke0 = section0.getStrokes();\n const sweepVector = surface.cloneSweepVector();\n const sweepTransform = Transform.createTranslation(sweepVector);\n const stroke1 = stroke0.cloneTransformed(sweepTransform) as AnyCurve;\n const numVEdge = this._options.applyMaxEdgeLength(1, sweepVector.magnitude());\n this.addBetweenStrokeSetsWithRuledNormals(stroke0, stroke1, numVEdge);\n if (surface.capped && contour.isAnyRegionType) {\n const contourA = surface.getSweepContourRef();\n contourA.purgeFacets();\n const reverseNearCap = contourA.localToWorld.matrix.dotColumnZ(sweepVector) > 0;\n contourA.emitFacets(this, reverseNearCap, undefined);\n contourA.emitFacets(this, !reverseNearCap, sweepTransform);\n }\n }\n /** Add facets from a ruled sweep. */\n public addRuledSweep(surface: RuledSweep): boolean {\n const contours = surface.sweepContoursRef();\n let stroke0: AnyCurve | undefined;\n let stroke1: AnyCurve;\n const sectionMaps = [];\n for (const contour of contours)\n sectionMaps.push(StrokeCountSection.create(contour.curves, this._options));\n if (StrokeCountSection.enforceStrokeCountCompatibility(sectionMaps)) {\n StrokeCountSection.enforceCompatibleDistanceSums(sectionMaps);\n for (let i = 0; i < contours.length; i++) {\n stroke1 = sectionMaps[i].getStrokes();\n if (!stroke1)\n stroke1 = contours[i].curves.cloneStroked();\n if (i > 0 && stroke0 && stroke1) {\n const distanceRange = Range1d.createNull();\n if (StrokeCountSection.extendDistanceRangeBetweenStrokes(stroke0, stroke1, distanceRange)\n && !distanceRange.isNull) {\n const numVEdge = this._options.applyMaxEdgeLength(1, distanceRange.high);\n this.addBetweenStrokeSetsWithRuledNormals(stroke0, stroke1, numVEdge);\n }\n }\n stroke0 = stroke1;\n }\n }\n if (surface.capped && contours[0].curves.isAnyRegionType) {\n contours[0].purgeFacets();\n contours[0].emitFacets(this, true, undefined);\n contours[contours.length - 1].purgeFacets();\n contours[contours.length - 1].emitFacets(this, false, undefined);\n }\n return true;\n }\n /** Add facets from a sphere. */\n public addSphere(sphere: Sphere, strokeCount?: number): void {\n let numStrokeTheta = strokeCount ? strokeCount : this.options.applyTolerancesToArc(sphere.maxAxisRadius());\n if (Geometry.isOdd(numStrokeTheta))\n numStrokeTheta += 1;\n const numStrokePhi = Geometry.clampToStartEnd(\n Math.abs(numStrokeTheta * sphere.latitudeSweepFraction), 1, Math.ceil(numStrokeTheta * 0.5),\n );\n const lineStringA = sphere.strokeConstantVSection(0.0, numStrokeTheta, this._options);\n if (sphere.capped && !Geometry.isSmallMetricDistance(lineStringA.quickLength())) {\n this.addTrianglesInUncheckedConvexPolygon(lineStringA, true); // lower triangles flip\n this.endFace();\n }\n const sizes = sphere.maxIsoParametricDistance();\n this.addUVGridBody(sphere, numStrokeTheta, numStrokePhi, Segment1d.create(0, sizes.x), Segment1d.create(0, sizes.y));\n this.endFace();\n const lineStringB = sphere.strokeConstantVSection(1.0, numStrokeTheta, this._options);\n if (sphere.capped && !Geometry.isSmallMetricDistance(lineStringB.quickLength())) {\n this.addTrianglesInUncheckedConvexPolygon(lineStringB, false); // upper triangles do not flip\n this.endFace();\n }\n }\n /** Add facets from a box. */\n public addBox(box: Box): void {\n const corners = box.getCorners();\n const xLength = Geometry.maxXY(box.getBaseX(), box.getBaseX());\n const yLength = Geometry.maxXY(box.getBaseY(), box.getTopY());\n let zLength = 0.0;\n for (let i = 0; i < 4; i++)\n zLength = Geometry.maxXY(zLength, corners[i].distance(corners[i + 4]));\n const numX = this._options.applyMaxEdgeLength(1, xLength);\n const numY = this._options.applyMaxEdgeLength(1, yLength);\n const numZ = this._options.applyMaxEdgeLength(1, zLength);\n // wrap the 4 out-of-plane faces as a single parameter space with \"distance\"\n // advancing in x, then y, then negative x, then negative y\n const uParamRange = Segment1d.create(0, xLength);\n const vParamRange = Segment1d.create(0, zLength);\n this.addUVGridBody(\n BilinearPatch.create(corners[0], corners[1], corners[4], corners[5]), numX, numZ, uParamRange, vParamRange,\n );\n uParamRange.shift(xLength);\n this.addUVGridBody(\n BilinearPatch.create(corners[1], corners[3], corners[5], corners[7]), numY, numZ, uParamRange, vParamRange,\n );\n uParamRange.shift(yLength);\n this.addUVGridBody(\n BilinearPatch.create(corners[3], corners[2], corners[7], corners[6]), numX, numZ, uParamRange, vParamRange,\n );\n uParamRange.shift(xLength);\n this.addUVGridBody(\n BilinearPatch.create(corners[2], corners[0], corners[6], corners[4]), numY, numZ, uParamRange, vParamRange,\n );\n // finally end that wraparound face\n this.endFace();\n if (box.capped) {\n uParamRange.set(0.0, xLength);\n vParamRange.set(0.0, yLength);\n this.addUVGridBody(\n BilinearPatch.create(corners[4], corners[5], corners[6], corners[7]), numX, numY, uParamRange, vParamRange,\n );\n this.endFace();\n uParamRange.set(0.0, xLength);\n vParamRange.set(0.0, yLength);\n this.addUVGridBody(\n BilinearPatch.create(corners[2], corners[3], corners[0], corners[1]), numX, numY, uParamRange, vParamRange,\n );\n this.endFace();\n }\n }\n /**\n * Add a polygon to the evolving facets.\n * * Add points to the polyface.\n * * Indices are added (in reverse order if indicated by the builder state).\n * @param points array of points. This may contain extra points not to be used in the polygon.\n * @param numPointsToUse number of points to use.\n */\n public addPolygon(points: Point3d[], numPointsToUse?: number): void {\n // don't use trailing points that match start point\n if (numPointsToUse === undefined)\n numPointsToUse = points.length;\n while (numPointsToUse > 1 && points[numPointsToUse - 1].isAlmostEqual(points[0]))\n numPointsToUse--;\n let index = 0;\n if (!this._reversed) {\n for (let i = 0; i < numPointsToUse; i++) {\n index = this.addPoint(points[i]);\n this._polyface.addPointIndex(index);\n }\n } else {\n for (let i = numPointsToUse; --i >= 0;) {\n index = this.addPoint(points[i]);\n this._polyface.addPointIndex(index);\n }\n }\n this._polyface.terminateFacet();\n }\n /**\n * Add a polygon to the evolving facets.\n * * Add points to the polyface\n * * Indices are added (in reverse order if indicated by the builder state).\n * * Arrays with 2 or fewer points are ignored.\n * @param points array of points. Trailing closure points are ignored.\n */\n public addPolygonGrowableXYZArray(points: GrowableXYZArray): void {\n // don't use trailing points that match start point\n let numPointsToUse = points.length;\n while (numPointsToUse > 2 && Geometry.isSmallMetricDistance(points.distanceIndexIndex(0, numPointsToUse - 1)!))\n numPointsToUse--;\n // strip trailing duplicates\n while (numPointsToUse > 2 && Geometry.isSmallMetricDistance(points.distanceIndexIndex(numPointsToUse - 2, numPointsToUse - 1)!))\n numPointsToUse--;\n // ignore triangles for which the height is less than smallMetricDistance times length.\n // sum of edge lengths is twice the perimeter. If it is flat that's twice the largest base dimension.\n // cross product magnitude is twice the area.\n if (numPointsToUse === 3) {\n const cross = points.crossProductIndexIndexIndex(0, 1, 2)!;\n const q = cross.magnitude();\n const p = points.distanceIndexIndex(0, 1)! + points.distanceIndexIndex(0, 2)! + points.distanceIndexIndex(1, 2)!;\n if (q < Geometry.smallMetricDistance * p)\n numPointsToUse = 0;\n }\n if (numPointsToUse > 2) {\n let index = 0;\n if (!this._reversed) {\n for (let i = 0; i < numPointsToUse; i++) {\n index = this.findOrAddPointInGrowableXYZArray(points, i)!;\n this._polyface.addPointIndex(index);\n }\n } else {\n for (let i = numPointsToUse; --i >= 0;) {\n index = this.findOrAddPointInGrowableXYZArray(points, i)!;\n this._polyface.addPointIndex(index);\n }\n }\n this._polyface.terminateFacet();\n }\n }\n /**\n * Add a polygon to the evolving facets.\n * * Add points to the polyface.\n * * Compute each point index as the point is added.\n * * All data arrays are parallel to the point array.\n * * Point indices are added in reverse order if indicated by the builder state.\n * @param points array of vertices in order around the facet.\n * @param normals (optional) array of normals, one per vertex.\n * @param params (optional) array of uv-parameters, one per vertex.\n * @param colors (optional) array of colors, one per vertex.\n * @param edgeVisible (optional) array of flags, one per vertex, true iff edge starting at corresponding vertex is visible.\n */\n public addFacetFromGrowableArrays(\n points: GrowableXYZArray,\n normals: GrowableXYZArray | undefined,\n params: GrowableXYArray | undefined,\n colors: number[] | undefined,\n edgeVisible?: boolean[],\n ): void {\n // don't use trailing points that match start point\n let numPointsToUse = points.length;\n while (numPointsToUse > 1 && Geometry.isSmallMetricDistance(points.distanceIndexIndex(0, numPointsToUse - 1)!))\n numPointsToUse--;\n let index = 0;\n if (normals && normals.length < numPointsToUse)\n normals = undefined;\n if (params && params.length < numPointsToUse)\n params = undefined;\n if (colors && colors.length < numPointsToUse)\n colors = undefined;\n if (edgeVisible && edgeVisible.length < numPointsToUse)\n edgeVisible = undefined;\n if (!this._reversed) {\n for (let i = 0; i < numPointsToUse; i++) {\n index = this.findOrAddPointInGrowableXYZArray(points, i)!;\n this._polyface.addPointIndex(index, edgeVisible ? edgeVisible[i] : true);\n if (normals) {\n index = this.findOrAddNormalInGrowableXYZArray(normals, i)!;\n this._polyface.addNormalIndex(index);\n }\n if (params) {\n index = this.addParamInGrowableXYArray(params, i)!;\n this._polyface.addParamIndex(index);\n }\n if (colors) {\n index = this._polyface.addColor(colors[i]);\n this._polyface.addColorIndex(index);\n }\n }\n } else {\n for (let i = numPointsToUse; --i >= 0;) {\n index = this.findOrAddPointInGrowableXYZArray(points, i)!;\n this._polyface.addPointIndex(index);\n if (normals) {\n index = this.findOrAddNormalInGrowableXYZArray(normals, i)!;\n this._polyface.addNormalIndex(index);\n }\n if (params) {\n index = this.addParamInGrowableXYArray(params, i)!;\n this._polyface.addParamIndex(index);\n }\n if (colors) {\n index = this._polyface.addColor(colors[i]);\n this._polyface.addColorIndex(index);\n }\n }\n }\n this._polyface.terminateFacet();\n }\n /**\n * Add the current visitor facet to the evolving polyface.\n * * Indices are added (in reverse order if indicated by the builder state).\n */\n public addFacetFromVisitor(visitor: PolyfaceVisitor): void {\n this.addFacetFromGrowableArrays(visitor.point, visitor.normal, visitor.param, visitor.color, visitor.edgeVisible);\n }\n /** Add all visitor facets to the evolving polyface (in reverse order if indicated by the builder state). */\n public addFacetsFromVisitor(visitor: PolyfaceVisitor): void {\n visitor.reset();\n for (; visitor.moveToNextFacet();)\n this.addFacetFromVisitor(visitor);\n }\n /**\n * Add the subset of visitor data indexed by the indices.\n * * Ideally, the subset represents a sub-facet of the visited facet.\n * @param visitor data for the currently visited facet.\n * @param indices local indices into the visitor data arrays.\n * @returns whether the data was added successfully. Encountering an invalid index returns false.\n */\n public addFacetFromIndexedVisitor(visitor: PolyfaceVisitor, indices: number[]): boolean {\n if (indices.length > visitor.pointIndex.length)\n return false;\n const xyz = new GrowableXYZArray(indices.length);\n const normal = visitor.normal ? new GrowableXYZArray(indices.length) : undefined;\n const param = visitor.param ? new GrowableXYArray(indices.length) : undefined;\n const color = visitor.color ? new Array<number>(indices.length) : undefined;\n const visible = visitor.edgeVisible ? new Array<boolean>(indices.length) : undefined;\n for (let i = 0; i < indices.length; ++i) {\n const index = indices[i];\n if (index < 0 || index >= visitor.point.length) // all visitor arrays have the same length\n return false;\n xyz.pushXYZ(\n visitor.point.getXAtUncheckedPointIndex(index),\n visitor.point.getYAtUncheckedPointIndex(index),\n visitor.point.getZAtUncheckedPointIndex(index),\n );\n if (visitor.normal && normal)\n normal.pushXYZ(\n visitor.normal.getXAtUncheckedPointIndex(index),\n visitor.normal.getYAtUncheckedPointIndex(index),\n visitor.normal.getZAtUncheckedPointIndex(index),\n );\n if (visitor.param && param)\n param.pushXY(\n visitor.param.getXAtUncheckedPointIndex(index),\n visitor.param.getYAtUncheckedPointIndex(index),\n );\n if (visitor.color && color)\n color[i] = visitor.color[index];\n if (visitor.edgeVisible && visible)\n visible[i] = visitor.edgeVisible[index];\n }\n this.addFacetFromGrowableArrays(xyz, normal, param, color, visible);\n return true;\n }\n /** Add a polyface with optional reverse and transform. */\n public addIndexedPolyface(source: IndexedPolyface, reversed: boolean = false, transform?: Transform): void {\n this._polyface.addIndexedPolyface(source, reversed, transform);\n }\n /**\n * Produce a new FacetFaceData for all terminated facets since construction of the previous face.\n * * Each facet number/index is mapped to the FacetFaceData through the faceToFaceData array.\n * @returns true if successful, and false otherwise.\n */\n public endFace(): boolean {\n return this._polyface.setNewFaceData();\n }\n /** Double dispatch handler for Cone. */\n public override handleCone(g: Cone): any {\n return this.addCone(g);\n }\n /** Double dispatch handler for TorusPipe. */\n public override handleTorusPipe(g: TorusPipe): any {\n return this.addTorusPipe(g);\n }\n /** Double dispatch handler for Sphere. */\n public override handleSphere(g: Sphere): any {\n return this.addSphere(g);\n }\n /** Double dispatch handler for Box. */\n public override handleBox(g: Box): any {\n return this.addBox(g);\n }\n /** Double dispatch handler for LinearSweep. */\n public override handleLinearSweep(g: LinearSweep): any {\n return this.addLinearSweep(g);\n }\n /** Double dispatch handler for RotationalSweep. */\n public override handleRotationalSweep(g: RotationalSweep): any {\n return this.addRotationalSweep(g);\n }\n /** Double dispatch handler for RuledSweep. */\n public override handleRuledSweep(g: RuledSweep): any {\n return this.addRuledSweep(g);\n }\n /** Double dispatch handler for Loop. */\n public override handleLoop(g: Loop): any {\n return this.addTriangulatedRegion(g);\n }\n /** Double dispatch handler for ParityRegion. */\n public override handleParityRegion(g: ParityRegion): any {\n return this.addTriangulatedRegion(g);\n }\n /** Double dispatch handler for UnionRegion. */\n public override handleUnionRegion(g: UnionRegion): any {\n return this.addTriangulatedRegion(g);\n }\n /** Add facets for a GeometryQuery object. This is double dispatch through `dispatchToGeometryHandler(this)` */\n public addGeometryQuery(g: GeometryQuery): void {\n g.dispatchToGeometryHandler(this);\n }\n /**\n * Add a graph to the builder.\n * * Visit one node per face.\n * * If `acceptFaceFunction(node)` returns true, pass face coordinates to the builder.\n * * Accepted face edge visibility is determined by `isEdgeVisibleFunction`.\n * * Rely on the builder's compress step to find common vertex coordinates.\n * @param graph faces to add as facets.\n * @param acceptFaceFunction optional test for whether to add a given face. Default: ignore exterior faces.\n * @param isEdgeVisibleFunction optional test for whether to hide an edge. Default: hide interior edges.\n * @internal\n */\n public addGraph(\n graph: HalfEdgeGraph,\n acceptFaceFunction: HalfEdgeToBooleanFunction = (node) => HalfEdge.testNodeMaskNotExterior(node),\n isEdgeVisibleFunction: HalfEdgeToBooleanFunction = (node) => HalfEdge.testMateMaskExterior(node),\n ): void {\n let index = 0;\n const needNormals = this._options.needNormals;\n const needParams = this._options.needParams;\n let normalIndex = 0;\n if (needNormals)\n normalIndex = this._polyface.addNormalXYZ(0, 0, 1); // big assumption!!!! Is each node.z really the same?\n graph.announceFaceLoops(\n (_graph: HalfEdgeGraph, seed: HalfEdge) => {\n if (acceptFaceFunction(seed) && seed.countEdgesAroundFace() > 2) {\n let node = seed;\n do {\n index = this.addPointXYZ(node.x, node.y, node.z);\n this._polyface.addPointIndex(index, isEdgeVisibleFunction === undefined ? true : isEdgeVisibleFunction(node));\n if (needParams) {\n index = this.addParamXY(node.x, node.y); // big assumption!!!!\n this._polyface.addParamIndex(index);\n }\n if (needNormals) {\n this._polyface.addNormalIndex(normalIndex);\n }\n node = node.faceSuccessor;\n } while (node !== seed);\n this._polyface.terminateFacet();\n }\n return true;\n });\n }\n /**\n * Add a graph's faces to the builder.\n * * For each node in `faces`:\n * * Add all of its vertices to the polyface.\n * * Add point indices to form a new facet.\n * * (note: no normal or param indices are added)\n * * Terminate the facet.\n * @internal\n */\n public addGraphFaces(faces: HalfEdge[]): void {\n let index = 0;\n for (const seed of faces) {\n let node = seed;\n do {\n index = this.addPointXYZ(node.x, node.y, node.z);\n this._polyface.addPointIndex(index);\n node = node.faceSuccessor;\n } while (node !== seed);\n this._polyface.terminateFacet();\n }\n }\n /**\n * Create a polyface containing the faces of a HalfEdgeGraph, with test functions to filter faces and hide edges.\n * * This is a static wrapper of [[addGraph]].\n * @param graph faces to add as facets.\n * @param options (optional) options for the polyface.\n * @param acceptFaceFunction optional test for whether to add a given face. Default: ignore exterior faces.\n * @param isEdgeVisibleFunction optional test for whether to hide an edge. Default: hide interior edges.\n * @internal\n */\n public static graphToPolyface(\n graph: HalfEdgeGraph,\n options?: StrokeOptions,\n acceptFaceFunction: HalfEdgeToBooleanFunction = (node) => HalfEdge.testNodeMaskNotExterior(node),\n isEdgeVisibleFunction: HalfEdgeToBooleanFunction = (node) => HalfEdge.testMateMaskExterior(node),\n ): IndexedPolyface {\n const builder = PolyfaceBuilder.create(options);\n builder.addGraph(graph, acceptFaceFunction, isEdgeVisibleFunction);\n builder.endFace();\n return builder.claimPolyface();\n }\n /**\n * Create a polyface containing the faces of a HalfEdgeGraph that are specified by the HalfEdge array.\n * @internal\n */\n public static graphFacesToPolyface(faces: HalfEdge[]): IndexedPolyface {\n const builder = PolyfaceBuilder.create();\n builder.addGraphFaces(faces);\n builder.endFace();\n return builder.claimPolyface();\n }\n /**\n * Create a polyface containing triangles in a (space) polygon.\n * * The polyface contains only coordinate data (no params or normals).\n */\n public static polygonToTriangulatedPolyface(points: Point3d[], localToWorld?: Transform): IndexedPolyface | undefined {\n if (!localToWorld)\n localToWorld = FrameBuilder.createFrameWithCCWPolygon(points);\n if (localToWorld) {\n const localPoints = localToWorld.multiplyInversePoint3dArray(points)!;\n const areaXY = PolygonOps.areaXY(localPoints);\n if (areaXY < 0.0)\n localPoints.reverse();\n const graph = Triangulator.createTriangulatedGraphFromSingleLoop(localPoints);\n if (graph) {\n const polyface = this.graphToPolyface(graph);\n polyface.tryTransformInPlace(localToWorld);\n return polyface;\n }\n }\n return undefined;\n }\n /**\n * Add facets to the builder given arrays of coordinates for multiple facets.\n * * pointArray[i] is an array of 3 or 4 points.\n * * paramArray[i] is an array of matching number of params.\n * * normalArray[i] is an array of matching number of normals.\n * @param pointArray array of arrays of point coordinates.\n * @param paramArray (optional) array of arrays of uv parameters.\n * @param normalArray (optional) array of arrays of normals.\n * @param endFace if true, call this.endFace after adding all the facets.\n */\n public addCoordinateFacets(\n pointArray: Point3d[][], paramArray?: Point2d[][], normalArray?: Vector3d[][], endFace: boolean = false,\n ): void {\n for (let i = 0; i < pointArray.length; i++) {\n const params = paramArray ? paramArray[i] : undefined;\n const normals = normalArray ? normalArray[i] : undefined;\n if (pointArray[i].length === 3)\n this.addTriangleFacet(pointArray[i], params, normals);\n else if (pointArray[i].length === 4)\n this.addQuadFacet(pointArray[i], params, normals);\n }\n if (endFace)\n this.endFace();\n }\n /**\n * Add facets from the parametric surface.\n * * Evaluate `(numU + 1) * (numV + 1)` grid points (in 0..1 in both u and v) on a surface.\n * * Add the facets for `numU * numV` quads.\n * * uv params are the 0..1 fractions.\n * * Normals are cross products of u and v direction partial derivatives.\n * @param surface UV surface to evaluate.\n * @param numU number of intervals (edges) in the u direction (number of points is `numU + 1`).\n * @param numV number of intervals (edges) in the v direction (number of points is `numV + 1`).\n * @param uMap optional mapping from u fraction to parameter space (such as texture).\n * @param vMap optional mapping from v fraction to parameter space (such as texture).\n */\n public addUVGridBody(surface: UVSurface, numU: number, numV: number, uMap?: Segment1d, vMap?: Segment1d): void {\n let xyzIndex0 = new GrowableFloat64Array(numU);\n let xyzIndex1 = new GrowableFloat64Array(numU);\n let paramIndex0: GrowableFloat64Array | undefined;\n let paramIndex1: GrowableFloat64Array | undefined;\n let normalIndex0: GrowableFloat64Array | undefined;\n let normalIndex1: GrowableFloat64Array | undefined;\n const reverse = this._reversed;\n const needNormals = this.options.needNormals;\n if (needNormals) {\n normalIndex0 = new GrowableFloat64Array(numU);\n normalIndex1 = new GrowableFloat64Array(numU);\n }\n const needParams = this.options.needParams;\n if (needParams) {\n paramIndex0 = new GrowableFloat64Array(numU);\n paramIndex1 = new GrowableFloat64Array(numU);\n }\n let indexSwap;\n xyzIndex0.ensureCapacity(numU);\n xyzIndex1.ensureCapacity(numU);\n const uv = Point2d.create();\n const normal = Vector3d.create();\n const du = 1.0 / numU;\n const dv = 1.0 / numV;\n const plane = Plane3dByOriginAndVectors.createXYPlane();\n for (let v = 0; v <= numV; v++) {\n // evaluate new points\n xyzIndex1.clear();\n if (needNormals)\n normalIndex1!.clear();\n if (needParams)\n paramIndex1!.clear();\n for (let u = 0; u <= numU; u++) {\n const uFrac = u * du;\n const vFrac = v * dv;\n surface.uvFractionToPointAndTangents(uFrac, vFrac, plane);\n xyzIndex1.push(this._polyface.addPoint(plane.origin));\n if (needNormals) {\n plane.vectorU.crossProduct(plane.vectorV, normal);\n normal.normalizeInPlace();\n if (reverse)\n normal.scaleInPlace(-1.0);\n normalIndex1!.push(this._polyface.addNormal(normal));\n }\n if (needParams)\n paramIndex1!.push(\n this._polyface.addParam(\n Point2d.create(uMap ? uMap.fractionToPoint(uFrac) : uFrac, vMap ? vMap.fractionToPoint(vFrac) : vFrac, uv),\n ),\n );\n }\n if (v > 0) {\n for (let u = 0; u < numU; u++) {\n if (!this._options.shouldTriangulate) {\n this.addIndexedQuadPointIndexes(\n xyzIndex0.atUncheckedIndex(u), xyzIndex0.atUncheckedIndex(u + 1),\n xyzIndex1.atUncheckedIndex(u), xyzIndex1.atUncheckedIndex(u + 1),\n false,\n );\n if (needNormals)\n this.addIndexedQuadNormalIndexes(\n normalIndex0!.atUncheckedIndex(u), normalIndex0!.atUncheckedIndex(u + 1),\n normalIndex1!.atUncheckedIndex(u), normalIndex1!.atUncheckedIndex(u + 1),\n );\n if (needParams)\n this.addIndexedQuadParamIndexes(\n paramIndex0!.atUncheckedIndex(u), paramIndex0!.atUncheckedIndex(u + 1),\n paramIndex1!.atUncheckedIndex(u), paramIndex1!.atUncheckedIndex(u + 1),\n );\n this._polyface.terminateFacet();\n } else {\n this.addIndexedTrianglePointIndexes(\n xyzIndex0.atUncheckedIndex(u), xyzIndex0.atUncheckedIndex(u + 1),\n xyzIndex1.atUncheckedIndex(u), false);\n if (needNormals)\n this.addIndexedTriangleNormalIndexes(\n normalIndex0!.atUncheckedIndex(u), normalIndex0!.atUncheckedIndex(u + 1),\n normalIndex1!.atUncheckedIndex(u),\n );\n if (needParams)\n this.addIndexedTriangleParamIndexes(\n paramIndex0!.atUncheckedIndex(u), paramIndex0!.atUncheckedIndex(u + 1),\n paramIndex1!.atUncheckedIndex(u),\n );\n this._polyface.terminateFacet();\n this.addIndexedTrianglePointIndexes(\n xyzIndex1.atUncheckedIndex(u),\n xyzIndex0.atUncheckedIndex(u + 1),\n xyzIndex1.atUncheckedIndex(u + 1),\n false,\n );\n if (needNormals)\n this.addIndexedTriangleNormalIndexes(\n normalIndex1!.atUncheckedIndex(u),\n normalIndex0!.atUncheckedIndex(u + 1),\n normalIndex1!.atUncheckedIndex(u + 1),\n );\n if (needParams)\n this.addIndexedTriangleParamIndexes(\n paramIndex1!.atUncheckedIndex(u),\n paramIndex0!.atUncheckedIndex(u + 1),\n paramIndex1!.atUncheckedIndex(u + 1),\n );\n this._polyface.terminateFacet();\n }\n }\n }\n indexSwap = xyzIndex1; xyzIndex1 = xyzIndex0; xyzIndex0 = indexSwap;\n if (needParams)\n indexSwap = paramIndex1; paramIndex1 = paramIndex0; paramIndex0 = indexSwap;\n if (needNormals)\n indexSwap = normalIndex1; normalIndex1 = normalIndex0; normalIndex0 = indexSwap;\n }\n xyzIndex0.clear();\n xyzIndex1.clear();\n }\n /**\n * Create a polyface from a triangulation of the points.\n * * The triangulation is computed as seen in the top view: z-coordinates are ignored.\n * * The highest z-coordinate is preserved for points that are separated by a vertical distance.\n * @param points an array of points.\n * @param options (optional) stroke options:\n * * `options.chordTol`: xy-distance for equating points. For DTM points, 1-2mm may suffice. Default value is\n * `Geometry.smallMetricDistance`.\n * * `options.needNormals`: whether to assign 001 to all facets (rarely useful).\n * * `options.needParams`: whether to assign all vertices uv-parameters equal to their xy-coordinates (rarely useful).\n * @returns triangulated polyface or `undefined` if triangulation was not possible.\n */\n public static pointsToTriangulatedPolyface(points: Point3d[], options?: StrokeOptions): IndexedPolyface | undefined {\n const graph = Triangulator.createTriangulatedGraphFromPoints(points, InsertedVertexZOptions.ReplaceIfLarger, options?.chordTol);\n if (graph)\n return PolyfaceBuilder.graphToPolyface(graph, options);\n return undefined;\n }\n /**\n * Add triangular facets between two linestrings.\n * * Each triangle will have 1 vertex on one of the linestrings and 2 on the other.\n * * Choice of triangles is heuristic, hence does not have a unique solution.\n * * Logic for choosing among the various possible triangles prefers:\n * * Make near-coplanar facets.\n * * Make facets with good aspect ratio.\n * * This is exercised with a limited number of lookahead points, i.e. greedy to make first-available decision.\n * @param pointsA points of first linestring.\n * @param pointsB points of second linestring.\n */\n public addGreedyTriangulationBetweenLineStrings(\n pointsA: Point3d[] | LineString3d | IndexedXYZCollection, pointsB: Point3d[] | LineString3d | IndexedXYZCollection,\n ): void {\n const context = GreedyTriangulationBetweenLineStrings.createContext();\n context.emitTriangles(\n resolveToIndexedXYZCollectionOrCarrier(pointsA),\n resolveToIndexedXYZCollectionOrCarrier(pointsB),\n (triangle: BarycentricTriangle) => { this.addTriangleFacet(triangle.points); },\n );\n }\n /**\n * Add quad facets along a mitered pipe that follows a centerline curve.\n * * At the end of each pipe segment, the pipe is mitered by the plane that bisects the angle between successive\n * centerline segments.\n * * Circular or elliptical pipe cross sections can be specified by supplying either a radius, a pair of semi-axis\n * lengths, or an Arc3d:\n * * For semi-axis length input, x and y correspond to ellipse local axes perpendicular to each other and to the\n * start tangent.\n * * For Arc3d input, the center is translated to the centerline start point. For best results, ensure this arc\n * is perpendicular to the centerline start tangent.\n * * This function internally calls [[CurveFactory.createMiteredSweepSections]], passing in the `startTangent`\n * option to preserve the rotation of Arc3d-type `sectionData`.\n * @param centerline centerline of pipe. If curved, it will be stroked using the builder's StrokeOptions, otherwise\n * for best results, ensure no successive duplicate points with e.g., [[GrowableXYZArray.createCompressed]].\n * @param sectionData circle radius, ellipse semi-axis lengths, or Arc3d.\n * @param numFacetAround how many equal parameter-space chords around each section.\n * @param capped if `true`, add a cap at each end of the pipe; defaults to `false`.\n */\n public addMiteredPipes(\n centerline: IndexedXYZCollection | Point3d[] | CurvePrimitive,\n sectionData: number | XAndY | Arc3d,\n numFacetAround: number = 12,\n capped: boolean = false,\n ): void {\n const arc = CurveFactory.createArcFromSectionData(centerline, sectionData);\n if (!arc)\n return;\n if (numFacetAround < 3)\n numFacetAround = 3;\n const section = LineString3d.create();\n section.appendFractionalStrokePoints(arc, numFacetAround, 0.0, 1.0, true);\n const strokeOptions = this._options.clone();\n const outputSelect = MiteredSweepOutputSelect.AlsoMesh;\n const startTangent = sectionData instanceof Arc3d ? arc.binormalVector() : undefined; // preserve arc orientation\n const options = { strokeOptions, capped, outputSelect, startTangent };\n const sections = CurveFactory.createMiteredSweepSections(centerline, section, options);\n if (sections && sections.mesh)\n this.addIndexedPolyface(sections.mesh);\n }\n /** Return the polyface index array indices corresponding to the given edge, or `undefined` if error. */\n private getEdgeIndices(edge: SortableEdge): { edgeIndexA: number, edgeIndexB: number } | undefined {\n let indexA = -1; let indexB = -1;\n for (let i = this._polyface.facetIndex0(edge.facetIndex); i < this._polyface.facetIndex1(edge.facetIndex); ++i) {\n if (edge.startVertex === this._polyface.data.pointIndex[i])\n indexA = i;\n else if (edge.endVertex === this._polyface.data.pointIndex[i])\n indexB = i;\n }\n return (indexA < 0 || indexB < 0) ? undefined : { edgeIndexA: indexA, edgeIndexB: indexB };\n }\n /**\n * Create a side face between base and swept facets along a base boundary edge.\n * * Assumes numBaseFacets base facets were added to this builder, immediately followed by the same number of swept\n * facets with opposite orientation (first index not preserved).\n */\n private addSweptFace(baseBoundaryEdge: SortableEdge, numBaseFacets: number): boolean {\n const edge = this.getEdgeIndices(baseBoundaryEdge);\n if (undefined === edge)\n return false;\n const sweptFacetIndex = numBaseFacets + baseBoundaryEdge.facetIndex;\n if (!this._polyface.isValidFacetIndex(sweptFacetIndex))\n return false;\n const numBaseFacetEdges = this._polyface.numEdgeInFacet(baseBoundaryEdge.facetIndex);\n if (numBaseFacetEdges !== this._polyface.numEdgeInFacet(sweptFacetIndex))\n return false;\n // generate indices into the polyface index arrays\n const baseFacetIndexStart = this._polyface.facetIndex0(baseBoundaryEdge.facetIndex);\n const sweptFacetIndexStart = this._polyface.facetIndex0(sweptFacetIndex);\n const edgeIndexOffsetInFaceLoopA = edge.edgeIndexA - baseFacetIndexStart;\n const edgeIndexOffsetInFaceLoopB = edge.edgeIndexB - baseFacetIndexStart;\n const sweptEdgeIndexOffsetInFaceLoopA = (numBaseFacetEdges - 1) - edgeIndexOffsetInFaceLoopA;\n const sweptEdgeIndexOffsetInFaceLoopB = (numBaseFacetEdges - 1) - edgeIndexOffsetInFaceLoopB;\n const indices = [\n edge.edgeIndexB,\n edge.edgeIndexA,\n sweptFacetIndexStart + sweptEdgeIndexOffsetInFaceLoopA,\n sweptFacetIndexStart + sweptEdgeIndexOffsetInFaceLoopB,\n ];\n const vertices: Point3d[] = [];\n let colors: number[] | undefined; // try to re-use colors; missing normals and params will be computed if needed\n if (undefined !== this.options.needColors && undefined !== this._polyface.data.color && undefined !== this._polyface.data.colorIndex)\n colors = [];\n for (let i = 0; i < 4; ++i) {\n const xyz = this._polyface.data.getPoint(this._polyface.data.pointIndex[indices[i]]);\n if (undefined === xyz)\n return false;\n vertices.push(xyz);\n if (undefined !== colors) {\n const color = this._polyface.data.getColor(this._polyface.data.colorIndex![indices[i]]);\n if (undefined === color)\n return false;\n colors.push(color);\n }\n }\n this.addQuadFacet(vertices, undefined, undefined, colors);\n return true;\n }\n /**\n * Add facets from the source polyface, from its translation along the vector, and from its swept boundary edges,\n * to form a polyface that encloses a volume.\n * @param source the surface mesh to sweep.\n * @param sweepVector the direction and length to sweep the surface mesh.\n * @param triangulateSides whether to triangulate side facets, or leave as quads.\n * @returns whether the added facets comprise a simple sweep. If false, the resulting mesh may have self-intersections,\n * be non-manifold, have inconsistently oriented facets, etc.\n */\n public addSweptIndexedPolyface(\n source: IndexedPolyface, sweepVector: Vector3d, triangulateSides: boolean = false,\n ): boolean {\n let isSimpleSweep = true;\n const totalProjectedArea = PolyfaceQuery.sumFacetAreas(source, sweepVector);\n if (Geometry.isAlmostEqualNumber(0.0, totalProjectedArea))\n isSimpleSweep = false;\n const partitionedIndices = PolyfaceQuery.partitionFacetIndicesByVisibilityVector(\n source, sweepVector, Angle.createDegrees(1.0e-3),\n );\n const numForwardFacets = partitionedIndices[0].length;\n const numBackwardFacets = partitionedIndices[1].length;\n const numSideFacets = partitionedIndices[2].length;\n if (numSideFacets > 0)\n isSimpleSweep = false;\n if (numForwardFacets > 0 && numBackwardFacets > 0)\n isSimpleSweep = false;\n // add base and swept facets with opposite orientations\n const reverseBase = numForwardFacets > 0;\n const firstBaseFacet = this._polyface.facetCount;\n this.addIndexedPolyface(source, reverseBase);\n const firstSweptFacet = this._polyface.facetCount;\n this.addIndexedPolyface(source, !reverseBase, Transform.createTranslation(sweepVector));\n // collect base edges added to the builder, and extract boundary\n const numBaseFacets = firstSweptFacet - firstBaseFacet;\n const baseFacetIndices = Array.from({ length: numBaseFacets }, (_, i) => firstBaseFacet + i);\n const baseFacetVisitor = IndexedPolyfaceSubsetVisitor.createSubsetVisitor(this._polyface, baseFacetIndices, 1);\n const baseEdges = PolyfaceQuery.createIndexedEdges(baseFacetVisitor);\n const baseBoundaryEdges: SortableEdgeCluster[] = [];\n baseEdges.sortAndCollectClusters(undefined, baseBoundaryEdges, undefined, undefined);\n // add a side face per boundary edge\n const oldShouldTriangulate = this._options.shouldTriangulate;\n this._options.shouldTriangulate = triangulateSides;\n for (const edgeOrCluster of baseBoundaryEdges) {\n if (edgeOrCluster instanceof SortableEdge)\n this.addSweptFace(edgeOrCluster, numBaseFacets);\n else if (Array.isArray(edgeOrCluster))\n for (const edge of edgeOrCluster)\n this.addSweptFace(edge, numBaseFacets);\n }\n this._options.shouldTriangulate = oldShouldTriangulate;\n return isSimpleSweep;\n }\n}\nfunction resolveToIndexedXYZCollectionOrCarrier(points: Point3d[] | LineString3d | IndexedXYZCollection): IndexedXYZCollection {\n if (Array.isArray(points))\n return new Point3dArrayCarrier(points);\n if (points instanceof LineString3d)\n return points.packedPoints;\n return points;\n}\nfunction distinctIndices(i0: number, i1: number, i2: number): boolean {\n return i0 !== i1 && i1 !== i2 && i2 !== i0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PolyfaceBuilder.js","sourceRoot":"","sources":["../../../src/polyface/PolyfaceBuilder.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\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { ConstructCurveBetweenCurves } from \"../curve/ConstructCurveBetweenCurves\";\r\nimport { CurveChain, CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurveFactory, MiteredSweepOutputSelect } from \"../curve/CurveFactory\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { AnyCurve, AnyRegion } from \"../curve/CurveTypes\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { ParityRegion } from \"../curve/ParityRegion\";\r\nimport { CylindricalRangeQuery } from \"../curve/Query/CylindricalRange\";\r\nimport { StrokeCountSection } from \"../curve/Query/StrokeCountChain\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { UnionRegion } from \"../curve/UnionRegion\";\r\nimport { AxisOrder, Geometry } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { BarycentricTriangle } from \"../geometry3d/BarycentricTriangle\";\r\nimport { BilinearPatch } from \"../geometry3d/BilinearPatch\";\r\nimport { FrameBuilder } from \"../geometry3d/FrameBuilder\";\r\nimport { NullGeometryHandler, UVSurface } from \"../geometry3d/GeometryHandler\";\r\nimport { GrowableFloat64Array } from \"../geometry3d/GrowableFloat64Array\";\r\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\r\nimport { Point3d, Vector3d, XYZ } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\r\nimport { Segment1d } from \"../geometry3d/Segment1d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { UVSurfaceOps } from \"../geometry3d/UVSurfaceOps\";\r\nimport { XAndY } from \"../geometry3d/XYZProps\";\r\nimport { Box } from \"../solid/Box\";\r\nimport { Cone } from \"../solid/Cone\";\r\nimport { LinearSweep } from \"../solid/LinearSweep\";\r\nimport { RotationalSweep } from \"../solid/RotationalSweep\";\r\nimport { RuledSweep } from \"../solid/RuledSweep\";\r\nimport { Sphere } from \"../solid/Sphere\";\r\nimport { SweepContour } from \"../solid/SweepContour\";\r\nimport { TorusPipe } from \"../solid/TorusPipe\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask, HalfEdgeToBooleanFunction } from \"../topology/Graph\";\r\nimport { InsertedVertexZOptions } from \"../topology/InsertAndRetriangulateContext\";\r\nimport { Triangulator } from \"../topology/Triangulation\";\r\nimport { BoxTopology } from \"./BoxTopology\";\r\nimport { FacetLocationDetail } from \"./FacetLocationDetail\";\r\nimport { GreedyTriangulationBetweenLineStrings } from \"./GreedyTriangulationBetweenLineStrings\";\r\nimport { SortableEdge, SortableEdgeCluster } from \"./IndexedEdgeMatcher\";\r\nimport { IndexedPolyfaceSubsetVisitor } from \"./IndexedPolyfaceVisitor\";\r\nimport { IndexedPolyface, PolyfaceVisitor } from \"./Polyface\";\r\nimport { PolyfaceQuery } from \"./PolyfaceQuery\";\r\nimport { PolyfaceRangeTreeContext } from \"./RangeTree/PolyfaceRangeTreeContext\";\r\n\r\n/**\r\n * A FacetSector.\r\n * * Initially holds coordinate data for a place where xyz and sectionDerivative are known.\r\n * * Normal is computed as a deferred step using an edge to adjacent place on ruled surface.\r\n * * Indices are set up even later.\r\n */\r\nclass FacetSector {\r\n public xyz: Point3d;\r\n public xyzIndex: number;\r\n public normal?: Vector3d;\r\n public normalIndex: number;\r\n public uv?: Point2d;\r\n public uvIndex: number;\r\n public sectionDerivative?: Vector3d;\r\n public constructor(needNormal: boolean = false, needUV: boolean = false, needSectionDerivative: boolean = false) {\r\n this.xyz = Point3d.create();\r\n this.normalIndex = -1;\r\n this.uvIndex = -1;\r\n this.xyzIndex = -1;\r\n if (needNormal) {\r\n this.normal = Vector3d.create();\r\n }\r\n if (needUV) {\r\n this.uv = Point2d.create();\r\n this.uvIndex = -1;\r\n }\r\n if (needSectionDerivative) {\r\n this.sectionDerivative = Vector3d.create();\r\n }\r\n }\r\n /**\r\n * Copy contents (not pointers) from `other`.\r\n * * ASSUME all fields defined in the instance are defined in `other`.\r\n */\r\n public copyContentsFrom(other: FacetSector) {\r\n this.xyz.setFromPoint3d(other.xyz);\r\n this.xyzIndex = other.xyzIndex;\r\n if (this.normal)\r\n this.normal.setFromVector3d(other.normal);\r\n this.normalIndex = other.normalIndex;\r\n if (this.uv)\r\n this.uv.setFrom(other.uv);\r\n this.uvIndex = other.uvIndex;\r\n if (this.sectionDerivative)\r\n this.sectionDerivative.setFrom(other.sectionDerivative);\r\n }\r\n /**\r\n * Access xyz, derivative from given arrays.\r\n * * ASSUME corresponding defined conditions.\r\n * * xyz and derivative are set.\r\n * * Index fields for updated data are cleared to -1.\r\n */\r\n public loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(\r\n i: number,\r\n packedXYZ: GrowableXYZArray,\r\n packedDerivatives?: GrowableXYZArray,\r\n fractions?: GrowableFloat64Array,\r\n v?: number,\r\n ): void {\r\n packedXYZ.getPoint3dAtCheckedPointIndex(i, this.xyz);\r\n if (this.uv && fractions && v !== undefined)\r\n this.uv.set(fractions.atUncheckedIndex(i), v);\r\n this.xyzIndex = -1;\r\n this.normalIndex = -1;\r\n this.uvIndex = -1;\r\n if (this.sectionDerivative !== undefined && packedDerivatives !== undefined)\r\n packedDerivatives.getVector3dAtCheckedVectorIndex(i, this.sectionDerivative);\r\n }\r\n private static suppressSmallUnitVectorComponents(uvw: XYZ): void {\r\n const tol = Geometry.smallFloatingPoint;\r\n if (Math.abs(uvw.x) < tol)\r\n uvw.x = 0.0;\r\n if (Math.abs(uvw.y) < tol)\r\n uvw.y = 0.0;\r\n if (Math.abs(uvw.z) < tol)\r\n uvw.z = 0.0;\r\n }\r\n private static _edgeVector: Vector3d = Vector3d.create();\r\n /**\r\n * Given two sectors with xyz and sectionDerivative (u derivative), use the edge from A to B as v direction\r\n * in-surface derivative. Compute cross products (and normalize).\r\n * @param sectorA \"lower\" sector.\r\n * @param sectorB \"upper\" sector.\r\n */\r\n public static computeNormalsAlongRuleLine(sectorA: FacetSector, sectorB: FacetSector) {\r\n // We expect that if a sector's sectionDerivative is defined, then so is its normal. If a normal is undefined, the\r\n // crossProduct returns an object that goes unused---not good, but the garbage collector will clean it up.\r\n if (sectorA.sectionDerivative && sectorB.sectionDerivative) {\r\n const vectorAB = FacetSector._edgeVector;\r\n Vector3d.createStartEnd(sectorA.xyz, sectorB.xyz, vectorAB);\r\n sectorA.sectionDerivative.crossProduct(vectorAB, sectorA.normal);\r\n sectorB.sectionDerivative.crossProduct(vectorAB, sectorB.normal);\r\n sectorA.normal!.normalizeInPlace();\r\n sectorB.normal!.normalizeInPlace();\r\n FacetSector.suppressSmallUnitVectorComponents(sectorA.normal!);\r\n FacetSector.suppressSmallUnitVectorComponents(sectorB.normal!);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * * Simple construction for strongly typed GeometryQuery objects:\r\n *\r\n * * Create a builder with `builder = PolyfaceBuilder.create()`\r\n * * Add GeometryQuery objects:\r\n * * `builder.addGeometryQuery(g: GeometryQuery)`\r\n * * `builder.addCone(cone: Cone)`\r\n * * `builder.addTorusPipe(surface: TorusPipe)`\r\n * * `builder.addLinearSweepLineStringsXYZOnly(surface: LinearSweep)`\r\n * * `builder.addRotationalSweep(surface: RotationalSweep)`\r\n * * `builder.addLinearSweep(surface: LinearSweep)`\r\n * * `builder.addRuledSweep(surface: RuledSweep)`\r\n * * `builder.addSphere(sphere: Sphere)`\r\n * * `builder.addBox(box: Box)`\r\n * * `builder.addIndexedPolyface(polyface)`\r\n * * Extract with `builder.claimPolyface(true)`\r\n *\r\n * * Simple construction for ephemeral constructive data:\r\n *\r\n * * Create a builder with `builder = PolyfaceBuilder.create()`\r\n * * Add from fragmentary data:\r\n * * `builder.addBetweenLineStringsWithStoredIndices(linestringA linestringB)`\r\n * * `builder.addBetweenLineStringsWithRuleEdgeNormals(linestringA, vA, linestringB, vB, addClosure)`\r\n * * `builder.addBetweenTransformedLineStrings(curves, transformA, transformB, addClosure)`\r\n * * `builder.addLinearSweepLineStringsXYZOnly(contour, vector)`\r\n * * `builder.addPolygon(points, numPointsToUse)`\r\n * * `builder.addTransformedUnitBox(transform)`\r\n * * `builder.addTriangleFan(conePoint, linestring, toggleOrientation)`\r\n * * `builder.addTrianglesInUncheckedConvexPolygon(linestring, toggle)`\r\n * * `builder.addUVGridBody(surface,numU, numV, createFanInCaps)`\r\n * * `builder.addGraph(Graph, acceptFaceFunction)`\r\n * * Extract with `builder.claimPolyface(true)`\r\n *\r\n * * Low-level detail construction -- direct use of indices:\r\n *\r\n * * Create a builder with `builder = PolyfaceBuilder.create()`\r\n * * Add GeometryQuery objects\r\n * * `builder.addPoint(point)`\r\n * * `builder.findOrAddPointInLineString(linestring, index)`\r\n * * `builder.addPointXYZ(x,y,z)`\r\n * * `builder.addTriangleFacet(points)`\r\n * * `builder.addQuadFacet(points)`\r\n * @public\r\n */\r\nexport class PolyfaceBuilder extends NullGeometryHandler {\r\n private _polyface: IndexedPolyface;\r\n private _options: StrokeOptions;\r\n /** Return (pointer to) the `StrokeOptions` in use by the builder. */\r\n public get options(): StrokeOptions {\r\n return this._options;\r\n }\r\n /** State data that affects the current construction. **/\r\n private _reversed: boolean;\r\n /** Ask if this builder is reversing vertex order as loops are received. */\r\n public get reversedFlag(): boolean {\r\n return this._reversed;\r\n }\r\n /**\r\n * Extract the polyface.\r\n * @param compress whether to cluster vertices (default `true`).\r\n * @param tolerance compression tolerance (default `Geometry.smallMetricDistance`).\r\n */\r\n public claimPolyface(compress: boolean = true, tolerance: number = Geometry.smallMetricDistance): IndexedPolyface {\r\n if (compress)\r\n this._polyface.data.compress(tolerance);\r\n return this._polyface;\r\n }\r\n /** Toggle (reverse) the flag controlling orientation flips for newly added facets. */\r\n public toggleReversedFacetFlag() {\r\n this._reversed = !this._reversed;\r\n }\r\n private constructor(options?: StrokeOptions) {\r\n super();\r\n this._options = options ? options : StrokeOptions.createForFacets();\r\n this._polyface = IndexedPolyface.create(\r\n this._options.needNormals, this._options.needParams, this._options.needColors, this._options.needTwoSided,\r\n );\r\n this._reversed = false;\r\n }\r\n /**\r\n * Create a builder with given StrokeOptions.\r\n * @param options StrokeOptions (captured).\r\n */\r\n public static create(options?: StrokeOptions): PolyfaceBuilder {\r\n return new PolyfaceBuilder(options);\r\n }\r\n /** Add facets for a transformed unit box. */\r\n public addTransformedUnitBox(transform: Transform) {\r\n this.addTransformedRangeMesh(transform, Range3d.createXYZXYZ(0, 0, 0, 1, 1, 1));\r\n }\r\n /**\r\n * Add facets for a transformed range box.\r\n * * For best results, the transformed range corners should define a nonzero volume or area.\r\n * @param transform applied to the range points before adding to the polyface.\r\n * @param range sides become 6 quad polyface facets.\r\n * @param faceSelector for each face in the order of `BoxTopology.cornerIndexCCW`, `faceSelector[i] === false` skips\r\n * that facet.\r\n */\r\n public addTransformedRangeMesh(transform: Transform, range: Range3d, faceSelector?: boolean[]): void {\r\n const pointIndex0 = this._polyface.data.pointCount;\r\n // these will have sequential indices starting at pointIndex0\r\n const points = range.corners();\r\n for (const p of points)\r\n this._polyface.addPoint(transform.multiplyPoint3d(p));\r\n let faceCounter = 0;\r\n for (const facet of BoxTopology.cornerIndexCCW) {\r\n if (!faceSelector || (faceCounter < faceSelector.length && faceSelector[faceCounter])) {\r\n const myFacet = facet.map((pointIndex) => pointIndex + pointIndex0);\r\n if (this._reversed)\r\n myFacet.reverse();\r\n if (this._options.shouldTriangulate) {\r\n this.addIndexedTrianglePointIndexes(myFacet[0], myFacet[1], myFacet[2], false);\r\n this.addIndexedTrianglePointIndexes(myFacet[0], myFacet[2], myFacet[3], false);\r\n } else {\r\n this.addIndexedQuadPointIndexes(myFacet[0], myFacet[1], myFacet[3], myFacet[2], false);\r\n }\r\n this._polyface.terminateFacet();\r\n }\r\n faceCounter++;\r\n }\r\n }\r\n /**\r\n * Add triangles from `conePoint` to each far edge.\r\n * @param conePoint the common vertex of all triangles.\r\n * @param ls linestring with point coordinates.\r\n * @param toggle if `true`, wrap the triangle creation in toggleReversedFacetFlag.\r\n */\r\n public addTriangleFan(conePoint: Point3d, ls: LineString3d, toggle: boolean): void {\r\n const n = ls.numPoints();\r\n if (n > 2) {\r\n if (toggle)\r\n this.toggleReversedFacetFlag();\r\n const index0 = this.addPoint(conePoint);\r\n let index1 = this.findOrAddPointInLineString(ls, 0)!;\r\n let index2 = 0;\r\n for (let i = 1; i < n; i++) {\r\n index2 = this.findOrAddPointInLineString(ls, i)!;\r\n this.addIndexedTrianglePointIndexes(index0, index1, index2);\r\n index1 = index2;\r\n }\r\n if (toggle)\r\n this.toggleReversedFacetFlag();\r\n }\r\n }\r\n /**\r\n * Add triangles from the first point of the linestring to the subsequent edges of the linestring.\r\n * * No checks are made for polygon convexity or edge colinearity, conditions which would ensure positive area triangles.\r\n * @param ls linestring with point coordinates.\r\n * @param reverse if `true`, wrap the triangle creation in toggleReversedFacetFlag.\r\n */\r\n public addTrianglesInUncheckedConvexPolygon(ls: LineString3d, toggle: boolean): void {\r\n const n = ls.numPoints();\r\n if (n > 2) {\r\n if (toggle)\r\n this.toggleReversedFacetFlag();\r\n let normal;\r\n let normalIndex;\r\n if (this._options.needNormals) {\r\n normal = ls.quickUnitNormal(PolyfaceBuilder._workVectorFindOrAdd)!;\r\n if (toggle)\r\n normal.scaleInPlace(-1.0);\r\n normalIndex = this._polyface.addNormal(normal);\r\n }\r\n const needParams = this._options.needParams;\r\n const packedUV = needParams ? ls.packedUVParams : undefined;\r\n let paramIndex0 = -1;\r\n let paramIndex1 = -1;\r\n let paramIndex2 = -1;\r\n if (packedUV) {\r\n paramIndex0 = this.addParamInGrowableXYArray(packedUV, 0)!;\r\n paramIndex1 = this.addParamInGrowableXYArray(packedUV, 1)!;\r\n }\r\n const pointIndex0 = this.findOrAddPointInLineString(ls, 0)!;\r\n let pointIndex1 = this.findOrAddPointInLineString(ls, 1)!;\r\n let pointIndex2 = 0;\r\n let numEdge = n;\r\n if (ls.isPhysicallyClosed)\r\n numEdge--;\r\n for (let i = 2; i < numEdge; i++, pointIndex1 = pointIndex2, paramIndex1 = paramIndex2) {\r\n pointIndex2 = this.findOrAddPointInLineString(ls, i)!;\r\n this.addIndexedTrianglePointIndexes(pointIndex0, pointIndex1, pointIndex2, false);\r\n if (normalIndex !== undefined)\r\n this.addIndexedTriangleNormalIndexes(normalIndex, normalIndex, normalIndex);\r\n if (packedUV) {\r\n paramIndex2 = this.addParamInGrowableXYArray(packedUV, i)!;\r\n this.addIndexedTriangleParamIndexes(paramIndex0, paramIndex1, paramIndex2);\r\n }\r\n this._polyface.terminateFacet();\r\n }\r\n if (toggle)\r\n this.toggleReversedFacetFlag();\r\n }\r\n }\r\n /** Add a point to the polyface. */\r\n public addPoint(xyz: Point3d): number {\r\n return this._polyface.addPoint(xyz);\r\n }\r\n /** Add a uv parameter to the polyface. */\r\n public addParamXY(x: number, y: number): number {\r\n return this._polyface.addParamUV(x, y);\r\n }\r\n private static _workPointFindOrAddA = Point3d.create();\r\n private static _workVectorFindOrAdd = Vector3d.create();\r\n private static _workUVFindOrAdd = Point2d.create();\r\n /**\r\n * Add a point to the polyface. The implementation is free to either create a new point or return the index of a\r\n * prior point with the same coordinates.\r\n * @param ls the linestring.\r\n * @param index index of the point in the linestring.\r\n * @param transform (optional) transform to be applied.\r\n * @param priorIndex (optional) index of a prior point to check for possible duplicate value.\r\n * @returns the point index in the polyface.\r\n */\r\n public findOrAddPointInLineString(\r\n ls: LineString3d, index: number, transform?: Transform, priorIndex?: number,\r\n ): number | undefined {\r\n const q = ls.pointAt(index, PolyfaceBuilder._workPointFindOrAddA);\r\n if (q) {\r\n if (transform)\r\n transform.multiplyPoint3d(q, q);\r\n return this._polyface.addPoint(q, priorIndex);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Add a point to the polyface. The implementation is free to either create a new point or return the index of a\r\n * prior point with the same coordinates.\r\n * @param xyz the array of points.\r\n * @param index index of the point in the array.\r\n * @param transform (optional) transform to be applied.\r\n * @param priorIndex (optional) index of a prior point to check for possible duplicate value.\r\n * @returns the point index in the polyface.\r\n */\r\n public findOrAddPointInGrowableXYZArray(\r\n xyz: GrowableXYZArray, index: number, transform?: Transform, priorIndex?: number,\r\n ): number | undefined {\r\n const q = xyz.getPoint3dAtCheckedPointIndex(index, PolyfaceBuilder._workPointFindOrAddA);\r\n if (q) {\r\n if (transform)\r\n transform.multiplyPoint3d(q, q);\r\n return this._polyface.addPoint(q, priorIndex);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Add a normal to the polyface. The implementation is free to either create a new normal or return the index of a\r\n * prior normal with the same coordinates.\r\n * @param xyz the array of normals.\r\n * @param index index of the normal in the array.\r\n * @param transform (optional) transform to be applied.\r\n * @param priorIndex (optional) index of a prior point to check for possible duplicate value.\r\n * @returns the normal index in the polyface.\r\n */\r\n public findOrAddNormalInGrowableXYZArray(\r\n xyz: GrowableXYZArray, index: number, transform?: Transform, priorIndex?: number,\r\n ): number | undefined {\r\n const q = xyz.getVector3dAtCheckedVectorIndex(index, PolyfaceBuilder._workVectorFindOrAdd);\r\n if (q) {\r\n if (transform)\r\n transform.multiplyVector(q, q);\r\n return this._polyface.addNormal(q, priorIndex);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Add a uv parameter to the polyface.\r\n * @param data the array of uv data.\r\n * @param index index of the param in the array.\r\n * @returns the uv parameter index in the polyface.\r\n */\r\n public addParamInGrowableXYArray(data: GrowableXYArray, index: number): number | undefined {\r\n if (!data)\r\n return undefined;\r\n const q = data.getPoint2dAtCheckedPointIndex(index, PolyfaceBuilder._workUVFindOrAdd);\r\n if (q)\r\n return this._polyface.addParam(q);\r\n return undefined;\r\n }\r\n /**\r\n * Add a uv parameter to the polyface, taking `u` from `ls.fractions` and `v` from input. The implementation is\r\n * free to either create a new param or return the index of a prior param with the same coordinates.\r\n * @param ls the linestring.\r\n * @param index index of the point in the linestring.\r\n * @param v the v parameter.\r\n * @param priorIndexA (optional) an index of a prior param to check for possible duplicate value.\r\n * @param priorIndexB (optional) another index of a prior param to check for possible duplicate value.\r\n * @returns the uv parameter index in the polyface.\r\n */\r\n public findOrAddParamInLineString(\r\n ls: LineString3d, index: number, v: number, priorIndexA?: number, priorIndexB?: number,\r\n ): number | undefined {\r\n const u = (ls.fractions && index < ls.fractions.length) ?\r\n ls.fractions.atUncheckedIndex(index) : index / ls.points.length;\r\n return this._polyface.addParamUV(u, v, priorIndexA, priorIndexB);\r\n }\r\n /**\r\n * Add a normal to the polyface.\r\n * @param ls the linestring.\r\n * @param index Index of the normal in the linestring's surface normal array.\r\n * @param transform (optional) transform to be applied.\r\n * @param priorIndexA (optional) an index of a prior normal to check for possible duplicate value.\r\n * @param priorIndexB (optional) another index of a prior normal to check for possible duplicate value.\r\n * @returns the normal index in the polyface.\r\n */\r\n public findOrAddNormalInLineString(\r\n ls: LineString3d, index: number, transform?: Transform, priorIndexA?: number, priorIndexB?: number,\r\n ): number | undefined {\r\n const linestringNormals = ls.packedSurfaceNormals;\r\n if (linestringNormals) {\r\n const q = linestringNormals.getVector3dAtCheckedVectorIndex(index, PolyfaceBuilder._workVectorFindOrAdd);\r\n if (q) {\r\n if (transform)\r\n transform.multiplyVector(q, q);\r\n return this._polyface.addNormal(q, priorIndexA, priorIndexB);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Add a point to the polyface. */\r\n public addPointXYZ(x: number, y: number, z: number): number {\r\n return this._polyface.addPointXYZ(x, y, z);\r\n }\r\n /** Returns a transform who can be applied to points on a triangular facet in order to obtain UV parameters. */\r\n private getUVTransformForTriangleFacet(pointA: Point3d, pointB: Point3d, pointC: Point3d): Transform | undefined {\r\n const vectorAB = pointA.vectorTo(pointB);\r\n const vectorAC = pointA.vectorTo(pointC);\r\n const unitAxes = Matrix3d.createRigidFromColumns(vectorAB, vectorAC, AxisOrder.XYZ);\r\n const localToWorld = Transform.createOriginAndMatrix(pointA, unitAxes);\r\n return localToWorld.inverse();\r\n }\r\n /** Returns the normal to a triangular facet. */\r\n private getNormalForTriangularFacet(pointA: Point3d, pointB: Point3d, pointC: Point3d): Vector3d {\r\n const vectorAB = pointA.vectorTo(pointB);\r\n const vectorAC = pointA.vectorTo(pointC);\r\n let normal = vectorAB.crossProduct(vectorAC).normalize();\r\n normal = normal ? normal : Vector3d.create();\r\n return normal;\r\n }\r\n // ### TODO: Consider case where normals will be reversed and point through the other end of the facet.\r\n /**\r\n * Add a quad to the polyface given its points in order around the edges.\r\n * @param points array of at least four vertices.\r\n * @param params (optional) array of at least four uv parameters (if `undefined`, params are calculated without\r\n * reference data).\r\n * @param normals (optional) array of at least four vectors (if `undefined`, the quad is assumed to be planar and its\r\n * normal is calculated).\r\n * @param colors (optional) array of at least four colors.\r\n */\r\n public addQuadFacet(\r\n points: Point3d[] | GrowableXYZArray, params?: Point2d[], normals?: Vector3d[], colors?: number[],\r\n ): void {\r\n if (points instanceof GrowableXYZArray)\r\n points = points.getPoint3dArray();\r\n if (points.length < 4)\r\n return;\r\n // if params and/or normals are needed, calculate them first\r\n const needParams = this.options.needParams;\r\n const needNormals = this.options.needNormals;\r\n const needColors = this.options.needColors;\r\n let param0: Point2d, param1: Point2d, param2: Point2d, param3: Point2d;\r\n let normal0: Vector3d, normal1: Vector3d, normal2: Vector3d, normal3: Vector3d;\r\n let color0: number, color1: number, color2: number, color3: number;\r\n if (needParams) {\r\n if (params !== undefined && params.length > 3) {\r\n param0 = params[0];\r\n param1 = params[1];\r\n param2 = params[2];\r\n param3 = params[3];\r\n } else {\r\n const paramTransform = this.getUVTransformForTriangleFacet(points[0], points[1], points[2]);\r\n if (paramTransform === undefined) {\r\n param0 = param1 = param2 = param3 = Point2d.createZero();\r\n } else {\r\n param0 = Point2d.createFrom(paramTransform.multiplyPoint3d(points[0]));\r\n param1 = Point2d.createFrom(paramTransform.multiplyPoint3d(points[1]));\r\n param2 = Point2d.createFrom(paramTransform.multiplyPoint3d(points[2]));\r\n param3 = Point2d.createFrom(paramTransform.multiplyPoint3d(points[3]));\r\n }\r\n }\r\n }\r\n if (needNormals) {\r\n if (normals !== undefined && normals.length > 3) {\r\n normal0 = normals[0];\r\n normal1 = normals[1];\r\n normal2 = normals[2];\r\n normal3 = normals[3];\r\n } else {\r\n normal0 = this.getNormalForTriangularFacet(points[0], points[1], points[2]);\r\n normal1 = this.getNormalForTriangularFacet(points[0], points[1], points[2]);\r\n normal2 = this.getNormalForTriangularFacet(points[0], points[1], points[2]);\r\n normal3 = this.getNormalForTriangularFacet(points[0], points[1], points[2]);\r\n }\r\n }\r\n if (needColors) {\r\n if (colors !== undefined && colors.length > 3) {\r\n color0 = colors[0];\r\n color1 = colors[1];\r\n color2 = colors[2];\r\n color3 = colors[3];\r\n }\r\n }\r\n if (this._options.shouldTriangulate) {\r\n // add as two triangles, with a diagonal along the shortest distance\r\n const vectorAC = points[0].vectorTo(points[2]);\r\n const vectorBD = points[1].vectorTo(points[3]);\r\n // Note: We pass along any values for normals or params that we calculated\r\n if (vectorAC.magnitude() >= vectorBD.magnitude()) {\r\n this.addTriangleFacet(\r\n [points[0], points[1], points[2]],\r\n needParams ? [param0!, param1!, param2!] : undefined,\r\n needNormals ? [normal0!, normal1!, normal2!] : undefined,\r\n needColors ? [color0!, color1!, color2!] : undefined,\r\n );\r\n this.addTriangleFacet(\r\n [points[0], points[2], points[3]],\r\n needParams ? [param0!, param2!, param3!] : undefined,\r\n needNormals ? [normal0!, normal2!, normal3!] : undefined,\r\n needColors ? [color0!, color2!, color3!] : undefined,\r\n );\r\n } else {\r\n this.addTriangleFacet(\r\n [points[0], points[1], points[3]],\r\n needParams ? [param0!, param1!, param3!] : undefined,\r\n needNormals ? [normal0!, normal1!, normal3!] : undefined,\r\n needColors ? [color0!, color1!, color3!] : undefined,\r\n );\r\n this.addTriangleFacet(\r\n [points[1], points[2], points[3]],\r\n needParams ? [param1!, param2!, param3!] : undefined,\r\n needNormals ? [normal1!, normal2!, normal3!] : undefined,\r\n needColors ? [color1!, color2!, color3!] : undefined,\r\n );\r\n }\r\n return;\r\n }\r\n let idx0, idx1, idx2, idx3;\r\n // add params if needed\r\n if (needParams) {\r\n idx0 = this._polyface.addParam(param0!);\r\n idx1 = this._polyface.addParam(param1!);\r\n idx2 = this._polyface.addParam(param2!);\r\n idx3 = this._polyface.addParam(param3!);\r\n this.addIndexedQuadParamIndexes(idx0, idx1, idx3, idx2);\r\n }\r\n // add normals if needed\r\n if (needNormals) {\r\n idx0 = this._polyface.addNormal(normal0!);\r\n idx1 = this._polyface.addNormal(normal1!);\r\n idx2 = this._polyface.addNormal(normal2!);\r\n idx3 = this._polyface.addNormal(normal3!);\r\n this.addIndexedQuadNormalIndexes(idx0, idx1, idx3, idx2);\r\n }\r\n // add colors if needed\r\n if (needColors) {\r\n idx0 = this._polyface.addColor(color0!);\r\n idx1 = this._polyface.addColor(color1!);\r\n idx2 = this._polyface.addColor(color2!);\r\n idx3 = this._polyface.addColor(color3!);\r\n this.addIndexedQuadColorIndexes(idx0, idx1, idx3, idx2);\r\n }\r\n // add point and point indexes last (terminates the facet)\r\n idx0 = this.addPoint(points[0]);\r\n idx1 = this.addPoint(points[1]);\r\n idx2 = this.addPoint(points[2]);\r\n idx3 = this.addPoint(points[3]);\r\n this.addIndexedQuadPointIndexes(idx0, idx1, idx3, idx2);\r\n }\r\n /**\r\n * Add a single quad facet from existing points to the polyface.\r\n * * The actual quad may be reversed or triangulated based on builder setup.\r\n * * `indexA0` and `indexA1` are in the forward order at the \"A\" end of the quad\r\n * * `indexB0` and `indexB1` are in the forward order at the \"B\" end of the quad.\r\n * * This means ccw/cw ordered vertices v[i] should be passed into this function as i=[0,1,3,2].\r\n */\r\n private addIndexedQuadPointIndexes(\r\n indexA0: number, indexA1: number, indexB0: number, indexB1: number, terminate: boolean = true,\r\n ): void {\r\n if (this._reversed) {\r\n this._polyface.addPointIndex(indexA0);\r\n this._polyface.addPointIndex(indexB0);\r\n this._polyface.addPointIndex(indexB1);\r\n this._polyface.addPointIndex(indexA1);\r\n } else {\r\n this._polyface.addPointIndex(indexA0);\r\n this._polyface.addPointIndex(indexA1);\r\n this._polyface.addPointIndex(indexB1);\r\n this._polyface.addPointIndex(indexB0);\r\n }\r\n if (terminate)\r\n this._polyface.terminateFacet();\r\n }\r\n /** For a single quad facet, add the indexes of the corresponding param points. */\r\n private addIndexedQuadParamIndexes(indexA0: number, indexA1: number, indexB0: number, indexB1: number): void {\r\n if (this._reversed) {\r\n this._polyface.addParamIndex(indexA0);\r\n this._polyface.addParamIndex(indexB0);\r\n this._polyface.addParamIndex(indexB1);\r\n this._polyface.addParamIndex(indexA1);\r\n } else {\r\n this._polyface.addParamIndex(indexA0);\r\n this._polyface.addParamIndex(indexA1);\r\n this._polyface.addParamIndex(indexB1);\r\n this._polyface.addParamIndex(indexB0);\r\n }\r\n }\r\n /** For a single quad facet, add the indexes of the corresponding normal vectors. */\r\n private addIndexedQuadNormalIndexes(indexA0: number, indexA1: number, indexB0: number, indexB1: number): void {\r\n if (this._reversed) {\r\n this._polyface.addNormalIndex(indexA0);\r\n this._polyface.addNormalIndex(indexB0);\r\n this._polyface.addNormalIndex(indexB1);\r\n this._polyface.addNormalIndex(indexA1);\r\n } else {\r\n this._polyface.addNormalIndex(indexA0);\r\n this._polyface.addNormalIndex(indexA1);\r\n this._polyface.addNormalIndex(indexB1);\r\n this._polyface.addNormalIndex(indexB0);\r\n }\r\n }\r\n /** For a single quad facet, add the indexes of the corresponding colors. */\r\n private addIndexedQuadColorIndexes(indexA0: number, indexA1: number, indexB0: number, indexB1: number): void {\r\n if (this._reversed) {\r\n this._polyface.addColorIndex(indexA0);\r\n this._polyface.addColorIndex(indexB0);\r\n this._polyface.addColorIndex(indexB1);\r\n this._polyface.addColorIndex(indexA1);\r\n } else {\r\n this._polyface.addColorIndex(indexA0);\r\n this._polyface.addColorIndex(indexA1);\r\n this._polyface.addColorIndex(indexB1);\r\n this._polyface.addColorIndex(indexB0);\r\n }\r\n }\r\n // ### TODO: Consider case where normals will be reversed and point through the other end of the facet.\r\n /**\r\n * Add a triangle to the polyface given its points in order around the edges.\r\n * @param points array of at least three vertices.\r\n * @param params (optional) array of at least three uv parameters (if `undefined`, params are calculated without\r\n * reference data).\r\n * @param normals (optional) array of at least three vectors (if `undefined`, the normal is calculated).\r\n * @param colors (optional) array of at least three colors.\r\n */\r\n public addTriangleFacet(\r\n points: Point3d[] | GrowableXYZArray, params?: Point2d[], normals?: Vector3d[], colors?: number[],\r\n ): void {\r\n if (points.length < 3)\r\n return;\r\n let idx0: number;\r\n let idx1: number;\r\n let idx2: number;\r\n let point0, point1, point2;\r\n if (points instanceof GrowableXYZArray) {\r\n point0 = points.getPoint3dAtCheckedPointIndex(0)!;\r\n point1 = points.getPoint3dAtCheckedPointIndex(1)!;\r\n point2 = points.getPoint3dAtCheckedPointIndex(2)!;\r\n } else {\r\n point0 = points[0];\r\n point1 = points[1];\r\n point2 = points[2];\r\n }\r\n // add params if needed\r\n if (this._options.needParams) {\r\n if (params && params.length >= 3) { // params were given\r\n idx0 = this._polyface.addParam(params[0]);\r\n idx1 = this._polyface.addParam(params[1]);\r\n idx2 = this._polyface.addParam(params[2]);\r\n } else { // compute params\r\n const paramTransform = this.getUVTransformForTriangleFacet(point0, point1, point2);\r\n idx0 = this._polyface.addParam(\r\n Point2d.createFrom(paramTransform ? paramTransform.multiplyPoint3d(point0) : undefined),\r\n );\r\n idx1 = this._polyface.addParam(\r\n Point2d.createFrom(paramTransform ? paramTransform.multiplyPoint3d(point1) : undefined),\r\n );\r\n idx2 = this._polyface.addParam(\r\n Point2d.createFrom(paramTransform ? paramTransform.multiplyPoint3d(point1) : undefined),\r\n );\r\n }\r\n this.addIndexedTriangleParamIndexes(idx0, idx1, idx2);\r\n }\r\n // add normals if needed\r\n if (this._options.needNormals) {\r\n if (normals !== undefined && normals.length > 2) { // normals were given\r\n idx0 = this._polyface.addNormal(normals[0]);\r\n idx1 = this._polyface.addNormal(normals[1]);\r\n idx2 = this._polyface.addNormal(normals[2]);\r\n } else { // compute normals\r\n const normal = this.getNormalForTriangularFacet(point0, point1, point2);\r\n idx0 = this._polyface.addNormal(normal);\r\n idx1 = this._polyface.addNormal(normal);\r\n idx2 = this._polyface.addNormal(normal);\r\n }\r\n this.addIndexedTriangleNormalIndexes(idx0, idx1, idx2);\r\n }\r\n // add colors if needed and provided\r\n if (this._options.needColors) {\r\n if (colors !== undefined && colors.length > 2) {\r\n idx0 = this._polyface.addColor(colors[0]);\r\n idx1 = this._polyface.addColor(colors[1]);\r\n idx2 = this._polyface.addColor(colors[2]);\r\n this.addIndexedTriangleColorIndexes(idx0, idx1, idx2);\r\n }\r\n }\r\n // add point and point indexes last (terminates the facet)\r\n idx0 = this.addPoint(point0);\r\n idx1 = this.addPoint(point1);\r\n idx2 = this.addPoint(point2);\r\n this.addIndexedTrianglePointIndexes(idx0, idx1, idx2);\r\n }\r\n /**\r\n * Add a single triangular facet from existing points to the polyface.\r\n * * The added triangle may be reversed based on builder setup.\r\n */\r\n private addIndexedTrianglePointIndexes(\r\n indexA: number, indexB: number, indexC: number, terminateFacet: boolean = true,\r\n ) {\r\n if (!this._reversed) {\r\n this._polyface.addPointIndex(indexA);\r\n this._polyface.addPointIndex(indexB);\r\n this._polyface.addPointIndex(indexC);\r\n } else {\r\n this._polyface.addPointIndex(indexA);\r\n this._polyface.addPointIndex(indexC);\r\n this._polyface.addPointIndex(indexB);\r\n }\r\n if (terminateFacet)\r\n this._polyface.terminateFacet();\r\n }\r\n /** For a single triangle facet, add the indexes of the corresponding params. */\r\n private addIndexedTriangleParamIndexes(indexA: number, indexB: number, indexC: number): void {\r\n if (!this._reversed) {\r\n this._polyface.addParamIndex(indexA);\r\n this._polyface.addParamIndex(indexB);\r\n this._polyface.addParamIndex(indexC);\r\n } else {\r\n this._polyface.addParamIndex(indexA);\r\n this._polyface.addParamIndex(indexC);\r\n this._polyface.addParamIndex(indexB);\r\n }\r\n }\r\n /** For a single triangle facet, add the indexes of the corresponding params. */\r\n private addIndexedTriangleNormalIndexes(indexA: number, indexB: number, indexC: number): void {\r\n if (!this._reversed) {\r\n this._polyface.addNormalIndex(indexA);\r\n this._polyface.addNormalIndex(indexB);\r\n this._polyface.addNormalIndex(indexC);\r\n } else {\r\n this._polyface.addNormalIndex(indexA);\r\n this._polyface.addNormalIndex(indexC);\r\n this._polyface.addNormalIndex(indexB);\r\n }\r\n }\r\n /** For a single triangle facet, add the indexes of the corresponding colors. */\r\n private addIndexedTriangleColorIndexes(indexA: number, indexB: number, indexC: number): void {\r\n if (!this._reversed) {\r\n this._polyface.addColorIndex(indexA);\r\n this._polyface.addColorIndex(indexB);\r\n this._polyface.addColorIndex(indexC);\r\n } else {\r\n this._polyface.addColorIndex(indexA);\r\n this._polyface.addColorIndex(indexC);\r\n this._polyface.addColorIndex(indexB);\r\n }\r\n }\r\n /** Find or add xyzIndex and normalIndex for coordinates in the sector. */\r\n private setSectorIndices(sector: FacetSector): void {\r\n sector.xyzIndex = this.addPoint(sector.xyz);\r\n if (sector.normal)\r\n sector.normalIndex = this._polyface.addNormal(sector.normal);\r\n if (sector.uv)\r\n sector.uvIndex = this._polyface.addParam(sector.uv);\r\n }\r\n private addSectorTriangle(sectorA0: FacetSector, sectorA1: FacetSector, sectorA2: FacetSector): void {\r\n if (sectorA0.xyz.isAlmostEqual(sectorA1.xyz)\r\n || sectorA1.xyz.isAlmostEqual(sectorA2.xyz)\r\n || sectorA2.xyz.isAlmostEqual(sectorA0.xyz)) {\r\n // trivially degenerate triangle; skip!!!\r\n } else {\r\n if (this._options.needNormals)\r\n this.addIndexedTriangleNormalIndexes(sectorA0.normalIndex, sectorA1.normalIndex, sectorA2.normalIndex);\r\n if (this._options.needParams)\r\n this.addIndexedTriangleParamIndexes(sectorA0.uvIndex, sectorA1.uvIndex, sectorA2.uvIndex);\r\n this.addIndexedTrianglePointIndexes(sectorA0.xyzIndex, sectorA1.xyzIndex, sectorA2.xyzIndex, true);\r\n }\r\n }\r\n private addSectorQuadA01B01(\r\n sectorA0: FacetSector, sectorA1: FacetSector, sectorB0: FacetSector, sectorB1: FacetSector,\r\n ): void {\r\n if (sectorA0.xyz.isAlmostEqual(sectorA1.xyz) && sectorB0.xyz.isAlmostEqual(sectorB1.xyz)) {\r\n // ignore null quad\r\n } else if (this._options.shouldTriangulate) {\r\n this.addSectorTriangle(sectorA0, sectorA1, sectorB1);\r\n this.addSectorTriangle(sectorB1, sectorB0, sectorA0);\r\n } else {\r\n if (this._options.needNormals)\r\n this.addIndexedQuadNormalIndexes(sectorA0.normalIndex, sectorA1.normalIndex, sectorB0.normalIndex, sectorB1.normalIndex);\r\n if (this._options.needParams)\r\n this.addIndexedQuadParamIndexes(sectorA0.uvIndex, sectorA1.uvIndex, sectorB0.uvIndex, sectorB1.uvIndex);\r\n this.addIndexedQuadPointIndexes(sectorA0.xyzIndex, sectorA1.xyzIndex, sectorB0.xyzIndex, sectorB1.xyzIndex, true);\r\n }\r\n }\r\n /**\r\n * Add facets between lineStrings with matched point counts.\r\n * * Surface normals are computed from (a) curve tangents in the linestrings and (b) rule line between linestrings.\r\n */\r\n public addBetweenLineStringsWithRuleEdgeNormals(\r\n lineStringA: LineString3d, vA: number, lineStringB: LineString3d, vB: number, addClosure: boolean = false,\r\n ): void {\r\n const pointA = lineStringA.packedPoints;\r\n const pointB = lineStringB.packedPoints;\r\n const derivativeA = lineStringA.packedDerivatives;\r\n const derivativeB = lineStringB.packedDerivatives;\r\n const fractionA = lineStringA.fractions;\r\n const fractionB = lineStringB.fractions;\r\n const needNormals = this._options.needNormals;\r\n const needParams = this._options.needParams;\r\n const sectorA0 = new FacetSector(needNormals, needParams, needNormals);\r\n const sectorA1 = new FacetSector(needNormals, needParams, needNormals);\r\n const sectorB0 = new FacetSector(needNormals, needParams, needNormals);\r\n const sectorB1 = new FacetSector(needNormals, needParams, needNormals);\r\n const sectorA00 = new FacetSector(needNormals, needParams, needNormals);\r\n const sectorB00 = new FacetSector(needNormals, needParams, needNormals);\r\n const numPoints = pointA.length;\r\n if (numPoints < 2 || numPoints !== pointB.length)\r\n return;\r\n sectorA0.loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(0, pointA, derivativeA, fractionA, vA);\r\n sectorB0.loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(0, pointB, derivativeB, fractionB, vB);\r\n if (needNormals)\r\n FacetSector.computeNormalsAlongRuleLine(sectorA0, sectorB0);\r\n this.setSectorIndices(sectorA0);\r\n this.setSectorIndices(sectorB0);\r\n sectorA00.copyContentsFrom(sectorA0);\r\n sectorB00.copyContentsFrom(sectorB0);\r\n for (let i = 1; i < numPoints; i++) {\r\n sectorA1.loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(i, pointA, derivativeA, fractionA, vA);\r\n sectorB1.loadIndexedPointAndDerivativeCoordinatesFromPackedArrays(i, pointB, derivativeA, fractionB, vB);\r\n FacetSector.computeNormalsAlongRuleLine(sectorA1, sectorB1);\r\n this.setSectorIndices(sectorA1);\r\n this.setSectorIndices(sectorB1);\r\n // create the facet\r\n this.addSectorQuadA01B01(sectorA0, sectorA1, sectorB0, sectorB1);\r\n sectorA0.copyContentsFrom(sectorA1);\r\n sectorB0.copyContentsFrom(sectorB1);\r\n }\r\n if (addClosure)\r\n this.addSectorQuadA01B01(sectorA0, sectorA00, sectorB0, sectorB00);\r\n }\r\n /**\r\n * Add facets between lineStrings with matched point counts.\r\n * * Indices of points, normals, and uv parameters are pre-stored in the linestrings.\r\n */\r\n public addBetweenLineStringsWithStoredIndices(lineStringA: LineString3d, lineStringB: LineString3d): void {\r\n const pointA = lineStringA.pointIndices!;\r\n const pointB = lineStringB.pointIndices!;\r\n let normalA: GrowableFloat64Array | undefined = lineStringA.normalIndices;\r\n let normalB: GrowableFloat64Array | undefined = lineStringB.normalIndices;\r\n if (!this._options.needNormals) {\r\n normalA = undefined;\r\n normalB = undefined;\r\n }\r\n let paramA: GrowableFloat64Array | undefined = lineStringA.paramIndices;\r\n let paramB: GrowableFloat64Array | undefined = lineStringB.paramIndices;\r\n if (!this._options.needParams) {\r\n paramA = undefined;\r\n paramB = undefined;\r\n }\r\n const numPoints = pointA.length;\r\n for (let i = 1; i < numPoints; i++) {\r\n if (this.options.shouldTriangulate) {\r\n if (distinctIndices(pointA.atUncheckedIndex(i - 1), pointA.atUncheckedIndex(i), pointB.atUncheckedIndex(i))) {\r\n this.addIndexedTrianglePointIndexes(\r\n pointA.atUncheckedIndex(i - 1), pointA.atUncheckedIndex(i), pointB.atUncheckedIndex(i), false,\r\n );\r\n if (normalA && normalB)\r\n this.addIndexedTriangleNormalIndexes(\r\n normalA.atUncheckedIndex(i - 1), normalA.atUncheckedIndex(i), normalB.atUncheckedIndex(i - 1),\r\n );\r\n if (paramA && paramB)\r\n this.addIndexedTriangleParamIndexes(\r\n paramA.atUncheckedIndex(i - 1), paramA.atUncheckedIndex(i), paramB.atUncheckedIndex(i - 1),\r\n );\r\n }\r\n if (distinctIndices(pointB.atUncheckedIndex(i), pointB.atUncheckedIndex(i - 1), pointA.atUncheckedIndex(i - 1))) {\r\n this.addIndexedTrianglePointIndexes(\r\n pointA.atUncheckedIndex(i - 1), pointB.atUncheckedIndex(i), pointB.atUncheckedIndex(i - 1), false,\r\n );\r\n if (normalA && normalB)\r\n this.addIndexedTriangleNormalIndexes(\r\n normalA.atUncheckedIndex(i - 1), normalB.atUncheckedIndex(i), normalB.atUncheckedIndex(i - 1),\r\n );\r\n if (paramA && paramB)\r\n this.addIndexedTriangleParamIndexes(\r\n paramA.atUncheckedIndex(i - 1), paramB.atUncheckedIndex(i), paramB.atUncheckedIndex(i - 1),\r\n );\r\n }\r\n } else {\r\n if (pointA.atUncheckedIndex(i - 1) !== pointA.atUncheckedIndex(i) ||\r\n pointB.atUncheckedIndex(i - 1) !== pointB.atUncheckedIndex(i)) {\r\n this.addIndexedQuadPointIndexes(\r\n pointA.atUncheckedIndex(i - 1), pointA.atUncheckedIndex(i),\r\n pointB.atUncheckedIndex(i - 1), pointB.atUncheckedIndex(i),\r\n false,\r\n );\r\n if (normalA && normalB)\r\n this.addIndexedQuadNormalIndexes(\r\n normalA.atUncheckedIndex(i - 1), normalA.atUncheckedIndex(i),\r\n normalB.atUncheckedIndex(i - 1), normalB.atUncheckedIndex(i),\r\n );\r\n if (paramA && paramB)\r\n this.addIndexedQuadParamIndexes(\r\n paramA.atUncheckedIndex(i - 1), paramA.atUncheckedIndex(i),\r\n paramB.atUncheckedIndex(i - 1), paramB.atUncheckedIndex(i),\r\n );\r\n }\r\n }\r\n this._polyface.terminateFacet();\r\n }\r\n }\r\n /**\r\n * Add facets between lineStrings with matched point counts.\r\n * * Facets are announced to addIndexedQuad.\r\n * * addIndexedQuad is free to apply reversal or triangulation options.\r\n */\r\n public addBetweenTransformedLineStrings(\r\n curves: AnyCurve, transformA: Transform, transformB: Transform, addClosure: boolean = false,\r\n ): void {\r\n if (curves instanceof LineString3d) {\r\n const pointA = curves.points;\r\n const numPoints = pointA.length;\r\n let indexA0 = this.findOrAddPointInLineString(curves, 0, transformA)!;\r\n let indexB0 = this.findOrAddPointInLineString(curves, 0, transformB)!;\r\n const indexA00 = indexA0;\r\n const indexB00 = indexB0;\r\n let indexA1 = 0;\r\n let indexB1 = 0;\r\n for (let i = 1; i < numPoints; i++) {\r\n indexA1 = this.findOrAddPointInLineString(curves, i, transformA)!;\r\n indexB1 = this.findOrAddPointInLineString(curves, i, transformB)!;\r\n this.addIndexedQuadPointIndexes(indexA0, indexA1, indexB0, indexB1);\r\n indexA0 = indexA1;\r\n indexB0 = indexB1;\r\n }\r\n if (addClosure)\r\n this.addIndexedQuadPointIndexes(indexA0, indexA00, indexB0, indexB00);\r\n } else {\r\n const children = curves.children;\r\n // just send the children individually; final compress will fix things??\r\n if (children)\r\n for (const c of children) {\r\n this.addBetweenTransformedLineStrings(c as AnyCurve, transformA, transformB);\r\n }\r\n }\r\n }\r\n private addBetweenStrokeSetPair(dataA: AnyCurve, vA: number, dataB: AnyCurve, vB: number) {\r\n if (dataA instanceof LineString3d && dataB instanceof LineString3d) {\r\n this.addBetweenLineStringsWithRuleEdgeNormals(dataA, vA, dataB, vB, false);\r\n } else if (dataA instanceof ParityRegion && dataB instanceof ParityRegion) {\r\n if (dataA.children.length === dataB.children.length) {\r\n for (let i = 0; i < dataA.children.length; i++) {\r\n this.addBetweenStrokeSetPair(dataA.children[i], vA, dataB.children[i], vB);\r\n }\r\n }\r\n } else if (dataA instanceof CurveChain && dataB instanceof CurveChain) {\r\n const chainA = dataA.children;\r\n const chainB = dataB.children;\r\n if (chainA.length === chainB.length) {\r\n for (let i = 0; i < chainA.length; i++) {\r\n const cpA = chainA[i];\r\n const cpB = chainB[i];\r\n if (cpA instanceof LineString3d && cpB instanceof LineString3d) {\r\n this.addBetweenLineStringsWithRuleEdgeNormals(cpA, vA, cpB, vB);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** Add facets from a Cone. */\r\n public addCone(cone: Cone): void {\r\n // ensure identical stroke counts at each end\r\n let strokeCount = 16;\r\n if (this._options)\r\n strokeCount = this._options.applyTolerancesToArc(cone.getMaxRadius());\r\n let axisStrokeCount = 1;\r\n const lineStringA = cone.strokeConstantVSection(0.0, strokeCount, this._options);\r\n const lineStringB = cone.strokeConstantVSection(1.0, strokeCount, this._options);\r\n if (this._options) {\r\n const vDistanceRange = GrowableXYZArray.distanceRangeBetweenCorrespondingPoints(\r\n lineStringA.packedPoints, lineStringB.packedPoints,\r\n );\r\n axisStrokeCount = this._options.applyMaxEdgeLength(1, vDistanceRange.low);\r\n }\r\n const sizes = cone.maxIsoParametricDistance();\r\n this.addUVGridBody(cone, strokeCount, axisStrokeCount, Segment1d.create(0, sizes.x), Segment1d.create(0, sizes.y));\r\n this.endFace();\r\n if (cone.capped) {\r\n if (!Geometry.isSmallMetricDistance(cone.getRadiusA())) {\r\n this.addTrianglesInUncheckedConvexPolygon(lineStringA, true); // lower triangles flip\r\n this.endFace();\r\n }\r\n if (!Geometry.isSmallMetricDistance(cone.getRadiusB())) {\r\n this.addTrianglesInUncheckedConvexPolygon(lineStringB, false); // upper triangles to not flip.\r\n this.endFace();\r\n }\r\n }\r\n }\r\n /** Add facets for a TorusPipe. */\r\n public addTorusPipe(surface: TorusPipe, phiStrokeCount?: number, thetaStrokeCount?: number): void {\r\n const thetaFraction = surface.getThetaFraction();\r\n let numU = Geometry.clamp(Geometry.resolveNumber(phiStrokeCount, 8), 4, 64);\r\n let numV = Geometry.clamp(\r\n Geometry.resolveNumber(thetaStrokeCount, Math.ceil(16 * thetaFraction)), 2, 64);\r\n if (this._options) {\r\n numU = this._options.applyTolerancesToArc(surface.getMinorRadius());\r\n numV = this._options.applyTolerancesToArc(surface.getMajorRadius(), surface.getSweepAngle().radians);\r\n }\r\n this.toggleReversedFacetFlag();\r\n const sizes = surface.maxIsoParametricDistance();\r\n this.addUVGridBody(surface, numU, numV, Segment1d.create(0, sizes.x), Segment1d.create(0, sizes.y));\r\n this.toggleReversedFacetFlag();\r\n if (surface.capped && thetaFraction < 1.0) {\r\n const centerFrame = surface.getConstructiveFrame()!;\r\n const minorRadius = surface.getMinorRadius();\r\n const majorRadius = surface.getMajorRadius();\r\n const a = 2 * minorRadius;\r\n const r0 = majorRadius - minorRadius;\r\n const r1 = majorRadius + minorRadius;\r\n const z0 = -minorRadius;\r\n const cap0ToLocal = Transform.createRowValues(\r\n a, 0, 0, r0,\r\n 0, 0, -1, 0,\r\n 0, a, 0, z0,\r\n );\r\n const cap0ToWorld = centerFrame.multiplyTransformTransform(cap0ToLocal);\r\n const worldToCap0 = cap0ToWorld.inverse();\r\n if (worldToCap0) {\r\n const ls0 = UVSurfaceOps.createLinestringOnUVLine(surface, 0, 0, 1, 0, numU, false, true);\r\n ls0.computeUVFromXYZTransform(worldToCap0);\r\n this.addTrianglesInUncheckedConvexPolygon(ls0, false);\r\n }\r\n const thetaRadians = surface.getSweepAngle().radians;\r\n const cc = Math.cos(thetaRadians);\r\n const ss = Math.sin(thetaRadians);\r\n const cap1ToLocal = Transform.createRowValues(\r\n -cc * a, 0, -ss, r1 * cc,\r\n -ss * a, 0, cc, r1 * ss,\r\n 0, a, 0, z0,\r\n );\r\n const cap1ToWorld = centerFrame.multiplyTransformTransform(cap1ToLocal);\r\n const worldToCap1 = cap1ToWorld.inverse();\r\n if (worldToCap1) {\r\n const ls1 = UVSurfaceOps.createLinestringOnUVLine(surface, 1, 1, 0, 1, numU, false, true);\r\n ls1.computeUVFromXYZTransform(worldToCap1);\r\n this.addTrianglesInUncheckedConvexPolygon(ls1, false);\r\n }\r\n }\r\n }\r\n /**\r\n * Add point data (no params, normals) for linestrings.\r\n * * This recurses through curve chains (loops and paths).\r\n * * LineStrings are swept.\r\n * * All other curve types are ignored.\r\n * @param contour contour which contains only linestrings.\r\n * @param vector sweep vector.\r\n */\r\n public addLinearSweepLineStringsXYZOnly(contour: AnyCurve, vector: Vector3d): void {\r\n if (contour instanceof LineString3d) {\r\n let pointA = Point3d.create();\r\n let pointB = Point3d.create();\r\n let indexA0 = 0;\r\n let indexA1 = 0;\r\n let indexB0 = 0;\r\n let indexB1 = 0;\r\n const n = contour.numPoints();\r\n for (let i = 0; i < n; i++) {\r\n pointA = contour.pointAt(i, pointA)!;\r\n pointB = pointA.plus(vector, pointB);\r\n indexA1 = this.addPoint(pointA);\r\n indexB1 = this.addPoint(pointB);\r\n if (i > 0)\r\n this.addIndexedQuadPointIndexes(indexA0, indexA1, indexB0, indexB1);\r\n indexA0 = indexA1;\r\n indexB0 = indexB1;\r\n }\r\n } else if (contour instanceof CurveChain) {\r\n for (const ls of contour.children)\r\n this.addLinearSweepLineStringsXYZOnly(ls, vector);\r\n }\r\n }\r\n /** Construct facets for a rotational sweep. */\r\n public addRotationalSweep(surface: RotationalSweep): void {\r\n const contour = surface.getSweepContourRef();\r\n const section0 = StrokeCountSection.create(contour.getCurves(), this._options);\r\n const baseStrokes = section0.getStrokes();\r\n // ensure sweep is positive for buildRotationalNormalsInLineStrings\r\n const axis = surface.cloneAxisRay();\r\n const sweepAngle = surface.getSweep();\r\n if (sweepAngle.radians < 0.0) {\r\n axis.direction.scaleInPlace(-1);\r\n sweepAngle.setRadians(-sweepAngle.radians);\r\n }\r\n // swingVector points in the direction of positive sweep\r\n const perpendicularVector = CylindricalRangeQuery.computeMaxVectorFromRay(axis, baseStrokes);\r\n const swingVector = axis.direction.crossProduct(perpendicularVector);\r\n // ensure contour computed normal is aligned with swingVector for buildRotationalNormalsInLineStrings\r\n const contourNormalAgreesWithSwingDir = contour.localToWorld.matrix.dotColumnZ(swingVector) > 0;\r\n if (!contourNormalAgreesWithSwingDir)\r\n baseStrokes.reverseInPlace();\r\n if (this._options.needNormals)\r\n CylindricalRangeQuery.buildRotationalNormalsInLineStrings(baseStrokes, axis, swingVector);\r\n const maxDistance = perpendicularVector.magnitude();\r\n const maxPath = Math.abs(maxDistance * sweepAngle.radians);\r\n let numStep = StrokeOptions.applyAngleTol(this._options, 1, sweepAngle.radians, undefined);\r\n numStep = StrokeOptions.applyMaxEdgeLength(this._options, numStep, maxPath);\r\n for (let i = 1; i <= numStep; i++) {\r\n const transformA = surface.getFractionalRotationTransform((i - 1) / numStep);\r\n const transformB = surface.getFractionalRotationTransform(i / numStep);\r\n this.addBetweenRotatedStrokeSets(baseStrokes, transformA, i - 1, transformB, i);\r\n }\r\n if (surface.capped) {\r\n contour.purgeFacets();\r\n const reverseNearCap = contourNormalAgreesWithSwingDir;\r\n contour.emitFacets(this, reverseNearCap, undefined);\r\n contour.emitFacets(this, !reverseNearCap, surface.getFractionalRotationTransform(1.0));\r\n }\r\n }\r\n /** Construct facets for any planar region. */\r\n public addTriangulatedRegion(region: AnyRegion): void {\r\n const contour = SweepContour.createForLinearSweep(region);\r\n if (contour)\r\n contour.emitFacets(this, this.reversedFlag, undefined);\r\n }\r\n /**\r\n * Apply stroke counts to curve primitives.\r\n * * Recursively visit all children of data.\r\n * * At each primitive, invoke `computeStrokeCountForOptions` method with options from the builder.\r\n * @deprecated in 4.8.0 - will not be removed until after 2026-06-13. This method does nothing and is unneeded.\r\n */\r\n public applyStrokeCountsToCurvePrimitives(data: AnyCurve | GeometryQuery): void {\r\n const options = this._options;\r\n if (data instanceof CurvePrimitive) {\r\n data.computeStrokeCountForOptions(options);\r\n } else if (data instanceof CurveCollection) {\r\n const children = data.children;\r\n if (children)\r\n for (const child of children)\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n this.applyStrokeCountsToCurvePrimitives(child);\r\n }\r\n }\r\n private addBetweenStrokeSetsWithRuledNormals(stroke0: AnyCurve, stroke1: AnyCurve, numVEdge: number): void {\r\n const strokeSets = [stroke0];\r\n const fractions = [0.0];\r\n for (let vIndex = 1; vIndex < numVEdge; vIndex++) {\r\n const vFraction = vIndex / numVEdge;\r\n const strokeA = ConstructCurveBetweenCurves.interpolateBetween(stroke0, vIndex / numVEdge, stroke1) as AnyCurve;\r\n strokeSets.push(strokeA);\r\n fractions.push(vFraction);\r\n }\r\n strokeSets.push(stroke1);\r\n fractions.push(1.0);\r\n for (let vIndex = 0; vIndex < numVEdge; vIndex++) {\r\n this.addBetweenStrokeSetPair(strokeSets[vIndex], fractions[vIndex], strokeSets[vIndex + 1], fractions[vIndex + 1]);\r\n }\r\n }\r\n private createIndicesInLineString(ls: LineString3d, vParam: number, transform?: Transform) {\r\n const n = ls.numPoints();\r\n const pointIndices = ls.ensureEmptyPointIndices();\r\n const index0 = this.findOrAddPointInLineString(ls, 0, transform);\r\n pointIndices.push(index0!);\r\n if (n > 1) {\r\n let indexA = index0;\r\n let indexB: number | undefined;\r\n for (let i = 1; i + 1 < n; i++) {\r\n indexB = this.findOrAddPointInLineString(ls, i, transform, indexA);\r\n pointIndices.push(indexB!);\r\n indexA = indexB;\r\n }\r\n // assume last point can only repeat back to zero\r\n indexB = this.findOrAddPointInLineString(ls, n - 1, transform, index0);\r\n pointIndices.push(indexB!);\r\n }\r\n if (this._options.needNormals && ls.packedSurfaceNormals !== undefined) {\r\n const normalIndices = ls.ensureEmptyNormalIndices();\r\n const normalIndex0 = this.findOrAddNormalInLineString(ls, 0, transform);\r\n normalIndices.push(normalIndex0!);\r\n if (n > 1) {\r\n let normalIndexA = normalIndex0;\r\n let normalIndexB: number | undefined;\r\n for (let i = 1; i + 1 < n; i++) {\r\n normalIndexB = this.findOrAddNormalInLineString(ls, i, transform, normalIndexA);\r\n normalIndices.push(normalIndexB!);\r\n normalIndexA = normalIndexB;\r\n }\r\n // assume last point can only repeat back to zero\r\n normalIndexB = this.findOrAddNormalInLineString(ls, n - 1, transform, normalIndex0, normalIndexA);\r\n normalIndices.push(normalIndexB!);\r\n }\r\n }\r\n if (this._options.needParams && ls.packedUVParams !== undefined) {\r\n const uvIndices = ls.ensureEmptyUVIndices();\r\n const uvIndex0 = this.findOrAddParamInLineString(ls, 0, vParam);\r\n uvIndices.push(uvIndex0!);\r\n if (n > 1) {\r\n let uvIndexA = uvIndex0;\r\n let uvIndexB: number | undefined;\r\n for (let i = 1; i + 1 < n; i++) {\r\n uvIndexB = this.findOrAddParamInLineString(ls, i, vParam, uvIndexA);\r\n uvIndices.push(uvIndexB!);\r\n uvIndexA = uvIndexB;\r\n }\r\n // assume last point can only repeat back to zero\r\n uvIndexB = this.findOrAddParamInLineString(ls, n - 1, vParam, uvIndexA, uvIndex0);\r\n uvIndices.push(uvIndexB!);\r\n }\r\n }\r\n }\r\n private addBetweenRotatedStrokeSets(\r\n stroke0: AnyCurve, transformA: Transform, vA: number, transformB: Transform, vB: number,\r\n ): void {\r\n if (stroke0 instanceof LineString3d) {\r\n const strokeA = stroke0.cloneTransformed(transformA);\r\n this.createIndicesInLineString(strokeA, vA);\r\n const strokeB = stroke0.cloneTransformed(transformB);\r\n this.createIndicesInLineString(strokeB, vB);\r\n this.addBetweenLineStringsWithStoredIndices(strokeA, strokeB);\r\n } else if (stroke0 instanceof ParityRegion) {\r\n for (const child of stroke0.children) {\r\n this.addBetweenRotatedStrokeSets(child, transformA, vA, transformB, vB);\r\n }\r\n } else if (stroke0 instanceof CurveChain) {\r\n for (const child of stroke0.children) {\r\n if (child instanceof LineString3d) {\r\n this.addBetweenRotatedStrokeSets(child, transformA, vA, transformB, vB);\r\n }\r\n }\r\n }\r\n }\r\n /** Add facets from the linear sweep. */\r\n public addLinearSweep(surface: LinearSweep): void {\r\n const contour = surface.getCurvesRef();\r\n const section0 = StrokeCountSection.create(contour, this._options);\r\n const stroke0 = section0.getStrokes();\r\n const sweepVector = surface.cloneSweepVector();\r\n const sweepTransform = Transform.createTranslation(sweepVector);\r\n const stroke1 = stroke0.cloneTransformed(sweepTransform) as AnyCurve;\r\n const numVEdge = this._options.applyMaxEdgeLength(1, sweepVector.magnitude());\r\n this.addBetweenStrokeSetsWithRuledNormals(stroke0, stroke1, numVEdge);\r\n if (surface.capped && contour.isAnyRegionType) {\r\n const contourA = surface.getSweepContourRef();\r\n contourA.purgeFacets();\r\n const reverseNearCap = contourA.localToWorld.matrix.dotColumnZ(sweepVector) > 0;\r\n contourA.emitFacets(this, reverseNearCap, undefined);\r\n contourA.emitFacets(this, !reverseNearCap, sweepTransform);\r\n }\r\n }\r\n /** Add facets from a ruled sweep. */\r\n public addRuledSweep(surface: RuledSweep): boolean {\r\n const contours = surface.sweepContoursRef();\r\n let stroke0: AnyCurve | undefined;\r\n let stroke1: AnyCurve;\r\n const sectionMaps = [];\r\n for (const contour of contours)\r\n sectionMaps.push(StrokeCountSection.create(contour.curves, this._options));\r\n if (StrokeCountSection.enforceStrokeCountCompatibility(sectionMaps)) {\r\n StrokeCountSection.enforceCompatibleDistanceSums(sectionMaps);\r\n for (let i = 0; i < contours.length; i++) {\r\n stroke1 = sectionMaps[i].getStrokes();\r\n if (!stroke1)\r\n stroke1 = contours[i].curves.cloneStroked();\r\n if (i > 0 && stroke0 && stroke1) {\r\n const distanceRange = Range1d.createNull();\r\n if (StrokeCountSection.extendDistanceRangeBetweenStrokes(stroke0, stroke1, distanceRange)\r\n && !distanceRange.isNull) {\r\n const numVEdge = this._options.applyMaxEdgeLength(1, distanceRange.high);\r\n this.addBetweenStrokeSetsWithRuledNormals(stroke0, stroke1, numVEdge);\r\n }\r\n }\r\n stroke0 = stroke1;\r\n }\r\n }\r\n if (surface.capped && contours[0].curves.isAnyRegionType) {\r\n contours[0].purgeFacets();\r\n contours[0].emitFacets(this, true, undefined);\r\n contours[contours.length - 1].purgeFacets();\r\n contours[contours.length - 1].emitFacets(this, false, undefined);\r\n }\r\n return true;\r\n }\r\n /** Add facets from a sphere. */\r\n public addSphere(sphere: Sphere, strokeCount?: number): void {\r\n let numStrokeTheta = strokeCount ? strokeCount : this.options.applyTolerancesToArc(sphere.maxAxisRadius());\r\n if (Geometry.isOdd(numStrokeTheta))\r\n numStrokeTheta += 1;\r\n const numStrokePhi = Geometry.clampToStartEnd(\r\n Math.abs(numStrokeTheta * sphere.latitudeSweepFraction), 1, Math.ceil(numStrokeTheta * 0.5),\r\n );\r\n const lineStringA = sphere.strokeConstantVSection(0.0, numStrokeTheta, this._options);\r\n if (sphere.capped && !Geometry.isSmallMetricDistance(lineStringA.quickLength())) {\r\n this.addTrianglesInUncheckedConvexPolygon(lineStringA, true); // lower triangles flip\r\n this.endFace();\r\n }\r\n const sizes = sphere.maxIsoParametricDistance();\r\n this.addUVGridBody(sphere, numStrokeTheta, numStrokePhi, Segment1d.create(0, sizes.x), Segment1d.create(0, sizes.y));\r\n this.endFace();\r\n const lineStringB = sphere.strokeConstantVSection(1.0, numStrokeTheta, this._options);\r\n if (sphere.capped && !Geometry.isSmallMetricDistance(lineStringB.quickLength())) {\r\n this.addTrianglesInUncheckedConvexPolygon(lineStringB, false); // upper triangles do not flip\r\n this.endFace();\r\n }\r\n }\r\n /** Add facets from a box. */\r\n public addBox(box: Box): void {\r\n const corners = box.getCorners();\r\n const xLength = Geometry.maxXY(box.getBaseX(), box.getBaseX());\r\n const yLength = Geometry.maxXY(box.getBaseY(), box.getTopY());\r\n let zLength = 0.0;\r\n for (let i = 0; i < 4; i++)\r\n zLength = Geometry.maxXY(zLength, corners[i].distance(corners[i + 4]));\r\n const numX = this._options.applyMaxEdgeLength(1, xLength);\r\n const numY = this._options.applyMaxEdgeLength(1, yLength);\r\n const numZ = this._options.applyMaxEdgeLength(1, zLength);\r\n // wrap the 4 out-of-plane faces as a single parameter space with \"distance\"\r\n // advancing in x, then y, then negative x, then negative y\r\n const uParamRange = Segment1d.create(0, xLength);\r\n const vParamRange = Segment1d.create(0, zLength);\r\n this.addUVGridBody(\r\n BilinearPatch.create(corners[0], corners[1], corners[4], corners[5]), numX, numZ, uParamRange, vParamRange,\r\n );\r\n uParamRange.shift(xLength);\r\n this.addUVGridBody(\r\n BilinearPatch.create(corners[1], corners[3], corners[5], corners[7]), numY, numZ, uParamRange, vParamRange,\r\n );\r\n uParamRange.shift(yLength);\r\n this.addUVGridBody(\r\n BilinearPatch.create(corners[3], corners[2], corners[7], corners[6]), numX, numZ, uParamRange, vParamRange,\r\n );\r\n uParamRange.shift(xLength);\r\n this.addUVGridBody(\r\n BilinearPatch.create(corners[2], corners[0], corners[6], corners[4]), numY, numZ, uParamRange, vParamRange,\r\n );\r\n // finally end that wraparound face\r\n this.endFace();\r\n if (box.capped) {\r\n uParamRange.set(0.0, xLength);\r\n vParamRange.set(0.0, yLength);\r\n this.addUVGridBody(\r\n BilinearPatch.create(corners[4], corners[5], corners[6], corners[7]), numX, numY, uParamRange, vParamRange,\r\n );\r\n this.endFace();\r\n uParamRange.set(0.0, xLength);\r\n vParamRange.set(0.0, yLength);\r\n this.addUVGridBody(\r\n BilinearPatch.create(corners[2], corners[3], corners[0], corners[1]), numX, numY, uParamRange, vParamRange,\r\n );\r\n this.endFace();\r\n }\r\n }\r\n /**\r\n * Add a polygon to the evolving facets.\r\n * * Add points to the polyface.\r\n * * Indices are added (in reverse order if indicated by the builder state).\r\n * @param points array of points. This may contain extra points not to be used in the polygon.\r\n * @param numPointsToUse number of points to use.\r\n */\r\n public addPolygon(points: Point3d[], numPointsToUse?: number): void {\r\n // don't use trailing points that match start point\r\n if (numPointsToUse === undefined)\r\n numPointsToUse = points.length;\r\n while (numPointsToUse > 1 && points[numPointsToUse - 1].isAlmostEqual(points[0]))\r\n numPointsToUse--;\r\n let index = 0;\r\n if (!this._reversed) {\r\n for (let i = 0; i < numPointsToUse; i++) {\r\n index = this.addPoint(points[i]);\r\n this._polyface.addPointIndex(index);\r\n }\r\n } else {\r\n for (let i = numPointsToUse; --i >= 0;) {\r\n index = this.addPoint(points[i]);\r\n this._polyface.addPointIndex(index);\r\n }\r\n }\r\n this._polyface.terminateFacet();\r\n }\r\n /**\r\n * Add a polygon to the evolving facets.\r\n * * Add points to the polyface\r\n * * Indices are added (in reverse order if indicated by the builder state).\r\n * * Arrays with 2 or fewer points are ignored.\r\n * @param points array of points. Trailing closure points are ignored.\r\n */\r\n public addPolygonGrowableXYZArray(points: GrowableXYZArray): void {\r\n // don't use trailing points that match start point\r\n let numPointsToUse = points.length;\r\n while (numPointsToUse > 2 && Geometry.isSmallMetricDistance(points.distanceIndexIndex(0, numPointsToUse - 1)!))\r\n numPointsToUse--;\r\n // strip trailing duplicates\r\n while (numPointsToUse > 2 && Geometry.isSmallMetricDistance(points.distanceIndexIndex(numPointsToUse - 2, numPointsToUse - 1)!))\r\n numPointsToUse--;\r\n // ignore triangles for which the height is less than smallMetricDistance times length.\r\n // sum of edge lengths is twice the perimeter. If it is flat that's twice the largest base dimension.\r\n // cross product magnitude is twice the area.\r\n if (numPointsToUse === 3) {\r\n const cross = points.crossProductIndexIndexIndex(0, 1, 2)!;\r\n const q = cross.magnitude();\r\n const p = points.distanceIndexIndex(0, 1)! + points.distanceIndexIndex(0, 2)! + points.distanceIndexIndex(1, 2)!;\r\n if (q < Geometry.smallMetricDistance * p)\r\n numPointsToUse = 0;\r\n }\r\n if (numPointsToUse > 2) {\r\n let index = 0;\r\n if (!this._reversed) {\r\n for (let i = 0; i < numPointsToUse; i++) {\r\n index = this.findOrAddPointInGrowableXYZArray(points, i)!;\r\n this._polyface.addPointIndex(index);\r\n }\r\n } else {\r\n for (let i = numPointsToUse; --i >= 0;) {\r\n index = this.findOrAddPointInGrowableXYZArray(points, i)!;\r\n this._polyface.addPointIndex(index);\r\n }\r\n }\r\n this._polyface.terminateFacet();\r\n }\r\n }\r\n /**\r\n * Add a polygon to the evolving facets.\r\n * * Add points to the polyface.\r\n * * Compute each point index as the point is added.\r\n * * All data arrays are parallel to the point array.\r\n * * Point indices are added in reverse order if indicated by the builder state.\r\n * @param points array of vertices in order around the facet.\r\n * @param normals (optional) array of normals, one per vertex.\r\n * @param params (optional) array of uv-parameters, one per vertex.\r\n * @param colors (optional) array of colors, one per vertex.\r\n * @param edgeVisible (optional) array of flags, one per vertex, true iff edge starting at corresponding vertex is visible.\r\n */\r\n public addFacetFromGrowableArrays(\r\n points: GrowableXYZArray,\r\n normals: GrowableXYZArray | undefined,\r\n params: GrowableXYArray | undefined,\r\n colors: number[] | undefined,\r\n edgeVisible?: boolean[],\r\n ): void {\r\n // don't use trailing points that match start point\r\n let numPointsToUse = points.length;\r\n while (numPointsToUse > 1 && Geometry.isSmallMetricDistance(points.distanceIndexIndex(0, numPointsToUse - 1)!))\r\n numPointsToUse--;\r\n let index = 0;\r\n if (normals && normals.length < numPointsToUse)\r\n normals = undefined;\r\n if (params && params.length < numPointsToUse)\r\n params = undefined;\r\n if (colors && colors.length < numPointsToUse)\r\n colors = undefined;\r\n if (edgeVisible && edgeVisible.length < numPointsToUse)\r\n edgeVisible = undefined;\r\n if (!this._reversed) {\r\n for (let i = 0; i < numPointsToUse; i++) {\r\n index = this.findOrAddPointInGrowableXYZArray(points, i)!;\r\n this._polyface.addPointIndex(index, edgeVisible ? edgeVisible[i] : true);\r\n if (normals) {\r\n index = this.findOrAddNormalInGrowableXYZArray(normals, i)!;\r\n this._polyface.addNormalIndex(index);\r\n }\r\n if (params) {\r\n index = this.addParamInGrowableXYArray(params, i)!;\r\n this._polyface.addParamIndex(index);\r\n }\r\n if (colors) {\r\n index = this._polyface.addColor(colors[i]);\r\n this._polyface.addColorIndex(index);\r\n }\r\n }\r\n } else {\r\n for (let i = numPointsToUse; --i >= 0;) {\r\n index = this.findOrAddPointInGrowableXYZArray(points, i)!;\r\n this._polyface.addPointIndex(index);\r\n if (normals) {\r\n index = this.findOrAddNormalInGrowableXYZArray(normals, i)!;\r\n this._polyface.addNormalIndex(index);\r\n }\r\n if (params) {\r\n index = this.addParamInGrowableXYArray(params, i)!;\r\n this._polyface.addParamIndex(index);\r\n }\r\n if (colors) {\r\n index = this._polyface.addColor(colors[i]);\r\n this._polyface.addColorIndex(index);\r\n }\r\n }\r\n }\r\n this._polyface.terminateFacet();\r\n }\r\n /**\r\n * Add the current visitor facet to the evolving polyface.\r\n * * Indices are added (in reverse order if indicated by the builder state).\r\n */\r\n public addFacetFromVisitor(visitor: PolyfaceVisitor): void {\r\n this.addFacetFromGrowableArrays(visitor.point, visitor.normal, visitor.param, visitor.color, visitor.edgeVisible);\r\n }\r\n /** Add all visitor facets to the evolving polyface (in reverse order if indicated by the builder state). */\r\n public addFacetsFromVisitor(visitor: PolyfaceVisitor): void {\r\n visitor.reset();\r\n for (; visitor.moveToNextFacet();)\r\n this.addFacetFromVisitor(visitor);\r\n }\r\n /**\r\n * Add the subset of visitor data indexed by the indices.\r\n * * Ideally, the subset represents a sub-facet of the visited facet.\r\n * @param visitor data for the currently visited facet.\r\n * @param indices local indices into the visitor data arrays.\r\n * @returns whether the data was added successfully. Encountering an invalid index returns false.\r\n */\r\n public addFacetFromIndexedVisitor(visitor: PolyfaceVisitor, indices: number[]): boolean {\r\n if (indices.length > visitor.pointIndex.length)\r\n return false;\r\n const xyz = new GrowableXYZArray(indices.length);\r\n const normal = visitor.normal ? new GrowableXYZArray(indices.length) : undefined;\r\n const param = visitor.param ? new GrowableXYArray(indices.length) : undefined;\r\n const color = visitor.color ? new Array<number>(indices.length) : undefined;\r\n const visible = visitor.edgeVisible ? new Array<boolean>(indices.length) : undefined;\r\n for (let i = 0; i < indices.length; ++i) {\r\n const index = indices[i];\r\n if (index < 0 || index >= visitor.point.length) // all visitor arrays have the same length\r\n return false;\r\n xyz.pushXYZ(\r\n visitor.point.getXAtUncheckedPointIndex(index),\r\n visitor.point.getYAtUncheckedPointIndex(index),\r\n visitor.point.getZAtUncheckedPointIndex(index),\r\n );\r\n if (visitor.normal && normal)\r\n normal.pushXYZ(\r\n visitor.normal.getXAtUncheckedPointIndex(index),\r\n visitor.normal.getYAtUncheckedPointIndex(index),\r\n visitor.normal.getZAtUncheckedPointIndex(index),\r\n );\r\n if (visitor.param && param)\r\n param.pushXY(\r\n visitor.param.getXAtUncheckedPointIndex(index),\r\n visitor.param.getYAtUncheckedPointIndex(index),\r\n );\r\n if (visitor.color && color)\r\n color[i] = visitor.color[index];\r\n if (visitor.edgeVisible && visible)\r\n visible[i] = visitor.edgeVisible[index];\r\n }\r\n this.addFacetFromGrowableArrays(xyz, normal, param, color, visible);\r\n return true;\r\n }\r\n /** Add a polyface with optional reverse and transform. */\r\n public addIndexedPolyface(source: IndexedPolyface, reversed: boolean = false, transform?: Transform): void {\r\n this._polyface.addIndexedPolyface(source, reversed, transform);\r\n }\r\n /**\r\n * Produce a new FacetFaceData for all terminated facets since construction of the previous face.\r\n * * Each facet number/index is mapped to the FacetFaceData through the faceToFaceData array.\r\n * @returns true if successful, and false otherwise.\r\n */\r\n public endFace(): boolean {\r\n return this._polyface.setNewFaceData();\r\n }\r\n /** Double dispatch handler for Cone. */\r\n public override handleCone(g: Cone): any {\r\n return this.addCone(g);\r\n }\r\n /** Double dispatch handler for TorusPipe. */\r\n public override handleTorusPipe(g: TorusPipe): any {\r\n return this.addTorusPipe(g);\r\n }\r\n /** Double dispatch handler for Sphere. */\r\n public override handleSphere(g: Sphere): any {\r\n return this.addSphere(g);\r\n }\r\n /** Double dispatch handler for Box. */\r\n public override handleBox(g: Box): any {\r\n return this.addBox(g);\r\n }\r\n /** Double dispatch handler for LinearSweep. */\r\n public override handleLinearSweep(g: LinearSweep): any {\r\n return this.addLinearSweep(g);\r\n }\r\n /** Double dispatch handler for RotationalSweep. */\r\n public override handleRotationalSweep(g: RotationalSweep): any {\r\n return this.addRotationalSweep(g);\r\n }\r\n /** Double dispatch handler for RuledSweep. */\r\n public override handleRuledSweep(g: RuledSweep): any {\r\n return this.addRuledSweep(g);\r\n }\r\n /** Double dispatch handler for Loop. */\r\n public override handleLoop(g: Loop): any {\r\n return this.addTriangulatedRegion(g);\r\n }\r\n /** Double dispatch handler for ParityRegion. */\r\n public override handleParityRegion(g: ParityRegion): any {\r\n return this.addTriangulatedRegion(g);\r\n }\r\n /** Double dispatch handler for UnionRegion. */\r\n public override handleUnionRegion(g: UnionRegion): any {\r\n return this.addTriangulatedRegion(g);\r\n }\r\n /** Add facets for a GeometryQuery object. This is double dispatch through `dispatchToGeometryHandler(this)` */\r\n public addGeometryQuery(g: GeometryQuery): void {\r\n g.dispatchToGeometryHandler(this);\r\n }\r\n /**\r\n * Add a graph to the builder.\r\n * * Visit one node per face.\r\n * * If `acceptFaceFunction(node)` returns true, pass face coordinates to the builder.\r\n * * Accepted face edge visibility is determined by `isEdgeVisibleFunction`.\r\n * * Rely on the builder's compress step to find common vertex coordinates.\r\n * @param graph faces to add as facets.\r\n * @param acceptFaceFunction (optional) callback invoked once per graph face to test for whether to add a given face to the mesh. Default: accept only interior faces.\r\n * @param isEdgeVisibleFunction (optional) callback invoked once per edge of each accepted face to test for whether to hide an edge. Default: only boundary edges are visible.\r\n * @internal\r\n */\r\n public addGraph(\r\n graph: HalfEdgeGraph,\r\n acceptFaceFunction: HalfEdgeToBooleanFunction = (node) => HalfEdge.testNodeMaskNotExterior(node),\r\n isEdgeVisibleFunction: HalfEdgeToBooleanFunction = (node) => HalfEdge.testMateMaskExterior(node),\r\n ): void {\r\n let index = 0;\r\n const needNormals = this._options.needNormals;\r\n const needParams = this._options.needParams;\r\n let normalIndex = 0;\r\n if (needNormals)\r\n normalIndex = this._polyface.addNormalXYZ(0, 0, 1); // big assumption!!!! Is each node.z really the same?\r\n graph.announceFaceLoops(\r\n (_graph: HalfEdgeGraph, seed: HalfEdge) => {\r\n if (acceptFaceFunction(seed) && seed.countEdgesAroundFace() > 2) {\r\n let node = seed;\r\n do {\r\n index = this.addPointXYZ(node.x, node.y, node.z);\r\n this._polyface.addPointIndex(index, isEdgeVisibleFunction === undefined ? true : isEdgeVisibleFunction(node));\r\n if (needParams) {\r\n index = this.addParamXY(node.x, node.y); // big assumption!!!!\r\n this._polyface.addParamIndex(index);\r\n }\r\n if (needNormals) {\r\n this._polyface.addNormalIndex(normalIndex);\r\n }\r\n node = node.faceSuccessor;\r\n } while (node !== seed);\r\n this._polyface.terminateFacet();\r\n }\r\n return true;\r\n });\r\n }\r\n /**\r\n * Add a graph's faces to the builder.\r\n * * For each node in `faces`:\r\n * * Add all of its vertices to the polyface.\r\n * * Add point indices to form a new facet.\r\n * * (note: no normal or param indices are added)\r\n * * Terminate the facet.\r\n * @internal\r\n */\r\n public addGraphFaces(faces: HalfEdge[]): void {\r\n let index = 0;\r\n for (const seed of faces) {\r\n let node = seed;\r\n do {\r\n index = this.addPointXYZ(node.x, node.y, node.z);\r\n this._polyface.addPointIndex(index);\r\n node = node.faceSuccessor;\r\n } while (node !== seed);\r\n this._polyface.terminateFacet();\r\n }\r\n }\r\n /**\r\n * Create a polyface containing the faces of a HalfEdgeGraph, with test functions to filter faces and hide edges.\r\n * * This is a static wrapper of [[addGraph]].\r\n * * Default callbacks assume graph is appropriately masked with HalfEdgeMask.EXTERIOR.\r\n * @param graph faces to add as facets.\r\n * @param options (optional) options for the polyface.\r\n * @param acceptFaceFunction (optional) callback invoked once per graph face to test for whether to add a given face to the mesh. Default: accept only interior faces.\r\n * @param isEdgeVisibleFunction (optional) callback invoked once per edge of each accepted face to test for whether to hide an edge. Default: only boundary edges are visible.\r\n * @param clusterTol optional distance tolerance for mesh compression. Default is [[Geometry.smallMetricDistance]].\r\n * @internal\r\n */\r\n public static graphToPolyface(\r\n graph: HalfEdgeGraph,\r\n options?: StrokeOptions,\r\n acceptFaceFunction: HalfEdgeToBooleanFunction = (node) => HalfEdge.testNodeMaskNotExterior(node),\r\n isEdgeVisibleFunction: HalfEdgeToBooleanFunction = (node) => HalfEdge.testMateMaskExterior(node),\r\n clusterTol: number = Geometry.smallMetricDistance\r\n ): IndexedPolyface {\r\n const builder = PolyfaceBuilder.create(options);\r\n builder.addGraph(graph, acceptFaceFunction, isEdgeVisibleFunction);\r\n builder.endFace();\r\n return builder.claimPolyface(true, clusterTol); // always compress; addGraph does not share vertices!\r\n }\r\n /**\r\n * Create a polyface containing the faces of a HalfEdgeGraph that are specified by the HalfEdge array.\r\n * @internal\r\n */\r\n public static graphFacesToPolyface(faces: HalfEdge[]): IndexedPolyface {\r\n const builder = PolyfaceBuilder.create();\r\n builder.addGraphFaces(faces);\r\n builder.endFace();\r\n return builder.claimPolyface();\r\n }\r\n /**\r\n * Create a polyface containing triangles in a (space) polygon.\r\n * * The polyface contains only coordinate data (no params or normals).\r\n */\r\n public static polygonToTriangulatedPolyface(points: Point3d[], localToWorld?: Transform): IndexedPolyface | undefined {\r\n if (!localToWorld)\r\n localToWorld = FrameBuilder.createFrameWithCCWPolygon(points);\r\n if (localToWorld) {\r\n const localPoints = localToWorld.multiplyInversePoint3dArray(points)!;\r\n const areaXY = PolygonOps.areaXY(localPoints);\r\n if (areaXY < 0.0)\r\n localPoints.reverse();\r\n const graph = Triangulator.createTriangulatedGraphFromSingleLoop(localPoints);\r\n if (graph) {\r\n const polyface = this.graphToPolyface(graph);\r\n polyface.tryTransformInPlace(localToWorld);\r\n return polyface;\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Add facets to the builder given arrays of coordinates for multiple facets.\r\n * * pointArray[i] is an array of 3 or 4 points.\r\n * * paramArray[i] is an array of matching number of params.\r\n * * normalArray[i] is an array of matching number of normals.\r\n * @param pointArray array of arrays of point coordinates.\r\n * @param paramArray (optional) array of arrays of uv parameters.\r\n * @param normalArray (optional) array of arrays of normals.\r\n * @param endFace if true, call this.endFace after adding all the facets.\r\n */\r\n public addCoordinateFacets(\r\n pointArray: Point3d[][], paramArray?: Point2d[][], normalArray?: Vector3d[][], endFace: boolean = false,\r\n ): void {\r\n for (let i = 0; i < pointArray.length; i++) {\r\n const params = paramArray ? paramArray[i] : undefined;\r\n const normals = normalArray ? normalArray[i] : undefined;\r\n if (pointArray[i].length === 3)\r\n this.addTriangleFacet(pointArray[i], params, normals);\r\n else if (pointArray[i].length === 4)\r\n this.addQuadFacet(pointArray[i], params, normals);\r\n }\r\n if (endFace)\r\n this.endFace();\r\n }\r\n /**\r\n * Add facets from the parametric surface.\r\n * * Evaluate `(numU + 1) * (numV + 1)` grid points (in 0..1 in both u and v) on a surface.\r\n * * Add the facets for `numU * numV` quads.\r\n * * uv params are the 0..1 fractions.\r\n * * Normals are cross products of u and v direction partial derivatives.\r\n * @param surface UV surface to evaluate.\r\n * @param numU number of intervals (edges) in the u direction (number of points is `numU + 1`).\r\n * @param numV number of intervals (edges) in the v direction (number of points is `numV + 1`).\r\n * @param uMap optional mapping from u fraction to parameter space (such as texture).\r\n * @param vMap optional mapping from v fraction to parameter space (such as texture).\r\n */\r\n public addUVGridBody(surface: UVSurface, numU: number, numV: number, uMap?: Segment1d, vMap?: Segment1d): void {\r\n let xyzIndex0 = new GrowableFloat64Array(numU);\r\n let xyzIndex1 = new GrowableFloat64Array(numU);\r\n let paramIndex0: GrowableFloat64Array | undefined;\r\n let paramIndex1: GrowableFloat64Array | undefined;\r\n let normalIndex0: GrowableFloat64Array | undefined;\r\n let normalIndex1: GrowableFloat64Array | undefined;\r\n const reverse = this._reversed;\r\n const needNormals = this.options.needNormals;\r\n if (needNormals) {\r\n normalIndex0 = new GrowableFloat64Array(numU);\r\n normalIndex1 = new GrowableFloat64Array(numU);\r\n }\r\n const needParams = this.options.needParams;\r\n if (needParams) {\r\n paramIndex0 = new GrowableFloat64Array(numU);\r\n paramIndex1 = new GrowableFloat64Array(numU);\r\n }\r\n let indexSwap;\r\n xyzIndex0.ensureCapacity(numU);\r\n xyzIndex1.ensureCapacity(numU);\r\n const uv = Point2d.create();\r\n const normal = Vector3d.create();\r\n const du = 1.0 / numU;\r\n const dv = 1.0 / numV;\r\n const plane = Plane3dByOriginAndVectors.createXYPlane();\r\n for (let v = 0; v <= numV; v++) {\r\n // evaluate new points\r\n xyzIndex1.clear();\r\n if (needNormals)\r\n normalIndex1!.clear();\r\n if (needParams)\r\n paramIndex1!.clear();\r\n for (let u = 0; u <= numU; u++) {\r\n const uFrac = u * du;\r\n const vFrac = v * dv;\r\n surface.uvFractionToPointAndTangents(uFrac, vFrac, plane);\r\n xyzIndex1.push(this._polyface.addPoint(plane.origin));\r\n if (needNormals) {\r\n plane.vectorU.crossProduct(plane.vectorV, normal);\r\n normal.normalizeInPlace();\r\n if (reverse)\r\n normal.scaleInPlace(-1.0);\r\n normalIndex1!.push(this._polyface.addNormal(normal));\r\n }\r\n if (needParams)\r\n paramIndex1!.push(\r\n this._polyface.addParam(\r\n Point2d.create(uMap ? uMap.fractionToPoint(uFrac) : uFrac, vMap ? vMap.fractionToPoint(vFrac) : vFrac, uv),\r\n ),\r\n );\r\n }\r\n if (v > 0) {\r\n for (let u = 0; u < numU; u++) {\r\n if (!this._options.shouldTriangulate) {\r\n this.addIndexedQuadPointIndexes(\r\n xyzIndex0.atUncheckedIndex(u), xyzIndex0.atUncheckedIndex(u + 1),\r\n xyzIndex1.atUncheckedIndex(u), xyzIndex1.atUncheckedIndex(u + 1),\r\n false,\r\n );\r\n if (needNormals)\r\n this.addIndexedQuadNormalIndexes(\r\n normalIndex0!.atUncheckedIndex(u), normalIndex0!.atUncheckedIndex(u + 1),\r\n normalIndex1!.atUncheckedIndex(u), normalIndex1!.atUncheckedIndex(u + 1),\r\n );\r\n if (needParams)\r\n this.addIndexedQuadParamIndexes(\r\n paramIndex0!.atUncheckedIndex(u), paramIndex0!.atUncheckedIndex(u + 1),\r\n paramIndex1!.atUncheckedIndex(u), paramIndex1!.atUncheckedIndex(u + 1),\r\n );\r\n this._polyface.terminateFacet();\r\n } else {\r\n this.addIndexedTrianglePointIndexes(\r\n xyzIndex0.atUncheckedIndex(u), xyzIndex0.atUncheckedIndex(u + 1),\r\n xyzIndex1.atUncheckedIndex(u), false);\r\n if (needNormals)\r\n this.addIndexedTriangleNormalIndexes(\r\n normalIndex0!.atUncheckedIndex(u), normalIndex0!.atUncheckedIndex(u + 1),\r\n normalIndex1!.atUncheckedIndex(u),\r\n );\r\n if (needParams)\r\n this.addIndexedTriangleParamIndexes(\r\n paramIndex0!.atUncheckedIndex(u), paramIndex0!.atUncheckedIndex(u + 1),\r\n paramIndex1!.atUncheckedIndex(u),\r\n );\r\n this._polyface.terminateFacet();\r\n this.addIndexedTrianglePointIndexes(\r\n xyzIndex1.atUncheckedIndex(u),\r\n xyzIndex0.atUncheckedIndex(u + 1),\r\n xyzIndex1.atUncheckedIndex(u + 1),\r\n false,\r\n );\r\n if (needNormals)\r\n this.addIndexedTriangleNormalIndexes(\r\n normalIndex1!.atUncheckedIndex(u),\r\n normalIndex0!.atUncheckedIndex(u + 1),\r\n normalIndex1!.atUncheckedIndex(u + 1),\r\n );\r\n if (needParams)\r\n this.addIndexedTriangleParamIndexes(\r\n paramIndex1!.atUncheckedIndex(u),\r\n paramIndex0!.atUncheckedIndex(u + 1),\r\n paramIndex1!.atUncheckedIndex(u + 1),\r\n );\r\n this._polyface.terminateFacet();\r\n }\r\n }\r\n }\r\n indexSwap = xyzIndex1; xyzIndex1 = xyzIndex0; xyzIndex0 = indexSwap;\r\n if (needParams)\r\n indexSwap = paramIndex1; paramIndex1 = paramIndex0; paramIndex0 = indexSwap;\r\n if (needNormals)\r\n indexSwap = normalIndex1; normalIndex1 = normalIndex0; normalIndex0 = indexSwap;\r\n }\r\n xyzIndex0.clear();\r\n xyzIndex1.clear();\r\n }\r\n /**\r\n * Create a polyface from a triangulation of the points.\r\n * * The triangulation is computed as seen in the top view: z-coordinates are ignored.\r\n * * The highest z-coordinate is preserved for points that are separated by a vertical distance.\r\n * @param points an array of points.\r\n * @param options (optional) stroke options:\r\n * * `options.chordTol`: xy-distance for equating points. For DTM points, 1-2mm may suffice. Default value is\r\n * `Geometry.smallMetricDistance`.\r\n * * `options.needNormals`: whether to assign 001 to all facets (rarely useful).\r\n * * `options.needParams`: whether to assign all vertices uv-parameters equal to their xy-coordinates (rarely useful).\r\n * @returns triangulated polyface or `undefined` if triangulation was not possible.\r\n */\r\n public static pointsToTriangulatedPolyface(points: Point3d[], options?: StrokeOptions): IndexedPolyface | undefined {\r\n const graph = Triangulator.createTriangulatedGraphFromPoints(points, InsertedVertexZOptions.ReplaceIfLarger, options?.chordTol);\r\n if (graph)\r\n return PolyfaceBuilder.graphToPolyface(graph, options);\r\n return undefined;\r\n }\r\n /**\r\n * Add triangular facets between two linestrings.\r\n * * Each triangle will have 1 vertex on one of the linestrings and 2 on the other.\r\n * * Choice of triangles is heuristic, hence does not have a unique solution.\r\n * * Logic for choosing among the various possible triangles prefers:\r\n * * Make near-coplanar facets.\r\n * * Make facets with good aspect ratio.\r\n * * This is exercised with a limited number of lookahead points, i.e. greedy to make first-available decision.\r\n * @param pointsA points of first linestring.\r\n * @param pointsB points of second linestring.\r\n */\r\n public addGreedyTriangulationBetweenLineStrings(\r\n pointsA: Point3d[] | LineString3d | IndexedXYZCollection, pointsB: Point3d[] | LineString3d | IndexedXYZCollection,\r\n ): void {\r\n const context = GreedyTriangulationBetweenLineStrings.createContext();\r\n context.emitTriangles(\r\n resolveToIndexedXYZCollectionOrCarrier(pointsA),\r\n resolveToIndexedXYZCollectionOrCarrier(pointsB),\r\n (triangle: BarycentricTriangle) => { this.addTriangleFacet(triangle.points); },\r\n );\r\n }\r\n /**\r\n * Add quad facets along a mitered pipe that follows a centerline curve.\r\n * * At the end of each pipe segment, the pipe is mitered by the plane that bisects the angle between successive\r\n * centerline segments.\r\n * * Circular or elliptical pipe cross sections can be specified by supplying either a radius, a pair of semi-axis\r\n * lengths, or an Arc3d:\r\n * * For semi-axis length input, x and y correspond to ellipse local axes perpendicular to each other and to the\r\n * start tangent.\r\n * * For Arc3d input, the center is translated to the centerline start point. For best results, ensure this arc\r\n * is perpendicular to the centerline start tangent.\r\n * * This function internally calls [[CurveFactory.createMiteredSweepSections]], passing in the `startTangent`\r\n * option to preserve the rotation of Arc3d-type `sectionData`.\r\n * @param centerline centerline of pipe. If curved, it will be stroked using the builder's StrokeOptions, otherwise\r\n * for best results, ensure no successive duplicate points with e.g., [[GrowableXYZArray.createCompressed]].\r\n * @param sectionData circle radius, ellipse semi-axis lengths, or Arc3d.\r\n * @param numFacetAround how many equal parameter-space chords around each section.\r\n * @param capped if `true`, add a cap at each end of the pipe; defaults to `false`.\r\n */\r\n public addMiteredPipes(\r\n centerline: IndexedXYZCollection | Point3d[] | CurvePrimitive,\r\n sectionData: number | XAndY | Arc3d,\r\n numFacetAround: number = 12,\r\n capped: boolean = false,\r\n ): void {\r\n const arc = CurveFactory.createArcFromSectionData(centerline, sectionData);\r\n if (!arc)\r\n return;\r\n if (numFacetAround < 3)\r\n numFacetAround = 3;\r\n const section = LineString3d.create();\r\n section.appendFractionalStrokePoints(arc, numFacetAround, 0.0, 1.0, true);\r\n const strokeOptions = this._options.clone();\r\n const outputSelect = MiteredSweepOutputSelect.AlsoMesh;\r\n const startTangent = sectionData instanceof Arc3d ? arc.binormalVector() : undefined; // preserve arc orientation\r\n const options = { strokeOptions, capped, outputSelect, startTangent };\r\n const sections = CurveFactory.createMiteredSweepSections(centerline, section, options);\r\n if (sections && sections.mesh)\r\n this.addIndexedPolyface(sections.mesh);\r\n }\r\n /** Return the polyface index array indices corresponding to the given edge, or `undefined` if error. */\r\n private getEdgeIndices(edge: SortableEdge): { edgeIndexA: number, edgeIndexB: number } | undefined {\r\n let indexA = -1; let indexB = -1;\r\n for (let i = this._polyface.facetIndex0(edge.facetIndex); i < this._polyface.facetIndex1(edge.facetIndex); ++i) {\r\n if (edge.startVertex === this._polyface.data.pointIndex[i])\r\n indexA = i;\r\n else if (edge.endVertex === this._polyface.data.pointIndex[i])\r\n indexB = i;\r\n }\r\n return (indexA < 0 || indexB < 0) ? undefined : { edgeIndexA: indexA, edgeIndexB: indexB };\r\n }\r\n /**\r\n * Create a side face between base and swept facets along a base boundary edge.\r\n * * Assumes numBaseFacets base facets were added to this builder, immediately followed by the same number of swept\r\n * facets with opposite orientation (first index not preserved).\r\n */\r\n private addSweptFace(baseBoundaryEdge: SortableEdge, numBaseFacets: number): boolean {\r\n const edge = this.getEdgeIndices(baseBoundaryEdge);\r\n if (undefined === edge)\r\n return false;\r\n const sweptFacetIndex = numBaseFacets + baseBoundaryEdge.facetIndex;\r\n if (!this._polyface.isValidFacetIndex(sweptFacetIndex))\r\n return false;\r\n const numBaseFacetEdges = this._polyface.numEdgeInFacet(baseBoundaryEdge.facetIndex);\r\n if (numBaseFacetEdges !== this._polyface.numEdgeInFacet(sweptFacetIndex))\r\n return false;\r\n // generate indices into the polyface index arrays\r\n const baseFacetIndexStart = this._polyface.facetIndex0(baseBoundaryEdge.facetIndex);\r\n const sweptFacetIndexStart = this._polyface.facetIndex0(sweptFacetIndex);\r\n const edgeIndexOffsetInFaceLoopA = edge.edgeIndexA - baseFacetIndexStart;\r\n const edgeIndexOffsetInFaceLoopB = edge.edgeIndexB - baseFacetIndexStart;\r\n const sweptEdgeIndexOffsetInFaceLoopA = (numBaseFacetEdges - 1) - edgeIndexOffsetInFaceLoopA;\r\n const sweptEdgeIndexOffsetInFaceLoopB = (numBaseFacetEdges - 1) - edgeIndexOffsetInFaceLoopB;\r\n const indices = [\r\n edge.edgeIndexB,\r\n edge.edgeIndexA,\r\n sweptFacetIndexStart + sweptEdgeIndexOffsetInFaceLoopA,\r\n sweptFacetIndexStart + sweptEdgeIndexOffsetInFaceLoopB,\r\n ];\r\n const vertices: Point3d[] = [];\r\n let colors: number[] | undefined; // try to re-use colors; missing normals and params will be computed if needed\r\n if (undefined !== this.options.needColors && undefined !== this._polyface.data.color && undefined !== this._polyface.data.colorIndex)\r\n colors = [];\r\n for (let i = 0; i < 4; ++i) {\r\n const xyz = this._polyface.data.getPoint(this._polyface.data.pointIndex[indices[i]]);\r\n if (undefined === xyz)\r\n return false;\r\n vertices.push(xyz);\r\n if (undefined !== colors) {\r\n const color = this._polyface.data.getColor(this._polyface.data.colorIndex![indices[i]]);\r\n if (undefined === color)\r\n return false;\r\n colors.push(color);\r\n }\r\n }\r\n this.addQuadFacet(vertices, undefined, undefined, colors);\r\n return true;\r\n }\r\n /**\r\n * Add facets from the source polyface, from its translation along the vector, and from its swept boundary edges,\r\n * to form a polyface that encloses a volume.\r\n * @param source the surface mesh to sweep.\r\n * @param sweepVector the direction and length to sweep the surface mesh.\r\n * @param triangulateSides whether to triangulate side facets, or leave as quads.\r\n * @returns whether the added facets comprise a simple sweep. If false, the resulting mesh may have self-intersections,\r\n * be non-manifold, have inconsistently oriented facets, etc.\r\n */\r\n public addSweptIndexedPolyface(\r\n source: IndexedPolyface, sweepVector: Vector3d, triangulateSides: boolean = false,\r\n ): boolean {\r\n let isSimpleSweep = true;\r\n const totalProjectedArea = PolyfaceQuery.sumFacetAreas(source, sweepVector);\r\n if (Geometry.isAlmostEqualNumber(0.0, totalProjectedArea))\r\n isSimpleSweep = false;\r\n const partitionedIndices = PolyfaceQuery.partitionFacetIndicesByVisibilityVector(\r\n source, sweepVector, Angle.createDegrees(1.0e-3),\r\n );\r\n const numForwardFacets = partitionedIndices[0].length;\r\n const numBackwardFacets = partitionedIndices[1].length;\r\n const numSideFacets = partitionedIndices[2].length;\r\n if (numSideFacets > 0)\r\n isSimpleSweep = false;\r\n if (numForwardFacets > 0 && numBackwardFacets > 0)\r\n isSimpleSweep = false;\r\n // add base and swept facets with opposite orientations\r\n const reverseBase = numForwardFacets > 0;\r\n const firstBaseFacet = this._polyface.facetCount;\r\n this.addIndexedPolyface(source, reverseBase);\r\n const firstSweptFacet = this._polyface.facetCount;\r\n this.addIndexedPolyface(source, !reverseBase, Transform.createTranslation(sweepVector));\r\n // collect base edges added to the builder, and extract boundary\r\n const numBaseFacets = firstSweptFacet - firstBaseFacet;\r\n const baseFacetIndices = Array.from({ length: numBaseFacets }, (_, i) => firstBaseFacet + i);\r\n const baseFacetVisitor = IndexedPolyfaceSubsetVisitor.createSubsetVisitor(this._polyface, baseFacetIndices, 1);\r\n const baseEdges = PolyfaceQuery.createIndexedEdges(baseFacetVisitor);\r\n const baseBoundaryEdges: SortableEdgeCluster[] = [];\r\n baseEdges.sortAndCollectClusters(undefined, baseBoundaryEdges, undefined, undefined);\r\n // add a side face per boundary edge\r\n const oldShouldTriangulate = this._options.shouldTriangulate;\r\n this._options.shouldTriangulate = triangulateSides;\r\n for (const edgeOrCluster of baseBoundaryEdges) {\r\n if (edgeOrCluster instanceof SortableEdge)\r\n this.addSweptFace(edgeOrCluster, numBaseFacets);\r\n else if (Array.isArray(edgeOrCluster))\r\n for (const edge of edgeOrCluster)\r\n this.addSweptFace(edge, numBaseFacets);\r\n }\r\n this._options.shouldTriangulate = oldShouldTriangulate;\r\n return isSimpleSweep;\r\n }\r\n}\r\nfunction resolveToIndexedXYZCollectionOrCarrier(points: Point3d[] | LineString3d | IndexedXYZCollection): IndexedXYZCollection {\r\n if (Array.isArray(points))\r\n return new Point3dArrayCarrier(points);\r\n if (points instanceof LineString3d)\r\n return points.packedPoints;\r\n return points;\r\n}\r\nfunction distinctIndices(i0: number, i1: number, i2: number): boolean {\r\n return i0 !== i1 && i1 !== i2 && i2 !== i0;\r\n}\r\n\r\n/**\r\n * In this file to avoid topology -> polyface dependency.\r\n * @internal\r\n */\r\nexport namespace HalfEdgeGraphSearch {\r\n /**\r\n * Search the graph for an interior face containing the test point(s).\r\n * * For best results:\r\n * * the graph exterior face(s) should be masked with HalfEdgeMask.EXTERIOR\r\n * * the graph should contain no vertical faces\r\n * @param graph input topology, z-coordinates ignored\r\n * @param testPoint xy point(s) to search\r\n * @returns edge in the face loop of the containing face, or `undefined` if `testPoint` is in an exterior face,\r\n * or an array of the same in 1-1 correspondence with the input points.\r\n */\r\n export function findContainingFaceXY(graph: HalfEdgeGraph, testPoint: XAndY | XAndY[]): (HalfEdge | undefined)[] | HalfEdge | undefined {\r\n const results: (HalfEdge | undefined)[] = [];\r\n const idToFaceIndexMap = graph.constructIdToFaceIndexMap();\r\n const facetIndexToFaceIndex: number[] = [];\r\n const acceptFace = (face: HalfEdge): boolean => {\r\n if (face.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false; // skip exterior face\r\n facetIndexToFaceIndex.push(idToFaceIndexMap.get(face.id) ?? -1);\r\n return true;\r\n };\r\n const clusterTol = Geometry.smallFloatingPoint; // don't want clustering to destroy edges\r\n const mesh = PolyfaceBuilder.graphToPolyface(graph, undefined, acceptFace, () => true, clusterTol);\r\n mesh.data.point.multiplyMatrix3dInPlace(Matrix3d.createScale(1, 1, 0)); // flatten\r\n const searcher = PolyfaceRangeTreeContext.createCapture(mesh, undefined, undefined, false);\r\n if (searcher) {\r\n const testPoints = Array.isArray(testPoint) ? testPoint : [testPoint];\r\n for (const testPt of testPoints) {\r\n let result: HalfEdge | undefined;\r\n const closestDetail = searcher.searchForClosestPoint(testPt, undefined, true) as FacetLocationDetail | undefined;\r\n // closest point on the mesh should have zero distance to testPt, but allow for minute slop\r\n if (closestDetail && closestDetail.a < Geometry.smallFloatingPoint) {\r\n const faceIndex = facetIndexToFaceIndex[closestDetail.facetIndex];\r\n if (faceIndex >= 0 && faceIndex < graph.allHalfEdges.length)\r\n result = graph.allHalfEdges[faceIndex];\r\n }\r\n results.push(result);\r\n }\r\n }\r\n return results.length === 0 ? undefined : (results.length === 1 ? results[0] : results);\r\n }\r\n}\r\n"]}
|