@itwin/core-geometry 5.2.0 → 5.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -1
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
- package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/cjs/bspline/KnotVector.js.map +1 -1
- package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +5 -7
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.d.ts +2 -5
- package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
- package/lib/cjs/curve/CurveOps.js +2 -5
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +50 -15
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +102 -84
- 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 +44 -25
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +74 -39
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +8 -8
- 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 +1 -0
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +102 -92
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +2 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +2 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +2 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +2 -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.d.ts +9 -16
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +3 -3
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts +2 -2
- package/lib/cjs/geometry3d/PolylineOps.js +2 -2
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/geometry4d/Map4d.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/geometry4d/MomentData.js.map +1 -1
- package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/cjs/geometry4d/Point4d.js.map +1 -1
- package/lib/cjs/numerics/BandedSystem.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js +2 -2
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/Complex.js.map +1 -1
- package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
- package/lib/cjs/numerics/PolarData.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/numerics/Quadrature.js.map +1 -1
- package/lib/cjs/numerics/Range1dArray.js.map +1 -1
- package/lib/cjs/numerics/SmallSystem.js.map +1 -1
- package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/cjs/numerics/UnionFind.js.map +1 -1
- package/lib/cjs/numerics/UsageSums.js.map +1 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/BoxTopology.js.map +1 -1
- package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
- package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/Merging.d.ts +15 -7
- package/lib/cjs/topology/Merging.d.ts.map +1 -1
- package/lib/cjs/topology/Merging.js +15 -10
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/Voronoi.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +5 -7
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.d.ts +2 -5
- package/lib/esm/curve/CurveOps.d.ts.map +1 -1
- package/lib/esm/curve/CurveOps.js +2 -5
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +50 -15
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +102 -84
- 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 +44 -25
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +72 -37
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +8 -8
- 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 +1 -0
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +102 -92
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +2 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +2 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +2 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +2 -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.d.ts +9 -16
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +3 -3
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Plane3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts +2 -2
- package/lib/esm/geometry3d/PolylineOps.js +2 -2
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/Segment1d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/esm/geometry3d/XYZProps.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/geometry4d/Map4d.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/geometry4d/MomentData.js.map +1 -1
- package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/esm/geometry4d/Point4d.js.map +1 -1
- package/lib/esm/numerics/BandedSystem.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js +2 -2
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/Complex.js.map +1 -1
- package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
- package/lib/esm/numerics/PolarData.js.map +1 -1
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/numerics/Quadrature.js.map +1 -1
- package/lib/esm/numerics/Range1dArray.js.map +1 -1
- package/lib/esm/numerics/SmallSystem.js.map +1 -1
- package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/esm/numerics/UnionFind.js.map +1 -1
- package/lib/esm/numerics/UsageSums.js.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/BoxTopology.js.map +1 -1
- package/lib/esm/polyface/FacetFaceData.js.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/esm/polyface/FacetOrientation.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeLengthData.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
- package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SolidPrimitive.js.map +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/Merging.d.ts +15 -7
- package/lib/esm/topology/Merging.d.ts.map +1 -1
- package/lib/esm/topology/Merging.js +15 -10
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/Voronoi.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolygonOps.js","sourceRoot":"","sources":["../../../src/geometry3d/PolygonOps.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 CartesianGeometry\r\n */\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\r\nimport { AxisOrder, Geometry, PlaneAltitudeEvaluator, PolygonLocation } from \"../Geometry\";\r\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { XYParitySearchContext } from \"../topology/XYParitySearchContext\";\r\nimport { FrameBuilder } from \"./FrameBuilder\";\r\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\r\nimport { IndexedReadWriteXYZCollection, IndexedXYZCollection } from \"./IndexedXYZCollection\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Plane3d } from \"./Plane3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Point2d, Vector2d } from \"./Point2dVector2d\";\r\nimport { Point3dArrayCarrier } from \"./Point3dArrayCarrier\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { PolylineOps } from \"./PolylineOps\";\r\nimport { Range1d, Range3d } from \"./Range\";\r\nimport { Ray3d } from \"./Ray3d\";\r\nimport { SortablePolygon } from \"./SortablePolygon\";\r\nimport { XAndY, XYAndZ } from \"./XYZProps\";\r\n\r\n/**\r\n * Carries data about a point in the plane of a polygon.\r\n * @public\r\n */\r\nexport class PolygonLocationDetail {\r\n /** The coordinates of the point p. */\r\n public point: Point3d;\r\n /** Application-specific number */\r\n public a: number;\r\n /** Application-specific vector */\r\n public v: Vector3d;\r\n /** A number that classifies the point's location with respect to the polygon. */\r\n public code: PolygonLocation;\r\n /** Index of the polygon vertex at the base of the edge closest to p. */\r\n public closestEdgeIndex: number;\r\n /** The parameter along the closest edge of the projection of p. */\r\n public closestEdgeParam: number;\r\n\r\n private constructor() {\r\n this.point = new Point3d();\r\n this.a = 0.0;\r\n this.v = new Vector3d();\r\n this.code = PolygonLocation.Unknown;\r\n this.closestEdgeIndex = 0;\r\n this.closestEdgeParam = 0.0;\r\n }\r\n\r\n /** Invalidate this detail. */\r\n public invalidate() {\r\n this.point.setZero();\r\n this.a = 0.0;\r\n this.v.setZero();\r\n this.code = PolygonLocation.Unknown;\r\n this.closestEdgeIndex = 0;\r\n this.closestEdgeParam = 0.0;\r\n }\r\n\r\n /** Create an invalid detail.\r\n * @param result optional pre-allocated object to fill and return\r\n */\r\n public static create(result?: PolygonLocationDetail): PolygonLocationDetail {\r\n if (undefined === result)\r\n result = new PolygonLocationDetail();\r\n else\r\n result.invalidate();\r\n return result;\r\n }\r\n\r\n /** Set the instance contents from the other detail.\r\n * @param other detail to clone\r\n */\r\n public copyContentsFrom(other: PolygonLocationDetail) {\r\n this.point.setFrom(other.point);\r\n this.a = other.a;\r\n this.v.setFrom(other.v);\r\n this.code = other.code;\r\n this.closestEdgeIndex = other.closestEdgeIndex;\r\n this.closestEdgeParam = other.closestEdgeParam;\r\n }\r\n\r\n /** Whether this detail is valid. */\r\n public get isValid(): boolean {\r\n return this.code !== PolygonLocation.Unknown;\r\n }\r\n\r\n /** Whether this instance specifies a location inside or on the polygon. */\r\n public get isInsideOrOn(): boolean {\r\n return this.code === PolygonLocation.InsidePolygon ||\r\n this.code === PolygonLocation.OnPolygonVertex || this.code === PolygonLocation.OnPolygonEdgeInterior ||\r\n this.code === PolygonLocation.InsidePolygonProjectsToVertex || this.code === PolygonLocation.InsidePolygonProjectsToEdgeInterior;\r\n }\r\n /**\r\n * Set point, index, and fraction for an \"at vertex\" or \"along edge\" PolygonLocationDetail.\r\n * * Point is not captured; its coordinates are copied.\r\n */\r\n public static createAtVertexOrEdge(point: Point3d, index: number, fraction: number = 0): PolygonLocationDetail {\r\n const detail = new PolygonLocationDetail();\r\n detail.point.setFrom(point);\r\n detail.closestEdgeIndex = index;\r\n detail.closestEdgeParam = fraction;\r\n fraction = Geometry.clamp(fraction, 0, 1);\r\n detail.code = (fraction > 0 && fraction < 1) ? PolygonLocation.OnPolygonEdgeInterior : PolygonLocation.OnPolygonVertex;\r\n return detail;\r\n }\r\n}\r\n\r\n/**\r\n * A pair of PolygonLocationDetail.\r\n * @public\r\n */\r\nexport class PolygonLocationDetailPair {\r\n /** The first of the two details. */\r\n public detailA: PolygonLocationDetail;\r\n /** The second of the two details. */\r\n public detailB: PolygonLocationDetail;\r\n\r\n /** Constructor, captures inputs */\r\n private constructor(detailA?: PolygonLocationDetail, detailB?: PolygonLocationDetail) {\r\n this.detailA = detailA ? detailA : PolygonLocationDetail.create();\r\n this.detailB = detailB ? detailB : PolygonLocationDetail.create();\r\n }\r\n /** Create an instance by capturing inputs */\r\n public static create(detailA: PolygonLocationDetail, detailB: PolygonLocationDetail, result?: PolygonLocationDetailPair): PolygonLocationDetailPair {\r\n if (!result)\r\n return new PolygonLocationDetailPair(detailA, detailB);\r\n result.detailA = detailA;\r\n result.detailB = detailB;\r\n return result;\r\n }\r\n /** Make a deep copy of this PolygonLocationDetailPair */\r\n public clone(result?: PolygonLocationDetailPair): PolygonLocationDetailPair {\r\n result = result ? result : new PolygonLocationDetailPair();\r\n result.detailA.copyContentsFrom(this.detailA);\r\n result.detailB.copyContentsFrom(this.detailB);\r\n return result;\r\n }\r\n /** Swap the details of A, B */\r\n public swapDetails() {\r\n const q = this.detailA;\r\n this.detailA = this.detailB;\r\n this.detailB = q;\r\n }\r\n}\r\n\r\n/**\r\n * Carrier for a loop extracted from clip operation, annotated for sorting\r\n * @internal\r\n */\r\nexport class CutLoop {\r\n /* All points of the loop */\r\n public xyz: GrowableXYZArray;\r\n /* ray within point of \"on\" edge */\r\n public edge?: Ray3d;\r\n public sortCoordinate0: number;\r\n public sortCoordinate1: number;\r\n public sortDelta: number;\r\n public isNotch: boolean;\r\n public constructor(xyz: GrowableXYZArray) {\r\n this.xyz = xyz;\r\n this.edge = undefined;\r\n this.sortCoordinate0 = this.sortCoordinate1 = 0;\r\n this.sortDelta = 0;\r\n this.isNotch = false;\r\n }\r\n /**\r\n * Create a `CutLoop` structure annotated with the vector from last point to first.\r\n * @param xyz coordinates to capture\r\n */\r\n public static createCaptureWithReturnEdge(xyz: GrowableXYZArray): CutLoop {\r\n const result = new CutLoop(xyz);\r\n if (xyz.length >= 2)\r\n result.edge = Ray3d.createStartEnd(xyz.front()!, xyz.back()!);\r\n return result;\r\n }\r\n /**\r\n * Set up coordinates for sort steps:\r\n * * Make `sortCoordinate0` and `sortCoordinate` the (algebraically sorted) start and end fractions along the ray\r\n * * Make `sortDelta` the oriented difference of those two\r\n * * Hence sorting on the coordinates puts loops in left-to-right order by the their edge vector leftmost point.\r\n */\r\n public setSortCoordinates(ray: Ray3d) {\r\n this.sortDelta = this.edge!.direction.dotProduct(ray.direction);\r\n const a = ray.dotProductToPoint(this.edge!.origin);\r\n if (this.sortDelta >= 0) {\r\n this.sortCoordinate0 = a;\r\n this.sortCoordinate1 = a + this.sortDelta;\r\n } else {\r\n this.sortCoordinate0 = a + this.sortDelta; // and sortDelta is negative !!!\r\n this.sortCoordinate1 = a;\r\n\r\n }\r\n }\r\n /** Return\r\n * * 0 if other sort limits are not strictly contained in this.\r\n * * 1 if other sort limits are strictly contained with same direction\r\n * * -1 if other sort limits are strictly contained in opposite direction.\r\n */\r\n public containsSortLimits(other: CutLoop): number {\r\n if (other.sortCoordinate0 >= this.sortCoordinate1\r\n || other.sortCoordinate0 <= this.sortCoordinate0\r\n || other.sortCoordinate1 <= this.sortCoordinate0\r\n || other.sortCoordinate1 >= this.sortCoordinate1)\r\n return 0;\r\n return this.sortDelta * other.sortDelta > 0 ? 1 : -1;\r\n }\r\n /**\r\n * * push coordinates from other onto this\r\n * * reset this.sortCoordinate0 to other.sortCoordinate1\r\n * @param other new coordinates\r\n */\r\n public absorb(other: CutLoop) {\r\n this.xyz.pushFromGrowableXYZArray(other.xyz);\r\n this.sortCoordinate0 = other.sortCoordinate1;\r\n }\r\n /** Comparison function for system sort function applied to an array of CutLoop .... */\r\n public static sortFunction(loopA: CutLoop, loopB: CutLoop): number {\r\n const q = loopA.sortCoordinate0 - loopB.sortCoordinate0;\r\n return q > 0 ? 1 : -1;\r\n }\r\n\r\n /** Return first point coordinates.\r\n * * For type checking, assume array is not empty.\r\n */\r\n public front(result?: Point3d): Point3d { return this.xyz.front(result)!; }\r\n /** Return last point coordinates.\r\n * * For type checking, assume array is not empty.\r\n */\r\n public back(result?: Point3d): Point3d { return this.xyz.back(result)!; }\r\n\r\n}\r\n/**\r\n * Context to hold an array of input loops and apply sort logic.\r\n * * This is used when a non-convex face is clipped by a plane\r\n * * Simple convex clip logic in this case generates double-back edges that need to be eliminated.\r\n * * This class manages the elimination.\r\n * * Usage pattern is:\r\n * @internal\r\n */\r\nexport class CutLoopMergeContext {\r\n /** Array (filled by user code) of loops being sorted. Contents are subject to being changed during sort. */\r\n public inputLoops: CutLoop[];\r\n /** Array (filled by sortAndMergeLoops) of reorganized loops. */\r\n public outputLoops: CutLoop[];\r\n // Initialize with empty loop arrays.\r\n public constructor() {\r\n this.inputLoops = [];\r\n this.outputLoops = [];\r\n }\r\n /**\r\n * * Search all start and end points for the one most distant from point0.\r\n */\r\n private mostDistantPoint(point0: Point3d, workPoint: Point3d, resultPoint: Point3d) {\r\n let dMax = -1.0;\r\n resultPoint.setZero();\r\n let d;\r\n for (const loop of this.inputLoops) {\r\n loop.front(workPoint);\r\n d = workPoint.distanceSquared(point0);\r\n if (d > dMax) {\r\n dMax = d;\r\n resultPoint.setFromPoint3d(workPoint);\r\n }\r\n loop.back(workPoint);\r\n d = workPoint.distanceSquared(point0);\r\n if (d > dMax) {\r\n dMax = d;\r\n resultPoint.setFromPoint3d(workPoint);\r\n }\r\n }\r\n }\r\n /**\r\n * * Find a long (probably longest) edge through start and end points of inputs.\r\n * * Setup sortCoordinate0 and sortCoordinate1 along that edge for each loop\r\n * * sort all inputLoop members by sortCoordinate0.\r\n */\r\n private sortInputs() {\r\n if (this.inputLoops.length > 0 && this.inputLoops[0].xyz.length > 0) {\r\n const point0 = this.inputLoops[0].xyz.front()!;\r\n const workPoint = Point3d.create();\r\n const point1 = Point3d.create();\r\n // point0 could be in the middle. Find the most distant point ...\r\n this.mostDistantPoint(point0, workPoint, point1);\r\n // And again from point1 to get to the other extreme . .\r\n this.mostDistantPoint(point1, workPoint, point0);\r\n const sortRay = Ray3d.createStartEnd(point0, point1);\r\n sortRay.direction.normalizeInPlace();\r\n for (const loop of this.inputLoops)\r\n loop.setSortCoordinates(sortRay);\r\n this.inputLoops.sort((loopA, loopB) => CutLoop.sortFunction(loopA, loopB));\r\n\r\n }\r\n }\r\n /**\r\n * * sort all input loops by coordinate along the cut edge\r\n * * sweep left to right, using start and end coordinates to decide if loops are outer or hole, and combine holes into their containing outer loops.\r\n */\r\n public sortAndMergeLoops() {\r\n this.sortInputs();\r\n const inputs = this.inputLoops;\r\n const outputs = this.outputLoops;\r\n const stack = [];\r\n outputs.length = 0;\r\n for (const candidate of inputs) {\r\n candidate.isNotch = false;\r\n // candidate must be either (a) absorbed in to of stack or (b) pushed onto stack.\r\n // If pushed, must have indication of natch state.\r\n for (; stack.length > 0;) {\r\n const topOfStack = stack[stack.length - 1];\r\n const containment = topOfStack.containsSortLimits(candidate);\r\n if (containment === 0) {\r\n if (!topOfStack.isNotch)\r\n outputs.push(topOfStack);\r\n stack.pop();\r\n continue; // a larger topOfStack may have appeared !\r\n candidate.isNotch = false;\r\n } else if (containment === 1) {\r\n candidate.isNotch = false;\r\n break;\r\n } else {\r\n topOfStack.absorb(candidate);\r\n candidate.isNotch = true;\r\n break;\r\n }\r\n }\r\n stack.push(candidate);\r\n }\r\n // Anything on stack must be complete ...\r\n for (const p of stack) {\r\n if (!p.isNotch)\r\n outputs.push(p);\r\n }\r\n }\r\n}\r\n/**\r\n * Bundle of options for [[PolygonOps.volumeBetweenPolygonAndPlane]].\r\n * @public\r\n * @see [[VolumeBetweenPolygonAndPlaneOutput]]\r\n */\r\nexport interface VolumeBetweenPolygonAndPlaneOptions {\r\n /** Whether to skip computation of the area moments. If `true` only volume and area are returned. Default is `false`. */\r\n skipMoments?: boolean;\r\n /** Work point. If `skipMoments` is undefined/false, this point is returned as the area moment origin. */\r\n workPoint0?: Point3d;\r\n /** Another work point. */\r\n workPoint1?: Point3d;\r\n /** Work vector. */\r\n workVector?: Vector3d;\r\n /** Work matrix. If `skipMoments` is undefined/false, this matrix is returned as the area moment products. */\r\n workMatrix?: Matrix4d;\r\n}\r\n/**\r\n * Bundle of output data for [[PolygonOps.volumeBetweenPolygonAndPlane]].\r\n * @public\r\n */\r\nexport interface VolumeBetweenPolygonAndPlaneOutput {\r\n /** Six times the signed volume of the truncated prism between the polygon and the plane. */\r\n volume6: number;\r\n /** Two times the signed area of the polygon's projection onto the plane. */\r\n area2: number;\r\n /** Origin of the facet used to accumulate `products`. */\r\n origin?: Point3d;\r\n /** Raw accumulated second moment area products of the polygon's projection onto the plane. */\r\n products?: Matrix4d;\r\n}\r\n/**\r\n * Various static methods to perform computations on an array of points interpreted as a polygon.\r\n * @public\r\n */\r\nexport class PolygonOps {\r\n /** Sum areas of triangles from points[0] to each far edge.\r\n * * Consider triangles from points[0] to each edge.\r\n * * Sum the absolute areas (without regard to orientation) all these triangles.\r\n * @returns sum of absolute triangle areas.\r\n */\r\n public static sumTriangleAreas(points: Point3d[] | GrowableXYZArray): number {\r\n let s = 0;\r\n const n = points.length;\r\n if (Array.isArray(points)) {\r\n if (n >= 3) {\r\n const origin = points[0];\r\n const vector0 = origin.vectorTo(points[1]);\r\n let vector1 = Vector3d.create();\r\n // This will work with or without closure edge. If closure is given, the last vector is 000.\r\n for (let i = 2; i < n; i++) {\r\n vector1 = origin.vectorTo(points[i], vector1);\r\n s += vector0.crossProductMagnitude(vector1);\r\n vector0.setFrom(vector1);\r\n }\r\n }\r\n return s * 0.5;\r\n }\r\n const crossVector = Vector3d.create();\r\n for (let i = 2; i < n; i++) {\r\n points.crossProductIndexIndexIndex(0, i - 1, i, crossVector);\r\n s += crossVector.magnitude();\r\n }\r\n return s * 0.5;\r\n }\r\n /** Sum areas of triangles from points[0] to each far edge, as viewed with upVector pointing up.\r\n * * Consider triangles from points[0] to each edge.\r\n * * Sum the areas perpendicular to the upVector.\r\n * * If the upVector is near-zero length, a simple z vector is used.\r\n * @returns sum of triangle areas.\r\n */\r\n public static sumTriangleAreasPerpendicularToUpVector(points: Point3d[] | GrowableXYZArray, upVector: Vector3d): number {\r\n let scale = upVector.magnitude();\r\n if (scale < Geometry.smallMetricDistance) {\r\n upVector = Vector3d.create(0, 0, 1);\r\n scale = 1.0;\r\n }\r\n\r\n let s = 0;\r\n const n = points.length;\r\n if (Array.isArray(points)) {\r\n if (n >= 3) {\r\n const origin = points[0];\r\n const vector0 = origin.vectorTo(points[1]);\r\n let vector1 = Vector3d.create();\r\n // This will work with or without closure edge. If closure is given, the last vector is 000.\r\n for (let i = 2; i < n; i++) {\r\n vector1 = origin.vectorTo(points[i], vector1);\r\n s += vector0.tripleProduct(vector1, upVector);\r\n vector0.setFrom(vector1);\r\n }\r\n }\r\n return s * 0.5 / scale;\r\n }\r\n const crossVector = Vector3d.create();\r\n for (let i = 2; i < n; i++) {\r\n points.crossProductIndexIndexIndex(0, i - 1, i, crossVector);\r\n s += crossVector.dotProduct(upVector);\r\n }\r\n return s * 0.5 / scale;\r\n }\r\n\r\n /** Sum areas of triangles from points[0] to each far edge.\r\n * * Consider triangles from points[0] to each edge.\r\n * * Sum the signed areas of all these triangles. (An area can be negative at a concave corner.)\r\n * @returns sum of signed triangle areas.\r\n */\r\n public static sumTriangleAreasXY(points: Point3d[]): number {\r\n let s = 0.0;\r\n const n = points.length;\r\n if (n >= 3) {\r\n const origin = points[0];\r\n const vector0 = origin.vectorTo(points[1]);\r\n let vector1 = Vector3d.create();\r\n // This will work with or without closure edge. If closure is given, the last vector is 000.\r\n for (let i = 2; i < n; i++) {\r\n vector1 = origin.vectorTo(points[i], vector1);\r\n s += vector0.crossProductXY(vector1);\r\n vector0.setFrom(vector1);\r\n }\r\n }\r\n s *= 0.5;\r\n return s;\r\n }\r\n /** These values are the integrated area moment products [xx,xy,xz, x]\r\n * for a right triangle in the first quadrant at the origin -- (0,0),(1,0),(0,1)\r\n */\r\n private static readonly _triangleMomentWeights = Matrix4d.createRowValues(2.0 / 24.0, 1.0 / 24.0, 0, 4.0 / 24.0, 1.0 / 24.0, 2.0 / 24.0, 0, 4.0 / 24.0, 0, 0, 0, 0, 4.0 / 24.0, 4.0 / 24.0, 0, 12.0 / 24.0);\r\n /** These values are the integrated volume moment products [xx,xy,xz, x, yx,yy,yz,y, zx,zy,zz,z,x,y,z,1]\r\n * for a tetrahedron in the first quadrant at the origin -- (0,00),(1,0,0),(0,1,0),(0,0,1)\r\n */\r\n private static readonly _tetrahedralMomentWeights = Matrix4d.createRowValues(\r\n 1.0 / 60.0, 1.0 / 120, 1.0 / 120, 1.0 / 24.0,\r\n 1.0 / 120, 1.0 / 60.0, 1.0 / 120, 1.0 / 24.0,\r\n 1.0 / 120, 1.0 / 120, 1.0 / 60.0, 1.0 / 24.0,\r\n 1.0 / 24.0, 1.0 / 24.0, 1.0 / 24.0, 1.0 / 6.0);\r\n // statics for shared reuse.\r\n // many methods use these.\r\n // only use them in \"leaf\" methods that are certain not to call other users . . .\r\n private static _vector0 = Vector3d.create();\r\n private static _vector1 = Vector3d.create();\r\n private static _vector2 = Vector3d.create();\r\n private static _vectorOrigin = Vector3d.create();\r\n private static _normal = Vector3d.create();\r\n private static _matrixA = Matrix4d.createIdentity();\r\n private static _matrixB = Matrix4d.createIdentity();\r\n private static _matrixC = Matrix4d.createIdentity();\r\n /** return a vector which is perpendicular to the polygon and has magnitude equal to the polygon area. */\r\n public static areaNormalGo(points: IndexedXYZCollection, result?: Vector3d): Vector3d | undefined {\r\n if (!result)\r\n result = new Vector3d();\r\n else\r\n result.setZero();\r\n const n = points.length;\r\n if (n === 3) {\r\n points.crossProductIndexIndexIndex(0, 1, 2, result);\r\n } else if (n > 3) {\r\n // This will work with or without closure edge. If closure is given, the last vector is 000.\r\n for (let i = 2; i < n; i++) {\r\n points.accumulateCrossProductIndexIndexIndex(0, i - 1, i, result);\r\n }\r\n }\r\n // ALL BRANCHES SUM FULL CROSS PRODUCTS AND EXPECT SCALE HERE\r\n result.scaleInPlace(0.5);\r\n return result.isZero ? undefined : result;\r\n }\r\n /** return a vector which is perpendicular to the polygon and has magnitude equal to the polygon area. */\r\n public static areaNormal(points: Point3d[], result?: Vector3d): Vector3d {\r\n if (!result)\r\n result = Vector3d.create();\r\n PolygonOps.areaNormalGo(new Point3dArrayCarrier(points), result);\r\n return result;\r\n }\r\n /** return the area of the polygon.\r\n * * This assumes the polygon is planar\r\n * * This does NOT assume the polygon is on the xy plane.\r\n */\r\n public static area(points: Point3d[]): number {\r\n return PolygonOps.areaNormal(points).magnitude();\r\n }\r\n /** return the projected XY area of the polygon. */\r\n public static areaXY(points: Point3d[] | IndexedXYZCollection): number {\r\n let area = 0.0;\r\n if (points instanceof IndexedXYZCollection) {\r\n if (points.length > 2) {\r\n const x0 = points.getXAtUncheckedPointIndex(0);\r\n const y0 = points.getYAtUncheckedPointIndex(0);\r\n let u1 = points.getXAtUncheckedPointIndex(1) - x0;\r\n let v1 = points.getYAtUncheckedPointIndex(1) - y0;\r\n let u2, v2;\r\n for (let i = 2; i + 1 < points.length; i++, u1 = u2, v1 = v2) {\r\n u2 = points.getXAtUncheckedPointIndex(i) - x0;\r\n v2 = points.getYAtUncheckedPointIndex(i) - y0;\r\n area += Geometry.crossProductXYXY(u1, v1, u2, v2);\r\n }\r\n }\r\n } else {\r\n for (let i = 1; i + 1 < points.length; i++)\r\n area += points[0].crossProductToPointsXY(points[i], points[i + 1]);\r\n }\r\n return 0.5 * area;\r\n }\r\n /** Sum the areaXY () values for multiple polygons */\r\n public static sumAreaXY(polygons: Point3d[][]): number {\r\n let s = 0.0;\r\n for (const p of polygons)\r\n s += this.areaXY(p);\r\n return s;\r\n }\r\n /**\r\n * Return a [[Ray3d]] with:\r\n * * `origin` is the centroid of the polygon,\r\n * * `direction` is a unit vector perpendicular to the polygon plane,\r\n * * `a` is the polygon area.\r\n * @param points the polygon vertices in order. Points can lie in any plane. First and last point do not have to be equal.\r\n * @param result optional pre-allocated result to populate and return.\r\n */\r\n public static centroidAreaNormal(points: IndexedXYZCollection | Point3d[], result?: Ray3d): Ray3d | undefined {\r\n if (Array.isArray(points)) {\r\n const carrier = new Point3dArrayCarrier(points);\r\n return this.centroidAreaNormal(carrier, result);\r\n }\r\n const n = points.length;\r\n if (n === 3) {\r\n const normal = points.crossProductIndexIndexIndex(0, 1, 2, result?.direction)!;\r\n const a = 0.5 * normal.magnitude();\r\n const centroid = points.getPoint3dAtCheckedPointIndex(0, result?.origin)!;\r\n points.accumulateScaledXYZ(1, 1.0, centroid);\r\n points.accumulateScaledXYZ(2, 1.0, centroid);\r\n centroid.scaleInPlace(1.0 / 3.0);\r\n if (!result)\r\n result = Ray3d.createCapture(centroid, normal);\r\n if (result.tryNormalizeInPlaceWithAreaWeight(a))\r\n return result;\r\n return undefined;\r\n }\r\n if (n >= 3) {\r\n const areaNormal = Vector3d.createZero();\r\n // This will work with or without closure edge. If closure is given, the last vector is 000.\r\n for (let i = 2; i < n; i++) {\r\n points.accumulateCrossProductIndexIndexIndex(0, i - 1, i, areaNormal);\r\n }\r\n areaNormal.normalizeInPlace();\r\n const origin = points.getPoint3dAtCheckedPointIndex(0)!;\r\n const vector0 = Vector3d.create();\r\n const vector1 = Vector3d.create();\r\n points.vectorXYAndZIndex(origin, 1, vector0);\r\n let cross = Vector3d.create();\r\n const centroidSum = Vector3d.createZero();\r\n const normal = Vector3d.createZero(result?.direction);\r\n let signedTriangleArea;\r\n // This will work with or without closure edge. If closure is given, the last vector is 000.\r\n for (let i = 2; i < n; i++) {\r\n points.vectorXYAndZIndex(origin, i, vector1);\r\n cross = vector0.crossProduct(vector1, cross);\r\n signedTriangleArea = areaNormal.dotProduct(cross); // well, actually twice the area.\r\n normal.addInPlace(cross); // this grows to twice the area\r\n const b = signedTriangleArea / 6.0;\r\n centroidSum.plus2Scaled(vector0, b, vector1, b, centroidSum);\r\n vector0.setFrom(vector1);\r\n }\r\n const area = 0.5 * normal.magnitude();\r\n const inverseArea = Geometry.conditionalDivideFraction(1, area);\r\n if (inverseArea !== undefined) {\r\n const centroid = origin.plusScaled(centroidSum, inverseArea, result?.origin);\r\n if (!result)\r\n result = Ray3d.createCapture(centroid, normal);\r\n result.tryNormalizeInPlaceWithAreaWeight(area);\r\n return result;\r\n }\r\n }\r\n return undefined;\r\n }\r\n // Has the potential to be combined with centroidAreaNormal for point3d array and Ray3d return listed above...\r\n // Returns undefined if given point array less than 3 or if not safe to divide at any point\r\n /**\r\n * * Return (in caller-allocated centroid) the centroid of the xy polygon.\r\n * * Return (as function value) the area\r\n */\r\n public static centroidAndAreaXY(points: Point2d[], centroid: Point2d): number | undefined {\r\n let area = 0.0;\r\n centroid.set(0, 0);\r\n if (points.length < 3)\r\n return undefined;\r\n const origin = points[0];\r\n let vectorSum = Vector2d.create(0, 0); // == sum ((U+V)/3) * (U CROSS V)/2 -- but leave out divisions\r\n let areaSum = 0.0; // == sum (U CROSS V) / 2 -- but leave out divisions\r\n for (let i = 1; i + 1 < points.length; i++) {\r\n const vector0 = origin.vectorTo(points[i]);\r\n const vector1 = origin.vectorTo(points[i + 1]);\r\n const tempArea = vector0.crossProduct(vector1);\r\n vectorSum = vectorSum.plus(vector0.plus(vector1).scale(tempArea));\r\n areaSum += tempArea;\r\n }\r\n area = areaSum * 0.5;\r\n const a = Geometry.conditionalDivideFraction(1.0, 6.0 * area);\r\n if (a === undefined) {\r\n centroid.setFrom(origin);\r\n return undefined;\r\n }\r\n centroid.setFrom(origin.plusScaled(vectorSum, a));\r\n return area;\r\n }\r\n /**\r\n * Return a unit normal to the plane of the polygon.\r\n * @param points array of points around the polygon.\r\n * @param result caller-allocated result vector.\r\n * @return true if and only if result has unit length\r\n */\r\n public static unitNormal(points: IndexedXYZCollection, result: Vector3d): boolean {\r\n result.setZero();\r\n let n = points.length;\r\n if (n > 1 && points.getPoint3dAtUncheckedPointIndex(0).isExactEqual(points.getPoint3dAtUncheckedPointIndex(n - 1)))\r\n --n; // ignore closure point\r\n if (n === 3) {\r\n points.crossProductIndexIndexIndex(0, 1, 2, result);\r\n return result.normalizeInPlace();\r\n }\r\n if (n === 4) {\r\n // cross product of diagonals is more stable than from single of the points . . .\r\n points.vectorIndexIndex(0, 2, PolygonOps._vector0);\r\n points.vectorIndexIndex(1, 3, PolygonOps._vector1);\r\n PolygonOps._vector0.crossProduct(PolygonOps._vector1, result);\r\n return result.normalizeInPlace();\r\n }\r\n // more than 4 points ... no shortcuts ...\r\n PolygonOps.areaNormalGo(points, result);\r\n return result.normalizeInPlace();\r\n }\r\n /** Accumulate to the matrix of area products of a polygon with respect to an origin.\r\n * The polygon is assumed to be planar and non-self-intersecting.\r\n */\r\n /** Accumulate to the matrix of area products of a polygon with respect to an origin.\r\n * * The polygon is assumed to be planar and non-self-intersecting.\r\n * * Accumulated values are integrals over triangles from point 0 of the polygon to other edges of the polygon.\r\n * * Integral over each triangle is transformed to integrals from the given origin.\r\n * @param points array of points around the polygon. Final closure point is not needed.\r\n * @param origin origin for global accumulation.\r\n * @param moments 4x4 matrix where products are accumulated.\r\n */\r\n public static addSecondMomentAreaProducts(points: IndexedXYZCollection, origin: Point3d, moments: Matrix4d) {\r\n this.addSecondMomentTransformedProducts(PolygonOps._triangleMomentWeights, points, origin, 2, moments);\r\n }\r\n\r\n /** Accumulate to the matrix of volume products of a polygon with respect to an origin.\r\n * * The polygon is assumed to be planar and non-self-intersecting.\r\n * * Accumulated values are integrals over tetrahedra from the origin to triangles on the polygon.\r\n * @param points array of points around the polygon. Final closure point is not needed.\r\n * @param origin origin for tetrahedra\r\n * @param moments 4x4 matrix where products are accumulated.\r\n */\r\n public static addSecondMomentVolumeProducts(points: IndexedXYZCollection, origin: Point3d, moments: Matrix4d) {\r\n this.addSecondMomentTransformedProducts(PolygonOps._tetrahedralMomentWeights, points, origin, 3, moments);\r\n }\r\n /** Return the matrix of area products of a polygon with respect to an origin.\r\n * The polygon is assumed to be planar and non-self-intersecting.\r\n * * `frameType===2` has xy vectors in the plane of the polygon, plus a unit normal z. (Used for area integrals)\r\n * * `frameType===3` has vectors from origin to 3 points in the triangle. (Used for volume integrals)\r\n */\r\n private static addSecondMomentTransformedProducts(firstQuadrantMoments: Matrix4d, points: IndexedXYZCollection, origin: Point3d,\r\n frameType: 2 | 3,\r\n moments: Matrix4d) {\r\n const unitNormal = PolygonOps._normal;\r\n if (PolygonOps.unitNormal(points, unitNormal)) {\r\n // The direction of the normal makes the various detJ values positive or negative so that non-convex polygons\r\n // sum correctly.\r\n const vector01 = PolygonOps._vector0;\r\n const vector02 = PolygonOps._vector1;\r\n const vector03 = PolygonOps._vector2;\r\n const placement = PolygonOps._matrixA;\r\n const matrixAB = PolygonOps._matrixB;\r\n const matrixABC = PolygonOps._matrixC;\r\n const vectorOrigin = points.vectorXYAndZIndex(origin, 0, PolygonOps._vectorOrigin)!;\r\n const numPoints = points.length;\r\n let detJ = 0;\r\n for (let i2 = 2; i2 < numPoints; i2++) {\r\n if (frameType === 2) {\r\n points.vectorIndexIndex(0, i2 - 1, vector01);\r\n points.vectorIndexIndex(0, i2, vector02);\r\n detJ = unitNormal.tripleProduct(vector01, vector02);\r\n placement.setOriginAndVectors(vectorOrigin, vector01, vector02, unitNormal);\r\n placement.multiplyMatrixMatrix(firstQuadrantMoments, matrixAB);\r\n matrixAB.multiplyMatrixMatrixTranspose(placement, matrixABC);\r\n moments.addScaledInPlace(matrixABC, detJ);\r\n } else if (frameType === 3) {\r\n points.vectorXYAndZIndex(origin, 0, vector01);\r\n points.vectorXYAndZIndex(origin, i2 - 1, vector02);\r\n points.vectorXYAndZIndex(origin, i2, vector03);\r\n detJ = vector01.tripleProduct(vector02, vector03);\r\n placement.setOriginAndVectors(origin, vector01, vector02, vector03);\r\n placement.multiplyMatrixMatrix(firstQuadrantMoments, matrixAB);\r\n matrixAB.multiplyMatrixMatrixTranspose(placement, matrixABC);\r\n moments.addScaledInPlace(matrixABC, detJ);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Compute the signed volume of the truncated prism between a facet and a plane.\r\n * * Useful for parallel algorithms.\r\n * @param facetPoints input 3D polygon; on return the points are projected onto the plane. Wraparound point is optional.\r\n * @param plane infinite plane bounding volume between the facet and (virtual) side facets perpendicular to the plane (unmodified).\r\n * @param options optional flags and pre-allocated temporary storage.\r\n * @returns computed data for this facet:\r\n * * `volume6`: six times the signed volume of the truncated prism between the facet and the plane.\r\n * * `area2`: two times the signed area of the facet's projection onto the plane.\r\n * * `origin`: origin of the facet used to accumulate area moments.\r\n * * `products`: raw accumulated second moment area products of the facet's projection onto the plane.\r\n * @see [[PolyfaceQuery.sumVolumeBetweenFacetsAndPlane]]\r\n */\r\n public static volumeBetweenPolygonAndPlane(facetPoints: GrowableXYZArray, plane: Plane3d, options?: VolumeBetweenPolygonAndPlaneOptions): VolumeBetweenPolygonAndPlaneOutput {\r\n let origin: Point3d | undefined;\r\n let products: Matrix4d | undefined;\r\n let singleProjectedFacetAreaTimes2 = 0.0;\r\n let signedTruncatedPrismVolumeTimes6 = 0.0;\r\n const h0 = facetPoints.evaluateUncheckedIndexPlaneAltitude(0, plane);\r\n for (let i = 1; i + 1 < facetPoints.length; i++) {\r\n const triangleNormal = facetPoints.crossProductIndexIndexIndex(0, i, i + 1, options?.workVector)!;\r\n const hA = facetPoints.evaluateUncheckedIndexPlaneAltitude(i, plane);\r\n const hB = facetPoints.evaluateUncheckedIndexPlaneAltitude(i + 1, plane);\r\n const signedProjectedTriangleAreaTimes2 = triangleNormal.dotProductXYZ(plane.normalX(), plane.normalY(), plane.normalZ());\r\n singleProjectedFacetAreaTimes2 += signedProjectedTriangleAreaTimes2;\r\n signedTruncatedPrismVolumeTimes6 += signedProjectedTriangleAreaTimes2 * (h0 + hA + hB);\r\n }\r\n if (!options?.skipMoments) {\r\n origin = facetPoints.getPoint3dAtUncheckedPointIndex(0, options?.workPoint0);\r\n products = Matrix4d.createZero(options?.workMatrix);\r\n facetPoints.mapPoint((x: number, y: number, z: number) => plane.projectXYZToPlane(x, y, z, options?.workPoint1));\r\n PolygonOps.addSecondMomentAreaProducts(facetPoints, origin, products);\r\n }\r\n return { volume6: signedTruncatedPrismVolumeTimes6, area2: singleProjectedFacetAreaTimes2, origin, products };\r\n }\r\n /** Test the direction of turn at the vertices of the polygon, ignoring z-coordinates.\r\n * * For a polygon without self-intersections and successive colinear edges, this is a convexity and orientation test: all positive is convex and counterclockwise, all negative is convex and clockwise.\r\n * * Beware that a polygon which turns through more than a full turn can cross itself and close, but is not convex.\r\n * @returns 1 if all turns are to the left, -1 if all to the right, and 0 if there are any zero or reverse turns\r\n */\r\n public static testXYPolygonTurningDirections(points: Point2d[] | Point3d[]): number {\r\n // Reduce count by trailing duplicates; leaves iLast at final index\r\n let numPoint = points.length;\r\n let iLast = numPoint - 1;\r\n while (iLast > 1 && points[iLast].x === points[0].x && points[iLast].y === points[0].y) {\r\n numPoint = iLast--;\r\n }\r\n if (numPoint > 2) {\r\n let vector0 = Point2d.create(points[iLast].x - points[iLast - 1].x, points[iLast].y - points[iLast - 1].y);\r\n const vector1 = Point2d.create(points[0].x - points[iLast].x, points[0].y - points[iLast].y);\r\n const baseArea = vector0.x * vector1.y - vector0.y * vector1.x;\r\n // In a convex polygon, all successive-vector cross products will\r\n // have the same sign as the base area, hence all products will be\r\n // positive.\r\n for (let i1 = 1; i1 < numPoint; i1++) {\r\n vector0 = vector1.clone();\r\n Point2d.create(points[i1].x - points[i1 - 1].x, points[i1].y - points[i1 - 1].y, vector1);\r\n const currArea = vector0.x * vector1.y - vector0.y * vector1.x;\r\n if (currArea * baseArea <= 0.0)\r\n return 0;\r\n }\r\n // Fall out with all signs same as base area\r\n return baseArea > 0.0 ? 1 : -1;\r\n }\r\n return 0;\r\n }\r\n /**\r\n * Determine whether the polygon is convex.\r\n * @param polygon vertices, closure point optional\r\n * @returns whether the polygon is convex.\r\n */\r\n public static isConvex(polygon: Point3d[] | IndexedXYZCollection): boolean {\r\n if (!(polygon instanceof IndexedXYZCollection))\r\n return this.isConvex(new Point3dArrayCarrier(polygon));\r\n let n = polygon.length;\r\n if (n > 1 && polygon.getPoint3dAtUncheckedPointIndex(0).isExactEqual(polygon.getPoint3dAtUncheckedPointIndex(n - 1)))\r\n --n; // ignore closure point\r\n const normal = Vector3d.create();\r\n if (!this.unitNormal(polygon, normal))\r\n return false;\r\n let positiveArea = 0.0;\r\n let negativeArea = 0.0;\r\n const vecA = this._vector0;\r\n let vecB = Vector3d.createStartEnd(polygon.getPoint3dAtUncheckedPointIndex(n - 1), polygon.getPoint3dAtUncheckedPointIndex(0), this._vector1);\r\n for (let i = 1; i <= n; i++) {\r\n // check turn through vertices i-1,i,i+1\r\n vecA.setFromVector3d(vecB);\r\n vecB = Vector3d.createStartEnd(polygon.getPoint3dAtUncheckedPointIndex(i - 1), polygon.getPoint3dAtUncheckedPointIndex(i % n), vecB);\r\n const signedArea = normal.tripleProduct(vecA, vecB);\r\n if (signedArea >= 0.0)\r\n positiveArea += signedArea;\r\n else\r\n negativeArea += signedArea;\r\n }\r\n return Math.abs(negativeArea) < Geometry.smallMetricDistanceSquared * positiveArea;\r\n }\r\n /**\r\n * Test if point (x,y) is IN, OUT or ON a polygon.\r\n * @return (1) for in, (-1) for OUT, (0) for ON\r\n * @param x x coordinate\r\n * @param y y coordinate\r\n * @param points array of xy coordinates.\r\n */\r\n public static classifyPointInPolygon(x: number, y: number, points: XAndY[]): number | undefined {\r\n const context = new XYParitySearchContext(x, y);\r\n let i0 = 0;\r\n const n = points.length;\r\n let i1;\r\n let iLast = -1;\r\n // walk to an acceptable start index ...\r\n for (i0 = 0; i0 < n; i0++) {\r\n i1 = i0 + 1;\r\n if (i1 >= n)\r\n i1 = 0;\r\n if (context.tryStartEdge(points[i0].x, points[i0].y, points[i1].x, points[i1].y)) {\r\n iLast = i1;\r\n break;\r\n }\r\n }\r\n if (iLast < 0)\r\n return undefined;\r\n for (let i = 1; i <= n; i++) {\r\n i1 = iLast + i;\r\n if (i1 >= n)\r\n i1 -= n;\r\n if (!context.advance(points[i1].x, points[i1].y))\r\n return context.classifyCounts();\r\n }\r\n return context.classifyCounts();\r\n }\r\n /**\r\n * Test if point (x,y) is IN, OUT or ON a polygon.\r\n * @return (1) for in, (-1) for OUT, (0) for ON\r\n * @param x x coordinate\r\n * @param y y coordinate\r\n * @param points array of xy coordinates.\r\n */\r\n public static classifyPointInPolygonXY(x: number, y: number, points: IndexedXYZCollection): number | undefined {\r\n const context = new XYParitySearchContext(x, y);\r\n let i0 = 0;\r\n const n = points.length;\r\n let i1;\r\n let iLast = -1;\r\n // walk to an acceptable start index ...\r\n for (i0 = 0; i0 < n; i0++) {\r\n i1 = i0 + 1;\r\n if (i1 >= n)\r\n i1 = 0;\r\n if (context.tryStartEdge(points.getXAtUncheckedPointIndex(i0), points.getYAtUncheckedPointIndex(i0), points.getXAtUncheckedPointIndex(i1), points.getYAtUncheckedPointIndex(i1))) {\r\n iLast = i1;\r\n break;\r\n }\r\n }\r\n if (iLast < 0)\r\n return undefined;\r\n for (let i = 1; i <= n; i++) {\r\n i1 = iLast + i;\r\n if (i1 >= n)\r\n i1 -= n;\r\n if (!context.advance(points.getXAtUncheckedPointIndex(i1), points.getYAtUncheckedPointIndex(i1)))\r\n return context.classifyCounts();\r\n }\r\n return context.classifyCounts();\r\n }\r\n\r\n /**\r\n * Reverse loops as necessary to make them all have CCW orientation for given outward normal.\r\n * @param loops\r\n * @param outwardNormal\r\n * @return the number of loops reversed.\r\n */\r\n public static orientLoopsCCWForOutwardNormalInPlace(loops: IndexedReadWriteXYZCollection | IndexedReadWriteXYZCollection[], outwardNormal: Vector3d): number {\r\n if (loops instanceof IndexedXYZCollection)\r\n return this.orientLoopsCCWForOutwardNormalInPlace([loops], outwardNormal);\r\n const unitNormal = Vector3d.create();\r\n // orient individually ... (no hole analysis)\r\n let numReverse = 0;\r\n for (const loop of loops) {\r\n if (this.unitNormal(loop, unitNormal)) {\r\n const q = unitNormal.dotProduct(outwardNormal);\r\n if (q < 0.0) {\r\n loop.reverseInPlace();\r\n numReverse++;\r\n }\r\n }\r\n }\r\n return numReverse;\r\n }\r\n /**\r\n * Reverse and reorder loops in the xy-plane for consistent orientation and containment.\r\n * @param loops multiple polygons in any order and orientation, z-coordinates ignored.\r\n * * For best results, all overlaps should be containments, i.e., loop boundaries can touch, but should not cross.\r\n * @returns array of arrays of polygons that capture the input pointers. In each first level array:\r\n * * The first polygon is an outer loop, oriented counterclockwise.\r\n * * Any subsequent polygons are holes of the outer loop, oriented clockwise.\r\n * @see [[RegionOps.sortOuterAndHoleLoopsXY]]\r\n */\r\n public static sortOuterAndHoleLoopsXY(loops: IndexedReadWriteXYZCollection[]): IndexedReadWriteXYZCollection[][] {\r\n const loopAndArea: SortablePolygon[] = [];\r\n for (const loop of loops) {\r\n SortablePolygon.pushPolygon(loopAndArea, loop);\r\n }\r\n return SortablePolygon.sortAsArrayOfArrayOfPolygons(loopAndArea);\r\n }\r\n\r\n /**\r\n * Exactly like `sortOuterAndHoleLoopsXY` but allows loops in any plane.\r\n * @param loops multiple loops to sort and reverse.\r\n * @param defaultNormal optional normal for the loops, if known\r\n * @see [[sortOuterAndHoleLoopsXY]]\r\n */\r\n public static sortOuterAndHoleLoops(loops: IndexedReadWriteXYZCollection[], defaultNormal: Vector3d | undefined): IndexedReadWriteXYZCollection[][] {\r\n const localToWorld = FrameBuilder.createRightHandedFrame(defaultNormal, loops);\r\n const worldToLocal = localToWorld?.inverse();\r\n\r\n const xyLoops: GrowableXYZArray[] = [];\r\n if (worldToLocal !== undefined) {\r\n // transform into plane so we can ignore z in the sort\r\n for (const loop of loops) {\r\n const xyLoop = new GrowableXYZArray(loop.length);\r\n for (const point of loop.points)\r\n xyLoop.push(worldToLocal.multiplyPoint3d(point));\r\n xyLoops.push(xyLoop);\r\n }\r\n }\r\n const xySortedLoopsArray = PolygonOps.sortOuterAndHoleLoopsXY(xyLoops);\r\n\r\n const sortedLoopsArray: GrowableXYZArray[][] = [];\r\n if (localToWorld !== undefined) {\r\n for (const xySortedLoops of xySortedLoopsArray) {\r\n const sortedLoops: GrowableXYZArray[] = [];\r\n for (const xySortedLoop of xySortedLoops) {\r\n const sortedLoop = new GrowableXYZArray(xySortedLoop.length);\r\n for (const point of xySortedLoop.points)\r\n sortedLoop.push(localToWorld.multiplyPoint3d(point));\r\n sortedLoops.push(sortedLoop);\r\n }\r\n sortedLoopsArray.push(sortedLoops);\r\n }\r\n }\r\n return sortedLoopsArray;\r\n }\r\n\r\n /** Compute the closest point on the polygon boundary to the given point.\r\n * * Compare to [[closestPoint]].\r\n * @param polygon points of the polygon, closure point optional\r\n * @param testPoint point p to project onto the polygon edges. Works best when p is in the plane of the polygon.\r\n * @param tolerance optional tolerance(s) to determine point-vertex and point-edge coincidence. A single number\r\n * is interpreted as distance tolerance. If an array is given, the first number is interpreted as distance tolerance;\r\n * the second, as parametric tolerance. Default values are [[Geometry.smallMetricDistance]] for distance tolerance\r\n * and 0.0 for parameter tolerance.\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the closest point `d.point`:\r\n * * `d.isValid()` returns true if and only if the polygon is nontrivial.\r\n * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point.\r\n * * `d.code` classifies the closest point as a vertex (`PolygonLocation.OnPolygonVertex`) or as a point on an edge (`PolygonLocation.OnPolygonEdgeInterior`).\r\n * * `d.a` is the distance from testPoint to the closest point.\r\n * * `d.v` can be used to classify p (if p and polygon are coplanar): if n is the polygon normal then `d.v.dotProduct(n)` is +/-/0 if and only if p is inside/outside/on the polygon.\r\n */\r\n public static closestPointOnBoundary(\r\n polygon: Point3d[] | IndexedXYZCollection,\r\n testPoint: Point3d,\r\n tolerance: number | [number, number] = Geometry.smallMetricDistance,\r\n result?: PolygonLocationDetail,\r\n ): PolygonLocationDetail {\r\n if (!(polygon instanceof IndexedXYZCollection))\r\n return this.closestPointOnBoundary(new Point3dArrayCarrier(polygon), testPoint, tolerance, result);\r\n const distTol = Array.isArray(tolerance) ? tolerance[0] : tolerance;\r\n const paramTol = Array.isArray(tolerance) ? Math.abs(tolerance[1]) : 0.0;\r\n const distTol2 = distTol * distTol;\r\n\r\n let numPoints = polygon.length;\r\n while (numPoints > 1) {\r\n if (polygon.distanceSquaredIndexIndex(0, numPoints - 1)! > distTol2)\r\n break;\r\n --numPoints; // ignore closure point\r\n }\r\n\r\n result = PolygonLocationDetail.create(result);\r\n if (0 === numPoints)\r\n return result; // invalid\r\n\r\n const constructSingletonPoint = (index: number): PolygonLocationDetail => {\r\n polygon.getPoint3dAtUncheckedPointIndex(index, result.point);\r\n result.a = result.point.distance(testPoint);\r\n result.v.setZero();\r\n result.code = PolygonLocation.OnPolygonVertex;\r\n result.closestEdgeIndex = index;\r\n result.closestEdgeParam = 0.0;\r\n return result;\r\n };\r\n if (1 === numPoints)\r\n return constructSingletonPoint(0);\r\n\r\n // lambda for computing edge parameter at which testPoint projects onto the edge starting at iEdgeStart\r\n const projectToEdge = (iEdgeStart: number): { isValid: boolean, edgeParam: number, uDotU: number, vDotV: number } => {\r\n let isValid = false;\r\n let edgeParam = 0.0;\r\n let uDotU = 0.0;\r\n let vDotV = 0.0;\r\n if (iEdgeStart >= 0 && iEdgeStart < numPoints) {\r\n let iEdgeEnd = iEdgeStart + 1;\r\n if (iEdgeEnd === numPoints)\r\n iEdgeEnd = 0;\r\n uDotU = polygon.distanceSquaredIndexIndex(iEdgeStart, iEdgeEnd)!;\r\n if (uDotU > distTol2) { // nontrivial edge\r\n vDotV = polygon.distanceSquaredIndexXYAndZ(iEdgeStart, testPoint)!;\r\n const uDotV = polygon.dotProductIndexIndexXYAndZ(iEdgeStart, iEdgeEnd, testPoint)!;\r\n edgeParam = uDotV / uDotU; // param of projection of testPoint onto edge [iEdgeStart, iEdgeEnd]\r\n isValid = true;\r\n }\r\n }\r\n return { isValid, edgeParam, uDotU, vDotV };\r\n };\r\n\r\n // find the previous nontrivial edge's projection status before processing the first edge\r\n let projBeyondPrevEdge = false;\r\n let iPrev = numPoints - 1;\r\n for (; iPrev > 0; --iPrev) {\r\n const projData = projectToEdge(iPrev);\r\n if (projData.isValid) {\r\n projBeyondPrevEdge = projData.edgeParam > 1.0 + paramTol;\r\n break;\r\n }\r\n }\r\n if (iPrev <= 0) // all segments trivial, so treat like single point case\r\n return constructSingletonPoint(0);\r\n\r\n let minDist2 = Geometry.largeCoordinateResult;\r\n for (let iBase = 0; iBase < numPoints; ++iBase) {\r\n let iNext = iBase + 1;\r\n if (iNext === numPoints)\r\n iNext = 0;\r\n\r\n const projData = projectToEdge(iBase);\r\n if (!projData.isValid)\r\n continue; // ignore trivial polygon edge (keep iPrev, projBeyondPrevEdge)\r\n\r\n if (projData.edgeParam <= paramTol) { // testPoint projects to/before edge start\r\n const distToStart2 = projData.vDotV;\r\n if (distToStart2 <= distTol2) {\r\n // testPoint is at edge start; we are done\r\n polygon.getPoint3dAtUncheckedPointIndex(iBase, result.point);\r\n result.a = Math.sqrt(distToStart2);\r\n result.v.setZero();\r\n result.code = PolygonLocation.OnPolygonVertex;\r\n result.closestEdgeIndex = iBase;\r\n result.closestEdgeParam = 0.0;\r\n return result;\r\n }\r\n if (distToStart2 < minDist2 && projBeyondPrevEdge) {\r\n // update candidate (to edge start) only if testPoint projected beyond previous edge end\r\n polygon.getPoint3dAtUncheckedPointIndex(iBase, result.point);\r\n result.a = Math.sqrt(distToStart2);\r\n polygon.crossProductIndexIndexIndex(iBase, iPrev, iNext, result.v)!;\r\n result.code = PolygonLocation.OnPolygonVertex;\r\n result.closestEdgeIndex = iBase;\r\n result.closestEdgeParam = 0.0;\r\n minDist2 = distToStart2;\r\n }\r\n projBeyondPrevEdge = false;\r\n } else if (projData.edgeParam <= 1.0 + paramTol) { // testPoint projects inside edge, or to edge end\r\n projData.edgeParam = Geometry.clamp(projData.edgeParam, 0.0, 1.0);\r\n const projDist2 = projData.vDotV - projData.edgeParam * projData.edgeParam * projData.uDotU;\r\n if (projDist2 <= distTol2) {\r\n // testPoint is on edge; we are done\r\n const distToStart2 = projData.vDotV;\r\n if (projData.edgeParam <= 0.5 && distToStart2 <= distTol2) {\r\n // testPoint is at edge start\r\n polygon.getPoint3dAtUncheckedPointIndex(iBase, result.point);\r\n result.a = Math.sqrt(distToStart2);\r\n result.v.setZero();\r\n result.code = PolygonLocation.OnPolygonVertex;\r\n result.closestEdgeIndex = iBase;\r\n result.closestEdgeParam = 0.0;\r\n return result;\r\n }\r\n const distToEnd2 = projDist2 + (1.0 - projData.edgeParam) * (1.0 - projData.edgeParam) * projData.uDotU;\r\n if (projData.edgeParam > 0.5 && distToEnd2 <= distTol2) {\r\n // testPoint is at edge end\r\n polygon.getPoint3dAtUncheckedPointIndex(iNext, result.point);\r\n result.a = Math.sqrt(distToEnd2);\r\n result.v.setZero();\r\n result.code = PolygonLocation.OnPolygonVertex;\r\n result.closestEdgeIndex = iNext;\r\n result.closestEdgeParam = 0.0;\r\n return result;\r\n }\r\n // testPoint is on edge interior\r\n polygon.interpolateIndexIndex(iBase, projData.edgeParam, iNext, result.point);\r\n result.a = Math.sqrt(projDist2);\r\n result.v.setZero();\r\n result.code = PolygonLocation.OnPolygonEdgeInterior;\r\n result.closestEdgeIndex = iBase;\r\n result.closestEdgeParam = projData.edgeParam;\r\n return result;\r\n }\r\n if (projDist2 < minDist2) {\r\n // update candidate\r\n polygon.interpolateIndexIndex(iBase, projData.edgeParam, iNext, result.point);\r\n result.a = Math.sqrt(projDist2);\r\n polygon.crossProductIndexIndexXYAndZ(iBase, iNext, testPoint, result.v)!;\r\n result.code = projData.edgeParam < 1.0 ? PolygonLocation.OnPolygonEdgeInterior : PolygonLocation.OnPolygonVertex;;\r\n result.closestEdgeIndex = iBase;\r\n result.closestEdgeParam = projData.edgeParam;\r\n minDist2 = projDist2;\r\n }\r\n projBeyondPrevEdge = false;\r\n } else {\r\n projBeyondPrevEdge = true; // to be handled by next edge\r\n }\r\n iPrev = iBase;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Compute the closest point on the polygon boundary or its interior to the given point.\r\n * * Compare to [[closestPointOnBoundary]].\r\n * @param polygon points of the polygon, closure point optional\r\n * @param testPoint point p to project onto the polygon edges. Works best when p is in the plane of the polygon.\r\n * @param tolerance optional distance tolerance for distinguishing boundary versus interior closest point.\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the closest point `d.point`:\r\n * * `d.isValid()` returns true if and only if the polygon is nontrivial.\r\n * * `d.edgeIndex` and `d.edgeParam` specify the location of the (nearest) boundary point.\r\n * * `d.code` classifies the closest point: `PolygonLocation.OnPolygonVertex`, `PolygonLocation.OnPolygonEdgeInterior`, `PolygonLocation.InsidePolygonProjectsToVertex`, or `PolygonLocation.InsidePolygonProjectsToEdgeInterior`.\r\n * * `d.a` is the distance from testPoint to the closest point.\r\n */\r\n public static closestPoint(polygon: Point3d[] | IndexedXYZCollection, testPoint: Point3d, tolerance: number = Geometry.smallMetricDistance, result?: PolygonLocationDetail): PolygonLocationDetail {\r\n if (!(polygon instanceof IndexedXYZCollection))\r\n return this.closestPoint(new Point3dArrayCarrier(polygon), testPoint, tolerance, result);\r\n if (!this.unitNormal(polygon, this._normal))\r\n return PolygonLocationDetail.create(result); // invalid\r\n const polygonPlane = this._workPlane = Plane3dByOriginAndUnitNormal.createXYZUVW(polygon.getXAtUncheckedPointIndex(0), polygon.getYAtUncheckedPointIndex(0), polygon.getZAtUncheckedPointIndex(0), this._normal.x, this._normal.y, this._normal.z, this._workPlane)!;\r\n const planePoint = this._workXYZ = polygonPlane.projectPointToPlane(testPoint, this._workXYZ);\r\n result = this.closestPointOnBoundary(polygon, planePoint, tolerance, result);\r\n if (result.isValid) {\r\n const dot = result.v.dotProduct(this._normal);\r\n if (dot > 0.0) { // planePoint is inside, so return it instead of the closest boundary point\r\n result.point.setFrom(planePoint);\r\n if (PolygonLocation.OnPolygonVertex === result.code)\r\n result.code = PolygonLocation.InsidePolygonProjectsToVertex;\r\n else if (PolygonLocation.OnPolygonEdgeInterior === result.code)\r\n result.code = PolygonLocation.InsidePolygonProjectsToEdgeInterior;\r\n }\r\n result.a = testPoint.distance(result.point);\r\n result.v.setZero(); // not relevant\r\n }\r\n return result;\r\n }\r\n\r\n // work objects, allocated as needed\r\n private static _workXYZ?: Point3d;\r\n private static _workXY0?: Point2d;\r\n private static _workXY1?: Point2d;\r\n private static _workXY2?: Point2d;\r\n private static _workRay?: Ray3d;\r\n private static _workMatrix3d?: Matrix3d;\r\n private static _workPlane?: Plane3dByOriginAndUnitNormal;\r\n\r\n /** Compute the intersection of a line (parameterized as a ray) with the plane of this polygon.\r\n * @param polygon points of the polygon, closure point optional\r\n * @param ray infinite line to intersect, as a ray\r\n * @param tolerance optional tolerance(s) to determine point-vertex and point-edge coincidence. A single number\r\n * is interpreted as distance tolerance. If an array is given, the first number is interpreted as distance tolerance;\r\n * the second, as parametric tolerance. Default values are [[Geometry.smallMetricDistance]] for distance tolerance\r\n * and 0.0 for parameter tolerance.\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the line-plane intersection `d.point`:\r\n * * `d.isValid()` returns true if and only if the line intersects the plane.\r\n * * `d.code` indicates where the intersection lies with respect to the polygon.\r\n * * `d.a` is the ray intersection parameter. If `d.a` >= 0, the ray intersects the plane of the polygon.\r\n * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point on the polygon to the intersection, within `distTol`.\r\n */\r\n public static intersectRay3d(\r\n polygon: Point3d[] | IndexedXYZCollection,\r\n ray: Ray3d,\r\n tolerance: number | [number, number] = Geometry.smallMetricDistance,\r\n result?: PolygonLocationDetail,\r\n ): PolygonLocationDetail {\r\n if (!(polygon instanceof IndexedXYZCollection))\r\n return this.intersectRay3d(new Point3dArrayCarrier(polygon), ray, tolerance, result);\r\n if (!this.unitNormal(polygon, this._normal))\r\n return PolygonLocationDetail.create(result); // invalid\r\n this._workPlane = Plane3dByOriginAndUnitNormal.createXYZUVW(\r\n polygon.getXAtUncheckedPointIndex(0),\r\n polygon.getYAtUncheckedPointIndex(0),\r\n polygon.getZAtUncheckedPointIndex(0),\r\n this._normal.x, this._normal.y, this._normal.z,\r\n this._workPlane,\r\n )!;\r\n const intersectionPoint = this._workXYZ = Point3d.createZero(this._workXYZ);\r\n const rayParam = ray.intersectionWithPlane(this._workPlane, intersectionPoint);\r\n if (undefined === rayParam)\r\n return PolygonLocationDetail.create(result);\r\n result = this.closestPointOnBoundary(polygon, intersectionPoint, tolerance, result);\r\n if (result.isValid) {\r\n result.point.setFrom(intersectionPoint);\r\n result.a = rayParam;\r\n const dot = result.v.dotProduct(this._normal);\r\n if (dot === 0.0) {\r\n // NOOP: intersectionPoint is on the polygon, so result.code already classifies it\r\n } else {\r\n // intersectionPoint is not on the polygon, so result.code refers to the closest point;\r\n // update it to refer to intersectionPoint.\r\n if (PolygonLocation.OnPolygonVertex === result.code) {\r\n result.code = (dot > 0.0)\r\n ? PolygonLocation.InsidePolygonProjectsToVertex\r\n : PolygonLocation.OutsidePolygonProjectsToVertex;\r\n } else if (PolygonLocation.OnPolygonEdgeInterior === result.code) {\r\n result.code = (dot > 0.0)\r\n ? PolygonLocation.InsidePolygonProjectsToEdgeInterior\r\n : PolygonLocation.OutsidePolygonProjectsToEdgeInterior;\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /** Compute the intersection of a line (parameterized as a line segment) with the plane of this polygon.\r\n * @param polygon points of the polygon, closure point optional\r\n * @param point0 start point of segment on line to intersect\r\n * @param point1 end point of segment on line to intersect\r\n * @param tolerance optional distance tolerance to determine point-vertex and point-edge coincidence.\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the line-plane intersection `d.point`:\r\n * * `d.isValid()` returns true if and only if the line intersects the plane.\r\n * * `d.code` indicates where the intersection lies with respect to the polygon.\r\n * * `d.a` is the segment intersection parameter. If `d.a` is in [0,1], the segment intersects the plane of the polygon.\r\n * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point on the polygon to the intersection, within `distTol`.\r\n * @see intersectRay3d\r\n */\r\n public static intersectSegment(\r\n polygon: Point3d[] | IndexedXYZCollection,\r\n point0: Point3d,\r\n point1: Point3d,\r\n tolerance: number = Geometry.smallMetricDistance,\r\n result?: PolygonLocationDetail,\r\n ): PolygonLocationDetail {\r\n this._workRay = Ray3d.createStartEnd(point0, point1, this._workRay);\r\n return this.intersectRay3d(polygon, this._workRay, tolerance, result);\r\n }\r\n\r\n /** Compute edge data for the barycentric coordinate computation, ignoring all z-coordinates.\r\n * @param polygon points of the polygon (without closure point)\r\n * @param edgeStartVertexIndex index of start vertex of the edge (unchecked)\r\n * @param point point to project to the edge\r\n * @param edgeOutwardUnitNormal pre-allocated vector to be populated on return with the unit perpendicular to the edge, facing outward, in xy-plane\r\n * @param tolerance used to clamp outputs\r\n * @param result optional pre-allocated result\r\n * @returns x: signed projection distance of `point` to the edge, y: edge parameter of the projection\r\n */\r\n private static computeEdgeDataXY(\r\n polygon: IndexedXYZCollection,\r\n edgeStartVertexIndex: number,\r\n point: XYAndZ,\r\n edgeOutwardUnitNormal: Vector3d,\r\n tolerance: number = Geometry.smallMetricDistance,\r\n result?: Point2d,\r\n ): Point2d {\r\n const i0 = edgeStartVertexIndex % polygon.length;\r\n const i1 = (i0 + 1) % polygon.length;\r\n polygon.vectorIndexIndex(i0, i1, edgeOutwardUnitNormal)!.unitPerpendicularXY(edgeOutwardUnitNormal).negate(edgeOutwardUnitNormal); // z is zero\r\n const hypDeltaX = polygon.getXAtUncheckedPointIndex(i0) - point.x;\r\n const hypDeltaY = polygon.getYAtUncheckedPointIndex(i0) - point.y;\r\n let projDist = Geometry.dotProductXYXY(hypDeltaX, hypDeltaY, edgeOutwardUnitNormal.x, edgeOutwardUnitNormal.y);\r\n const edgeDist = Geometry.crossProductXYXY(hypDeltaX, hypDeltaY, edgeOutwardUnitNormal.x, edgeOutwardUnitNormal.y);\r\n const edgeLength = Geometry.distanceXYXY(polygon.getXAtUncheckedPointIndex(i0), polygon.getYAtUncheckedPointIndex(i0), polygon.getXAtUncheckedPointIndex(i1), polygon.getYAtUncheckedPointIndex(i1));\r\n let edgeParam = Geometry.safeDivideFraction(edgeDist, edgeLength, 0.0);\r\n if (Geometry.isSameCoordinate(0.0, projDist, tolerance))\r\n projDist = 0.0;\r\n if (Geometry.isSameCoordinate(0.0, edgeParam, tolerance))\r\n edgeParam = 0.0;\r\n else if (Geometry.isSameCoordinate(1.0, edgeParam, tolerance))\r\n edgeParam = 1.0;\r\n return Point2d.create(projDist, edgeParam, result);\r\n }\r\n\r\n /** Compute the barycentric coordinates for a point on either of a pair of adjacent edges of a convex polygon.\r\n * @param polygon points of the polygon, assumed to be convex. Assumed to have no closure point.\r\n * @param iPrev start index of previous edge\r\n * @param prevNormal outward unit normal of previous edge\r\n * @param prevProj x = signed distance from point to previous edge; y = edge parameter of this projection in [0,1]\r\n * @param i start index of current edge\r\n * @param normal outward unit normal of current edge\r\n * @param proj x = signed distance from point to current edge; y = edge parameter of this projection in [0,1]\r\n * @param coords pre-allocated barycentric coordinate array to return, assumed to have length at least `polygon.length`\r\n * @returns barycentric coordinates, or undefined if not on either edge\r\n */\r\n private static convexBarycentricCoordinatesOnEdge(\r\n polygon: IndexedXYZCollection,\r\n iPrev: number,\r\n prevNormal: Vector3d,\r\n prevProj: XAndY,\r\n i: number,\r\n normal: Vector3d,\r\n proj: XAndY,\r\n coords: number[],\r\n ): number[] | undefined {\r\n // ignore degenerate edges\r\n const pointIsOnPrevEdge = !prevNormal.isZero && (0.0 === prevProj.x) && Geometry.isIn01(prevProj.y);\r\n const pointIsOnEdge = !normal.isZero && (0.0 === proj.x) && Geometry.isIn01(proj.y);\r\n if (pointIsOnPrevEdge && pointIsOnEdge) { // the point is at vertex i\r\n coords.fill(0);\r\n coords[i] = 1.0;\r\n return coords;\r\n }\r\n const n = polygon.length;\r\n if (pointIsOnPrevEdge) { // the point is on the previous edge\r\n coords.fill(0);\r\n const i0 = iPrev;\r\n const i1 = i;\r\n const edgeParam = prevProj.y;\r\n coords[i0] = 1.0 - edgeParam;\r\n coords[i1] = edgeParam;\r\n return coords;\r\n }\r\n if (pointIsOnEdge) { // the point is on the edge starting at the i_th vertex\r\n coords.fill(0);\r\n const i0 = i;\r\n const i1 = (i + 1) % n;\r\n const edgeParam = proj.y;\r\n coords[i0] = 1.0 - edgeParam;\r\n coords[i1] = edgeParam;\r\n return coords;\r\n }\r\n return undefined; // not on edge\r\n }\r\n\r\n // cspell:word CAGD\r\n /** Compute the barycentric coordinates for a point inside a convex polygon.\r\n * @param polygon points of the polygon, assumed to be convex. Closure point optional.\r\n * @param point point assumed to be inside or on polygon\r\n * @param tolerance distance tolerance for point to be considered on a polygon edge\r\n * @return barycentric coordinates of the interior point, or undefined if invalid polygon or exterior point. Length is same as `polygon.length`.\r\n * @see BarycentricTriangle.pointToFraction\r\n */\r\n public static convexBarycentricCoordinates(\r\n polygon: Point3d[] | IndexedXYZCollection,\r\n point: Point3d,\r\n tolerance: number = Geometry.smallMetricDistance,\r\n ): number[] | undefined {\r\n // cf. \"Barycentric Coordinates for Convex Sets\", by Warren et al., CAGD (2003)\r\n if (Array.isArray(polygon))\r\n return this.convexBarycentricCoordinates(new Point3dArrayCarrier(polygon), point);\r\n let n = polygon.length;\r\n while (n > 1 && polygon.getPoint3dAtUncheckedPointIndex(0).isExactEqual(polygon.getPoint3dAtUncheckedPointIndex(n - 1)))\r\n --n; // ignore closure point(s)\r\n if (n < 3 || !PolygonOps.unitNormal(polygon, this._normal))\r\n return undefined;\r\n const localToWorld = this._workMatrix3d = Matrix3d.createRigidHeadsUp(this._normal, AxisOrder.ZXY, this._workMatrix3d);\r\n const polygonXY = new GrowableXYZArray(n);\r\n for (let i = 0; i < n; ++i)\r\n polygonXY.push(localToWorld.multiplyInverseXYZAsPoint3d(polygon.getXAtUncheckedPointIndex(i), polygon.getYAtUncheckedPointIndex(i), polygon.getZAtUncheckedPointIndex(i), this._workXYZ)!);\r\n const pointXY = this._workXYZ = localToWorld.multiplyInverseXYZAsPoint3d(point.x, point.y, point.z, this._workXYZ)!;\r\n // now we know polygon orientation is ccw, its last edge has positive length, and we can ignore z-coords\r\n let iPrev = n - 1;\r\n const outwardUnitNormalOfLastEdge = this._vector0;\r\n const projToLastEdge = this._workXY0 = this.computeEdgeDataXY(polygonXY, iPrev, pointXY, outwardUnitNormalOfLastEdge, tolerance, this._workXY0);\r\n // we can compare to exact zero because computeEdgeDataXY has chopped small distances to zero\r\n if (projToLastEdge.x < 0.0)\r\n return undefined; // point is outside polygon, or polygon is nonconvex\r\n const outwardUnitNormalOfPrevEdge = Vector3d.createFrom(outwardUnitNormalOfLastEdge, this._vector1);\r\n const projToPrevEdge = this._workXY1 = Point2d.createFrom(projToLastEdge, this._workXY1);\r\n const coords = Array<number>(polygon.length).fill(0); // use original length\r\n const largestResult = (tolerance > 0.0) ? 1.0 / (tolerance * tolerance) : Geometry.largeCoordinateResult;\r\n let coordSum = 0.0;\r\n for (let i = 0; i < n; ++i) {\r\n const outwardUnitNormalOfEdge = Vector3d.createFrom(outwardUnitNormalOfLastEdge, this._vector2);\r\n const projToEdge = this._workXY2 = (i < n - 1) ? this.computeEdgeDataXY(polygonXY, i, pointXY, outwardUnitNormalOfEdge, tolerance, this._workXY2) : Point2d.createFrom(projToLastEdge, this._workXY2);\r\n if (projToEdge.x < 0.0)\r\n return undefined; // point is outside polygon, or polygon is nonconvex\r\n if (undefined !== this.convexBarycentricCoordinatesOnEdge(polygonXY, iPrev, outwardUnitNormalOfPrevEdge, projToPrevEdge, i, outwardUnitNormalOfEdge, projToEdge, coords))\r\n return coords; // point is on vertex or edge; we are done\r\n if (outwardUnitNormalOfEdge.x === 0.0 && outwardUnitNormalOfEdge.y === 0.0)\r\n continue; // edge is degenerate; coords[i] = 0; keep previous edge data\r\n if (0.0 === projToPrevEdge.x || 0.0 === projToEdge.x)\r\n continue; // point is on subsequent colinear edge (ASSUMING interior point, convex polygon!); coords[i] = 0; keep previous edge data\r\n const areaOfNormalParallelogram = Math.abs(outwardUnitNormalOfPrevEdge.crossProductXY(outwardUnitNormalOfEdge));\r\n const coord = Geometry.conditionalDivideCoordinate(areaOfNormalParallelogram, projToPrevEdge.x * projToEdge.x, largestResult);\r\n if (undefined === coord) {\r\n assert(false, \"unexpectedly small projection distance to an edge\"); // shouldn't happen due to chopping in computeEdgeDataXY: area/(dist*dist) <= 1/tol^2 = largestResult\r\n }\r\n coords[i] = coord;\r\n coordSum += coord;\r\n outwardUnitNormalOfPrevEdge.setFrom(outwardUnitNormalOfEdge);\r\n projToPrevEdge.setFrom(projToEdge);\r\n iPrev = i;\r\n }\r\n const scale = Geometry.conditionalDivideCoordinate(1.0, coordSum);\r\n if (undefined === scale) {\r\n assert(false, \"unexpected zero barycentric coordinate sum\");\r\n }\r\n for (let i = 0; i < n; ++i)\r\n coords[i] *= scale; // normalized\r\n return coords;\r\n }\r\n /**\r\n * Force the polygon to be closed.\r\n * * If first and last points are not within tolerance, push copy of first point\r\n * * If first and last points are within tolerance, set last point equal to first\r\n * @param polygon input polygon\r\n * @param tolerance closure distance tolerance\r\n */\r\n public static forceClosure(polygon: Point3d[] | GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance): void {\r\n if (polygon.length >= 2) {\r\n if (polygon instanceof GrowableXYZArray) {\r\n polygon.forceClosure(tolerance);\r\n } else if (polygon[0].distance(polygon[polygon.length - 1]) > tolerance) {\r\n polygon.push(polygon[0].clone());\r\n } else {\r\n polygon[polygon.length - 1].setFromPoint3d(polygon[0]);\r\n }\r\n }\r\n }\r\n /**\r\n * Return a closed polygon, cloning only if necessary.\r\n * * If the first and last points are not identical, call [[forceClosure]] on a clone of the polygon and return it.\r\n * * If the first and last points are already identical, just return the input.\r\n * @param polygon input polygon\r\n * @param tolerance closure distance tolerance\r\n */\r\n public static ensureClosed(polygon: Point3d[] | IndexedXYZCollection, tolerance: number = Geometry.smallMetricDistance): Point3d[] | IndexedXYZCollection {\r\n if (polygon.length >= 2) {\r\n let forceClosure = false;\r\n if (polygon instanceof IndexedXYZCollection)\r\n forceClosure = !polygon.almostEqualIndexIndex(0, polygon.length - 1, 0.0);\r\n else\r\n forceClosure = !polygon[0].isExactEqual(polygon[polygon.length - 1]);\r\n if (forceClosure) {\r\n const cloned = GrowableXYZArray.create(polygon);\r\n this.forceClosure(cloned, tolerance);\r\n polygon = cloned;\r\n }\r\n }\r\n return polygon;\r\n }\r\n private static _workCLDPair?: CurveLocationDetailPair;\r\n /**\r\n * Find smallest distance between polygons.\r\n * * For efficiency, input polygons should include closure edge.\r\n * * If searching interiors for close approaches, the polygons are assumed to be convex.\r\n * @param polygonA first polygon\r\n * @param polygonB second polygon\r\n * @param dMax optional largest approach distance to consider\r\n * @param _searchInterior If true, include (convex) polygon interiors in computations (currently unimplemented).\r\n * If false (default): return closest approach between polygon boundaries only, using [[PolylineOps.closestApproach]].\r\n * @return pair of details, one per polygon. The `a` field of each detail stores the closest approach distance.\r\n */\r\n public static closestApproach(\r\n polygonA: Point3d[] | IndexedXYZCollection,\r\n polygonB: Point3d[] | IndexedXYZCollection,\r\n dMax: number = Number.MAX_VALUE,\r\n _searchInterior: boolean = false,\r\n ): PolygonLocationDetailPair | undefined {\r\n // TODO: handle interior close approaches as well...\r\n let result: PolygonLocationDetailPair | undefined;\r\n const polyA = this.ensureClosed(polygonA);\r\n const polyB = this.ensureClosed(polygonB);\r\n const cld = this._workCLDPair = PolylineOps.closestApproach(polyA, false, polyB, false, dMax, this._workCLDPair);\r\n if (cld && cld.detailA.childDetail && cld.detailB.childDetail) {\r\n result = PolygonLocationDetailPair.create(\r\n PolygonLocationDetail.createAtVertexOrEdge(cld.detailA.point, cld.detailA.childDetail.a, cld.detailA.childDetail.fraction),\r\n PolygonLocationDetail.createAtVertexOrEdge(cld.detailB.point, cld.detailB.childDetail.a, cld.detailB.childDetail.fraction),\r\n );\r\n result.detailA.a = result.detailB.a = cld.detailA.a;\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * `IndexedXYZCollectionPolygonOps` class contains _static_ methods for typical operations on polygons carried as `IndexedXYZCollection`\r\n * @public\r\n */\r\nexport class IndexedXYZCollectionPolygonOps {\r\n private static _xyz0Work: Point3d = Point3d.create();\r\n private static _xyz1Work: Point3d = Point3d.create();\r\n private static _xyz2Work: Point3d = Point3d.create();\r\n /**\r\n * Split a (convex) polygon into 2 parts based on altitude evaluations.\r\n * * Both output arrays are cleared first.\r\n * * This method uses only a fixed (tight) parametric tolerance for on-plane detection.\r\n * See [[clipConvexPolygonInPlace]] for a method that takes an additional distance tolerance.\r\n * @param plane any `PlaneAltitudeEvaluator` object that can evaluate `plane.altitude(xyz)` for distance from the plane.\r\n * @param xyz original polygon\r\n * @param xyzPositive array to receive inside part (altitude > 0)\r\n * @param xyzNegative array to receive outside part\r\n * @param altitudeRange min and max altitudes encountered.\r\n * @see clipConvexPolygonInPlace\r\n */\r\n public static splitConvexPolygonInsideOutsidePlane(\r\n plane: PlaneAltitudeEvaluator,\r\n xyz: IndexedXYZCollection,\r\n xyzPositive: IndexedReadWriteXYZCollection,\r\n xyzNegative: IndexedReadWriteXYZCollection,\r\n altitudeRange: Range1d,\r\n ): void {\r\n const xyz0 = IndexedXYZCollectionPolygonOps._xyz0Work;\r\n const xyz1 = IndexedXYZCollectionPolygonOps._xyz1Work;\r\n const xyzInterpolated = IndexedXYZCollectionPolygonOps._xyz2Work;\r\n const n = xyz.length;\r\n xyzPositive.clear();\r\n xyzNegative.clear();\r\n const fractionTol = 1.0e-8;\r\n if (n > 2) {\r\n xyz.back(xyz0);\r\n let a0 = plane.altitude(xyz0), a1 = 0.0, f = 0.0;\r\n altitudeRange.setX(a0);\r\n for (let i1 = 0; i1 < n; i1++) {\r\n xyz.getPoint3dAtUncheckedPointIndex(i1, xyz1);\r\n a1 = plane.altitude(xyz1);\r\n altitudeRange.extendX(a1);\r\n if (a0 * a1 < 0.0) {\r\n // simple crossing\r\n f = - a0 / (a1 - a0);\r\n if (f > 1.0 - fractionTol) {\r\n // segment end is on the clip plane; push it to both sides of the plane\r\n xyzPositive.push(xyz1);\r\n xyzNegative.push(xyz1);\r\n } else if (f < fractionTol) {\r\n // segment start is on the clip plane; push it to same side as segment end, as the\r\n // the previous segment end was already pushed to the opposite side of the plane\r\n if (a1 > 0.0) {\r\n xyzPositive.push(xyz0);\r\n xyzPositive.push(xyz1);\r\n } else {\r\n xyzNegative.push(xyz0);\r\n xyzNegative.push(xyz1);\r\n }\r\n } else {\r\n // crossing point is on the clip plane; push it to both sides of the plane\r\n xyz0.interpolate(f, xyz1, xyzInterpolated);\r\n xyzPositive.push(xyzInterpolated);\r\n xyzNegative.push(xyzInterpolated);\r\n // save segment end to only one side of the plane\r\n if (a1 > 0.0)\r\n xyzPositive.push(xyz1);\r\n else\r\n xyzNegative.push(xyz1);\r\n }\r\n } else {\r\n // no crossing\r\n if (a1 >= 0.0)\r\n xyzPositive.push(xyz1);\r\n if (a1 <= 0.0)\r\n xyzNegative.push(xyz1);\r\n }\r\n xyz0.setFromPoint3d(xyz1);\r\n a0 = a1;\r\n }\r\n }\r\n }\r\n /**\r\n * Clip a polygon to one side of a plane.\r\n * * Results with 2 or fewer points are ignored.\r\n * * Other than ensuring capacity in the arrays, there are no object allocations during execution of this function.\r\n * * For a convex input polygon, the output polygon is also convex.\r\n * * For non-convex input, the output polygon may have double-back edges along plane intersections. This is still a\r\n * valid clip in a parity sense (overlapping regions cancel).\r\n * * This method returns only the piece of the input polygon on one side of the clipper.\r\n * See [[splitConvexPolygonInsideOutsidePlane]] for a method that returns both sides.\r\n * @param plane any type that has `plane.altitude`\r\n * @param xyz input polygon, clipped on output\r\n * @param work optional work buffer\r\n * @param keepPositive whether the positive side of the plane survives (true, default), or negative side (false).\r\n * @param tolerance tolerance for \"on plane\" decision. This is a distance if `plane` has unit normal (e.g., [[ClipPlane]]).\r\n * Default value is [[Geometry.smallMetricDistance]].\r\n * @return the number of crossings. If this is larger than 2, the input polygon was non-convex.\r\n * @see splitConvexPolygonInsideOutsidePlane\r\n */\r\n public static clipConvexPolygonInPlace(\r\n plane: PlaneAltitudeEvaluator,\r\n xyz: GrowableXYZArray,\r\n work?: GrowableXYZArray,\r\n keepPositive: boolean = true,\r\n tolerance: number = Geometry.smallMetricDistance\r\n ): number {\r\n if (!work)\r\n work = new GrowableXYZArray();\r\n work.clear();\r\n const s = keepPositive ? 1.0 : -1.0;\r\n const n = xyz.length;\r\n let numNegative = 0;\r\n const fractionTol = 1.0e-8;\r\n const b = -tolerance;\r\n let numCrossings = 0;\r\n if (xyz.length > 1) { // > 2 ??\r\n let a1;\r\n let index0 = xyz.length - 1;\r\n let a0 = s * xyz.evaluateUncheckedIndexPlaneAltitude(index0, plane);\r\n if (Math.abs(a0) < tolerance)\r\n a0 = 0;\r\n // if (a0 >= 0.0)\r\n // work.push_back (xyz0);\r\n for (let index1 = 0; index1 < n; a0 = a1, index0 = index1++) {\r\n a1 = s * xyz.evaluateUncheckedIndexPlaneAltitude(index1, plane);\r\n if (Math.abs(a1) < tolerance)\r\n a1 = 0;\r\n if (a1 < 0)\r\n numNegative++;\r\n if (a0 * a1 < 0.0) {\r\n // simple crossing . . .\r\n const f = - a0 / (a1 - a0);\r\n if (f > 1.0 - fractionTol && a1 >= 0.0) {\r\n // the endpoint will be saved -- avoid the duplicate\r\n } else {\r\n work.pushInterpolatedFromGrowableXYZArray(xyz, index0, f, index1);\r\n if (a1 > 0)\r\n numCrossings++; // \"out to in\"\r\n }\r\n }\r\n if (a1 >= b) {\r\n work.pushFromGrowableXYZArray(xyz, index1);\r\n if (a0 < -b) {\r\n numCrossings++; // \"in to out\"\r\n }\r\n }\r\n index0 = index1;\r\n a0 = a1;\r\n }\r\n }\r\n\r\n if (work.length <= 2) {\r\n xyz.clear();\r\n } else if (numNegative > 0) {\r\n xyz.clear();\r\n xyz.pushFromGrowableXYZArray(work);\r\n }\r\n work.clear();\r\n return numCrossings;\r\n }\r\n /** Return an array containing\r\n * * All points that are exactly on the plane.\r\n * * Crossing points between adjacent points that are (strictly) on opposite sides.\r\n */\r\n public static polygonPlaneCrossings(plane: PlaneAltitudeEvaluator, xyz: IndexedXYZCollection, crossings: Point3d[]) {\r\n crossings.length = 0;\r\n if (xyz.length >= 2) {\r\n const xyz0 = this._xyz0Work;\r\n xyz.getPoint3dAtUncheckedPointIndex(xyz.length - 1, xyz0);\r\n let a0 = plane.altitude(xyz0);\r\n const xyz1 = this._xyz1Work;\r\n for (let i = 0; i < xyz.length; i++) {\r\n xyz.getPoint3dAtUncheckedPointIndex(i, xyz1);\r\n const a1 = plane.altitude(xyz1);\r\n if (a0 * a1 < 0.0) {\r\n // simple crossing. . .\r\n const f = - a0 / (a1 - a0);\r\n crossings.push(xyz0.interpolate(f, xyz1));\r\n }\r\n if (a1 === 0.0) { // IMPORTANT -- every point is directly tested here\r\n crossings.push(xyz1.clone());\r\n }\r\n xyz0.setFromPoint3d(xyz1);\r\n a0 = a1;\r\n }\r\n }\r\n }\r\n /**\r\n * * Input a \"clipped\" polygon (from clipConvexPolygonInPlace) with more than 2 crossings, i.e. is from a non-convex polygon with configurations like:\r\n * * multiple distinct polygons\r\n * * single polygon, but cut lines overlap and cancel by parity rules.\r\n * * return 1 or more polygons, each having first and last points \"on\" the plane and intermediate points \"off\"\r\n * * `minChainLength` indicates the shortest chain to be returned.\r\n * @internal\r\n */\r\n public static gatherCutLoopsFromPlaneClip(plane: PlaneAltitudeEvaluator, xyz: GrowableXYZArray, minChainLength: number = 3, tolerance: number = Geometry.smallMetricDistance): CutLoopMergeContext {\r\n const result: CutLoopMergeContext = new CutLoopMergeContext();\r\n // find the first on-plane point\r\n let firstOnPlaneIndex = 0;\r\n const n = xyz.length;\r\n for (; firstOnPlaneIndex < n; firstOnPlaneIndex++) {\r\n const a = xyz.evaluateUncheckedIndexPlaneAltitude(firstOnPlaneIndex, plane);\r\n if (Math.abs(a) <= tolerance)\r\n break;\r\n }\r\n if (firstOnPlaneIndex === n)\r\n return result;\r\n // find contiguous blocks of \"off plane\" points with on-plane points at their end.\r\n let candidateA = firstOnPlaneIndex;\r\n while (candidateA < n) {\r\n const currentChain = new GrowableXYZArray();\r\n currentChain.pushFromGrowableXYZArray(xyz, candidateA);\r\n let candidateB = candidateA + 1;\r\n while (candidateB < n) {\r\n currentChain.pushFromGrowableXYZArray(xyz, candidateB);\r\n const a = xyz.evaluateUncheckedIndexPlaneAltitude(candidateB, plane);\r\n if (Math.abs(a) <= tolerance) {\r\n break;\r\n }\r\n candidateB++;\r\n }\r\n if (candidateB === n)\r\n for (let i = 0; i <= firstOnPlaneIndex; i++)\r\n currentChain.pushFromGrowableXYZArray(xyz, i);\r\n if (currentChain.length >= minChainLength)\r\n result.inputLoops.push(CutLoop.createCaptureWithReturnEdge(currentChain));\r\n candidateA = candidateB;\r\n }\r\n return result;\r\n }\r\n /**\r\n * * Input the loops from `gatherCutLoopsFromClipPlane`\r\n * * Consolidate loops for reentrant configurations.\r\n * * WARNING: The output reuses and modifies input loops whenever possible.\r\n * @internal\r\n */\r\n public static reorderCutLoops(loops: CutLoopMergeContext) {\r\n // Simple case: all loops have common orientation\r\n if (loops.inputLoops.length === 1)\r\n return;\r\n // Simple cases: 2 loops . . .\r\n if (loops.inputLoops.length === 2) {\r\n // if edges are in the same direction, it must be a pair of unrelated loop . . .\r\n if (loops.inputLoops[0].edge!.direction.dotProduct(loops.inputLoops[1].edge!.direction) > 0) {\r\n loops.outputLoops.push(loops.inputLoops[0]);\r\n loops.outputLoops.push(loops.inputLoops[1]);\r\n return;\r\n }\r\n // twist the two loops into 1,\r\n const source = loops.inputLoops[1].xyz;\r\n const dest = loops.inputLoops[0].xyz;\r\n dest.pushFromGrowableXYZArray(source);\r\n loops.outputLoops.push(loops.inputLoops[0]);\r\n return;\r\n }\r\n // 3 or more loops.\r\n loops.sortAndMergeLoops();\r\n //\r\n }\r\n /**\r\n * Return the intersection of the plane with a range cube.\r\n * @param range\r\n * @param xyzOut intersection polygon. This is convex.\r\n * @return reference to xyz if the polygon still has points; undefined if all points are clipped away.\r\n */\r\n public static intersectRangeConvexPolygonInPlace(range: Range3d, xyz: GrowableXYZArray): GrowableXYZArray | undefined {\r\n if (range.isNull)\r\n return undefined;\r\n const work = new GrowableXYZArray();\r\n const plane = Point4d.create();\r\n plane.set(0, 0, -1, range.high.z);\r\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\r\n if (xyz.length === 0)\r\n return undefined;\r\n\r\n plane.set(0, 0, 1, -range.low.z);\r\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\r\n if (xyz.length === 0)\r\n return undefined;\r\n\r\n plane.set(0, -1, 0, range.high.y);\r\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\r\n if (xyz.length === 0)\r\n return undefined;\r\n\r\n plane.set(0, 1, 0, -range.low.y);\r\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\r\n if (xyz.length === 0)\r\n return undefined;\r\n\r\n plane.set(-1, 0, 0, range.high.x);\r\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\r\n if (xyz.length === 0)\r\n return undefined;\r\n\r\n plane.set(1, 0, 0, -range.low.x);\r\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\r\n if (xyz.length === 0)\r\n return undefined;\r\n\r\n return xyz;\r\n }\r\n}\r\n/**\r\n * `Point3dArrayPolygonOps` class contains _static_ methods for typical operations on polygons carried as `Point3d[]`\r\n * @public\r\n */\r\nexport class Point3dArrayPolygonOps {\r\n private static _xyz0Work: Point3d = Point3d.create();\r\n // private static _xyz1Work: Point3d = Point3d.create();\r\n // private static _xyz2Work: Point3d = Point3d.create();\r\n /**\r\n * Split a (convex) polygon into 2 parts.\r\n * @param xyz original polygon\r\n * @param xyzIn array to receive inside part\r\n * @param xyzOut array to receive outside part\r\n * @param altitudeRange min and max altitudes encountered.\r\n */\r\n public static convexPolygonSplitInsideOutsidePlane(plane: PlaneAltitudeEvaluator, xyz: Point3d[], xyzIn: Point3d[], xyzOut: Point3d[], altitudeRange: Range1d): void {\r\n const xyzCarrier = new Point3dArrayCarrier(xyz);\r\n const xyzInCarrier = new Point3dArrayCarrier(xyzIn);\r\n const xyzOutCarrier = new Point3dArrayCarrier(xyzOut);\r\n IndexedXYZCollectionPolygonOps.splitConvexPolygonInsideOutsidePlane(plane, xyzCarrier, xyzInCarrier, xyzOutCarrier, altitudeRange);\r\n }\r\n\r\n /** Return an array containing\r\n * * All points that are exactly on the plane.\r\n * * Crossing points between adjacent points that are (strictly) on opposite sides.\r\n */\r\n public static polygonPlaneCrossings(plane: PlaneAltitudeEvaluator, xyz: Point3d[], crossings: Point3d[]): void {\r\n const xyzSource = new Point3dArrayCarrier(xyz);\r\n return IndexedXYZCollectionPolygonOps.polygonPlaneCrossings(plane, xyzSource, crossings);\r\n }\r\n /**\r\n * Clip a polygon, returning the clip result in the same object.\r\n * @param xyz input/output polygon\r\n * @param work scratch object\r\n * @param tolerance tolerance for on-plane decision.\r\n */\r\n public static convexPolygonClipInPlace(plane: PlaneAltitudeEvaluator, xyz: Point3d[], work: Point3d[] | undefined, tolerance: number = Geometry.smallMetricDistance) {\r\n if (work === undefined)\r\n work = [];\r\n work.length = 0;\r\n let numNegative = 0;\r\n const fractionTol = 1.0e-8;\r\n const b = -tolerance;\r\n if (xyz.length > 2) {\r\n let xyz0 = xyz[xyz.length - 1];\r\n let a0 = plane.altitude(xyz0);\r\n // if (a0 >= 0.0)\r\n // work.push_back (xyz0);\r\n for (const xyz1 of xyz) {\r\n const a1 = plane.altitude(xyz1);\r\n if (a1 < 0)\r\n numNegative++;\r\n if (a0 * a1 < 0.0) {\r\n // simple crossing . . .\r\n const f = - a0 / (a1 - a0);\r\n if (f > 1.0 - fractionTol && a1 >= 0.0) {\r\n // the endpoint will be saved -- avoid the duplicate\r\n } else {\r\n work.push(xyz0.interpolate(f, xyz1));\r\n }\r\n }\r\n if (a1 >= b)\r\n work.push(xyz1);\r\n xyz0 = Point3d.createFrom(xyz1);\r\n a0 = a1;\r\n }\r\n }\r\n\r\n if (work.length <= 2) {\r\n xyz.length = 0;\r\n } else if (numNegative > 0) {\r\n xyz.length = 0;\r\n for (const xyzI of work) {\r\n xyz.push(xyzI);\r\n }\r\n work.length = 0;\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"PolygonOps.js","sourceRoot":"","sources":["../../../src/geometry3d/PolygonOps.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 CartesianGeometry\n */\nimport { assert } from \"@itwin/core-bentley\";\nimport { CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\nimport { AxisOrder, Geometry, PlaneAltitudeEvaluator, PolygonLocation } from \"../Geometry\";\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { XYParitySearchContext } from \"../topology/XYParitySearchContext\";\nimport { FrameBuilder } from \"./FrameBuilder\";\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\nimport { IndexedReadWriteXYZCollection, IndexedXYZCollection } from \"./IndexedXYZCollection\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Plane3d } from \"./Plane3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\nimport { Point2d, Vector2d } from \"./Point2dVector2d\";\nimport { Point3dArrayCarrier } from \"./Point3dArrayCarrier\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { PolylineOps } from \"./PolylineOps\";\nimport { Range1d, Range3d } from \"./Range\";\nimport { Ray3d } from \"./Ray3d\";\nimport { SortablePolygon } from \"./SortablePolygon\";\nimport { XAndY, XYAndZ } from \"./XYZProps\";\n\n/**\n * Carries data about a point in the plane of a polygon.\n * @public\n */\nexport class PolygonLocationDetail {\n /** The coordinates of the point p. */\n public point: Point3d;\n /** Application-specific number */\n public a: number;\n /** Application-specific vector */\n public v: Vector3d;\n /** A number that classifies the point's location with respect to the polygon. */\n public code: PolygonLocation;\n /** Index of the polygon vertex at the base of the edge closest to p. */\n public closestEdgeIndex: number;\n /** The parameter along the closest edge of the projection of p. */\n public closestEdgeParam: number;\n\n private constructor() {\n this.point = new Point3d();\n this.a = 0.0;\n this.v = new Vector3d();\n this.code = PolygonLocation.Unknown;\n this.closestEdgeIndex = 0;\n this.closestEdgeParam = 0.0;\n }\n\n /** Invalidate this detail. */\n public invalidate() {\n this.point.setZero();\n this.a = 0.0;\n this.v.setZero();\n this.code = PolygonLocation.Unknown;\n this.closestEdgeIndex = 0;\n this.closestEdgeParam = 0.0;\n }\n\n /** Create an invalid detail.\n * @param result optional pre-allocated object to fill and return\n */\n public static create(result?: PolygonLocationDetail): PolygonLocationDetail {\n if (undefined === result)\n result = new PolygonLocationDetail();\n else\n result.invalidate();\n return result;\n }\n\n /** Set the instance contents from the other detail.\n * @param other detail to clone\n */\n public copyContentsFrom(other: PolygonLocationDetail) {\n this.point.setFrom(other.point);\n this.a = other.a;\n this.v.setFrom(other.v);\n this.code = other.code;\n this.closestEdgeIndex = other.closestEdgeIndex;\n this.closestEdgeParam = other.closestEdgeParam;\n }\n\n /** Whether this detail is valid. */\n public get isValid(): boolean {\n return this.code !== PolygonLocation.Unknown;\n }\n\n /** Whether this instance specifies a location inside or on the polygon. */\n public get isInsideOrOn(): boolean {\n return this.code === PolygonLocation.InsidePolygon ||\n this.code === PolygonLocation.OnPolygonVertex || this.code === PolygonLocation.OnPolygonEdgeInterior ||\n this.code === PolygonLocation.InsidePolygonProjectsToVertex || this.code === PolygonLocation.InsidePolygonProjectsToEdgeInterior;\n }\n /**\n * Set point, index, and fraction for an \"at vertex\" or \"along edge\" PolygonLocationDetail.\n * * Point is not captured; its coordinates are copied.\n */\n public static createAtVertexOrEdge(point: Point3d, index: number, fraction: number = 0): PolygonLocationDetail {\n const detail = new PolygonLocationDetail();\n detail.point.setFrom(point);\n detail.closestEdgeIndex = index;\n detail.closestEdgeParam = fraction;\n fraction = Geometry.clamp(fraction, 0, 1);\n detail.code = (fraction > 0 && fraction < 1) ? PolygonLocation.OnPolygonEdgeInterior : PolygonLocation.OnPolygonVertex;\n return detail;\n }\n}\n\n/**\n * A pair of PolygonLocationDetail.\n * @public\n */\nexport class PolygonLocationDetailPair {\n /** The first of the two details. */\n public detailA: PolygonLocationDetail;\n /** The second of the two details. */\n public detailB: PolygonLocationDetail;\n\n /** Constructor, captures inputs */\n private constructor(detailA?: PolygonLocationDetail, detailB?: PolygonLocationDetail) {\n this.detailA = detailA ? detailA : PolygonLocationDetail.create();\n this.detailB = detailB ? detailB : PolygonLocationDetail.create();\n }\n /** Create an instance by capturing inputs */\n public static create(detailA: PolygonLocationDetail, detailB: PolygonLocationDetail, result?: PolygonLocationDetailPair): PolygonLocationDetailPair {\n if (!result)\n return new PolygonLocationDetailPair(detailA, detailB);\n result.detailA = detailA;\n result.detailB = detailB;\n return result;\n }\n /** Make a deep copy of this PolygonLocationDetailPair */\n public clone(result?: PolygonLocationDetailPair): PolygonLocationDetailPair {\n result = result ? result : new PolygonLocationDetailPair();\n result.detailA.copyContentsFrom(this.detailA);\n result.detailB.copyContentsFrom(this.detailB);\n return result;\n }\n /** Swap the details of A, B */\n public swapDetails() {\n const q = this.detailA;\n this.detailA = this.detailB;\n this.detailB = q;\n }\n}\n\n/**\n * Carrier for a loop extracted from clip operation, annotated for sorting\n * @internal\n */\nexport class CutLoop {\n /* All points of the loop */\n public xyz: GrowableXYZArray;\n /* ray within point of \"on\" edge */\n public edge?: Ray3d;\n public sortCoordinate0: number;\n public sortCoordinate1: number;\n public sortDelta: number;\n public isNotch: boolean;\n public constructor(xyz: GrowableXYZArray) {\n this.xyz = xyz;\n this.edge = undefined;\n this.sortCoordinate0 = this.sortCoordinate1 = 0;\n this.sortDelta = 0;\n this.isNotch = false;\n }\n /**\n * Create a `CutLoop` structure annotated with the vector from last point to first.\n * @param xyz coordinates to capture\n */\n public static createCaptureWithReturnEdge(xyz: GrowableXYZArray): CutLoop {\n const result = new CutLoop(xyz);\n if (xyz.length >= 2)\n result.edge = Ray3d.createStartEnd(xyz.front()!, xyz.back()!);\n return result;\n }\n /**\n * Set up coordinates for sort steps:\n * * Make `sortCoordinate0` and `sortCoordinate` the (algebraically sorted) start and end fractions along the ray\n * * Make `sortDelta` the oriented difference of those two\n * * Hence sorting on the coordinates puts loops in left-to-right order by the their edge vector leftmost point.\n */\n public setSortCoordinates(ray: Ray3d) {\n this.sortDelta = this.edge!.direction.dotProduct(ray.direction);\n const a = ray.dotProductToPoint(this.edge!.origin);\n if (this.sortDelta >= 0) {\n this.sortCoordinate0 = a;\n this.sortCoordinate1 = a + this.sortDelta;\n } else {\n this.sortCoordinate0 = a + this.sortDelta; // and sortDelta is negative !!!\n this.sortCoordinate1 = a;\n\n }\n }\n /** Return\n * * 0 if other sort limits are not strictly contained in this.\n * * 1 if other sort limits are strictly contained with same direction\n * * -1 if other sort limits are strictly contained in opposite direction.\n */\n public containsSortLimits(other: CutLoop): number {\n if (other.sortCoordinate0 >= this.sortCoordinate1\n || other.sortCoordinate0 <= this.sortCoordinate0\n || other.sortCoordinate1 <= this.sortCoordinate0\n || other.sortCoordinate1 >= this.sortCoordinate1)\n return 0;\n return this.sortDelta * other.sortDelta > 0 ? 1 : -1;\n }\n /**\n * * push coordinates from other onto this\n * * reset this.sortCoordinate0 to other.sortCoordinate1\n * @param other new coordinates\n */\n public absorb(other: CutLoop) {\n this.xyz.pushFromGrowableXYZArray(other.xyz);\n this.sortCoordinate0 = other.sortCoordinate1;\n }\n /** Comparison function for system sort function applied to an array of CutLoop .... */\n public static sortFunction(loopA: CutLoop, loopB: CutLoop): number {\n const q = loopA.sortCoordinate0 - loopB.sortCoordinate0;\n return q > 0 ? 1 : -1;\n }\n\n /** Return first point coordinates.\n * * For type checking, assume array is not empty.\n */\n public front(result?: Point3d): Point3d { return this.xyz.front(result)!; }\n /** Return last point coordinates.\n * * For type checking, assume array is not empty.\n */\n public back(result?: Point3d): Point3d { return this.xyz.back(result)!; }\n\n}\n/**\n * Context to hold an array of input loops and apply sort logic.\n * * This is used when a non-convex face is clipped by a plane\n * * Simple convex clip logic in this case generates double-back edges that need to be eliminated.\n * * This class manages the elimination.\n * * Usage pattern is:\n * @internal\n */\nexport class CutLoopMergeContext {\n /** Array (filled by user code) of loops being sorted. Contents are subject to being changed during sort. */\n public inputLoops: CutLoop[];\n /** Array (filled by sortAndMergeLoops) of reorganized loops. */\n public outputLoops: CutLoop[];\n // Initialize with empty loop arrays.\n public constructor() {\n this.inputLoops = [];\n this.outputLoops = [];\n }\n /**\n * * Search all start and end points for the one most distant from point0.\n */\n private mostDistantPoint(point0: Point3d, workPoint: Point3d, resultPoint: Point3d) {\n let dMax = -1.0;\n resultPoint.setZero();\n let d;\n for (const loop of this.inputLoops) {\n loop.front(workPoint);\n d = workPoint.distanceSquared(point0);\n if (d > dMax) {\n dMax = d;\n resultPoint.setFromPoint3d(workPoint);\n }\n loop.back(workPoint);\n d = workPoint.distanceSquared(point0);\n if (d > dMax) {\n dMax = d;\n resultPoint.setFromPoint3d(workPoint);\n }\n }\n }\n /**\n * * Find a long (probably longest) edge through start and end points of inputs.\n * * Setup sortCoordinate0 and sortCoordinate1 along that edge for each loop\n * * sort all inputLoop members by sortCoordinate0.\n */\n private sortInputs() {\n if (this.inputLoops.length > 0 && this.inputLoops[0].xyz.length > 0) {\n const point0 = this.inputLoops[0].xyz.front()!;\n const workPoint = Point3d.create();\n const point1 = Point3d.create();\n // point0 could be in the middle. Find the most distant point ...\n this.mostDistantPoint(point0, workPoint, point1);\n // And again from point1 to get to the other extreme . .\n this.mostDistantPoint(point1, workPoint, point0);\n const sortRay = Ray3d.createStartEnd(point0, point1);\n sortRay.direction.normalizeInPlace();\n for (const loop of this.inputLoops)\n loop.setSortCoordinates(sortRay);\n this.inputLoops.sort((loopA, loopB) => CutLoop.sortFunction(loopA, loopB));\n\n }\n }\n /**\n * * sort all input loops by coordinate along the cut edge\n * * sweep left to right, using start and end coordinates to decide if loops are outer or hole, and combine holes into their containing outer loops.\n */\n public sortAndMergeLoops() {\n this.sortInputs();\n const inputs = this.inputLoops;\n const outputs = this.outputLoops;\n const stack = [];\n outputs.length = 0;\n for (const candidate of inputs) {\n candidate.isNotch = false;\n // candidate must be either (a) absorbed in to of stack or (b) pushed onto stack.\n // If pushed, must have indication of natch state.\n for (; stack.length > 0;) {\n const topOfStack = stack[stack.length - 1];\n const containment = topOfStack.containsSortLimits(candidate);\n if (containment === 0) {\n if (!topOfStack.isNotch)\n outputs.push(topOfStack);\n stack.pop();\n continue; // a larger topOfStack may have appeared !\n candidate.isNotch = false;\n } else if (containment === 1) {\n candidate.isNotch = false;\n break;\n } else {\n topOfStack.absorb(candidate);\n candidate.isNotch = true;\n break;\n }\n }\n stack.push(candidate);\n }\n // Anything on stack must be complete ...\n for (const p of stack) {\n if (!p.isNotch)\n outputs.push(p);\n }\n }\n}\n/**\n * Bundle of options for [[PolygonOps.volumeBetweenPolygonAndPlane]].\n * @public\n * @see [[VolumeBetweenPolygonAndPlaneOutput]]\n */\nexport interface VolumeBetweenPolygonAndPlaneOptions {\n /** Whether to skip computation of the area moments. If `true` only volume and area are returned. Default is `false`. */\n skipMoments?: boolean;\n /** Work point. If `skipMoments` is undefined/false, this point is returned as the area moment origin. */\n workPoint0?: Point3d;\n /** Another work point. */\n workPoint1?: Point3d;\n /** Work vector. */\n workVector?: Vector3d;\n /** Work matrix. If `skipMoments` is undefined/false, this matrix is returned as the area moment products. */\n workMatrix?: Matrix4d;\n}\n/**\n * Bundle of output data for [[PolygonOps.volumeBetweenPolygonAndPlane]].\n * @public\n */\nexport interface VolumeBetweenPolygonAndPlaneOutput {\n /** Six times the signed volume of the truncated prism between the polygon and the plane. */\n volume6: number;\n /** Two times the signed area of the polygon's projection onto the plane. */\n area2: number;\n /** Origin of the facet used to accumulate `products`. */\n origin?: Point3d;\n /** Raw accumulated second moment area products of the polygon's projection onto the plane. */\n products?: Matrix4d;\n}\n/**\n * Various static methods to perform computations on an array of points interpreted as a polygon.\n * @public\n */\nexport class PolygonOps {\n /** Sum areas of triangles from points[0] to each far edge.\n * * Consider triangles from points[0] to each edge.\n * * Sum the absolute areas (without regard to orientation) all these triangles.\n * @returns sum of absolute triangle areas.\n */\n public static sumTriangleAreas(points: Point3d[] | GrowableXYZArray): number {\n let s = 0;\n const n = points.length;\n if (Array.isArray(points)) {\n if (n >= 3) {\n const origin = points[0];\n const vector0 = origin.vectorTo(points[1]);\n let vector1 = Vector3d.create();\n // This will work with or without closure edge. If closure is given, the last vector is 000.\n for (let i = 2; i < n; i++) {\n vector1 = origin.vectorTo(points[i], vector1);\n s += vector0.crossProductMagnitude(vector1);\n vector0.setFrom(vector1);\n }\n }\n return s * 0.5;\n }\n const crossVector = Vector3d.create();\n for (let i = 2; i < n; i++) {\n points.crossProductIndexIndexIndex(0, i - 1, i, crossVector);\n s += crossVector.magnitude();\n }\n return s * 0.5;\n }\n /** Sum areas of triangles from points[0] to each far edge, as viewed with upVector pointing up.\n * * Consider triangles from points[0] to each edge.\n * * Sum the areas perpendicular to the upVector.\n * * If the upVector is near-zero length, a simple z vector is used.\n * @returns sum of triangle areas.\n */\n public static sumTriangleAreasPerpendicularToUpVector(points: Point3d[] | GrowableXYZArray, upVector: Vector3d): number {\n let scale = upVector.magnitude();\n if (scale < Geometry.smallMetricDistance) {\n upVector = Vector3d.create(0, 0, 1);\n scale = 1.0;\n }\n\n let s = 0;\n const n = points.length;\n if (Array.isArray(points)) {\n if (n >= 3) {\n const origin = points[0];\n const vector0 = origin.vectorTo(points[1]);\n let vector1 = Vector3d.create();\n // This will work with or without closure edge. If closure is given, the last vector is 000.\n for (let i = 2; i < n; i++) {\n vector1 = origin.vectorTo(points[i], vector1);\n s += vector0.tripleProduct(vector1, upVector);\n vector0.setFrom(vector1);\n }\n }\n return s * 0.5 / scale;\n }\n const crossVector = Vector3d.create();\n for (let i = 2; i < n; i++) {\n points.crossProductIndexIndexIndex(0, i - 1, i, crossVector);\n s += crossVector.dotProduct(upVector);\n }\n return s * 0.5 / scale;\n }\n\n /** Sum areas of triangles from points[0] to each far edge.\n * * Consider triangles from points[0] to each edge.\n * * Sum the signed areas of all these triangles. (An area can be negative at a concave corner.)\n * @returns sum of signed triangle areas.\n */\n public static sumTriangleAreasXY(points: Point3d[]): number {\n let s = 0.0;\n const n = points.length;\n if (n >= 3) {\n const origin = points[0];\n const vector0 = origin.vectorTo(points[1]);\n let vector1 = Vector3d.create();\n // This will work with or without closure edge. If closure is given, the last vector is 000.\n for (let i = 2; i < n; i++) {\n vector1 = origin.vectorTo(points[i], vector1);\n s += vector0.crossProductXY(vector1);\n vector0.setFrom(vector1);\n }\n }\n s *= 0.5;\n return s;\n }\n /** These values are the integrated area moment products [xx,xy,xz, x]\n * for a right triangle in the first quadrant at the origin -- (0,0),(1,0),(0,1)\n */\n private static readonly _triangleMomentWeights = Matrix4d.createRowValues(2.0 / 24.0, 1.0 / 24.0, 0, 4.0 / 24.0, 1.0 / 24.0, 2.0 / 24.0, 0, 4.0 / 24.0, 0, 0, 0, 0, 4.0 / 24.0, 4.0 / 24.0, 0, 12.0 / 24.0);\n /** These values are the integrated volume moment products [xx,xy,xz, x, yx,yy,yz,y, zx,zy,zz,z,x,y,z,1]\n * for a tetrahedron in the first quadrant at the origin -- (0,00),(1,0,0),(0,1,0),(0,0,1)\n */\n private static readonly _tetrahedralMomentWeights = Matrix4d.createRowValues(\n 1.0 / 60.0, 1.0 / 120, 1.0 / 120, 1.0 / 24.0,\n 1.0 / 120, 1.0 / 60.0, 1.0 / 120, 1.0 / 24.0,\n 1.0 / 120, 1.0 / 120, 1.0 / 60.0, 1.0 / 24.0,\n 1.0 / 24.0, 1.0 / 24.0, 1.0 / 24.0, 1.0 / 6.0);\n // statics for shared reuse.\n // many methods use these.\n // only use them in \"leaf\" methods that are certain not to call other users . . .\n private static _vector0 = Vector3d.create();\n private static _vector1 = Vector3d.create();\n private static _vector2 = Vector3d.create();\n private static _vectorOrigin = Vector3d.create();\n private static _normal = Vector3d.create();\n private static _matrixA = Matrix4d.createIdentity();\n private static _matrixB = Matrix4d.createIdentity();\n private static _matrixC = Matrix4d.createIdentity();\n /** return a vector which is perpendicular to the polygon and has magnitude equal to the polygon area. */\n public static areaNormalGo(points: IndexedXYZCollection, result?: Vector3d): Vector3d | undefined {\n if (!result)\n result = new Vector3d();\n else\n result.setZero();\n const n = points.length;\n if (n === 3) {\n points.crossProductIndexIndexIndex(0, 1, 2, result);\n } else if (n > 3) {\n // This will work with or without closure edge. If closure is given, the last vector is 000.\n for (let i = 2; i < n; i++) {\n points.accumulateCrossProductIndexIndexIndex(0, i - 1, i, result);\n }\n }\n // ALL BRANCHES SUM FULL CROSS PRODUCTS AND EXPECT SCALE HERE\n result.scaleInPlace(0.5);\n return result.isZero ? undefined : result;\n }\n /** return a vector which is perpendicular to the polygon and has magnitude equal to the polygon area. */\n public static areaNormal(points: Point3d[], result?: Vector3d): Vector3d {\n if (!result)\n result = Vector3d.create();\n PolygonOps.areaNormalGo(new Point3dArrayCarrier(points), result);\n return result;\n }\n /** return the area of the polygon.\n * * This assumes the polygon is planar\n * * This does NOT assume the polygon is on the xy plane.\n */\n public static area(points: Point3d[]): number {\n return PolygonOps.areaNormal(points).magnitude();\n }\n /** return the projected XY area of the polygon. */\n public static areaXY(points: Point3d[] | IndexedXYZCollection): number {\n let area = 0.0;\n if (points instanceof IndexedXYZCollection) {\n if (points.length > 2) {\n const x0 = points.getXAtUncheckedPointIndex(0);\n const y0 = points.getYAtUncheckedPointIndex(0);\n let u1 = points.getXAtUncheckedPointIndex(1) - x0;\n let v1 = points.getYAtUncheckedPointIndex(1) - y0;\n let u2, v2;\n for (let i = 2; i + 1 < points.length; i++, u1 = u2, v1 = v2) {\n u2 = points.getXAtUncheckedPointIndex(i) - x0;\n v2 = points.getYAtUncheckedPointIndex(i) - y0;\n area += Geometry.crossProductXYXY(u1, v1, u2, v2);\n }\n }\n } else {\n for (let i = 1; i + 1 < points.length; i++)\n area += points[0].crossProductToPointsXY(points[i], points[i + 1]);\n }\n return 0.5 * area;\n }\n /** Sum the areaXY () values for multiple polygons */\n public static sumAreaXY(polygons: Point3d[][]): number {\n let s = 0.0;\n for (const p of polygons)\n s += this.areaXY(p);\n return s;\n }\n /**\n * Return a [[Ray3d]] with:\n * * `origin` is the centroid of the polygon,\n * * `direction` is a unit vector perpendicular to the polygon plane,\n * * `a` is the polygon area.\n * @param points the polygon vertices in order. Points can lie in any plane. First and last point do not have to be equal.\n * @param result optional pre-allocated result to populate and return.\n */\n public static centroidAreaNormal(points: IndexedXYZCollection | Point3d[], result?: Ray3d): Ray3d | undefined {\n if (Array.isArray(points)) {\n const carrier = new Point3dArrayCarrier(points);\n return this.centroidAreaNormal(carrier, result);\n }\n const n = points.length;\n if (n === 3) {\n const normal = points.crossProductIndexIndexIndex(0, 1, 2, result?.direction)!;\n const a = 0.5 * normal.magnitude();\n const centroid = points.getPoint3dAtCheckedPointIndex(0, result?.origin)!;\n points.accumulateScaledXYZ(1, 1.0, centroid);\n points.accumulateScaledXYZ(2, 1.0, centroid);\n centroid.scaleInPlace(1.0 / 3.0);\n if (!result)\n result = Ray3d.createCapture(centroid, normal);\n if (result.tryNormalizeInPlaceWithAreaWeight(a))\n return result;\n return undefined;\n }\n if (n >= 3) {\n const areaNormal = Vector3d.createZero();\n // This will work with or without closure edge. If closure is given, the last vector is 000.\n for (let i = 2; i < n; i++) {\n points.accumulateCrossProductIndexIndexIndex(0, i - 1, i, areaNormal);\n }\n areaNormal.normalizeInPlace();\n const origin = points.getPoint3dAtCheckedPointIndex(0)!;\n const vector0 = Vector3d.create();\n const vector1 = Vector3d.create();\n points.vectorXYAndZIndex(origin, 1, vector0);\n let cross = Vector3d.create();\n const centroidSum = Vector3d.createZero();\n const normal = Vector3d.createZero(result?.direction);\n let signedTriangleArea;\n // This will work with or without closure edge. If closure is given, the last vector is 000.\n for (let i = 2; i < n; i++) {\n points.vectorXYAndZIndex(origin, i, vector1);\n cross = vector0.crossProduct(vector1, cross);\n signedTriangleArea = areaNormal.dotProduct(cross); // well, actually twice the area.\n normal.addInPlace(cross); // this grows to twice the area\n const b = signedTriangleArea / 6.0;\n centroidSum.plus2Scaled(vector0, b, vector1, b, centroidSum);\n vector0.setFrom(vector1);\n }\n const area = 0.5 * normal.magnitude();\n const inverseArea = Geometry.conditionalDivideFraction(1, area);\n if (inverseArea !== undefined) {\n const centroid = origin.plusScaled(centroidSum, inverseArea, result?.origin);\n if (!result)\n result = Ray3d.createCapture(centroid, normal);\n result.tryNormalizeInPlaceWithAreaWeight(area);\n return result;\n }\n }\n return undefined;\n }\n // Has the potential to be combined with centroidAreaNormal for point3d array and Ray3d return listed above...\n // Returns undefined if given point array less than 3 or if not safe to divide at any point\n /**\n * * Return (in caller-allocated centroid) the centroid of the xy polygon.\n * * Return (as function value) the area\n */\n public static centroidAndAreaXY(points: Point2d[], centroid: Point2d): number | undefined {\n let area = 0.0;\n centroid.set(0, 0);\n if (points.length < 3)\n return undefined;\n const origin = points[0];\n let vectorSum = Vector2d.create(0, 0); // == sum ((U+V)/3) * (U CROSS V)/2 -- but leave out divisions\n let areaSum = 0.0; // == sum (U CROSS V) / 2 -- but leave out divisions\n for (let i = 1; i + 1 < points.length; i++) {\n const vector0 = origin.vectorTo(points[i]);\n const vector1 = origin.vectorTo(points[i + 1]);\n const tempArea = vector0.crossProduct(vector1);\n vectorSum = vectorSum.plus(vector0.plus(vector1).scale(tempArea));\n areaSum += tempArea;\n }\n area = areaSum * 0.5;\n const a = Geometry.conditionalDivideFraction(1.0, 6.0 * area);\n if (a === undefined) {\n centroid.setFrom(origin);\n return undefined;\n }\n centroid.setFrom(origin.plusScaled(vectorSum, a));\n return area;\n }\n /**\n * Return a unit normal to the plane of the polygon.\n * @param points array of points around the polygon.\n * @param result caller-allocated result vector.\n * @return true if and only if result has unit length\n */\n public static unitNormal(points: IndexedXYZCollection, result: Vector3d): boolean {\n result.setZero();\n let n = points.length;\n if (n > 1 && points.getPoint3dAtUncheckedPointIndex(0).isExactEqual(points.getPoint3dAtUncheckedPointIndex(n - 1)))\n --n; // ignore closure point\n if (n === 3) {\n points.crossProductIndexIndexIndex(0, 1, 2, result);\n return result.normalizeInPlace();\n }\n if (n === 4) {\n // cross product of diagonals is more stable than from single of the points . . .\n points.vectorIndexIndex(0, 2, PolygonOps._vector0);\n points.vectorIndexIndex(1, 3, PolygonOps._vector1);\n PolygonOps._vector0.crossProduct(PolygonOps._vector1, result);\n return result.normalizeInPlace();\n }\n // more than 4 points ... no shortcuts ...\n PolygonOps.areaNormalGo(points, result);\n return result.normalizeInPlace();\n }\n /** Accumulate to the matrix of area products of a polygon with respect to an origin.\n * The polygon is assumed to be planar and non-self-intersecting.\n */\n /** Accumulate to the matrix of area products of a polygon with respect to an origin.\n * * The polygon is assumed to be planar and non-self-intersecting.\n * * Accumulated values are integrals over triangles from point 0 of the polygon to other edges of the polygon.\n * * Integral over each triangle is transformed to integrals from the given origin.\n * @param points array of points around the polygon. Final closure point is not needed.\n * @param origin origin for global accumulation.\n * @param moments 4x4 matrix where products are accumulated.\n */\n public static addSecondMomentAreaProducts(points: IndexedXYZCollection, origin: Point3d, moments: Matrix4d) {\n this.addSecondMomentTransformedProducts(PolygonOps._triangleMomentWeights, points, origin, 2, moments);\n }\n\n /** Accumulate to the matrix of volume products of a polygon with respect to an origin.\n * * The polygon is assumed to be planar and non-self-intersecting.\n * * Accumulated values are integrals over tetrahedra from the origin to triangles on the polygon.\n * @param points array of points around the polygon. Final closure point is not needed.\n * @param origin origin for tetrahedra\n * @param moments 4x4 matrix where products are accumulated.\n */\n public static addSecondMomentVolumeProducts(points: IndexedXYZCollection, origin: Point3d, moments: Matrix4d) {\n this.addSecondMomentTransformedProducts(PolygonOps._tetrahedralMomentWeights, points, origin, 3, moments);\n }\n /** Return the matrix of area products of a polygon with respect to an origin.\n * The polygon is assumed to be planar and non-self-intersecting.\n * * `frameType===2` has xy vectors in the plane of the polygon, plus a unit normal z. (Used for area integrals)\n * * `frameType===3` has vectors from origin to 3 points in the triangle. (Used for volume integrals)\n */\n private static addSecondMomentTransformedProducts(firstQuadrantMoments: Matrix4d, points: IndexedXYZCollection, origin: Point3d,\n frameType: 2 | 3,\n moments: Matrix4d) {\n const unitNormal = PolygonOps._normal;\n if (PolygonOps.unitNormal(points, unitNormal)) {\n // The direction of the normal makes the various detJ values positive or negative so that non-convex polygons\n // sum correctly.\n const vector01 = PolygonOps._vector0;\n const vector02 = PolygonOps._vector1;\n const vector03 = PolygonOps._vector2;\n const placement = PolygonOps._matrixA;\n const matrixAB = PolygonOps._matrixB;\n const matrixABC = PolygonOps._matrixC;\n const vectorOrigin = points.vectorXYAndZIndex(origin, 0, PolygonOps._vectorOrigin)!;\n const numPoints = points.length;\n let detJ = 0;\n for (let i2 = 2; i2 < numPoints; i2++) {\n if (frameType === 2) {\n points.vectorIndexIndex(0, i2 - 1, vector01);\n points.vectorIndexIndex(0, i2, vector02);\n detJ = unitNormal.tripleProduct(vector01, vector02);\n placement.setOriginAndVectors(vectorOrigin, vector01, vector02, unitNormal);\n placement.multiplyMatrixMatrix(firstQuadrantMoments, matrixAB);\n matrixAB.multiplyMatrixMatrixTranspose(placement, matrixABC);\n moments.addScaledInPlace(matrixABC, detJ);\n } else if (frameType === 3) {\n points.vectorXYAndZIndex(origin, 0, vector01);\n points.vectorXYAndZIndex(origin, i2 - 1, vector02);\n points.vectorXYAndZIndex(origin, i2, vector03);\n detJ = vector01.tripleProduct(vector02, vector03);\n placement.setOriginAndVectors(origin, vector01, vector02, vector03);\n placement.multiplyMatrixMatrix(firstQuadrantMoments, matrixAB);\n matrixAB.multiplyMatrixMatrixTranspose(placement, matrixABC);\n moments.addScaledInPlace(matrixABC, detJ);\n }\n }\n }\n }\n /**\n * Compute the signed volume of the truncated prism between a facet and a plane.\n * * Useful for parallel algorithms.\n * @param facetPoints input 3D polygon; on return the points are projected onto the plane. Wraparound point is optional.\n * @param plane infinite plane bounding volume between the facet and (virtual) side facets perpendicular to the plane (unmodified).\n * @param options optional flags and pre-allocated temporary storage.\n * @returns computed data for this facet:\n * * `volume6`: six times the signed volume of the truncated prism between the facet and the plane.\n * * `area2`: two times the signed area of the facet's projection onto the plane.\n * * `origin`: origin of the facet used to accumulate area moments.\n * * `products`: raw accumulated second moment area products of the facet's projection onto the plane.\n * @see [[PolyfaceQuery.sumVolumeBetweenFacetsAndPlane]]\n */\n public static volumeBetweenPolygonAndPlane(facetPoints: GrowableXYZArray, plane: Plane3d, options?: VolumeBetweenPolygonAndPlaneOptions): VolumeBetweenPolygonAndPlaneOutput {\n let origin: Point3d | undefined;\n let products: Matrix4d | undefined;\n let singleProjectedFacetAreaTimes2 = 0.0;\n let signedTruncatedPrismVolumeTimes6 = 0.0;\n const h0 = facetPoints.evaluateUncheckedIndexPlaneAltitude(0, plane);\n for (let i = 1; i + 1 < facetPoints.length; i++) {\n const triangleNormal = facetPoints.crossProductIndexIndexIndex(0, i, i + 1, options?.workVector)!;\n const hA = facetPoints.evaluateUncheckedIndexPlaneAltitude(i, plane);\n const hB = facetPoints.evaluateUncheckedIndexPlaneAltitude(i + 1, plane);\n const signedProjectedTriangleAreaTimes2 = triangleNormal.dotProductXYZ(plane.normalX(), plane.normalY(), plane.normalZ());\n singleProjectedFacetAreaTimes2 += signedProjectedTriangleAreaTimes2;\n signedTruncatedPrismVolumeTimes6 += signedProjectedTriangleAreaTimes2 * (h0 + hA + hB);\n }\n if (!options?.skipMoments) {\n origin = facetPoints.getPoint3dAtUncheckedPointIndex(0, options?.workPoint0);\n products = Matrix4d.createZero(options?.workMatrix);\n facetPoints.mapPoint((x: number, y: number, z: number) => plane.projectXYZToPlane(x, y, z, options?.workPoint1));\n PolygonOps.addSecondMomentAreaProducts(facetPoints, origin, products);\n }\n return { volume6: signedTruncatedPrismVolumeTimes6, area2: singleProjectedFacetAreaTimes2, origin, products };\n }\n /** Test the direction of turn at the vertices of the polygon, ignoring z-coordinates.\n * * For a polygon without self-intersections and successive colinear edges, this is a convexity and orientation test: all positive is convex and counterclockwise, all negative is convex and clockwise.\n * * Beware that a polygon which turns through more than a full turn can cross itself and close, but is not convex.\n * @returns 1 if all turns are to the left, -1 if all to the right, and 0 if there are any zero or reverse turns\n */\n public static testXYPolygonTurningDirections(points: Point2d[] | Point3d[]): number {\n // Reduce count by trailing duplicates; leaves iLast at final index\n let numPoint = points.length;\n let iLast = numPoint - 1;\n while (iLast > 1 && points[iLast].x === points[0].x && points[iLast].y === points[0].y) {\n numPoint = iLast--;\n }\n if (numPoint > 2) {\n let vector0 = Point2d.create(points[iLast].x - points[iLast - 1].x, points[iLast].y - points[iLast - 1].y);\n const vector1 = Point2d.create(points[0].x - points[iLast].x, points[0].y - points[iLast].y);\n const baseArea = vector0.x * vector1.y - vector0.y * vector1.x;\n // In a convex polygon, all successive-vector cross products will\n // have the same sign as the base area, hence all products will be\n // positive.\n for (let i1 = 1; i1 < numPoint; i1++) {\n vector0 = vector1.clone();\n Point2d.create(points[i1].x - points[i1 - 1].x, points[i1].y - points[i1 - 1].y, vector1);\n const currArea = vector0.x * vector1.y - vector0.y * vector1.x;\n if (currArea * baseArea <= 0.0)\n return 0;\n }\n // Fall out with all signs same as base area\n return baseArea > 0.0 ? 1 : -1;\n }\n return 0;\n }\n /**\n * Determine whether the polygon is convex.\n * @param polygon vertices, closure point optional\n * @returns whether the polygon is convex.\n */\n public static isConvex(polygon: Point3d[] | IndexedXYZCollection): boolean {\n if (!(polygon instanceof IndexedXYZCollection))\n return this.isConvex(new Point3dArrayCarrier(polygon));\n let n = polygon.length;\n if (n > 1 && polygon.getPoint3dAtUncheckedPointIndex(0).isExactEqual(polygon.getPoint3dAtUncheckedPointIndex(n - 1)))\n --n; // ignore closure point\n const normal = Vector3d.create();\n if (!this.unitNormal(polygon, normal))\n return false;\n let positiveArea = 0.0;\n let negativeArea = 0.0;\n const vecA = this._vector0;\n let vecB = Vector3d.createStartEnd(polygon.getPoint3dAtUncheckedPointIndex(n - 1), polygon.getPoint3dAtUncheckedPointIndex(0), this._vector1);\n for (let i = 1; i <= n; i++) {\n // check turn through vertices i-1,i,i+1\n vecA.setFromVector3d(vecB);\n vecB = Vector3d.createStartEnd(polygon.getPoint3dAtUncheckedPointIndex(i - 1), polygon.getPoint3dAtUncheckedPointIndex(i % n), vecB);\n const signedArea = normal.tripleProduct(vecA, vecB);\n if (signedArea >= 0.0)\n positiveArea += signedArea;\n else\n negativeArea += signedArea;\n }\n return Math.abs(negativeArea) < Geometry.smallMetricDistanceSquared * positiveArea;\n }\n /**\n * Test if point (x,y) is IN, OUT or ON a polygon.\n * @return (1) for in, (-1) for OUT, (0) for ON\n * @param x x coordinate\n * @param y y coordinate\n * @param points array of xy coordinates.\n */\n public static classifyPointInPolygon(x: number, y: number, points: XAndY[]): number | undefined {\n const context = new XYParitySearchContext(x, y);\n let i0 = 0;\n const n = points.length;\n let i1;\n let iLast = -1;\n // walk to an acceptable start index ...\n for (i0 = 0; i0 < n; i0++) {\n i1 = i0 + 1;\n if (i1 >= n)\n i1 = 0;\n if (context.tryStartEdge(points[i0].x, points[i0].y, points[i1].x, points[i1].y)) {\n iLast = i1;\n break;\n }\n }\n if (iLast < 0)\n return undefined;\n for (let i = 1; i <= n; i++) {\n i1 = iLast + i;\n if (i1 >= n)\n i1 -= n;\n if (!context.advance(points[i1].x, points[i1].y))\n return context.classifyCounts();\n }\n return context.classifyCounts();\n }\n /**\n * Test if point (x,y) is IN, OUT or ON a polygon.\n * @return (1) for in, (-1) for OUT, (0) for ON\n * @param x x coordinate\n * @param y y coordinate\n * @param points array of xy coordinates.\n */\n public static classifyPointInPolygonXY(x: number, y: number, points: IndexedXYZCollection): number | undefined {\n const context = new XYParitySearchContext(x, y);\n let i0 = 0;\n const n = points.length;\n let i1;\n let iLast = -1;\n // walk to an acceptable start index ...\n for (i0 = 0; i0 < n; i0++) {\n i1 = i0 + 1;\n if (i1 >= n)\n i1 = 0;\n if (context.tryStartEdge(points.getXAtUncheckedPointIndex(i0), points.getYAtUncheckedPointIndex(i0), points.getXAtUncheckedPointIndex(i1), points.getYAtUncheckedPointIndex(i1))) {\n iLast = i1;\n break;\n }\n }\n if (iLast < 0)\n return undefined;\n for (let i = 1; i <= n; i++) {\n i1 = iLast + i;\n if (i1 >= n)\n i1 -= n;\n if (!context.advance(points.getXAtUncheckedPointIndex(i1), points.getYAtUncheckedPointIndex(i1)))\n return context.classifyCounts();\n }\n return context.classifyCounts();\n }\n\n /**\n * Reverse loops as necessary to make them all have CCW orientation for given outward normal.\n * @param loops\n * @param outwardNormal\n * @return the number of loops reversed.\n */\n public static orientLoopsCCWForOutwardNormalInPlace(loops: IndexedReadWriteXYZCollection | IndexedReadWriteXYZCollection[], outwardNormal: Vector3d): number {\n if (loops instanceof IndexedXYZCollection)\n return this.orientLoopsCCWForOutwardNormalInPlace([loops], outwardNormal);\n const unitNormal = Vector3d.create();\n // orient individually ... (no hole analysis)\n let numReverse = 0;\n for (const loop of loops) {\n if (this.unitNormal(loop, unitNormal)) {\n const q = unitNormal.dotProduct(outwardNormal);\n if (q < 0.0) {\n loop.reverseInPlace();\n numReverse++;\n }\n }\n }\n return numReverse;\n }\n /**\n * Reverse and reorder loops in the xy-plane for consistent orientation and containment.\n * @param loops multiple polygons in any order and orientation, z-coordinates ignored.\n * * For best results, all overlaps should be containments, i.e., loop boundaries can touch, but should not cross.\n * @returns array of arrays of polygons that capture the input pointers. In each first level array:\n * * The first polygon is an outer loop, oriented counterclockwise.\n * * Any subsequent polygons are holes of the outer loop, oriented clockwise.\n * @see [[RegionOps.sortOuterAndHoleLoopsXY]]\n */\n public static sortOuterAndHoleLoopsXY(loops: IndexedReadWriteXYZCollection[]): IndexedReadWriteXYZCollection[][] {\n const loopAndArea: SortablePolygon[] = [];\n for (const loop of loops) {\n SortablePolygon.pushPolygon(loopAndArea, loop);\n }\n return SortablePolygon.sortAsArrayOfArrayOfPolygons(loopAndArea);\n }\n\n /**\n * Exactly like `sortOuterAndHoleLoopsXY` but allows loops in any plane.\n * @param loops multiple loops to sort and reverse.\n * @param defaultNormal optional normal for the loops, if known\n * @see [[sortOuterAndHoleLoopsXY]]\n */\n public static sortOuterAndHoleLoops(loops: IndexedReadWriteXYZCollection[], defaultNormal: Vector3d | undefined): IndexedReadWriteXYZCollection[][] {\n const localToWorld = FrameBuilder.createRightHandedFrame(defaultNormal, loops);\n const worldToLocal = localToWorld?.inverse();\n\n const xyLoops: GrowableXYZArray[] = [];\n if (worldToLocal !== undefined) {\n // transform into plane so we can ignore z in the sort\n for (const loop of loops) {\n const xyLoop = new GrowableXYZArray(loop.length);\n for (const point of loop.points)\n xyLoop.push(worldToLocal.multiplyPoint3d(point));\n xyLoops.push(xyLoop);\n }\n }\n const xySortedLoopsArray = PolygonOps.sortOuterAndHoleLoopsXY(xyLoops);\n\n const sortedLoopsArray: GrowableXYZArray[][] = [];\n if (localToWorld !== undefined) {\n for (const xySortedLoops of xySortedLoopsArray) {\n const sortedLoops: GrowableXYZArray[] = [];\n for (const xySortedLoop of xySortedLoops) {\n const sortedLoop = new GrowableXYZArray(xySortedLoop.length);\n for (const point of xySortedLoop.points)\n sortedLoop.push(localToWorld.multiplyPoint3d(point));\n sortedLoops.push(sortedLoop);\n }\n sortedLoopsArray.push(sortedLoops);\n }\n }\n return sortedLoopsArray;\n }\n\n /** Compute the closest point on the polygon boundary to the given point.\n * * Compare to [[closestPoint]].\n * @param polygon points of the polygon, closure point optional\n * @param testPoint point p to project onto the polygon edges. Works best when p is in the plane of the polygon.\n * @param tolerance optional tolerance(s) to determine point-vertex and point-edge coincidence. A single number\n * is interpreted as distance tolerance. If an array is given, the first number is interpreted as distance tolerance;\n * the second, as parametric tolerance. Default values are [[Geometry.smallMetricDistance]] for distance tolerance\n * and 0.0 for parameter tolerance.\n * @param result optional pre-allocated object to fill and return\n * @returns details d of the closest point `d.point`:\n * * `d.isValid()` returns true if and only if the polygon is nontrivial.\n * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point.\n * * `d.code` classifies the closest point as a vertex (`PolygonLocation.OnPolygonVertex`) or as a point on an edge (`PolygonLocation.OnPolygonEdgeInterior`).\n * * `d.a` is the distance from testPoint to the closest point.\n * * `d.v` can be used to classify p (if p and polygon are coplanar): if n is the polygon normal then `d.v.dotProduct(n)` is +/-/0 if and only if p is inside/outside/on the polygon.\n */\n public static closestPointOnBoundary(\n polygon: Point3d[] | IndexedXYZCollection,\n testPoint: Point3d,\n tolerance: number | [number, number] = Geometry.smallMetricDistance,\n result?: PolygonLocationDetail,\n ): PolygonLocationDetail {\n if (!(polygon instanceof IndexedXYZCollection))\n return this.closestPointOnBoundary(new Point3dArrayCarrier(polygon), testPoint, tolerance, result);\n const distTol = Array.isArray(tolerance) ? tolerance[0] : tolerance;\n const paramTol = Array.isArray(tolerance) ? Math.abs(tolerance[1]) : 0.0;\n const distTol2 = distTol * distTol;\n\n let numPoints = polygon.length;\n while (numPoints > 1) {\n if (polygon.distanceSquaredIndexIndex(0, numPoints - 1)! > distTol2)\n break;\n --numPoints; // ignore closure point\n }\n\n result = PolygonLocationDetail.create(result);\n if (0 === numPoints)\n return result; // invalid\n\n const constructSingletonPoint = (index: number): PolygonLocationDetail => {\n polygon.getPoint3dAtUncheckedPointIndex(index, result.point);\n result.a = result.point.distance(testPoint);\n result.v.setZero();\n result.code = PolygonLocation.OnPolygonVertex;\n result.closestEdgeIndex = index;\n result.closestEdgeParam = 0.0;\n return result;\n };\n if (1 === numPoints)\n return constructSingletonPoint(0);\n\n // lambda for computing edge parameter at which testPoint projects onto the edge starting at iEdgeStart\n const projectToEdge = (iEdgeStart: number): { isValid: boolean, edgeParam: number, uDotU: number, vDotV: number } => {\n let isValid = false;\n let edgeParam = 0.0;\n let uDotU = 0.0;\n let vDotV = 0.0;\n if (iEdgeStart >= 0 && iEdgeStart < numPoints) {\n let iEdgeEnd = iEdgeStart + 1;\n if (iEdgeEnd === numPoints)\n iEdgeEnd = 0;\n uDotU = polygon.distanceSquaredIndexIndex(iEdgeStart, iEdgeEnd)!;\n if (uDotU > distTol2) { // nontrivial edge\n vDotV = polygon.distanceSquaredIndexXYAndZ(iEdgeStart, testPoint)!;\n const uDotV = polygon.dotProductIndexIndexXYAndZ(iEdgeStart, iEdgeEnd, testPoint)!;\n edgeParam = uDotV / uDotU; // param of projection of testPoint onto edge [iEdgeStart, iEdgeEnd]\n isValid = true;\n }\n }\n return { isValid, edgeParam, uDotU, vDotV };\n };\n\n // find the previous nontrivial edge's projection status before processing the first edge\n let projBeyondPrevEdge = false;\n let iPrev = numPoints - 1;\n for (; iPrev > 0; --iPrev) {\n const projData = projectToEdge(iPrev);\n if (projData.isValid) {\n projBeyondPrevEdge = projData.edgeParam > 1.0 + paramTol;\n break;\n }\n }\n if (iPrev <= 0) // all segments trivial, so treat like single point case\n return constructSingletonPoint(0);\n\n let minDist2 = Geometry.largeCoordinateResult;\n for (let iBase = 0; iBase < numPoints; ++iBase) {\n let iNext = iBase + 1;\n if (iNext === numPoints)\n iNext = 0;\n\n const projData = projectToEdge(iBase);\n if (!projData.isValid)\n continue; // ignore trivial polygon edge (keep iPrev, projBeyondPrevEdge)\n\n if (projData.edgeParam <= paramTol) { // testPoint projects to/before edge start\n const distToStart2 = projData.vDotV;\n if (distToStart2 <= distTol2) {\n // testPoint is at edge start; we are done\n polygon.getPoint3dAtUncheckedPointIndex(iBase, result.point);\n result.a = Math.sqrt(distToStart2);\n result.v.setZero();\n result.code = PolygonLocation.OnPolygonVertex;\n result.closestEdgeIndex = iBase;\n result.closestEdgeParam = 0.0;\n return result;\n }\n if (distToStart2 < minDist2 && projBeyondPrevEdge) {\n // update candidate (to edge start) only if testPoint projected beyond previous edge end\n polygon.getPoint3dAtUncheckedPointIndex(iBase, result.point);\n result.a = Math.sqrt(distToStart2);\n polygon.crossProductIndexIndexIndex(iBase, iPrev, iNext, result.v)!;\n result.code = PolygonLocation.OnPolygonVertex;\n result.closestEdgeIndex = iBase;\n result.closestEdgeParam = 0.0;\n minDist2 = distToStart2;\n }\n projBeyondPrevEdge = false;\n } else if (projData.edgeParam <= 1.0 + paramTol) { // testPoint projects inside edge, or to edge end\n projData.edgeParam = Geometry.clamp(projData.edgeParam, 0.0, 1.0);\n const projDist2 = projData.vDotV - projData.edgeParam * projData.edgeParam * projData.uDotU;\n if (projDist2 <= distTol2) {\n // testPoint is on edge; we are done\n const distToStart2 = projData.vDotV;\n if (projData.edgeParam <= 0.5 && distToStart2 <= distTol2) {\n // testPoint is at edge start\n polygon.getPoint3dAtUncheckedPointIndex(iBase, result.point);\n result.a = Math.sqrt(distToStart2);\n result.v.setZero();\n result.code = PolygonLocation.OnPolygonVertex;\n result.closestEdgeIndex = iBase;\n result.closestEdgeParam = 0.0;\n return result;\n }\n const distToEnd2 = projDist2 + (1.0 - projData.edgeParam) * (1.0 - projData.edgeParam) * projData.uDotU;\n if (projData.edgeParam > 0.5 && distToEnd2 <= distTol2) {\n // testPoint is at edge end\n polygon.getPoint3dAtUncheckedPointIndex(iNext, result.point);\n result.a = Math.sqrt(distToEnd2);\n result.v.setZero();\n result.code = PolygonLocation.OnPolygonVertex;\n result.closestEdgeIndex = iNext;\n result.closestEdgeParam = 0.0;\n return result;\n }\n // testPoint is on edge interior\n polygon.interpolateIndexIndex(iBase, projData.edgeParam, iNext, result.point);\n result.a = Math.sqrt(projDist2);\n result.v.setZero();\n result.code = PolygonLocation.OnPolygonEdgeInterior;\n result.closestEdgeIndex = iBase;\n result.closestEdgeParam = projData.edgeParam;\n return result;\n }\n if (projDist2 < minDist2) {\n // update candidate\n polygon.interpolateIndexIndex(iBase, projData.edgeParam, iNext, result.point);\n result.a = Math.sqrt(projDist2);\n polygon.crossProductIndexIndexXYAndZ(iBase, iNext, testPoint, result.v)!;\n result.code = projData.edgeParam < 1.0 ? PolygonLocation.OnPolygonEdgeInterior : PolygonLocation.OnPolygonVertex;;\n result.closestEdgeIndex = iBase;\n result.closestEdgeParam = projData.edgeParam;\n minDist2 = projDist2;\n }\n projBeyondPrevEdge = false;\n } else {\n projBeyondPrevEdge = true; // to be handled by next edge\n }\n iPrev = iBase;\n }\n return result;\n }\n\n /**\n * Compute the closest point on the polygon boundary or its interior to the given point.\n * * Compare to [[closestPointOnBoundary]].\n * @param polygon points of the polygon, closure point optional\n * @param testPoint point p to project onto the polygon edges. Works best when p is in the plane of the polygon.\n * @param tolerance optional distance tolerance for distinguishing boundary versus interior closest point.\n * @param result optional pre-allocated object to fill and return\n * @returns details d of the closest point `d.point`:\n * * `d.isValid()` returns true if and only if the polygon is nontrivial.\n * * `d.edgeIndex` and `d.edgeParam` specify the location of the (nearest) boundary point.\n * * `d.code` classifies the closest point: `PolygonLocation.OnPolygonVertex`, `PolygonLocation.OnPolygonEdgeInterior`, `PolygonLocation.InsidePolygonProjectsToVertex`, or `PolygonLocation.InsidePolygonProjectsToEdgeInterior`.\n * * `d.a` is the distance from testPoint to the closest point.\n */\n public static closestPoint(polygon: Point3d[] | IndexedXYZCollection, testPoint: Point3d, tolerance: number = Geometry.smallMetricDistance, result?: PolygonLocationDetail): PolygonLocationDetail {\n if (!(polygon instanceof IndexedXYZCollection))\n return this.closestPoint(new Point3dArrayCarrier(polygon), testPoint, tolerance, result);\n if (!this.unitNormal(polygon, this._normal))\n return PolygonLocationDetail.create(result); // invalid\n const polygonPlane = this._workPlane = Plane3dByOriginAndUnitNormal.createXYZUVW(polygon.getXAtUncheckedPointIndex(0), polygon.getYAtUncheckedPointIndex(0), polygon.getZAtUncheckedPointIndex(0), this._normal.x, this._normal.y, this._normal.z, this._workPlane)!;\n const planePoint = this._workXYZ = polygonPlane.projectPointToPlane(testPoint, this._workXYZ);\n result = this.closestPointOnBoundary(polygon, planePoint, tolerance, result);\n if (result.isValid) {\n const dot = result.v.dotProduct(this._normal);\n if (dot > 0.0) { // planePoint is inside, so return it instead of the closest boundary point\n result.point.setFrom(planePoint);\n if (PolygonLocation.OnPolygonVertex === result.code)\n result.code = PolygonLocation.InsidePolygonProjectsToVertex;\n else if (PolygonLocation.OnPolygonEdgeInterior === result.code)\n result.code = PolygonLocation.InsidePolygonProjectsToEdgeInterior;\n }\n result.a = testPoint.distance(result.point);\n result.v.setZero(); // not relevant\n }\n return result;\n }\n\n // work objects, allocated as needed\n private static _workXYZ?: Point3d;\n private static _workXY0?: Point2d;\n private static _workXY1?: Point2d;\n private static _workXY2?: Point2d;\n private static _workRay?: Ray3d;\n private static _workMatrix3d?: Matrix3d;\n private static _workPlane?: Plane3dByOriginAndUnitNormal;\n\n /** Compute the intersection of a line (parameterized as a ray) with the plane of this polygon.\n * @param polygon points of the polygon, closure point optional\n * @param ray infinite line to intersect, as a ray\n * @param tolerance optional tolerance(s) to determine point-vertex and point-edge coincidence. A single number\n * is interpreted as distance tolerance. If an array is given, the first number is interpreted as distance tolerance;\n * the second, as parametric tolerance. Default values are [[Geometry.smallMetricDistance]] for distance tolerance\n * and 0.0 for parameter tolerance.\n * @param result optional pre-allocated object to fill and return\n * @returns details d of the line-plane intersection `d.point`:\n * * `d.isValid()` returns true if and only if the line intersects the plane.\n * * `d.code` indicates where the intersection lies with respect to the polygon.\n * * `d.a` is the ray intersection parameter. If `d.a` >= 0, the ray intersects the plane of the polygon.\n * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point on the polygon to the intersection, within `distTol`.\n */\n public static intersectRay3d(\n polygon: Point3d[] | IndexedXYZCollection,\n ray: Ray3d,\n tolerance: number | [number, number] = Geometry.smallMetricDistance,\n result?: PolygonLocationDetail,\n ): PolygonLocationDetail {\n if (!(polygon instanceof IndexedXYZCollection))\n return this.intersectRay3d(new Point3dArrayCarrier(polygon), ray, tolerance, result);\n if (!this.unitNormal(polygon, this._normal))\n return PolygonLocationDetail.create(result); // invalid\n this._workPlane = Plane3dByOriginAndUnitNormal.createXYZUVW(\n polygon.getXAtUncheckedPointIndex(0),\n polygon.getYAtUncheckedPointIndex(0),\n polygon.getZAtUncheckedPointIndex(0),\n this._normal.x, this._normal.y, this._normal.z,\n this._workPlane,\n )!;\n const intersectionPoint = this._workXYZ = Point3d.createZero(this._workXYZ);\n const rayParam = ray.intersectionWithPlane(this._workPlane, intersectionPoint);\n if (undefined === rayParam)\n return PolygonLocationDetail.create(result);\n result = this.closestPointOnBoundary(polygon, intersectionPoint, tolerance, result);\n if (result.isValid) {\n result.point.setFrom(intersectionPoint);\n result.a = rayParam;\n const dot = result.v.dotProduct(this._normal);\n if (dot === 0.0) {\n // NOOP: intersectionPoint is on the polygon, so result.code already classifies it\n } else {\n // intersectionPoint is not on the polygon, so result.code refers to the closest point;\n // update it to refer to intersectionPoint.\n if (PolygonLocation.OnPolygonVertex === result.code) {\n result.code = (dot > 0.0)\n ? PolygonLocation.InsidePolygonProjectsToVertex\n : PolygonLocation.OutsidePolygonProjectsToVertex;\n } else if (PolygonLocation.OnPolygonEdgeInterior === result.code) {\n result.code = (dot > 0.0)\n ? PolygonLocation.InsidePolygonProjectsToEdgeInterior\n : PolygonLocation.OutsidePolygonProjectsToEdgeInterior;\n }\n }\n }\n return result;\n }\n\n /** Compute the intersection of a line (parameterized as a line segment) with the plane of this polygon.\n * @param polygon points of the polygon, closure point optional\n * @param point0 start point of segment on line to intersect\n * @param point1 end point of segment on line to intersect\n * @param tolerance optional distance tolerance to determine point-vertex and point-edge coincidence.\n * @param result optional pre-allocated object to fill and return\n * @returns details d of the line-plane intersection `d.point`:\n * * `d.isValid()` returns true if and only if the line intersects the plane.\n * * `d.code` indicates where the intersection lies with respect to the polygon.\n * * `d.a` is the segment intersection parameter. If `d.a` is in [0,1], the segment intersects the plane of the polygon.\n * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point on the polygon to the intersection, within `distTol`.\n * @see intersectRay3d\n */\n public static intersectSegment(\n polygon: Point3d[] | IndexedXYZCollection,\n point0: Point3d,\n point1: Point3d,\n tolerance: number = Geometry.smallMetricDistance,\n result?: PolygonLocationDetail,\n ): PolygonLocationDetail {\n this._workRay = Ray3d.createStartEnd(point0, point1, this._workRay);\n return this.intersectRay3d(polygon, this._workRay, tolerance, result);\n }\n\n /** Compute edge data for the barycentric coordinate computation, ignoring all z-coordinates.\n * @param polygon points of the polygon (without closure point)\n * @param edgeStartVertexIndex index of start vertex of the edge (unchecked)\n * @param point point to project to the edge\n * @param edgeOutwardUnitNormal pre-allocated vector to be populated on return with the unit perpendicular to the edge, facing outward, in xy-plane\n * @param tolerance used to clamp outputs\n * @param result optional pre-allocated result\n * @returns x: signed projection distance of `point` to the edge, y: edge parameter of the projection\n */\n private static computeEdgeDataXY(\n polygon: IndexedXYZCollection,\n edgeStartVertexIndex: number,\n point: XYAndZ,\n edgeOutwardUnitNormal: Vector3d,\n tolerance: number = Geometry.smallMetricDistance,\n result?: Point2d,\n ): Point2d {\n const i0 = edgeStartVertexIndex % polygon.length;\n const i1 = (i0 + 1) % polygon.length;\n polygon.vectorIndexIndex(i0, i1, edgeOutwardUnitNormal)!.unitPerpendicularXY(edgeOutwardUnitNormal).negate(edgeOutwardUnitNormal); // z is zero\n const hypDeltaX = polygon.getXAtUncheckedPointIndex(i0) - point.x;\n const hypDeltaY = polygon.getYAtUncheckedPointIndex(i0) - point.y;\n let projDist = Geometry.dotProductXYXY(hypDeltaX, hypDeltaY, edgeOutwardUnitNormal.x, edgeOutwardUnitNormal.y);\n const edgeDist = Geometry.crossProductXYXY(hypDeltaX, hypDeltaY, edgeOutwardUnitNormal.x, edgeOutwardUnitNormal.y);\n const edgeLength = Geometry.distanceXYXY(polygon.getXAtUncheckedPointIndex(i0), polygon.getYAtUncheckedPointIndex(i0), polygon.getXAtUncheckedPointIndex(i1), polygon.getYAtUncheckedPointIndex(i1));\n let edgeParam = Geometry.safeDivideFraction(edgeDist, edgeLength, 0.0);\n if (Geometry.isSameCoordinate(0.0, projDist, tolerance))\n projDist = 0.0;\n if (Geometry.isSameCoordinate(0.0, edgeParam, tolerance))\n edgeParam = 0.0;\n else if (Geometry.isSameCoordinate(1.0, edgeParam, tolerance))\n edgeParam = 1.0;\n return Point2d.create(projDist, edgeParam, result);\n }\n\n /** Compute the barycentric coordinates for a point on either of a pair of adjacent edges of a convex polygon.\n * @param polygon points of the polygon, assumed to be convex. Assumed to have no closure point.\n * @param iPrev start index of previous edge\n * @param prevNormal outward unit normal of previous edge\n * @param prevProj x = signed distance from point to previous edge; y = edge parameter of this projection in [0,1]\n * @param i start index of current edge\n * @param normal outward unit normal of current edge\n * @param proj x = signed distance from point to current edge; y = edge parameter of this projection in [0,1]\n * @param coords pre-allocated barycentric coordinate array to return, assumed to have length at least `polygon.length`\n * @returns barycentric coordinates, or undefined if not on either edge\n */\n private static convexBarycentricCoordinatesOnEdge(\n polygon: IndexedXYZCollection,\n iPrev: number,\n prevNormal: Vector3d,\n prevProj: XAndY,\n i: number,\n normal: Vector3d,\n proj: XAndY,\n coords: number[],\n ): number[] | undefined {\n // ignore degenerate edges\n const pointIsOnPrevEdge = !prevNormal.isZero && (0.0 === prevProj.x) && Geometry.isIn01(prevProj.y);\n const pointIsOnEdge = !normal.isZero && (0.0 === proj.x) && Geometry.isIn01(proj.y);\n if (pointIsOnPrevEdge && pointIsOnEdge) { // the point is at vertex i\n coords.fill(0);\n coords[i] = 1.0;\n return coords;\n }\n const n = polygon.length;\n if (pointIsOnPrevEdge) { // the point is on the previous edge\n coords.fill(0);\n const i0 = iPrev;\n const i1 = i;\n const edgeParam = prevProj.y;\n coords[i0] = 1.0 - edgeParam;\n coords[i1] = edgeParam;\n return coords;\n }\n if (pointIsOnEdge) { // the point is on the edge starting at the i_th vertex\n coords.fill(0);\n const i0 = i;\n const i1 = (i + 1) % n;\n const edgeParam = proj.y;\n coords[i0] = 1.0 - edgeParam;\n coords[i1] = edgeParam;\n return coords;\n }\n return undefined; // not on edge\n }\n\n // cspell:word CAGD\n /** Compute the barycentric coordinates for a point inside a convex polygon.\n * @param polygon points of the polygon, assumed to be convex. Closure point optional.\n * @param point point assumed to be inside or on polygon\n * @param tolerance distance tolerance for point to be considered on a polygon edge\n * @return barycentric coordinates of the interior point, or undefined if invalid polygon or exterior point. Length is same as `polygon.length`.\n * @see BarycentricTriangle.pointToFraction\n */\n public static convexBarycentricCoordinates(\n polygon: Point3d[] | IndexedXYZCollection,\n point: Point3d,\n tolerance: number = Geometry.smallMetricDistance,\n ): number[] | undefined {\n // cf. \"Barycentric Coordinates for Convex Sets\", by Warren et al., CAGD (2003)\n if (Array.isArray(polygon))\n return this.convexBarycentricCoordinates(new Point3dArrayCarrier(polygon), point);\n let n = polygon.length;\n while (n > 1 && polygon.getPoint3dAtUncheckedPointIndex(0).isExactEqual(polygon.getPoint3dAtUncheckedPointIndex(n - 1)))\n --n; // ignore closure point(s)\n if (n < 3 || !PolygonOps.unitNormal(polygon, this._normal))\n return undefined;\n const localToWorld = this._workMatrix3d = Matrix3d.createRigidHeadsUp(this._normal, AxisOrder.ZXY, this._workMatrix3d);\n const polygonXY = new GrowableXYZArray(n);\n for (let i = 0; i < n; ++i)\n polygonXY.push(localToWorld.multiplyInverseXYZAsPoint3d(polygon.getXAtUncheckedPointIndex(i), polygon.getYAtUncheckedPointIndex(i), polygon.getZAtUncheckedPointIndex(i), this._workXYZ)!);\n const pointXY = this._workXYZ = localToWorld.multiplyInverseXYZAsPoint3d(point.x, point.y, point.z, this._workXYZ)!;\n // now we know polygon orientation is ccw, its last edge has positive length, and we can ignore z-coords\n let iPrev = n - 1;\n const outwardUnitNormalOfLastEdge = this._vector0;\n const projToLastEdge = this._workXY0 = this.computeEdgeDataXY(polygonXY, iPrev, pointXY, outwardUnitNormalOfLastEdge, tolerance, this._workXY0);\n // we can compare to exact zero because computeEdgeDataXY has chopped small distances to zero\n if (projToLastEdge.x < 0.0)\n return undefined; // point is outside polygon, or polygon is nonconvex\n const outwardUnitNormalOfPrevEdge = Vector3d.createFrom(outwardUnitNormalOfLastEdge, this._vector1);\n const projToPrevEdge = this._workXY1 = Point2d.createFrom(projToLastEdge, this._workXY1);\n const coords = Array<number>(polygon.length).fill(0); // use original length\n const largestResult = (tolerance > 0.0) ? 1.0 / (tolerance * tolerance) : Geometry.largeCoordinateResult;\n let coordSum = 0.0;\n for (let i = 0; i < n; ++i) {\n const outwardUnitNormalOfEdge = Vector3d.createFrom(outwardUnitNormalOfLastEdge, this._vector2);\n const projToEdge = this._workXY2 = (i < n - 1) ? this.computeEdgeDataXY(polygonXY, i, pointXY, outwardUnitNormalOfEdge, tolerance, this._workXY2) : Point2d.createFrom(projToLastEdge, this._workXY2);\n if (projToEdge.x < 0.0)\n return undefined; // point is outside polygon, or polygon is nonconvex\n if (undefined !== this.convexBarycentricCoordinatesOnEdge(polygonXY, iPrev, outwardUnitNormalOfPrevEdge, projToPrevEdge, i, outwardUnitNormalOfEdge, projToEdge, coords))\n return coords; // point is on vertex or edge; we are done\n if (outwardUnitNormalOfEdge.x === 0.0 && outwardUnitNormalOfEdge.y === 0.0)\n continue; // edge is degenerate; coords[i] = 0; keep previous edge data\n if (0.0 === projToPrevEdge.x || 0.0 === projToEdge.x)\n continue; // point is on subsequent colinear edge (ASSUMING interior point, convex polygon!); coords[i] = 0; keep previous edge data\n const areaOfNormalParallelogram = Math.abs(outwardUnitNormalOfPrevEdge.crossProductXY(outwardUnitNormalOfEdge));\n const coord = Geometry.conditionalDivideCoordinate(areaOfNormalParallelogram, projToPrevEdge.x * projToEdge.x, largestResult);\n if (undefined === coord) {\n assert(false, \"unexpectedly small projection distance to an edge\"); // shouldn't happen due to chopping in computeEdgeDataXY: area/(dist*dist) <= 1/tol^2 = largestResult\n }\n coords[i] = coord;\n coordSum += coord;\n outwardUnitNormalOfPrevEdge.setFrom(outwardUnitNormalOfEdge);\n projToPrevEdge.setFrom(projToEdge);\n iPrev = i;\n }\n const scale = Geometry.conditionalDivideCoordinate(1.0, coordSum);\n if (undefined === scale) {\n assert(false, \"unexpected zero barycentric coordinate sum\");\n }\n for (let i = 0; i < n; ++i)\n coords[i] *= scale; // normalized\n return coords;\n }\n /**\n * Force the polygon to be closed.\n * * If first and last points are not within tolerance, push copy of first point\n * * If first and last points are within tolerance, set last point equal to first\n * @param polygon input polygon\n * @param tolerance closure distance tolerance\n */\n public static forceClosure(polygon: Point3d[] | GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance): void {\n if (polygon.length >= 2) {\n if (polygon instanceof GrowableXYZArray) {\n polygon.forceClosure(tolerance);\n } else if (polygon[0].distance(polygon[polygon.length - 1]) > tolerance) {\n polygon.push(polygon[0].clone());\n } else {\n polygon[polygon.length - 1].setFromPoint3d(polygon[0]);\n }\n }\n }\n /**\n * Return a closed polygon, cloning only if necessary.\n * * If the first and last points are not identical, call [[forceClosure]] on a clone of the polygon and return it.\n * * If the first and last points are already identical, just return the input.\n * @param polygon input polygon\n * @param tolerance closure distance tolerance\n */\n public static ensureClosed(polygon: Point3d[] | IndexedXYZCollection, tolerance: number = Geometry.smallMetricDistance): Point3d[] | IndexedXYZCollection {\n if (polygon.length >= 2) {\n let forceClosure = false;\n if (polygon instanceof IndexedXYZCollection)\n forceClosure = !polygon.almostEqualIndexIndex(0, polygon.length - 1, 0.0);\n else\n forceClosure = !polygon[0].isExactEqual(polygon[polygon.length - 1]);\n if (forceClosure) {\n const cloned = GrowableXYZArray.create(polygon);\n this.forceClosure(cloned, tolerance);\n polygon = cloned;\n }\n }\n return polygon;\n }\n private static _workCLDPair?: CurveLocationDetailPair;\n /**\n * Find smallest distance between polygons.\n * * For efficiency, input polygons should include closure edge.\n * * If searching interiors for close approaches, the polygons are assumed to be convex.\n * @param polygonA first polygon\n * @param polygonB second polygon\n * @param dMax optional largest approach distance to consider\n * @param _searchInterior If true, include (convex) polygon interiors in computations (currently unimplemented).\n * If false (default): return closest approach between polygon boundaries only, using [[PolylineOps.closestApproach]].\n * @return pair of details, one per polygon. The `a` field of each detail stores the closest approach distance.\n */\n public static closestApproach(\n polygonA: Point3d[] | IndexedXYZCollection,\n polygonB: Point3d[] | IndexedXYZCollection,\n dMax: number = Number.MAX_VALUE,\n _searchInterior: boolean = false,\n ): PolygonLocationDetailPair | undefined {\n // TODO: handle interior close approaches as well...\n let result: PolygonLocationDetailPair | undefined;\n const polyA = this.ensureClosed(polygonA);\n const polyB = this.ensureClosed(polygonB);\n const cld = this._workCLDPair = PolylineOps.closestApproach(polyA, false, polyB, false, dMax, this._workCLDPair);\n if (cld && cld.detailA.childDetail && cld.detailB.childDetail) {\n result = PolygonLocationDetailPair.create(\n PolygonLocationDetail.createAtVertexOrEdge(cld.detailA.point, cld.detailA.childDetail.a, cld.detailA.childDetail.fraction),\n PolygonLocationDetail.createAtVertexOrEdge(cld.detailB.point, cld.detailB.childDetail.a, cld.detailB.childDetail.fraction),\n );\n result.detailA.a = result.detailB.a = cld.detailA.a;\n }\n return result;\n }\n}\n\n/**\n * `IndexedXYZCollectionPolygonOps` class contains _static_ methods for typical operations on polygons carried as `IndexedXYZCollection`\n * @public\n */\nexport class IndexedXYZCollectionPolygonOps {\n private static _xyz0Work: Point3d = Point3d.create();\n private static _xyz1Work: Point3d = Point3d.create();\n private static _xyz2Work: Point3d = Point3d.create();\n /**\n * Split a (convex) polygon into 2 parts based on altitude evaluations.\n * * Both output arrays are cleared first.\n * * This method uses only a fixed (tight) parametric tolerance for on-plane detection.\n * See [[clipConvexPolygonInPlace]] for a method that takes an additional distance tolerance.\n * @param plane any `PlaneAltitudeEvaluator` object that can evaluate `plane.altitude(xyz)` for distance from the plane.\n * @param xyz original polygon\n * @param xyzPositive array to receive inside part (altitude > 0)\n * @param xyzNegative array to receive outside part\n * @param altitudeRange min and max altitudes encountered.\n * @see clipConvexPolygonInPlace\n */\n public static splitConvexPolygonInsideOutsidePlane(\n plane: PlaneAltitudeEvaluator,\n xyz: IndexedXYZCollection,\n xyzPositive: IndexedReadWriteXYZCollection,\n xyzNegative: IndexedReadWriteXYZCollection,\n altitudeRange: Range1d,\n ): void {\n const xyz0 = IndexedXYZCollectionPolygonOps._xyz0Work;\n const xyz1 = IndexedXYZCollectionPolygonOps._xyz1Work;\n const xyzInterpolated = IndexedXYZCollectionPolygonOps._xyz2Work;\n const n = xyz.length;\n xyzPositive.clear();\n xyzNegative.clear();\n const fractionTol = 1.0e-8;\n if (n > 2) {\n xyz.back(xyz0);\n let a0 = plane.altitude(xyz0), a1 = 0.0, f = 0.0;\n altitudeRange.setX(a0);\n for (let i1 = 0; i1 < n; i1++) {\n xyz.getPoint3dAtUncheckedPointIndex(i1, xyz1);\n a1 = plane.altitude(xyz1);\n altitudeRange.extendX(a1);\n if (a0 * a1 < 0.0) {\n // simple crossing\n f = - a0 / (a1 - a0);\n if (f > 1.0 - fractionTol) {\n // segment end is on the clip plane; push it to both sides of the plane\n xyzPositive.push(xyz1);\n xyzNegative.push(xyz1);\n } else if (f < fractionTol) {\n // segment start is on the clip plane; push it to same side as segment end, as the\n // the previous segment end was already pushed to the opposite side of the plane\n if (a1 > 0.0) {\n xyzPositive.push(xyz0);\n xyzPositive.push(xyz1);\n } else {\n xyzNegative.push(xyz0);\n xyzNegative.push(xyz1);\n }\n } else {\n // crossing point is on the clip plane; push it to both sides of the plane\n xyz0.interpolate(f, xyz1, xyzInterpolated);\n xyzPositive.push(xyzInterpolated);\n xyzNegative.push(xyzInterpolated);\n // save segment end to only one side of the plane\n if (a1 > 0.0)\n xyzPositive.push(xyz1);\n else\n xyzNegative.push(xyz1);\n }\n } else {\n // no crossing\n if (a1 >= 0.0)\n xyzPositive.push(xyz1);\n if (a1 <= 0.0)\n xyzNegative.push(xyz1);\n }\n xyz0.setFromPoint3d(xyz1);\n a0 = a1;\n }\n }\n }\n /**\n * Clip a polygon to one side of a plane.\n * * Results with 2 or fewer points are ignored.\n * * Other than ensuring capacity in the arrays, there are no object allocations during execution of this function.\n * * For a convex input polygon, the output polygon is also convex.\n * * For non-convex input, the output polygon may have double-back edges along plane intersections. This is still a\n * valid clip in a parity sense (overlapping regions cancel).\n * * This method returns only the piece of the input polygon on one side of the clipper.\n * See [[splitConvexPolygonInsideOutsidePlane]] for a method that returns both sides.\n * @param plane any type that has `plane.altitude`\n * @param xyz input polygon, clipped on output\n * @param work optional work buffer\n * @param keepPositive whether the positive side of the plane survives (true, default), or negative side (false).\n * @param tolerance tolerance for \"on plane\" decision. This is a distance if `plane` has unit normal (e.g., [[ClipPlane]]).\n * Default value is [[Geometry.smallMetricDistance]].\n * @return the number of crossings. If this is larger than 2, the input polygon was non-convex.\n * @see splitConvexPolygonInsideOutsidePlane\n */\n public static clipConvexPolygonInPlace(\n plane: PlaneAltitudeEvaluator,\n xyz: GrowableXYZArray,\n work?: GrowableXYZArray,\n keepPositive: boolean = true,\n tolerance: number = Geometry.smallMetricDistance\n ): number {\n if (!work)\n work = new GrowableXYZArray();\n work.clear();\n const s = keepPositive ? 1.0 : -1.0;\n const n = xyz.length;\n let numNegative = 0;\n const fractionTol = 1.0e-8;\n const b = -tolerance;\n let numCrossings = 0;\n if (xyz.length > 1) { // > 2 ??\n let a1;\n let index0 = xyz.length - 1;\n let a0 = s * xyz.evaluateUncheckedIndexPlaneAltitude(index0, plane);\n if (Math.abs(a0) < tolerance)\n a0 = 0;\n // if (a0 >= 0.0)\n // work.push_back (xyz0);\n for (let index1 = 0; index1 < n; a0 = a1, index0 = index1++) {\n a1 = s * xyz.evaluateUncheckedIndexPlaneAltitude(index1, plane);\n if (Math.abs(a1) < tolerance)\n a1 = 0;\n if (a1 < 0)\n numNegative++;\n if (a0 * a1 < 0.0) {\n // simple crossing . . .\n const f = - a0 / (a1 - a0);\n if (f > 1.0 - fractionTol && a1 >= 0.0) {\n // the endpoint will be saved -- avoid the duplicate\n } else {\n work.pushInterpolatedFromGrowableXYZArray(xyz, index0, f, index1);\n if (a1 > 0)\n numCrossings++; // \"out to in\"\n }\n }\n if (a1 >= b) {\n work.pushFromGrowableXYZArray(xyz, index1);\n if (a0 < -b) {\n numCrossings++; // \"in to out\"\n }\n }\n index0 = index1;\n a0 = a1;\n }\n }\n\n if (work.length <= 2) {\n xyz.clear();\n } else if (numNegative > 0) {\n xyz.clear();\n xyz.pushFromGrowableXYZArray(work);\n }\n work.clear();\n return numCrossings;\n }\n /** Return an array containing\n * * All points that are exactly on the plane.\n * * Crossing points between adjacent points that are (strictly) on opposite sides.\n */\n public static polygonPlaneCrossings(plane: PlaneAltitudeEvaluator, xyz: IndexedXYZCollection, crossings: Point3d[]) {\n crossings.length = 0;\n if (xyz.length >= 2) {\n const xyz0 = this._xyz0Work;\n xyz.getPoint3dAtUncheckedPointIndex(xyz.length - 1, xyz0);\n let a0 = plane.altitude(xyz0);\n const xyz1 = this._xyz1Work;\n for (let i = 0; i < xyz.length; i++) {\n xyz.getPoint3dAtUncheckedPointIndex(i, xyz1);\n const a1 = plane.altitude(xyz1);\n if (a0 * a1 < 0.0) {\n // simple crossing. . .\n const f = - a0 / (a1 - a0);\n crossings.push(xyz0.interpolate(f, xyz1));\n }\n if (a1 === 0.0) { // IMPORTANT -- every point is directly tested here\n crossings.push(xyz1.clone());\n }\n xyz0.setFromPoint3d(xyz1);\n a0 = a1;\n }\n }\n }\n /**\n * * Input a \"clipped\" polygon (from clipConvexPolygonInPlace) with more than 2 crossings, i.e. is from a non-convex polygon with configurations like:\n * * multiple distinct polygons\n * * single polygon, but cut lines overlap and cancel by parity rules.\n * * return 1 or more polygons, each having first and last points \"on\" the plane and intermediate points \"off\"\n * * `minChainLength` indicates the shortest chain to be returned.\n * @internal\n */\n public static gatherCutLoopsFromPlaneClip(plane: PlaneAltitudeEvaluator, xyz: GrowableXYZArray, minChainLength: number = 3, tolerance: number = Geometry.smallMetricDistance): CutLoopMergeContext {\n const result: CutLoopMergeContext = new CutLoopMergeContext();\n // find the first on-plane point\n let firstOnPlaneIndex = 0;\n const n = xyz.length;\n for (; firstOnPlaneIndex < n; firstOnPlaneIndex++) {\n const a = xyz.evaluateUncheckedIndexPlaneAltitude(firstOnPlaneIndex, plane);\n if (Math.abs(a) <= tolerance)\n break;\n }\n if (firstOnPlaneIndex === n)\n return result;\n // find contiguous blocks of \"off plane\" points with on-plane points at their end.\n let candidateA = firstOnPlaneIndex;\n while (candidateA < n) {\n const currentChain = new GrowableXYZArray();\n currentChain.pushFromGrowableXYZArray(xyz, candidateA);\n let candidateB = candidateA + 1;\n while (candidateB < n) {\n currentChain.pushFromGrowableXYZArray(xyz, candidateB);\n const a = xyz.evaluateUncheckedIndexPlaneAltitude(candidateB, plane);\n if (Math.abs(a) <= tolerance) {\n break;\n }\n candidateB++;\n }\n if (candidateB === n)\n for (let i = 0; i <= firstOnPlaneIndex; i++)\n currentChain.pushFromGrowableXYZArray(xyz, i);\n if (currentChain.length >= minChainLength)\n result.inputLoops.push(CutLoop.createCaptureWithReturnEdge(currentChain));\n candidateA = candidateB;\n }\n return result;\n }\n /**\n * * Input the loops from `gatherCutLoopsFromClipPlane`\n * * Consolidate loops for reentrant configurations.\n * * WARNING: The output reuses and modifies input loops whenever possible.\n * @internal\n */\n public static reorderCutLoops(loops: CutLoopMergeContext) {\n // Simple case: all loops have common orientation\n if (loops.inputLoops.length === 1)\n return;\n // Simple cases: 2 loops . . .\n if (loops.inputLoops.length === 2) {\n // if edges are in the same direction, it must be a pair of unrelated loop . . .\n if (loops.inputLoops[0].edge!.direction.dotProduct(loops.inputLoops[1].edge!.direction) > 0) {\n loops.outputLoops.push(loops.inputLoops[0]);\n loops.outputLoops.push(loops.inputLoops[1]);\n return;\n }\n // twist the two loops into 1,\n const source = loops.inputLoops[1].xyz;\n const dest = loops.inputLoops[0].xyz;\n dest.pushFromGrowableXYZArray(source);\n loops.outputLoops.push(loops.inputLoops[0]);\n return;\n }\n // 3 or more loops.\n loops.sortAndMergeLoops();\n //\n }\n /**\n * Return the intersection of the plane with a range cube.\n * @param range\n * @param xyzOut intersection polygon. This is convex.\n * @return reference to xyz if the polygon still has points; undefined if all points are clipped away.\n */\n public static intersectRangeConvexPolygonInPlace(range: Range3d, xyz: GrowableXYZArray): GrowableXYZArray | undefined {\n if (range.isNull)\n return undefined;\n const work = new GrowableXYZArray();\n const plane = Point4d.create();\n plane.set(0, 0, -1, range.high.z);\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\n if (xyz.length === 0)\n return undefined;\n\n plane.set(0, 0, 1, -range.low.z);\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\n if (xyz.length === 0)\n return undefined;\n\n plane.set(0, -1, 0, range.high.y);\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\n if (xyz.length === 0)\n return undefined;\n\n plane.set(0, 1, 0, -range.low.y);\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\n if (xyz.length === 0)\n return undefined;\n\n plane.set(-1, 0, 0, range.high.x);\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\n if (xyz.length === 0)\n return undefined;\n\n plane.set(1, 0, 0, -range.low.x);\n this.clipConvexPolygonInPlace(plane, xyz, work, true);\n if (xyz.length === 0)\n return undefined;\n\n return xyz;\n }\n}\n/**\n * `Point3dArrayPolygonOps` class contains _static_ methods for typical operations on polygons carried as `Point3d[]`\n * @public\n */\nexport class Point3dArrayPolygonOps {\n private static _xyz0Work: Point3d = Point3d.create();\n // private static _xyz1Work: Point3d = Point3d.create();\n // private static _xyz2Work: Point3d = Point3d.create();\n /**\n * Split a (convex) polygon into 2 parts.\n * @param xyz original polygon\n * @param xyzIn array to receive inside part\n * @param xyzOut array to receive outside part\n * @param altitudeRange min and max altitudes encountered.\n */\n public static convexPolygonSplitInsideOutsidePlane(plane: PlaneAltitudeEvaluator, xyz: Point3d[], xyzIn: Point3d[], xyzOut: Point3d[], altitudeRange: Range1d): void {\n const xyzCarrier = new Point3dArrayCarrier(xyz);\n const xyzInCarrier = new Point3dArrayCarrier(xyzIn);\n const xyzOutCarrier = new Point3dArrayCarrier(xyzOut);\n IndexedXYZCollectionPolygonOps.splitConvexPolygonInsideOutsidePlane(plane, xyzCarrier, xyzInCarrier, xyzOutCarrier, altitudeRange);\n }\n\n /** Return an array containing\n * * All points that are exactly on the plane.\n * * Crossing points between adjacent points that are (strictly) on opposite sides.\n */\n public static polygonPlaneCrossings(plane: PlaneAltitudeEvaluator, xyz: Point3d[], crossings: Point3d[]): void {\n const xyzSource = new Point3dArrayCarrier(xyz);\n return IndexedXYZCollectionPolygonOps.polygonPlaneCrossings(plane, xyzSource, crossings);\n }\n /**\n * Clip a polygon, returning the clip result in the same object.\n * @param xyz input/output polygon\n * @param work scratch object\n * @param tolerance tolerance for on-plane decision.\n */\n public static convexPolygonClipInPlace(plane: PlaneAltitudeEvaluator, xyz: Point3d[], work: Point3d[] | undefined, tolerance: number = Geometry.smallMetricDistance) {\n if (work === undefined)\n work = [];\n work.length = 0;\n let numNegative = 0;\n const fractionTol = 1.0e-8;\n const b = -tolerance;\n if (xyz.length > 2) {\n let xyz0 = xyz[xyz.length - 1];\n let a0 = plane.altitude(xyz0);\n // if (a0 >= 0.0)\n // work.push_back (xyz0);\n for (const xyz1 of xyz) {\n const a1 = plane.altitude(xyz1);\n if (a1 < 0)\n numNegative++;\n if (a0 * a1 < 0.0) {\n // simple crossing . . .\n const f = - a0 / (a1 - a0);\n if (f > 1.0 - fractionTol && a1 >= 0.0) {\n // the endpoint will be saved -- avoid the duplicate\n } else {\n work.push(xyz0.interpolate(f, xyz1));\n }\n }\n if (a1 >= b)\n work.push(xyz1);\n xyz0 = Point3d.createFrom(xyz1);\n a0 = a1;\n }\n }\n\n if (work.length <= 2) {\n xyz.length = 0;\n } else if (numNegative > 0) {\n xyz.length = 0;\n for (const xyzI of work) {\n xyz.push(xyzI);\n }\n work.length = 0;\n }\n }\n}\n"]}
|