@itwin/core-geometry 5.2.0-dev.20 → 5.2.0-dev.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
- package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/cjs/bspline/KnotVector.js.map +1 -1
- package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/geometry4d/Map4d.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/geometry4d/MomentData.js.map +1 -1
- package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/cjs/geometry4d/Point4d.js.map +1 -1
- package/lib/cjs/numerics/BandedSystem.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/Complex.js.map +1 -1
- package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
- package/lib/cjs/numerics/PolarData.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/numerics/Quadrature.js.map +1 -1
- package/lib/cjs/numerics/Range1dArray.js.map +1 -1
- package/lib/cjs/numerics/SmallSystem.js.map +1 -1
- package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/cjs/numerics/UnionFind.js.map +1 -1
- package/lib/cjs/numerics/UsageSums.js.map +1 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/BoxTopology.js.map +1 -1
- package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
- package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Plane3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/Segment1d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/esm/geometry3d/XYZProps.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/geometry4d/Map4d.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/geometry4d/MomentData.js.map +1 -1
- package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/esm/geometry4d/Point4d.js.map +1 -1
- package/lib/esm/numerics/BandedSystem.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/Complex.js.map +1 -1
- package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
- package/lib/esm/numerics/PolarData.js.map +1 -1
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/numerics/Quadrature.js.map +1 -1
- package/lib/esm/numerics/Range1dArray.js.map +1 -1
- package/lib/esm/numerics/SmallSystem.js.map +1 -1
- package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/esm/numerics/UnionFind.js.map +1 -1
- package/lib/esm/numerics/UsageSums.js.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/BoxTopology.js.map +1 -1
- package/lib/esm/polyface/FacetFaceData.js.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/esm/polyface/FacetOrientation.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeLengthData.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
- package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SolidPrimitive.js.map +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoincidentGeometryOps.js","sourceRoot":"","sources":["../../../src/geometry3d/CoincidentGeometryOps.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 { Arc3d } from \"../curve/Arc3d\";\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { Geometry } from \"../Geometry\";\nimport { SmallSystem } from \"../numerics/SmallSystem\";\nimport { AngleSweep } from \"./AngleSweep\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { Segment1d } from \"./Segment1d\";\n\n/**\n * `CoincidentGeometryQuery` has methods useful in testing for overlapping geometry.\n * * Each instance carries tolerance information that can be reused over extended call sequences.\n * * These methods are expected to be called internally by CurveCurve intersection methods.\n * @internal\n */\nexport class CoincidentGeometryQuery {\n private _vectorU?: Vector3d;\n private _vectorV?: Vector3d;\n private _point0?: Point3d;\n private _point1?: Point3d;\n private _tolerance: number;\n public get tolerance(): number {\n return this._tolerance;\n }\n private constructor(tolerance: number = Geometry.smallMetricDistance) {\n this._tolerance = tolerance;\n }\n public static create(tolerance: number = Geometry.smallMetricDistance): CoincidentGeometryQuery {\n return new CoincidentGeometryQuery(tolerance);\n }\n /**\n * * Assign both the fraction and fraction1 values in the detail, possibly swapped.\n * * reevaluate the points as simple interpolation between given points.\n */\n public static assignDetailInterpolatedFractionsAndPoints(detail: CurveLocationDetail, f0: number, f1: number,\n pointA: Point3d, pointB: Point3d, swap: boolean = false) {\n if (swap) {\n detail.fraction = f1;\n detail.fraction1 = f0;\n } else {\n detail.fraction = f0;\n detail.fraction1 = f1;\n }\n detail.point = pointA.interpolate(detail.fraction, pointB, detail.point);\n detail.point1 = pointA.interpolate(detail.fraction1, pointB, detail.point1);\n\n }\n\n /** Return a curve location detail with projection of a `spacePoint` to the line segment with `pointA` and `pointB` */\n public projectPointToSegmentXY(spacePoint: Point3d, pointA: Point3d, pointB: Point3d): CurveLocationDetail {\n this._vectorU = Vector3d.createStartEnd(pointA, pointB, this._vectorU);\n this._vectorV = Vector3d.createStartEnd(pointA, spacePoint, this._vectorV);\n const uDotU = this._vectorU.dotProductXY(this._vectorU);\n const uDotV = this._vectorU.dotProductXY(this._vectorV);\n const fraction = Geometry.safeDivideFraction(uDotV, uDotU, 0.0);\n return CurveLocationDetail.createCurveFractionPoint(undefined, fraction,\n pointA.interpolate(fraction, pointB));\n }\n /**\n * Given a detail pair representing the projection of each of two colinear line segments onto the other,\n * clamp the details (in place) to the line segments' endpoints according to the given flags.\n * @param overlap unbounded segment overlap as returned by [[coincidentSegmentRangeXY]], modified and returned\n * @param pointA0 start point of segment A\n * @param pointA1 end point of segment A\n * @param pointB0 start point of segment B\n * @param pointB1 end point of segment B\n * @param extendA0 whether to extend segment A beyond its start\n * @param extendA1 whether to extend segment A beyond its end\n * @param extendB0 whether to extend segment B beyond its start\n * @param extendB1 whether to extend segment B beyond its end\n * @return reference to the modified input, or undefined (leaving input untouched) if clamping would result in empty interval.\n */\n public clampCoincidentOverlapToSegmentBounds(overlap: CurveLocationDetailPair,\n pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d,\n extendA0: boolean = false, extendA1: boolean = false, extendB0: boolean = false, extendB1: boolean = false,\n ): CurveLocationDetailPair | undefined {\n const rangeA = Segment1d.create(overlap.detailA.fraction, overlap.detailA.hasFraction1 ? overlap.detailA.fraction1 : overlap.detailA.fraction);\n const rangeB = Segment1d.create(overlap.detailB.fraction, overlap.detailB.hasFraction1 ? overlap.detailB.fraction1 : overlap.detailB.fraction);\n const reversed = rangeA.signedDelta() < 0.0;\n\n const updateIntervalFromRangesAndInterpolatedPoints = (): CurveLocationDetailPair => {\n const a0 = rangeA.x0;\n const a1 = rangeA.x1;\n const b0 = rangeB.x0;\n const b1 = rangeB.x1;\n CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(overlap.detailA, a0, a1, pointA0, pointA1, a0 > a1);\n CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(overlap.detailB, b0, b1, pointB0, pointB1, b0 > b1);\n return overlap;\n };\n\n const haveIntervalA = rangeA.clampDirectedTo01(!extendA0, !extendA1, false);\n const haveIntervalB = rangeB.clampDirectedTo01(!extendB0, !extendB1, false);\n if (haveIntervalA && haveIntervalB) {\n if (Geometry.isAlmostEqualNumber(rangeA.absoluteDelta(), rangeB.absoluteDelta(), Geometry.smallFraction))\n return updateIntervalFromRangesAndInterpolatedPoints(); // intersection of partially clamped ranges\n else if (rangeA.clampDirectedTo01(true, true, false) && rangeB.clampDirectedTo01(true, true, false))\n return updateIntervalFromRangesAndInterpolatedPoints(); // intersection of fully clamped ranges\n }\n\n const collapseToSingleton = (pointA: Point3d, pointB: Point3d, atStartA: boolean, atStartB: boolean): CurveLocationDetailPair => {\n pointA.clone(overlap.detailA.point);\n pointB.clone(overlap.detailB.point);\n overlap.detailA.fraction = atStartA ? 0.0 : 1.0;\n overlap.detailB.fraction = atStartB ? 0.0 : 1.0;\n overlap.detailA.collapseToStart();\n overlap.detailB.collapseToStart();\n return overlap;\n };\n\n const haveSingletonA = rangeA.clampDirectedTo01(true, true, true);\n const haveSingletonB = rangeB.clampDirectedTo01(true, true, true);\n if (haveSingletonA && haveSingletonB) { // intersection is a single point\n const point1 = overlap.detailA.point1 ?? overlap.detailA.point;\n if (reversed) {\n if (overlap.detailA.point.isAlmostEqual(pointA0, this.tolerance))\n return collapseToSingleton(pointA0, pointB0, true, true);\n else if (point1.isAlmostEqual(pointA1, this.tolerance))\n return collapseToSingleton(pointA1, pointB1, false, false);\n } else {\n if (point1.isAlmostEqual(pointA0, this.tolerance))\n return collapseToSingleton(pointA0, pointB1, true, false);\n else if (overlap.detailA.point.isAlmostEqual(pointA1, this.tolerance))\n return collapseToSingleton(pointA1, pointB0, false, true);\n }\n }\n return undefined; // no intersection\n }\n /**\n * Compute whether two line segments have a coincident overlap in xy.\n * * Project `pointA0` and `pointA1` onto the (infinite) line formed by `pointB0` and `pointB1` and vice versa.\n * * If all projection distances are sufficiently small, return a detail pair recording the coincident interval.\n * * Caller can follow up with [[clampCoincidentOverlapToSegmentBounds]] to restrict the returned interval by the segments' ranges.\n * @param pointA0 start point of segment A\n * @param pointA1 end point of segment A\n * @param pointB0 start point of segment B\n * @param pointB1 end point of segment B\n * @return detail pair for the coincident interval (`detailA` has fractions along segment A, and `detailB` has\n * fractions along segment B), or `undefined` if no coincidence.\n */\n public coincidentSegmentRangeXY(pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d): CurveLocationDetailPair | undefined {\n const aDir = { x: pointA1.x - pointA0.x, y: pointA1.y - pointA0.y };\n const bDir = { x: pointB1.x - pointB0.x, y: pointB1.y - pointB0.y };\n const fractions = SmallSystem.lineSegmentXYUVOverlapUnbounded(pointA0, aDir, pointB0, bDir, this._tolerance);\n if (!fractions || !fractions.f1)\n return undefined; // no overlap\n const detailA = CurveLocationDetail.createCurveFractionPoint(undefined, fractions.f0.x, pointA0.interpolate(fractions.f0.x, pointA1));\n detailA.captureFraction1Point1(fractions.f1.x, pointA0.interpolate(fractions.f1.x, pointA1));\n const detailB = CurveLocationDetail.createCurveFractionPoint(undefined, fractions.f0.y, pointB0.interpolate(fractions.f0.y, pointB1));\n detailB.captureFraction1Point1(fractions.f1.y, pointB0.interpolate(fractions.f1.y, pointB1));\n return CurveLocationDetailPair.createCapture(detailA, detailB);\n }\n /**\n * Create a CurveLocationDetailPair for a coincident interval of two overlapping curves\n * @param cpA curveA\n * @param cpB curveB\n * @param fractionsOnA coincident interval of curveB in fraction space of curveA\n * @param fractionB0 curveB start in fraction space of curveA\n * @param fractionB1 curveB end in fraction space of curveA\n * @param reverse whether curveB and curveA have opposite direction\n */\n private createDetailPair(cpA: CurvePrimitive, cpB: CurvePrimitive, fractionsOnA: Segment1d, fractionB0: number, fractionB1: number, reverse: boolean): CurveLocationDetailPair | undefined {\n const deltaB = fractionB1 - fractionB0;\n const g0 = Geometry.conditionalDivideFraction(fractionsOnA.x0 - fractionB0, deltaB);\n const g1 = Geometry.conditionalDivideFraction(fractionsOnA.x1 - fractionB0, deltaB);\n if (g0 !== undefined && g1 !== undefined) {\n const detailA = CurveLocationDetail.createCurveEvaluatedFractionFraction(cpA, fractionsOnA.x0, fractionsOnA.x1);\n const detailB = CurveLocationDetail.createCurveEvaluatedFractionFraction(cpB, g0, g1);\n if (reverse)\n detailA.swapFractionsAndPoints();\n return CurveLocationDetailPair.createCapture(detailA, detailB);\n }\n return undefined;\n }\n private appendDetailPair(result: CurveLocationDetailPair[] | undefined, pair: CurveLocationDetailPair | undefined): CurveLocationDetailPair[] | undefined {\n if (pair === undefined)\n return result;\n if (result === undefined)\n return [pair];\n result.push(pair);\n return result;\n }\n /**\n * Test if 2 arcs have coinciding portions.\n * @param arcA\n * @param arcB\n * @param _restrictToBounds\n * @return 0, 1, or 2 overlap points/intervals\n */\n public coincidentArcIntersectionXY(arcA: Arc3d, arcB: Arc3d, _restrictToBounds: boolean = true): CurveLocationDetailPair[] | undefined {\n let result: CurveLocationDetailPair[] | undefined;\n if (arcA.center.isAlmostEqual(arcB.center, this.tolerance)) {\n const matrixBToA = arcA.matrixRef.multiplyMatrixInverseMatrix(arcB.matrixRef);\n if (matrixBToA) {\n const ux = matrixBToA.at(0, 0); const uy = matrixBToA.at(1, 0);\n const vx = matrixBToA.at(0, 1); const vy = matrixBToA.at(1, 1);\n const ru = Geometry.hypotenuseXY(ux, uy);\n const rv = Geometry.hypotenuseXY(vx, vy);\n const dot = Geometry.dotProductXYXY(ux, uy, vx, vy);\n const cross = Geometry.crossProductXYXY(ux, uy, vx, vy);\n if (Geometry.isAlmostEqualNumber(ru, 1.0)\n && Geometry.isAlmostEqualNumber(rv, 1.0)\n && Geometry.isAlmostEqualNumber(0, dot)) {\n const alphaB0Radians = Math.atan2(uy, ux); // angular position of arcB 0 point in arcA sweep\n const sweepDirection = cross > 0 ? 1.0 : -1.0; // 1 if arcB parameter space sweeps in same direction as arcA, -1 if opposite\n const betaStartRadians = alphaB0Radians + sweepDirection * arcB.sweep.startRadians; // arcB start in arcA parameter space\n const betaEndRadians = alphaB0Radians + sweepDirection * arcB.sweep.endRadians; // arcB end in arcA parameter space\n const fractionSpacesReversed = (sweepDirection * arcA.sweep.sweepRadians * arcB.sweep.sweepRadians) < 0;\n const sweepB = AngleSweep.createStartEndRadians(betaStartRadians, betaEndRadians);\n const sweepA = arcA.sweep;\n const fractionPeriodA = sweepA.fractionPeriod();\n const fractionB0 = sweepA.radiansToPositivePeriodicFraction(sweepB.startRadians); // arcB start in arcA fraction space\n assert(fractionB0 >= 0.0);\n const fractionSweep = sweepB.sweepRadians / sweepA.sweepRadians; // arcB sweep in arcA fraction space\n const fractionB1 = fractionB0 + fractionSweep; // arcB end in arcA fraction space\n const fractionSweepB = Segment1d.create(fractionB0, fractionB1);\n\n /** lambda to add a coincident interval or isolated intersection, given inputs in arcA fraction space\n * @param arcBInArcAFractionSpace span of arcB in arcA fraction space. On return, clamped to [0,1] if nontrivial.\n * @param testStartOfArcA if no nontrivial coincident interval was found, look for an isolated intersection at the start (true) or end (false) of arcA\n * @returns whether a detail pair was appended to result\n */\n const appendCoincidentIntersection = (arcBInArcAFractionSpace: Segment1d, testStartOfArcA: boolean): boolean => {\n const size = result ? result.length : 0;\n const arcBStart = arcBInArcAFractionSpace.x0;\n const arcBEnd = arcBInArcAFractionSpace.x1;\n if (arcBInArcAFractionSpace.clampDirectedTo01() && !Geometry.isSmallRelative(arcBInArcAFractionSpace.absoluteDelta())) {\n result = this.appendDetailPair(result, this.createDetailPair(arcA, arcB, arcBInArcAFractionSpace, arcBStart, arcBEnd, fractionSpacesReversed));\n } else { // test isolated intersection\n const testStartOfArcB = fractionSpacesReversed ? testStartOfArcA : !testStartOfArcA;\n const arcAPt = this._point0 = testStartOfArcA ? arcA.startPoint(this._point0) : arcA.endPoint(this._point0);\n const arcBPt = this._point1 = testStartOfArcB ? arcB.startPoint(this._point1) : arcB.endPoint(this._point1);\n if (arcAPt.isAlmostEqual(arcBPt, this.tolerance)) {\n const detailA = CurveLocationDetail.createCurveFractionPoint(arcA, testStartOfArcA ? 0 : 1, arcAPt);\n const detailB = CurveLocationDetail.createCurveFractionPoint(arcB, testStartOfArcB ? 0 : 1, arcBPt);\n result = this.appendDetailPair(result, CurveLocationDetailPair.createCapture(detailA, detailB));\n }\n }\n return result !== undefined && result.length > size;\n };\n\n appendCoincidentIntersection(fractionSweepB, false); // compute overlap in strict interior, or at end of arcA\n\n // check overlap at start of arcA with a periodic shift of fractionSweepB\n if (fractionB1 >= fractionPeriodA)\n appendCoincidentIntersection(Segment1d.create(fractionB0 - fractionPeriodA, fractionB1 - fractionPeriodA), true);\n else if (fractionB0 === 0.0)\n appendCoincidentIntersection(Segment1d.create(fractionB0 + fractionPeriodA, fractionB1 + fractionPeriodA), true);\n }\n }\n }\n return result;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CoincidentGeometryOps.js","sourceRoot":"","sources":["../../../src/geometry3d/CoincidentGeometryOps.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 { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { SmallSystem } from \"../numerics/SmallSystem\";\r\nimport { AngleSweep } from \"./AngleSweep\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Segment1d } from \"./Segment1d\";\r\n\r\n/**\r\n * `CoincidentGeometryQuery` has methods useful in testing for overlapping geometry.\r\n * * Each instance carries tolerance information that can be reused over extended call sequences.\r\n * * These methods are expected to be called internally by CurveCurve intersection methods.\r\n * @internal\r\n */\r\nexport class CoincidentGeometryQuery {\r\n private _vectorU?: Vector3d;\r\n private _vectorV?: Vector3d;\r\n private _point0?: Point3d;\r\n private _point1?: Point3d;\r\n private _tolerance: number;\r\n public get tolerance(): number {\r\n return this._tolerance;\r\n }\r\n private constructor(tolerance: number = Geometry.smallMetricDistance) {\r\n this._tolerance = tolerance;\r\n }\r\n public static create(tolerance: number = Geometry.smallMetricDistance): CoincidentGeometryQuery {\r\n return new CoincidentGeometryQuery(tolerance);\r\n }\r\n /**\r\n * * Assign both the fraction and fraction1 values in the detail, possibly swapped.\r\n * * reevaluate the points as simple interpolation between given points.\r\n */\r\n public static assignDetailInterpolatedFractionsAndPoints(detail: CurveLocationDetail, f0: number, f1: number,\r\n pointA: Point3d, pointB: Point3d, swap: boolean = false) {\r\n if (swap) {\r\n detail.fraction = f1;\r\n detail.fraction1 = f0;\r\n } else {\r\n detail.fraction = f0;\r\n detail.fraction1 = f1;\r\n }\r\n detail.point = pointA.interpolate(detail.fraction, pointB, detail.point);\r\n detail.point1 = pointA.interpolate(detail.fraction1, pointB, detail.point1);\r\n\r\n }\r\n\r\n /** Return a curve location detail with projection of a `spacePoint` to the line segment with `pointA` and `pointB` */\r\n public projectPointToSegmentXY(spacePoint: Point3d, pointA: Point3d, pointB: Point3d): CurveLocationDetail {\r\n this._vectorU = Vector3d.createStartEnd(pointA, pointB, this._vectorU);\r\n this._vectorV = Vector3d.createStartEnd(pointA, spacePoint, this._vectorV);\r\n const uDotU = this._vectorU.dotProductXY(this._vectorU);\r\n const uDotV = this._vectorU.dotProductXY(this._vectorV);\r\n const fraction = Geometry.safeDivideFraction(uDotV, uDotU, 0.0);\r\n return CurveLocationDetail.createCurveFractionPoint(undefined, fraction,\r\n pointA.interpolate(fraction, pointB));\r\n }\r\n /**\r\n * Given a detail pair representing the projection of each of two colinear line segments onto the other,\r\n * clamp the details (in place) to the line segments' endpoints according to the given flags.\r\n * @param overlap unbounded segment overlap as returned by [[coincidentSegmentRangeXY]], modified and returned\r\n * @param pointA0 start point of segment A\r\n * @param pointA1 end point of segment A\r\n * @param pointB0 start point of segment B\r\n * @param pointB1 end point of segment B\r\n * @param extendA0 whether to extend segment A beyond its start\r\n * @param extendA1 whether to extend segment A beyond its end\r\n * @param extendB0 whether to extend segment B beyond its start\r\n * @param extendB1 whether to extend segment B beyond its end\r\n * @return reference to the modified input, or undefined (leaving input untouched) if clamping would result in empty interval.\r\n */\r\n public clampCoincidentOverlapToSegmentBounds(overlap: CurveLocationDetailPair,\r\n pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d,\r\n extendA0: boolean = false, extendA1: boolean = false, extendB0: boolean = false, extendB1: boolean = false,\r\n ): CurveLocationDetailPair | undefined {\r\n const rangeA = Segment1d.create(overlap.detailA.fraction, overlap.detailA.hasFraction1 ? overlap.detailA.fraction1 : overlap.detailA.fraction);\r\n const rangeB = Segment1d.create(overlap.detailB.fraction, overlap.detailB.hasFraction1 ? overlap.detailB.fraction1 : overlap.detailB.fraction);\r\n const reversed = rangeA.signedDelta() < 0.0;\r\n\r\n const updateIntervalFromRangesAndInterpolatedPoints = (): CurveLocationDetailPair => {\r\n const a0 = rangeA.x0;\r\n const a1 = rangeA.x1;\r\n const b0 = rangeB.x0;\r\n const b1 = rangeB.x1;\r\n CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(overlap.detailA, a0, a1, pointA0, pointA1, a0 > a1);\r\n CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(overlap.detailB, b0, b1, pointB0, pointB1, b0 > b1);\r\n return overlap;\r\n };\r\n\r\n const haveIntervalA = rangeA.clampDirectedTo01(!extendA0, !extendA1, false);\r\n const haveIntervalB = rangeB.clampDirectedTo01(!extendB0, !extendB1, false);\r\n if (haveIntervalA && haveIntervalB) {\r\n if (Geometry.isAlmostEqualNumber(rangeA.absoluteDelta(), rangeB.absoluteDelta(), Geometry.smallFraction))\r\n return updateIntervalFromRangesAndInterpolatedPoints(); // intersection of partially clamped ranges\r\n else if (rangeA.clampDirectedTo01(true, true, false) && rangeB.clampDirectedTo01(true, true, false))\r\n return updateIntervalFromRangesAndInterpolatedPoints(); // intersection of fully clamped ranges\r\n }\r\n\r\n const collapseToSingleton = (pointA: Point3d, pointB: Point3d, atStartA: boolean, atStartB: boolean): CurveLocationDetailPair => {\r\n pointA.clone(overlap.detailA.point);\r\n pointB.clone(overlap.detailB.point);\r\n overlap.detailA.fraction = atStartA ? 0.0 : 1.0;\r\n overlap.detailB.fraction = atStartB ? 0.0 : 1.0;\r\n overlap.detailA.collapseToStart();\r\n overlap.detailB.collapseToStart();\r\n return overlap;\r\n };\r\n\r\n const haveSingletonA = rangeA.clampDirectedTo01(true, true, true);\r\n const haveSingletonB = rangeB.clampDirectedTo01(true, true, true);\r\n if (haveSingletonA && haveSingletonB) { // intersection is a single point\r\n const point1 = overlap.detailA.point1 ?? overlap.detailA.point;\r\n if (reversed) {\r\n if (overlap.detailA.point.isAlmostEqual(pointA0, this.tolerance))\r\n return collapseToSingleton(pointA0, pointB0, true, true);\r\n else if (point1.isAlmostEqual(pointA1, this.tolerance))\r\n return collapseToSingleton(pointA1, pointB1, false, false);\r\n } else {\r\n if (point1.isAlmostEqual(pointA0, this.tolerance))\r\n return collapseToSingleton(pointA0, pointB1, true, false);\r\n else if (overlap.detailA.point.isAlmostEqual(pointA1, this.tolerance))\r\n return collapseToSingleton(pointA1, pointB0, false, true);\r\n }\r\n }\r\n return undefined; // no intersection\r\n }\r\n /**\r\n * Compute whether two line segments have a coincident overlap in xy.\r\n * * Project `pointA0` and `pointA1` onto the (infinite) line formed by `pointB0` and `pointB1` and vice versa.\r\n * * If all projection distances are sufficiently small, return a detail pair recording the coincident interval.\r\n * * Caller can follow up with [[clampCoincidentOverlapToSegmentBounds]] to restrict the returned interval by the segments' ranges.\r\n * @param pointA0 start point of segment A\r\n * @param pointA1 end point of segment A\r\n * @param pointB0 start point of segment B\r\n * @param pointB1 end point of segment B\r\n * @return detail pair for the coincident interval (`detailA` has fractions along segment A, and `detailB` has\r\n * fractions along segment B), or `undefined` if no coincidence.\r\n */\r\n public coincidentSegmentRangeXY(pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d): CurveLocationDetailPair | undefined {\r\n const aDir = { x: pointA1.x - pointA0.x, y: pointA1.y - pointA0.y };\r\n const bDir = { x: pointB1.x - pointB0.x, y: pointB1.y - pointB0.y };\r\n const fractions = SmallSystem.lineSegmentXYUVOverlapUnbounded(pointA0, aDir, pointB0, bDir, this._tolerance);\r\n if (!fractions || !fractions.f1)\r\n return undefined; // no overlap\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(undefined, fractions.f0.x, pointA0.interpolate(fractions.f0.x, pointA1));\r\n detailA.captureFraction1Point1(fractions.f1.x, pointA0.interpolate(fractions.f1.x, pointA1));\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(undefined, fractions.f0.y, pointB0.interpolate(fractions.f0.y, pointB1));\r\n detailB.captureFraction1Point1(fractions.f1.y, pointB0.interpolate(fractions.f1.y, pointB1));\r\n return CurveLocationDetailPair.createCapture(detailA, detailB);\r\n }\r\n /**\r\n * Create a CurveLocationDetailPair for a coincident interval of two overlapping curves\r\n * @param cpA curveA\r\n * @param cpB curveB\r\n * @param fractionsOnA coincident interval of curveB in fraction space of curveA\r\n * @param fractionB0 curveB start in fraction space of curveA\r\n * @param fractionB1 curveB end in fraction space of curveA\r\n * @param reverse whether curveB and curveA have opposite direction\r\n */\r\n private createDetailPair(cpA: CurvePrimitive, cpB: CurvePrimitive, fractionsOnA: Segment1d, fractionB0: number, fractionB1: number, reverse: boolean): CurveLocationDetailPair | undefined {\r\n const deltaB = fractionB1 - fractionB0;\r\n const g0 = Geometry.conditionalDivideFraction(fractionsOnA.x0 - fractionB0, deltaB);\r\n const g1 = Geometry.conditionalDivideFraction(fractionsOnA.x1 - fractionB0, deltaB);\r\n if (g0 !== undefined && g1 !== undefined) {\r\n const detailA = CurveLocationDetail.createCurveEvaluatedFractionFraction(cpA, fractionsOnA.x0, fractionsOnA.x1);\r\n const detailB = CurveLocationDetail.createCurveEvaluatedFractionFraction(cpB, g0, g1);\r\n if (reverse)\r\n detailA.swapFractionsAndPoints();\r\n return CurveLocationDetailPair.createCapture(detailA, detailB);\r\n }\r\n return undefined;\r\n }\r\n private appendDetailPair(result: CurveLocationDetailPair[] | undefined, pair: CurveLocationDetailPair | undefined): CurveLocationDetailPair[] | undefined {\r\n if (pair === undefined)\r\n return result;\r\n if (result === undefined)\r\n return [pair];\r\n result.push(pair);\r\n return result;\r\n }\r\n /**\r\n * Test if 2 arcs have coinciding portions.\r\n * @param arcA\r\n * @param arcB\r\n * @param _restrictToBounds\r\n * @return 0, 1, or 2 overlap points/intervals\r\n */\r\n public coincidentArcIntersectionXY(arcA: Arc3d, arcB: Arc3d, _restrictToBounds: boolean = true): CurveLocationDetailPair[] | undefined {\r\n let result: CurveLocationDetailPair[] | undefined;\r\n if (arcA.center.isAlmostEqual(arcB.center, this.tolerance)) {\r\n const matrixBToA = arcA.matrixRef.multiplyMatrixInverseMatrix(arcB.matrixRef);\r\n if (matrixBToA) {\r\n const ux = matrixBToA.at(0, 0); const uy = matrixBToA.at(1, 0);\r\n const vx = matrixBToA.at(0, 1); const vy = matrixBToA.at(1, 1);\r\n const ru = Geometry.hypotenuseXY(ux, uy);\r\n const rv = Geometry.hypotenuseXY(vx, vy);\r\n const dot = Geometry.dotProductXYXY(ux, uy, vx, vy);\r\n const cross = Geometry.crossProductXYXY(ux, uy, vx, vy);\r\n if (Geometry.isAlmostEqualNumber(ru, 1.0)\r\n && Geometry.isAlmostEqualNumber(rv, 1.0)\r\n && Geometry.isAlmostEqualNumber(0, dot)) {\r\n const alphaB0Radians = Math.atan2(uy, ux); // angular position of arcB 0 point in arcA sweep\r\n const sweepDirection = cross > 0 ? 1.0 : -1.0; // 1 if arcB parameter space sweeps in same direction as arcA, -1 if opposite\r\n const betaStartRadians = alphaB0Radians + sweepDirection * arcB.sweep.startRadians; // arcB start in arcA parameter space\r\n const betaEndRadians = alphaB0Radians + sweepDirection * arcB.sweep.endRadians; // arcB end in arcA parameter space\r\n const fractionSpacesReversed = (sweepDirection * arcA.sweep.sweepRadians * arcB.sweep.sweepRadians) < 0;\r\n const sweepB = AngleSweep.createStartEndRadians(betaStartRadians, betaEndRadians);\r\n const sweepA = arcA.sweep;\r\n const fractionPeriodA = sweepA.fractionPeriod();\r\n const fractionB0 = sweepA.radiansToPositivePeriodicFraction(sweepB.startRadians); // arcB start in arcA fraction space\r\n assert(fractionB0 >= 0.0);\r\n const fractionSweep = sweepB.sweepRadians / sweepA.sweepRadians; // arcB sweep in arcA fraction space\r\n const fractionB1 = fractionB0 + fractionSweep; // arcB end in arcA fraction space\r\n const fractionSweepB = Segment1d.create(fractionB0, fractionB1);\r\n\r\n /** lambda to add a coincident interval or isolated intersection, given inputs in arcA fraction space\r\n * @param arcBInArcAFractionSpace span of arcB in arcA fraction space. On return, clamped to [0,1] if nontrivial.\r\n * @param testStartOfArcA if no nontrivial coincident interval was found, look for an isolated intersection at the start (true) or end (false) of arcA\r\n * @returns whether a detail pair was appended to result\r\n */\r\n const appendCoincidentIntersection = (arcBInArcAFractionSpace: Segment1d, testStartOfArcA: boolean): boolean => {\r\n const size = result ? result.length : 0;\r\n const arcBStart = arcBInArcAFractionSpace.x0;\r\n const arcBEnd = arcBInArcAFractionSpace.x1;\r\n if (arcBInArcAFractionSpace.clampDirectedTo01() && !Geometry.isSmallRelative(arcBInArcAFractionSpace.absoluteDelta())) {\r\n result = this.appendDetailPair(result, this.createDetailPair(arcA, arcB, arcBInArcAFractionSpace, arcBStart, arcBEnd, fractionSpacesReversed));\r\n } else { // test isolated intersection\r\n const testStartOfArcB = fractionSpacesReversed ? testStartOfArcA : !testStartOfArcA;\r\n const arcAPt = this._point0 = testStartOfArcA ? arcA.startPoint(this._point0) : arcA.endPoint(this._point0);\r\n const arcBPt = this._point1 = testStartOfArcB ? arcB.startPoint(this._point1) : arcB.endPoint(this._point1);\r\n if (arcAPt.isAlmostEqual(arcBPt, this.tolerance)) {\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(arcA, testStartOfArcA ? 0 : 1, arcAPt);\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(arcB, testStartOfArcB ? 0 : 1, arcBPt);\r\n result = this.appendDetailPair(result, CurveLocationDetailPair.createCapture(detailA, detailB));\r\n }\r\n }\r\n return result !== undefined && result.length > size;\r\n };\r\n\r\n appendCoincidentIntersection(fractionSweepB, false); // compute overlap in strict interior, or at end of arcA\r\n\r\n // check overlap at start of arcA with a periodic shift of fractionSweepB\r\n if (fractionB1 >= fractionPeriodA)\r\n appendCoincidentIntersection(Segment1d.create(fractionB0 - fractionPeriodA, fractionB1 - fractionPeriodA), true);\r\n else if (fractionB0 === 0.0)\r\n appendCoincidentIntersection(Segment1d.create(fractionB0 + fractionPeriodA, fractionB1 + fractionPeriodA), true);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ellipsoid.js","sourceRoot":"","sources":["../../../src/geometry3d/Ellipsoid.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 */\n\nimport { CurveAndSurfaceLocationDetail, UVSurfaceLocationDetail } from \"../bspline/SurfaceLocationDetail\";\nimport { Clipper } from \"../clipping/ClipUtils\";\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\nimport { AnnounceNumberNumber, AnnounceNumberNumberCurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { AxisIndex, AxisOrder, Geometry } from \"../Geometry\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { Order3Bezier } from \"../numerics/BezierPolynomials\";\nimport { Newton2dUnboundedWithDerivative, NewtonEvaluatorRRtoRRD } from \"../numerics/Newton\";\nimport { SineCosinePolynomial, SphereImplicit, TrigPolynomial } from \"../numerics/Polynomials\";\nimport { TriDiagonalSystem } from \"../numerics/TriDiagonalSystem\";\nimport { Angle } from \"./Angle\";\nimport { AngleSweep } from \"./AngleSweep\";\nimport { UVSurface } from \"./GeometryHandler\";\nimport { LongitudeLatitudeNumber } from \"./LongitudeLatitudeAltitude\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\nimport { Plane3dByOriginAndVectors } from \"./Plane3dByOriginAndVectors\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { Range1d, Range3d } from \"./Range\";\nimport { Ray3d } from \"./Ray3d\";\nimport { Transform } from \"./Transform\";\nimport { XYAndZ } from \"./XYZProps\";\n\n/**\n * For one component (x,y, or z) on the sphere\n * f(theta,phi) = c + (u * cos(theta) + v * sin(theta)) * cos(phi) + w * sin(phi)\n *\n * For the equator circle, phi=0, cos(phi) = 1, sin(phi)=0\n * f = u * cos(theta) + v * sin(theta).\n * with derivative\n * df / dTheta = - u * sin(theta) + v * cos(theta)\n * whose zero is tan(theta) = v/u\n * (and that has two solutions 180 degrees apart)\n * Then with that theta let A = u * cos(theta) + v * sin(theta)\n * f = A * cos(phi) + w * sin(phi)\n * df/dPhi = - A * sin(phi) + w * cos(phi)\n * tan(phi) = w / A\n * @internal\n */\nclass EllipsoidComponentExtrema {\n public c: number;\n public u: number;\n public v: number;\n public w: number;\n public axisIndex: AxisIndex;\n public theta0Radians: number;\n public phi0Radians: number;\n public cosTheta0: number;\n public sinTheta0: number;\n public cosPhi0: number;\n public sinPhi0: number;\n // temp vars used in arc range evaluation:\n private _axisRange: Range1d;\n private _trigForm: SineCosinePolynomial;\n public constructor(c: number, u: number, v: number, w: number, axisIndex: AxisIndex) {\n this.c = c;\n this.u = u;\n this.v = v;\n this.w = w;\n this.axisIndex = axisIndex;\n this.theta0Radians = Math.atan2(v, u);\n this.cosTheta0 = Math.cos(this.theta0Radians);\n this.sinTheta0 = Math.sin(this.theta0Radians);\n const A0 = u * this.cosTheta0 + v * this.sinTheta0;\n this.phi0Radians = Math.atan2(w, A0);\n this.cosPhi0 = Math.cos(this.phi0Radians);\n this.sinPhi0 = Math.sin(this.phi0Radians);\n this._axisRange = Range1d.createNull();\n this._trigForm = new SineCosinePolynomial(0, 0, 0);\n\n }\n /**\n * Create a component object with coefficients from a row of a `Transform`.\n * @param transform source transform.\n * @param axisIndex row index within the transform.\n */\n public static createTransformRow(transform: Transform, axisIndex: AxisIndex): EllipsoidComponentExtrema {\n const matrix = transform.matrix;\n return new EllipsoidComponentExtrema(transform.origin.at(axisIndex), matrix.at(axisIndex, 0), matrix.at(axisIndex, 1), matrix.at(axisIndex, 2), axisIndex);\n }\n public extendRangeForSmoothSurfacePoints(range: Range3d, theta0Radians: number, theta1Radians: number, phi0Radians: number, phi1Radians: number) {\n const delta = (this.u * this.cosTheta0 + this.v * this.sinTheta0) * this.cosPhi0 + this.w * this.sinPhi0;\n if (AngleSweep.isRadiansInStartEnd(this.theta0Radians, theta0Radians, theta1Radians)\n && AngleSweep.isRadiansInStartEnd(this.phi0Radians, phi0Radians, phi1Radians, false)) {\n range.extendSingleAxis(this.c + delta, this.axisIndex);\n }\n const thetaRadians = this.theta0Radians + Math.PI;\n const phiRadians = -this.phi0Radians;\n if (AngleSweep.isRadiansInStartEnd(thetaRadians, theta0Radians, theta1Radians)\n && AngleSweep.isRadiansInStartEnd(phiRadians, phi0Radians, phi1Radians, false)) {\n // cosTheta and sinTheta are both negated\n // sinPhi is negated\n // delta is negated\n range.extendSingleAxis(this.c - delta, this.axisIndex);\n }\n }\n /**\n * Extend range to include extrema of a phi-bounded arc at constant theta (i.e. a polar circle)\n * @param range range to extend\n * @param thetaRadians theta for arc\n * @param phi0Radians limit value on arc sweep\n * @param phi1Radians limit value on arc sweep\n */\n public extendRangeForConstantThetaArc(range: Range3d, thetaRadians: number, phi0Radians: number, phi1Radians: number) {\n const cosTheta = Math.cos(thetaRadians);\n const sinTheta = Math.sin(thetaRadians);\n this._trigForm.set(this.c, (this.u * cosTheta + this.v * sinTheta), this.w);\n this._trigForm.rangeInStartEndRadians(phi0Radians, phi1Radians, this._axisRange);\n range.extendSingleAxis(this._axisRange.low, this.axisIndex);\n range.extendSingleAxis(this._axisRange.high, this.axisIndex);\n }\n\n /**\n * Extend range to include extrema of a theta-bounded arc at constant phi (i.e. a circle parallel to the equator)\n * @param range range to extend\n * @param phiRadians phi for arc\n * @param theta0Radians limit value on arc sweep\n * @param theta1Radians limit value on arc sweep\n */\n public extendRangeForConstantPhiArc(range: Range3d, theta0Radians: number, theta1Radians: number, phiRadians: number) {\n const cosPhi = Math.cos(phiRadians);\n const sinPhi = Math.sin(phiRadians);\n this._trigForm.set(this.c + this.w * sinPhi, this.u * cosPhi, this.v * cosPhi);\n this._trigForm.rangeInStartEndRadians(theta0Radians, theta1Radians, this._axisRange);\n range.extendSingleAxis(this._axisRange.low, this.axisIndex);\n range.extendSingleAxis(this._axisRange.high, this.axisIndex);\n }\n}\n\n/**\n * A complete unit sphere mapped by an arbitrary [[Transform]].\n * * The (unit) sphere parameterization with respect to longitude `theta` and latitude `phi` is\n * * `u = cos(theta) * cos (phi)`\n * * `v = sin(theta) * cos(phi)`\n * * `w = sin(phi)`\n * * The sphere (u,v,w) multiply the x,y,z columns of the Ellipsoid transform.\n * * Compare to [[Sphere]], which has the same parameterization, but is a [[SolidPrimitive]] with latitude sweep.\n * @public\n */\nexport class Ellipsoid implements Clipper {\n private _transform: Transform;\n private _workUnitVectorA: Vector3d;\n private _workUnitVectorB: Vector3d;\n private _workPointA: Point3d;\n private _workPointB: Point3d;\n private constructor(transform: Transform) {\n this._transform = transform;\n this._workUnitVectorA = Vector3d.create();\n this._workUnitVectorB = Vector3d.create();\n this._workPointA = Point3d.create();\n this._workPointB = Point3d.create();\n }\n /** Create with a clone (not capture) with given transform.\n * * If transform is undefined, create a unit sphere.\n */\n public static create(matrixOrTransform?: Transform | Matrix3d): Ellipsoid {\n if (matrixOrTransform instanceof Transform)\n return new Ellipsoid(matrixOrTransform);\n else if (matrixOrTransform instanceof Matrix3d)\n return new Ellipsoid(Transform.createOriginAndMatrix(undefined, matrixOrTransform));\n else\n return new Ellipsoid(Transform.createIdentity());\n }\n /**\n * Create a transform with given center and directions, applying the radii as multipliers for the respective columns of the axes.\n * @param center center of ellipsoid\n * @param axes x,y,z directions are columns of this matrix\n * @param radiusX multiplier to be applied to the x direction\n * @param radiusY multiplier to be applied to the y direction\n * @param radiusZ multiplier to be applied to the z direction\n */\n public static createCenterMatrixRadii(center: Point3d, axes: Matrix3d | undefined, radiusX: number, radiusY: number, radiusZ: number): Ellipsoid {\n let scaledAxes;\n if (axes === undefined)\n scaledAxes = Matrix3d.createScale(radiusX, radiusY, radiusZ)!;\n else\n scaledAxes = axes.scaleColumns(radiusX, radiusY, radiusZ);\n return new Ellipsoid(Transform.createOriginAndMatrix(center, scaledAxes));\n }\n /** Return a (REFERENCE TO) the transform from world space to the mapped sphere space.\n * * This maps coordinates \"relative to the sphere\" to world.\n * * Its inverse maps world coordinates into the sphere space.\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\n */\n public get transformRef(): Transform { return this._transform; }\n /**\n * * Convert a world point to point within the underlying mapped sphere space.\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\n * * This is undefined in the highly unusual case that the ellipsoid frame is singular.\n */\n public worldToLocal(worldPoint: XYAndZ, result?: Point3d): Point3d | undefined {\n return this._transform.multiplyInversePoint3d(worldPoint, result);\n }\n /**\n * * Convert a point within the underlying mapped sphere space to world coordinates.\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\n */\n public localToWorld(localPoint: XYAndZ, result?: Point3d): Point3d {\n return this._transform.multiplyPoint3d(localPoint, result);\n }\n\n /** return a clone with same coordinates */\n public clone(): Ellipsoid {\n return new Ellipsoid(this._transform.clone());\n }\n /** test equality of the 4 points */\n public isAlmostEqual(other: Ellipsoid): boolean {\n return this._transform.isAlmostEqual(other._transform);\n }\n /** Apply the transform to each point */\n public tryTransformInPlace(transform: Transform): boolean {\n transform.multiplyTransformTransform(this._transform, this._transform);\n return true;\n }\n /**\n * return a cloned and transformed ellipsoid.\n * @param transform\n */\n public cloneTransformed(transform: Transform): Ellipsoid | undefined {\n const result = this.clone();\n result.tryTransformInPlace(transform);\n return result;\n }\n /** Find the closest point of the (patch of the) ellipsoid.\n * * In general there are multiple points where a space point projects onto an ellipse.\n * * This searches for only one point, using heuristics which are reliable for points close to the surface but not for points distant from highly skewed ellipsoid\n */\n public projectPointToSurface(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\n const searcher = new EllipsoidClosestPoint(this);\n return searcher.searchClosestPoint(spacePoint);\n }\n\n /** Find the silhouette of the ellipsoid as viewed from a homogeneous eyepoint.\n * * Returns undefined if the eyepoint is inside the ellipsoid\n */\n public silhouetteArc(eyePoint: Point4d): Arc3d | undefined {\n const localEyePoint = this._transform.multiplyInversePoint4d(eyePoint);\n if (localEyePoint !== undefined) {\n // localEyePoint is now looking at a unit sphere centered at the origin.\n // the plane through the silhouette is the eye point with z negated ...\n const localPlaneA = Point4d.create(localEyePoint.x, localEyePoint.y, localEyePoint.z, -localEyePoint.w);\n const localPlaneB = localPlaneA.toPlane3dByOriginAndUnitNormal();\n // if the silhouette plane has origin inside the sphere, there is a silhouette with center at the plane origin.\n if (localPlaneB) {\n const rr = 1.0 - localPlaneB.getOriginRef().magnitudeSquared(); // squared distance radius of silhouette arc\n if (rr > 0.0 && rr <= 1.0) {\n const arc = Arc3d.createCenterNormalRadius(localPlaneB.getOriginRef(), localPlaneB.getNormalRef(), Math.sqrt(rr));\n if (arc.tryTransformInPlace(this._transform))\n return arc;\n }\n }\n }\n return undefined;\n }\n\n /** Compute intersections with a ray.\n * * Return the number of intersections\n * * Fill any combinations of arrays of\n * * rayFractions = fractions along the ray\n * * xyz = xyz intersection coordinates points in space\n * * thetaPhiRadians = sphere longitude and latitude in radians.\n * * For each optional array, caller must of course initialize an array (usually empty)\n * * return 0 if ray length is too small.\n */\n public intersectRay(ray: Ray3d, rayFractions: number[] | undefined, xyz: Point3d[] | undefined, thetaPhiRadians: LongitudeLatitudeNumber[] | undefined): number {\n if (xyz)\n xyz.length = 0;\n if (thetaPhiRadians !== undefined)\n thetaPhiRadians.length = 0;\n if (rayFractions)\n rayFractions.length = 0;\n // if ray comes in unit vector in large ellipsoid, localRay direction is minuscule.\n // use a ray scaled up so its direction vector magnitude is comparable to the ellipsoid radiusX\n const ray1 = ray.clone();\n const a0 = ray.direction.magnitude();\n const aX = this._transform.matrix.columnXMagnitude();\n const scale = Geometry.conditionalDivideCoordinate(aX, a0);\n if (scale === undefined)\n return 0;\n ray1.direction.scaleInPlace(scale);\n const localRay = ray1.cloneInverseTransformed(this._transform);\n if (localRay !== undefined) {\n const n = SphereImplicit.intersectSphereRay(Point3d.create(0, 0, 0), 1.0, localRay, rayFractions, xyz, thetaPhiRadians);\n if (rayFractions !== undefined) {\n for (let i = 0; i < rayFractions.length; i++)\n rayFractions[i] *= scale;\n }\n if (xyz !== undefined) {\n this._transform.multiplyPoint3dArrayInPlace(xyz);\n }\n return n;\n }\n return 0;\n }\n\n /** Return the range of a uv-aligned patch of the sphere. */\n public patchRangeStartEndRadians(theta0Radians: number, theta1Radians: number, phi0Radians: number, phi1Radians: number, result?: Range3d): Range3d {\n const xExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 0);\n const yExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 1);\n const zExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 2);\n if (!result)\n result = Range3d.createNull();\n else\n result.setNull();\n // Range extrema can occur at:\n // * 2 smooth surface points in each direction\n // * along low and high phi boundary arcs\n // * along low and high theta boundary arcs\n // smooth surface extrema . ..\n xExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\n yExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\n zExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\n //\n if (!Angle.isFullCircleRadians(theta1Radians - theta0Radians)) {\n xExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\n yExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\n zExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\n\n xExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\n yExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\n zExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\n }\n if (!Angle.isHalfCircleRadians(phi1Radians - phi0Radians)) {\n xExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\n yExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\n zExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\n\n xExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\n yExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\n zExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\n }\n return result;\n }\n /**\n * Evaluate a point on the ellipsoid at angles give in radians.\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param result optional point result\n */\n public radiansToPoint(thetaRadians: number, phiRadians: number, result?: Point3d): Point3d {\n const cosTheta = Math.cos(thetaRadians);\n const sinTheta = Math.sin(thetaRadians);\n const cosPhi = Math.cos(phiRadians);\n const sinPhi = Math.sin(phiRadians);\n return this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, result);\n }\n\n /**\n * * For a given pair of points on an ellipsoid, construct an arc (possibly elliptical) which\n * * passes through both points\n * * is completely within the ellipsoid surface\n * * has its centerEvaluate a point on the ellipsoid at angles give in radians.\n * * If the ellipsoid is a sphere, this is the shortest great-circle arc between the two points.\n * * If the ellipsoid is not a sphere, this is close to but not precisely the shortest path.\n * @param thetaARadians longitude, in radians, for pointA\n * @param phiARadians latitude, in radians, for pointA\n * @param thetaBRadians longitude, in radians, for pointB\n * @param phiBRadians latitude, in radians, for pointB\n * @param result optional preallocated result\n */\n public radiansPairToGreatArc(\n thetaARadians: number, phiARadians: number,\n thetaBRadians: number, phiBRadians: number,\n result?: Arc3d): Arc3d | undefined {\n SphereImplicit.radiansToUnitSphereXYZ(thetaARadians, phiARadians, this._workUnitVectorA);\n SphereImplicit.radiansToUnitSphereXYZ(thetaBRadians, phiBRadians, this._workUnitVectorB);\n const sweepAngle = this._workUnitVectorA.angleTo(this._workUnitVectorB);\n // the unit vectors (on unit sphere) are never 0, so this cannot fail.\n const matrix = Matrix3d.createRigidFromColumns(this._workUnitVectorA, this._workUnitVectorB, AxisOrder.XYZ)!;\n if (matrix !== undefined) {\n const matrix1 = this._transform.matrix.multiplyMatrixMatrix(matrix);\n return Arc3d.create(this._transform.getOrigin(), matrix1.columnX(), matrix1.columnY(),\n AngleSweep.createStartEndRadians(0.0, sweepAngle.radians), result);\n }\n return undefined;\n }\n /**\n * See radiansPairToGreatArc, which does this computation with positions from `angleA` and `angleB` directly as radians\n */\n public anglePairToGreatArc(angleA: LongitudeLatitudeNumber, angleB: LongitudeLatitudeNumber, result?: Arc3d): Arc3d | undefined {\n return this.radiansPairToGreatArc(\n angleA.longitudeRadians, angleA.latitudeRadians, angleB.longitudeRadians, angleB.latitudeRadians, result);\n }\n /**\n * Construct an arc for the section cut of a plane with the ellipsoid.\n * * this is undefined if the plane does not intersect the ellipsoid.\n */\n public createPlaneSection(plane: Plane3dByOriginAndUnitNormal): Arc3d | undefined {\n const localPlane = plane.cloneTransformed(this._transform, true);\n if (localPlane !== undefined) {\n // construct center and arc vectors in the local system --- later transform them out to global.\n const center = localPlane.projectPointToPlane(Point3d.createZero());\n const d = center.magnitude();\n if (d < 1.0) {\n const frame = Matrix3d.createRigidHeadsUp(localPlane.getNormalRef(), AxisOrder.ZYX);\n const vector0 = frame.columnX();\n const vector90 = frame.columnY();\n const sectionRadius = Math.sqrt(1.0 - d * d);\n vector0.scaleInPlace(sectionRadius);\n vector90.scaleInPlace(sectionRadius);\n\n this._transform.multiplyPoint3d(center, center);\n this._transform.multiplyVector(vector0, vector0);\n this._transform.multiplyVector(vector90, vector90);\n return Arc3d.create(center, vector0, vector90, undefined);\n }\n }\n return undefined;\n }\n /**\n * Construct an arc which\n * * start at pointA (defined by its angle position)\n * * ends at pointB (defined by its angle position)\n * * contains the 3rd vector as an in-plane point.\n */\n public createSectionArcPointPointVectorInPlane(pointAnglesA: LongitudeLatitudeNumber, pointAnglesB: LongitudeLatitudeNumber, inPlaneVector: Vector3d,\n result?: Arc3d): Arc3d | undefined {\n const xyzA = this.radiansToPoint(pointAnglesA.longitudeRadians, pointAnglesA.latitudeRadians);\n const xyzB = this.radiansToPoint(pointAnglesB.longitudeRadians, pointAnglesB.latitudeRadians);\n const localA = this._transform.multiplyInversePoint3d(xyzA);\n const localB = this._transform.multiplyInversePoint3d(xyzB);\n const a = this._transform.matrix.maxAbs();\n const scaledInPlaneVector = inPlaneVector.scaleToLength(a);\n if (scaledInPlaneVector === undefined)\n return undefined;\n const localInPlaneVector = this._transform.matrix.multiplyInverse(scaledInPlaneVector);\n if (localA !== undefined && localB !== undefined && localInPlaneVector !== undefined) {\n const localPlane = Plane3dByOriginAndUnitNormal.createPointPointVectorInPlane(localA, localB, localInPlaneVector);\n if (localPlane !== undefined) {\n // construct center and arc vectors in the local system --- later transform them out to global.\n const center = localPlane.projectPointToPlane(Point3d.createZero());\n const vector0 = Vector3d.createStartEnd(center, localA);\n const vectorB = Vector3d.createStartEnd(center, localB);\n const vector90 = Vector3d.createRotateVectorAroundVector(vector0, localPlane.getNormalRef(), undefined);\n if (vector90 !== undefined) {\n const sweepRadians = vector0.planarRadiansTo(vectorB, localPlane.getNormalRef());\n this._transform.multiplyPoint3d(center, center);\n this._transform.multiplyVector(vector0, vector0);\n this._transform.multiplyVector(vector90, vector90);\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0, sweepRadians), result);\n }\n }\n }\n return undefined;\n }\n /**\n * * For a given pair of points on an ellipsoid, construct another ellipsoid\n * * touches the same xyz points in space\n * * has transformation modified so that the original two points are on the equator.\n * * Note that except for true sphere inputs, the result axes can be both non-perpendicular axes and of different lengths.\n * @param thetaARadians longitude, in radians, for pointA\n * @param phiARadians latitude, in radians, for pointA\n * @param thetaBRadians longitude, in radians, for pointB\n * @param phiBRadians latitude, in radians, for pointB\n * @param result optional preallocated result\n */\n public radiansPairToEquatorialEllipsoid(\n thetaARadians: number, phiARadians: number,\n thetaBRadians: number, phiBRadians: number,\n result?: Ellipsoid): Ellipsoid | undefined {\n SphereImplicit.radiansToUnitSphereXYZ(thetaARadians, phiARadians, this._workUnitVectorA);\n SphereImplicit.radiansToUnitSphereXYZ(thetaBRadians, phiBRadians, this._workUnitVectorB);\n\n const matrix = Matrix3d.createRigidFromColumns(this._workUnitVectorA, this._workUnitVectorB, AxisOrder.XYZ);\n if (matrix) {\n if (result) {\n this._transform.multiplyTransformMatrix3d(matrix, result._transform);\n return result;\n }\n return Ellipsoid.create(this._transform.multiplyTransformMatrix3d(matrix));\n }\n return undefined;\n }\n /**\n * Return an arc (circular or elliptical) at constant longitude\n * @param longitude (strongly typed) longitude\n * @param latitude latitude sweep angles\n * @param result\n */\n public constantLongitudeArc(longitude: Angle, latitudeSweep: AngleSweep, result?: Arc3d): Arc3d | undefined {\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, latitudeSweep.sweepRadians))\n return undefined;\n const cosTheta = longitude.cos();\n const sinTheta = longitude.sin();\n const vector0 = this._transform.matrix.multiplyXY(cosTheta, sinTheta);\n const vector90 = this._transform.matrix.columnZ();\n const center = this._transform.getOrigin();\n return Arc3d.create(center, vector0, vector90, latitudeSweep, result);\n }\n /**\n * Return an arc (circular or elliptical) at constant longitude\n * @param latitude sweep angles\n * @param latitude (strongly typed) latitude\n * @param result\n */\n public constantLatitudeArc(longitudeSweep: AngleSweep, latitude: Angle, result?: Arc3d): Arc3d | undefined {\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, longitudeSweep.sweepRadians))\n return undefined;\n if (latitude.isAlmostNorthOrSouthPole)\n return undefined;\n const cosPhi = latitude.cos();\n const sinPhi = latitude.sin();\n const vector0 = this._transform.matrix.columnX(); vector0.scaleInPlace(cosPhi);\n const vector90 = this._transform.matrix.columnY(); vector90.scaleInPlace(cosPhi);\n const center = this._transform.multiplyXYZ(0, 0, sinPhi);\n return Arc3d.create(center, vector0, vector90, longitudeSweep, result);\n }\n /**\n * * create a section arc with and end at positions A and B, and in plane with the normal at a fractional\n * interpolation between.\n * @param angleA start point of arc (given as angles on this ellipsoid)\n * @param intermediateNormalFraction\n * @param angleB end point of arc (given as angles on this ellipsoid)\n */\n public sectionArcWithIntermediateNormal(\n angleA: LongitudeLatitudeNumber,\n intermediateNormalFraction: number,\n angleB: LongitudeLatitudeNumber): Arc3d {\n const normalA = this.radiansToUnitNormalRay(angleA.longitudeRadians, angleA.latitudeRadians)!;\n const normalB = this.radiansToUnitNormalRay(angleB.longitudeRadians, angleB.latitudeRadians)!;\n const normal = normalA.direction.interpolate(intermediateNormalFraction, normalB.direction);\n const arc = this.createSectionArcPointPointVectorInPlane(angleA, angleB, normal);\n return arc!;\n }\n\n /**\n * Evaluate a point and derivatives with respect to angle on the ellipsoid at angles give in radians.\n * * \"u direction\" vector of the returned plane is derivative with respect to longitude.\n * * \"v direction\" vector fo the returned plane is derivative with respect ot latitude.\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param applyCosPhiFactor selector for handling of theta (around equator derivative)\n * * if true, compute the properly scaled derivative, which goes to zero at the poles.\n * * If false, omit he cos(phi) factor on the derivative wrt theta. This ensures it is always nonzero and can be safely used in cross product for surface normal.\n * @param result optional plane result\n */\n public radiansToPointAndDerivatives(thetaRadians: number, phiRadians: number, applyCosPhiFactor = true, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n const cosTheta = Math.cos(thetaRadians);\n const sinTheta = Math.sin(thetaRadians);\n const cosPhi = Math.cos(phiRadians);\n const cosPhiA = applyCosPhiFactor ? cosPhi : 1.0;\n const sinPhi = Math.sin(phiRadians);\n const matrix = this._transform.matrix;\n if (!result)\n return Plane3dByOriginAndVectors.createCapture(\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi),\n matrix.multiplyXYZ(-sinTheta * cosPhiA, cosTheta * cosPhiA, 0),\n matrix.multiplyXYZ(-sinPhi * cosTheta, -sinPhi * sinTheta, cosPhi));\n // in place modification requires direct reference to members of the result ...\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, result.origin);\n matrix.multiplyXYZ(-sinTheta * cosPhiA, cosTheta * cosPhiA, 0, result.vectorU);\n matrix.multiplyXYZ(-sinPhi * cosTheta, -sinPhi * sinTheta, cosPhi, result.vectorV);\n return result;\n }\n /**\n * Evaluate a point and derivatives wrt to theta, phi, thetaTheta, phiPhi, and thetaPhi.\n * All outputs are to caller-allocated points and vectors.\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param point (returned) surface point\n * @param d1Theta (returned) derivative wrt theta\n * @param d1Phi (returned) derivative wrt phi\n * @param d2ThetaTheta (returned) second derivative wrt theta twice\n * @param d2PhiPhi (returned) second derivative wrt phi twice\n * @param d2ThetaPhi (returned) second derivative wrt theta and phi\n * @param result optional plane result\n */\n public radiansToPointAnd2Derivatives(thetaRadians: number, phiRadians: number,\n point: Point3d,\n d1Theta: Vector3d,\n d1Phi: Vector3d,\n d2ThetaTheta: Vector3d,\n d2PhiPhi: Vector3d,\n d2ThetaPhi: Vector3d) {\n const cosTheta = Math.cos(thetaRadians);\n const sinTheta = Math.sin(thetaRadians);\n const cosPhi = Math.cos(phiRadians);\n const sinPhi = Math.sin(phiRadians);\n const matrix = this._transform.matrix;\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, point);\n // theta derivatives\n matrix.multiplyXYZ(-sinTheta * cosPhi, cosTheta * cosPhi, 0, d1Theta);\n matrix.multiplyXYZ(-cosTheta * cosPhi, -sinTheta * cosPhi, 0, d2ThetaTheta);\n\n // phi derivatives\n matrix.multiplyXYZ(-cosTheta * sinPhi, -sinTheta * sinPhi, cosPhi, d1Phi);\n matrix.multiplyXYZ(-cosTheta * cosPhi, -sinTheta * cosPhi, -sinPhi, d2PhiPhi);\n\n // mixed derivative\n matrix.multiplyXYZ(sinTheta * sinPhi, -cosTheta * sinPhi, 0, d2ThetaPhi);\n }\n\n /**\n * Evaluate a point and rigid local coordinate frame the ellipsoid at angles give in radians.\n * * The undefined return is only possible if the placement transform is singular (and even then only at critical angles)\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param result optional transform result\n *\n */\n public radiansToFrenetFrame(thetaRadians: number, phiRadians: number, result?: Transform): Transform | undefined {\n const plane = this.radiansToPointAndDerivatives(thetaRadians, phiRadians, false);\n return plane.toRigidFrame(result);\n }\n /**\n * Evaluate a point and unit normal at given angles.\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param result optional transform result\n *\n */\n public radiansToUnitNormalRay(thetaRadians: number, phiRadians: number, result?: Ray3d): Ray3d | undefined {\n const plane = this.radiansToPointAndDerivatives(thetaRadians, phiRadians, false);\n return plane.unitNormalRay(result);\n }\n\n /**\n * Find the (unique) extreme point for a given true surface perpendicular vector (outward)\n */\n public surfaceNormalToAngles(normal: Vector3d, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber {\n const matrix = this._transform.matrix;\n const conjugateVector = matrix.multiplyTransposeVector(normal);\n const thetaRadians = Math.atan2(conjugateVector.y, conjugateVector.x);\n // For that phi arc,\n const axy = -(conjugateVector.x * Math.cos(thetaRadians) + conjugateVector.y * Math.sin(thetaRadians));\n const az = conjugateVector.z;\n const phiRadians = Math.atan2(az, -axy);\n return LongitudeLatitudeNumber.createRadians(thetaRadians, phiRadians, 0.0, result);\n }\n\n /**\n * * Evaluate the surface normal on `other` ellipsoid at given angles\n * * If `other` is undefined, default to unit sphere.\n * * Find the angles for the same normal on `this` ellipsoid\n */\n public otherEllipsoidAnglesToThisEllipsoidAngles(otherEllipsoid: Ellipsoid | undefined, otherAngles: LongitudeLatitudeNumber, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber | undefined {\n const normal = Ellipsoid.radiansToUnitNormalRay(otherEllipsoid, otherAngles.longitudeRadians, otherAngles.latitudeRadians);\n if (normal !== undefined)\n return this.surfaceNormalToAngles(normal.direction, result);\n return undefined;\n }\n /**\n * * if ellipsoid is given, return its surface point and unit normal as a Ray3d.\n * * if not given, return surface point and unit normal for unit sphere.\n */\n public static radiansToUnitNormalRay(ellipsoid: Ellipsoid | undefined, thetaRadians: number, phiRadians: number, result?: Ray3d): Ray3d | undefined {\n if (ellipsoid) {\n return ellipsoid.radiansToUnitNormalRay(thetaRadians, phiRadians, result);\n }\n if (!result)\n result = Ray3d.createZAxis();\n // for unit sphere, the vector from center to surface point is identical to the unit normal.\n SphereImplicit.radiansToUnitSphereXYZ(thetaRadians, phiRadians, result.origin);\n result.direction.setFromPoint3d(result.origin);\n return result;\n }\n /** Implementation of [[Clipper.isPointOnOrInside]]. */\n public isPointOnOrInside(point: Point3d): boolean {\n const localPoint = this._transform.multiplyInversePoint3d(point, this._workPointA);\n if (localPoint !== undefined)\n return localPoint.magnitude() <= 1.0;\n return false;\n }\n /** Announce \"in\" portions of a line segment. Implementation of [[Clipper.announceClippedSegmentIntervals]]. */\n public announceClippedSegmentIntervals(f0: number, f1: number, pointA: Point3d, pointB: Point3d, announce?: AnnounceNumberNumber): boolean {\n const localA = this._transform.multiplyInversePoint3d(pointA, this._workPointA);\n const localB = this._transform.multiplyInversePoint3d(pointB, this._workPointB);\n if (localA && localB) {\n const dotAA = Vector3d.dotProductAsXYAndZ(this._workPointA, this._workPointA);\n const dotAB = Vector3d.dotProductAsXYAndZ(this._workPointA, this._workPointB);\n const dotBB = Vector3d.dotProductAsXYAndZ(this._workPointB, this._workPointB);\n const bezier = new Order3Bezier(dotAA, dotAB, dotBB);\n const roots = bezier.roots(1.0, false);\n if (roots !== undefined && roots.length === 2) {\n // we know the roots are sorted. The f0,f1 might not be ..\n if (f0 < f1) {\n if (roots[0] < f0)\n roots[0] = f0;\n if (f1 < roots[1])\n roots[1] = f1;\n if (roots[0] < roots[1]) {\n if (announce)\n announce(roots[0], roots[1]);\n return true;\n }\n } else {\n // f0,f1 are reversed. do the outputs in the same sense\n if (roots[1] > f0)\n roots[1] = f0;\n if (roots[0] < f1)\n roots[0] = f1;\n if (roots[1] > roots[0]) {\n if (announce)\n announce(roots[1], roots[0]);\n return true;\n }\n }\n }\n }\n return false;\n }\n /** Announce \"in\" portions of a line segment. Implementation of [[Clipper.announceClippedArcIntervals]] */\n public announceClippedArcIntervals(arc: Arc3d, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\n const arcData = arc.toVectors();\n let numAnnounce = 0;\n if (this._transform.multiplyInversePoint3d(arcData.center, arcData.center)\n && this._transform.matrix.multiplyInverse(arcData.vector0, arcData.vector0)\n && this._transform.matrix.multiplyInverse(arcData.vector90, arcData.vector90)) {\n // in local coordinates the arc parameterization is X = center + vector0 * cos(theta) + vector90 * sin(theta)\n // We want X DOT X === 1, viz\n // center DOT center + 2 * cos(theta) * center DOT vector0 + 2 * sin(theta) * center DOT vector90 + cos(theta) ^2 * vector0 DOT vector0 + sin (theta)^2 * vector90 DOT vector90 = 1\n const cc = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.center);\n const cu = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.vector0);\n const cv = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.vector90);\n const uv = Vector3d.dotProductAsXYAndZ(arcData.vector0, arcData.vector90);\n const uu = Vector3d.dotProductAsXYAndZ(arcData.vector0, arcData.vector0);\n const vv = Vector3d.dotProductAsXYAndZ(arcData.vector90, arcData.vector90);\n const intersectionRadians: number[] = [];\n\n if (TrigPolynomial.solveUnitCircleImplicitQuadricIntersection(\n uu, 2.0 * uv, vv,\n 2.0 * cu, 2.0 * cv, cc - 1.0,\n intersectionRadians)) {\n const fractions = [0.0, 1.0];\n for (const radians of intersectionRadians) {\n const fraction = arc.sweep.radiansToSignedPeriodicFraction(radians);\n if (Geometry.isIn01(fraction))\n fractions.push(fraction);\n }\n fractions.sort();\n let f0, f1;\n for (let i1 = 1; i1 < fractions.length; i1++) {\n f0 = fractions[i1 - 1];\n f1 = fractions[i1];\n if (f1 > f0) {\n const xyz = arc.fractionToPoint(Geometry.interpolate(fractions[i1 - 1], 0.5, fractions[i1]));\n if (this.isPointOnOrInside(xyz)) {\n if (announce)\n announce(fractions[i1 - 1], fractions[i1], arc);\n numAnnounce++;\n }\n }\n }\n }\n }\n return numAnnounce > 0;\n }\n}\n/**\n * * An `EllipsoidPatch` is\n * * An underlying (full) `Ellipsoid` object\n * * an angular range (`AngleSweep`) of longitudes around the equator\n * * an angular range (`AngleSweep`) of latitudes, with 0 at the equator, +90 degrees at north pole.\n * * The `EllipsoidPatch` implements `UVSurface` methods, so a `PolyfaceBuilder` can generate facets in its method `addUVGridBody`\n * @public\n */\nexport class EllipsoidPatch implements UVSurface {\n public ellipsoid: Ellipsoid;\n public longitudeSweep: AngleSweep;\n public latitudeSweep: AngleSweep;\n /**\n * CAPTURE ellipsoid and sweeps as an EllipsoidPatch.\n * @param ellipsoid\n * @param longitudeSweep\n * @param latitudeSweep\n */\n private constructor(ellipsoid: Ellipsoid, longitudeSweep: AngleSweep, latitudeSweep: AngleSweep) {\n this.ellipsoid = ellipsoid;\n this.longitudeSweep = longitudeSweep;\n this.latitudeSweep = latitudeSweep;\n }\n /**\n * Create a new EllipsoidPatch, capturing (not cloning) all input object references.\n * @param ellipsoid full ellipsoid\n * @param longitudeSweep sweep of longitudes in the active patch\n * @param latitudeSweep sweep of latitudes in the active patch.\n */\n public static createCapture(ellipsoid: Ellipsoid, longitudeSweep: AngleSweep, latitudeSweep: AngleSweep): EllipsoidPatch {\n return new EllipsoidPatch(ellipsoid, longitudeSweep, latitudeSweep);\n }\n /** Return the point on the ellipsoid at fractional positions in the angular ranges. */\n public uvFractionToPoint(longitudeFraction: number, latitudeFraction: number, result?: Point3d): Point3d {\n return this.ellipsoid.radiansToPoint(this.longitudeSweep.fractionToRadians(longitudeFraction), this.latitudeSweep.fractionToRadians(latitudeFraction), result);\n }\n /** Return the point and derivative vectors on the ellipsoid at fractional positions in the angular ranges.\n * * Derivatives are with respect to fractional position.\n */\n public uvFractionToPointAndTangents(longitudeFraction: number, latitudeFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n result = this.ellipsoid.radiansToPointAndDerivatives(\n this.longitudeSweep.fractionToRadians(longitudeFraction),\n this.latitudeSweep.fractionToRadians(latitudeFraction),\n true,\n result);\n result.vectorU.scale(this.longitudeSweep.sweepRadians);\n result.vectorV.scale(this.latitudeSweep.sweepRadians);\n return result;\n }\n /** Return the range of the patch, considering both boundary and internal extrema. */\n public range(result?: Range3d): Range3d {\n return this.ellipsoid.patchRangeStartEndRadians(this.longitudeSweep.startRadians, this.longitudeSweep.endRadians, this.latitudeSweep.startRadians, this.latitudeSweep.endRadians, result);\n }\n /** Return intersections of the ray and surface.\n * * uv values in the intersections are in radians unless `convertIntersectionRadiansToFractions` is true requesting conversion to patch fractions.\n */\n public intersectRay(ray: Ray3d, restrictToPatch: boolean, convertIntersectionRadiansToFractions: boolean = false): CurveAndSurfaceLocationDetail[] {\n const result: CurveAndSurfaceLocationDetail[] = [];\n const rayFractions: number[] = [];\n const xyz: Point3d[] = [];\n const thetaPhi: LongitudeLatitudeNumber[] = [];\n const n = this.ellipsoid.intersectRay(ray, rayFractions, xyz, thetaPhi);\n for (let i = 0; i < n; i++) {\n const longitudeRadians = thetaPhi[i].longitudeRadians;\n const latitudeRadians = thetaPhi[i].latitudeRadians;\n\n if (!restrictToPatch\n || (this.longitudeSweep.isRadiansInSweep(longitudeRadians)\n && this.latitudeSweep.isRadiansInSweep(latitudeRadians))) {\n if (convertIntersectionRadiansToFractions) {\n const uFraction = this.longitudeSweep.radiansToSignedPeriodicFraction(longitudeRadians);\n const vFraction = this.latitudeSweep.radiansToSignedPeriodicFraction(latitudeRadians);\n result.push(new CurveAndSurfaceLocationDetail(\n CurveLocationDetail.createRayFractionPoint(ray, rayFractions[i], xyz[i]),\n UVSurfaceLocationDetail.createSurfaceUVNumbersPoint(this, uFraction, vFraction, xyz[i])));\n } else {\n result.push(new CurveAndSurfaceLocationDetail(\n CurveLocationDetail.createRayFractionPoint(ray, rayFractions[i], xyz[i]),\n UVSurfaceLocationDetail.createSurfaceUVNumbersPoint(this, longitudeRadians, latitudeRadians, xyz[i])));\n }\n }\n }\n return result;\n }\n /**\n * test if the angles of the `LongitudeLatitudeNumber` are within the sweep ranges.\n * @param position longitude and latitude to test.\n * @param `allowPeriodicLongitude` true to allow the longitude to be in when shifted by a multiple of 2 PI\n * (latitude is never periodic for patches)\n */\n public containsAngles(position: LongitudeLatitudeNumber, allowPeriodicLongitude: boolean = true): boolean {\n return this.latitudeSweep.isRadiansInSweep(position.latitudeRadians, false)\n && this.longitudeSweep.isRadiansInSweep(position.longitudeRadians, allowPeriodicLongitude);\n }\n\n /**\n * Compute point (with altitude) at given angles and altitude.\n * * Never fails for non-singular ellipsoid.\n * * In the returned ray,\n * * ray.origin is the point at requested altitude.\n * * ray.direction is an outward-directed unit vector\n * @param position longitude, latitude, and height\n *\n */\n public anglesToUnitNormalRay(position: LongitudeLatitudeNumber, result?: Ray3d): Ray3d | undefined {\n const ray = this.ellipsoid.radiansToUnitNormalRay(position.longitudeRadians, position.latitudeRadians, result);\n if (!ray)\n return undefined;\n ray.origin = ray.fractionToPoint(position.altitude, ray.origin);\n return ray;\n }\n /**\n * Return simple angles of a fractional position in the patch.\n * @param thetaFraction fractional position in longitude (theta) interval\n * @param phiFraction fractional position in latitude (phi) interval\n * @param h optional altitude\n * @param result optional preallocated result.\n */\n public uvFractionToAngles(longitudeFraction: number, phiFraction: number, h: number = 0, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber {\n return LongitudeLatitudeNumber.createRadians(this.longitudeSweep.fractionToRadians(longitudeFraction), this.latitudeSweep.fractionToRadians(phiFraction), h, result);\n }\n /** Find the closest point of the (patch of the) ellipsoid. */\n public projectPointToSurface(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\n return this.ellipsoid.projectPointToSurface(spacePoint);\n }\n}\n/**\n * Internal class for searching for the closest point (projection of spacePoint) on an ellipsoid.\n */\nclass EllipsoidClosestPoint extends NewtonEvaluatorRRtoRRD {\n private _ellipsoid: Ellipsoid;\n private _spacePoint!: Point3d;\n private _surfacePoint: Point3d;\n private _d1Theta: Vector3d;\n private _d2Theta: Vector3d;\n private _d1Phi: Vector3d;\n private _d2Phi: Vector3d;\n private _d2ThetaPhi: Vector3d;\n private _delta: Vector3d;\n public constructor(ellipsoid: Ellipsoid) {\n super();\n this._ellipsoid = ellipsoid;\n this._surfacePoint = Point3d.create();\n this._d1Theta = Vector3d.create();\n this._d1Phi = Vector3d.create();\n this._d2Theta = Vector3d.create();\n this._d2Phi = Vector3d.create();\n this._d2ThetaPhi = Vector3d.create();\n\n this._delta = Vector3d.create();\n }\n public searchClosestPoint(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\n this._spacePoint = spacePoint;\n const localPoint = this._ellipsoid.transformRef.multiplyInversePoint3d(spacePoint);\n if (!localPoint)\n return undefined;\n const sphere = new SphereImplicit(1.0);\n const uv = sphere.xyzToThetaPhiR(localPoint);\n const newtonSearcher = new Newton2dUnboundedWithDerivative(this);\n newtonSearcher.setUV(uv.thetaRadians, uv.phiRadians);\n if (newtonSearcher.runIterations()) {\n uv.thetaRadians = newtonSearcher.getU();\n uv.phiRadians = newtonSearcher.getV();\n }\n return LongitudeLatitudeNumber.createRadians(uv.thetaRadians, uv.phiRadians, 0.0);\n }\n public evaluate(thetaRadians: number, phiRadians: number): boolean {\n this._ellipsoid.radiansToPointAnd2Derivatives(thetaRadians, phiRadians,\n this._surfacePoint,\n this._d1Theta, this._d1Phi,\n this._d2Theta, this._d2Phi,\n this._d2ThetaPhi);\n Vector3d.createStartEnd(this._spacePoint, this._surfacePoint, this._delta);\n const q = this._d1Theta.dotProduct(this._d1Phi) + this._delta.dotProduct(this._d2ThetaPhi);\n this.currentF.setOriginAndVectorsXYZ(\n // f,g,0\n this._delta.dotProduct(this._d1Theta), this._delta.dotProduct(this._d1Phi), 0,\n // df/dTheta, dg/dTheta, 0\n this._d1Theta.dotProduct(this._d1Theta) + this._delta.dotProduct(this._d2Theta), q, 0,\n // df/dPhi, dg/dPhi, 0\n q, this._d1Phi.dotProduct(this._d1Phi) + this._delta.dotProduct(this._d2Phi), 0);\n\n return true;\n }\n}\n/**\n * Detailed data for a point on a 2-angle parameter space.\n * @public\n */\nexport class GeodesicPathPoint {\n /** First angle, in radians */\n public thetaRadians: number;\n /** Second angle, in radians */\n public phiRadians: number;\n public point: Point3d;\n public dTheta: Vector3d;\n public dPhi: Vector3d;\n public d2Theta: Vector3d;\n public d2Phi: Vector3d;\n public d2ThetaPhi: Vector3d;\n public d1Cross: Vector3d;\n public constructor() {\n this.thetaRadians = 0;\n this.phiRadians = 0;\n this.point = Point3d.create();\n this.dTheta = Vector3d.create();\n this.dPhi = Vector3d.create();\n this.d2Theta = Vector3d.create();\n this.d2Phi = Vector3d.create();\n this.d2ThetaPhi = Vector3d.create();\n this.d1Cross = Vector3d.create();\n }\n /** Fill all evaluations at given theta and phi. */\n public evaluateDerivativesAtCurrentAngles(ellipsoid: Ellipsoid) {\n ellipsoid.radiansToPointAnd2Derivatives(this.thetaRadians, this.phiRadians, this.point, this.dTheta, this.dPhi, this.d2Theta, this.d2Phi, this.d2ThetaPhi);\n this.dTheta.crossProduct(this.dPhi, this.d1Cross);\n }\n private static _vectorAB?: Vector3d;\n private static _vectorCB?: Vector3d;\n private static _vectorCross?: Vector3d;\n /** Evaluate the newton function and derivatives:\n * `(UAB cross UCB) dot d1cross`\n * with as the central data, UAB = vector from pointA to pointB, UCB = vector from pointC to pointB.\n * * Return order is:\n * * values[0] = the function\n * * values[1] = derivative wrt pointA.phi\n * * values[2] = derivative wrt pointB.phi\n * * values[3] = derivative wrt pointC.phi\n */\n public static evaluateNewtonFunction(pointA: GeodesicPathPoint, pointB: GeodesicPathPoint, pointC: GeodesicPathPoint, values: Float64Array) {\n this._vectorAB = Vector3d.createStartEnd(pointA.point, pointB.point, this._vectorAB);\n this._vectorCB = Vector3d.createStartEnd(pointC.point, pointB.point, this._vectorCB);\n this._vectorCross = this._vectorAB.crossProduct(this._vectorCB);\n // this._vectorCross is the cross product of vectors from A to B and C to B\n // it should be perpendicular to (have zero dot product with) the surface normal, which is sitting in pointB as d1Cross\n values[0] = this._vectorCross.dotProduct(pointB.d1Cross);\n // Derivatives wrt phi at A, B, C creates derivatives of values[0] wrt each.\n // derivatives at neighbor appear only on their point-to-point vector, and with negative sign ..\n values[1] = - pointA.dPhi.tripleProduct(this._vectorCB, pointB.d1Cross);\n values[3] = - this._vectorAB.tripleProduct(pointC.dPhi, pointB.d1Cross);\n // values from pointB appear with positive sign everywhere . ..\n values[2] = pointB.dPhi.tripleProduct(this._vectorCB, pointB.d1Cross)\n + this._vectorAB.tripleProduct(pointB.dPhi, pointB.d1Cross)\n + this._vectorCross.tripleProduct(pointB.d2ThetaPhi, pointB.dPhi)\n + this._vectorCross.tripleProduct(pointB.dTheta, pointB.d2Phi);\n // CRUNCH CRUNCH CRUNCH\n }\n /**\n * Extract the two angles form this structure to a LongitudeLatitudeNumber structure.\n */\n public toAngles(): LongitudeLatitudeNumber {\n return LongitudeLatitudeNumber.createRadians(this.thetaRadians, this.phiRadians);\n }\n}\n/**\n * Algorithm implementation class for computing approximate optimal (shortest) path points.\n * * Call the static method `createGeodesicPath` to compute path points.\n * @public\n */\nexport class GeodesicPathSolver {\n private _defaultArc: Arc3d;\n private _pathPoints: GeodesicPathPoint[];\n private _tridiagonalSolver!: TriDiagonalSystem;\n private constructor(defaultArc: Arc3d) {\n this._pathPoints = [];\n this._defaultArc = defaultArc;\n }\n /**\n *\n * @param originalEllipsoid Given start and endpoints on an ellipsoid, compute points along a near-optimal shortest path.\n * * The points are located so that at each point the local surface normal is contained in the plane of the point and its two neighbors.\n * @param startAngles angles for the start of the path\n * @param endAngles angles for the end of the path\n * @param density If this is a number, it is the requested edge count. If this is an angle, it ias an angular spacing measured in the great arc through the two points.\n */\n public static createGeodesicPath(originalEllipsoid: Ellipsoid,\n startAngles: LongitudeLatitudeNumber, endAngles: LongitudeLatitudeNumber, density: number | Angle): GeodesicPathPoint[] | undefined {\n const workEllipsoid1 = originalEllipsoid.radiansPairToEquatorialEllipsoid(startAngles.longitudeRadians, startAngles.latitudeRadians,\n endAngles.longitudeRadians, endAngles.latitudeRadians);\n const workArc = originalEllipsoid.radiansPairToGreatArc(startAngles.longitudeRadians, startAngles.latitudeRadians,\n endAngles.longitudeRadians, endAngles.latitudeRadians);\n if (workEllipsoid1 === undefined || workArc === undefined)\n return undefined;\n let numEdges = 4;\n if (density instanceof Angle) {\n numEdges = Geometry.stepCount(density.radians, workArc.sweep.sweepRadians, 4, 180);\n } else if (Number.isFinite(density)) {\n numEdges = Math.max(numEdges, density);\n }\n if (numEdges > 180)\n numEdges = 180;\n const scaledMatrix = workEllipsoid1.transformRef.matrix.clone();\n const largestCoordinate = scaledMatrix.maxAbs();\n const inverseLargestCoordinate = 1.0 / largestCoordinate;\n scaledMatrix.scaleColumnsInPlace(inverseLargestCoordinate, inverseLargestCoordinate, inverseLargestCoordinate);\n const workEllipsoid = Ellipsoid.create(Transform.createOriginAndMatrix(undefined, scaledMatrix));\n\n const solver = new GeodesicPathSolver(workArc);\n solver.createInitialPointsAndTridiagonalSystem(numEdges);\n\n let numConverged = 0;\n let previousMaxDPhi = 10000.0;\n let numStep = 0;\n const dPhiTolerance = 1.0e-8;\n solver.setupStep(workEllipsoid);\n while (numStep < 15 && numConverged < 2) {\n if (!solver.solve())\n break;\n previousMaxDPhi = solver.applyUpdate(0.1);\n solver.setupStep(workEllipsoid);\n if (previousMaxDPhi < dPhiTolerance)\n numConverged++;\n else\n numConverged = 0;\n numStep++;\n }\n if (numConverged > 0) {\n const workAngles = LongitudeLatitudeNumber.createRadians(0, 0);\n const originalAngles = LongitudeLatitudeNumber.createRadians(0, 0);\n for (const p of solver._pathPoints) {\n LongitudeLatitudeNumber.createRadians(p.thetaRadians, p.phiRadians, 0, workAngles);\n originalEllipsoid.otherEllipsoidAnglesToThisEllipsoidAngles(workEllipsoid, workAngles, originalAngles);\n p.thetaRadians = originalAngles.longitudeRadians;\n p.phiRadians = originalAngles.latitudeRadians;\n p.evaluateDerivativesAtCurrentAngles(originalEllipsoid);\n }\n return solver._pathPoints;\n }\n return numConverged > 0 ? solver._pathPoints : undefined;\n }\n private createInitialPointsAndTridiagonalSystem(numEdges: number) {\n if (numEdges < 2)\n numEdges = 2;\n let f, thetaRadians;\n for (let i = 0; i <= numEdges; i++) {\n f = i / numEdges;\n thetaRadians = this._defaultArc.sweep.fractionToRadians(f);\n const p = new GeodesicPathPoint();\n p.thetaRadians = thetaRadians;\n p.phiRadians = 0.0;\n this._pathPoints.push(p);\n }\n this._tridiagonalSolver = new TriDiagonalSystem(this._pathPoints.length);\n }\n private applyUpdate(maxDPhiRadians: number): number {\n let dPhiMax = 0;\n for (let i = 0; i < this._pathPoints.length; i++) {\n const dPhi = Geometry.clampToStartEnd(this._tridiagonalSolver.getX(i), -maxDPhiRadians, maxDPhiRadians);\n this._pathPoints[i].phiRadians -= dPhi;\n dPhiMax = Geometry.maxAbsXY(dPhiMax, dPhi);\n }\n return dPhiMax;\n }\n\n /**\n * Set up a step with specified ellipsoid.\n * * ASSUME angles in _pathPoints are valid on given ellipsoid.\n * @param ellipsoid\n */\n private setupStep(ellipsoid: Ellipsoid) {\n for (const p of this._pathPoints) {\n p.evaluateDerivativesAtCurrentAngles(ellipsoid);\n }\n const lastRow = this._pathPoints.length - 1;\n // first and last points get trivial dPhi=0 equations:\n this._tridiagonalSolver.reset();\n this._tridiagonalSolver.addToRow(0, 0, 1, 0);\n this._tridiagonalSolver.addToB(0, 0);\n this._tridiagonalSolver.addToRow(lastRow, 0, 1, 0);\n this._tridiagonalSolver.addToB(lastRow, 0);\n\n // interior points get proper newton equations\n const values = new Float64Array(4);\n for (let i = 1; i < lastRow; i++) {\n GeodesicPathPoint.evaluateNewtonFunction(this._pathPoints[i - 1], this._pathPoints[i], this._pathPoints[i + 1], values);\n this._tridiagonalSolver.addToRow(i, values[1], values[2], values[3]);\n this._tridiagonalSolver.addToB(i, values[0]);\n }\n }\n\n private solve(): boolean {\n return this._tridiagonalSolver.factorAndBackSubstitute();\n }\n /**\n * Construct various section arcs (on the ellipsoid), using planes that (a) pass through the two given points and (b) have in-plane vector sampled between the normals of the two points.\n * * Each candidate ellipse has is in a plane with ellipsoid normal at vector constructed \"between\" the endpoint normals.\n * * The intermediate construction is by interpolation between stated fractions (which maybe outside 0 to 1)\n * @param ellipsoid\n * @param angleA start point of all candidates\n * @param angleB end point of all candidates\n * @param numSample number of ellipses to construct as candidates.\n * @param normalInterpolationFraction0\n * @param normalInterpolationFraction1\n */\n public static approximateMinimumLengthSectionArc(ellipsoid: Ellipsoid,\n angleA: LongitudeLatitudeNumber,\n angleB: LongitudeLatitudeNumber, numSample: number,\n normalInterpolationFraction0: number,\n normalInterpolationFraction1: number): { minLengthArc: Arc3d, minLengthNormalInterpolationFraction: number } | undefined {\n numSample = Geometry.clampToStartEnd(numSample, 2, 200);\n const normalA = ellipsoid.radiansToUnitNormalRay(angleA.longitudeRadians, angleA.latitudeRadians);\n const normalB = ellipsoid.radiansToUnitNormalRay(angleB.longitudeRadians, angleB.latitudeRadians);\n if (normalA !== undefined && normalB !== undefined) {\n let normalC;\n let resultArc;\n let lengthC;\n let fractionC;\n\n for (let i = 1; i <= numSample; i++) {\n const f = Geometry.interpolate(normalInterpolationFraction0, i / numSample, normalInterpolationFraction1);\n normalC = normalA.direction.interpolate(f, normalB.direction, normalC);\n const candidateArc = ellipsoid.createSectionArcPointPointVectorInPlane(angleA, angleB, normalC);\n if (candidateArc !== undefined) {\n const candidateLength = candidateArc.curveLength();\n if (lengthC === undefined || candidateLength < lengthC) {\n lengthC = candidateLength;\n resultArc = candidateArc;\n fractionC = f;\n }\n }\n }\n if (resultArc !== undefined && fractionC !== undefined)\n return { minLengthArc: resultArc, minLengthNormalInterpolationFraction: fractionC };\n }\n return undefined;\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Ellipsoid.js","sourceRoot":"","sources":["../../../src/geometry3d/Ellipsoid.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,4EAA0G;AAE1G,0CAAuC;AACvC,sEAAmE;AAEnE,0CAA6D;AAC7D,mDAAgD;AAChD,qEAA6D;AAC7D,+CAA6F;AAC7F,yDAA+F;AAC/F,qEAAkE;AAClE,mCAAgC;AAChC,6CAA0C;AAE1C,2EAAsE;AACtE,yCAAsC;AACtC,iFAA8E;AAC9E,2EAAwE;AACxE,uDAAsD;AACtD,mCAA2C;AAC3C,mCAAgC;AAChC,2CAAwC;AAGxC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,yBAAyB;IACtB,CAAC,CAAS;IACV,CAAC,CAAS;IACV,CAAC,CAAS;IACV,CAAC,CAAS;IACV,SAAS,CAAY;IACrB,aAAa,CAAS;IACtB,WAAW,CAAS;IACpB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,OAAO,CAAS;IACvB,0CAA0C;IAClC,UAAU,CAAU;IACpB,SAAS,CAAuB;IACxC,YAAmB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,SAAoB;QACjF,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,IAAI,kCAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAErD,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,kBAAkB,CAAC,SAAoB,EAAE,SAAoB;QACzE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7J,CAAC;IACM,iCAAiC,CAAC,KAAc,EAAE,aAAqB,EAAE,aAAqB,EAAE,WAAmB,EAAE,WAAmB;QAC7I,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACzG,IAAI,uBAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC;eAC/E,uBAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;YACvF,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,uBAAU,CAAC,mBAAmB,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC;eACzE,uBAAU,CAAC,mBAAmB,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;YACjF,yCAAyC;YACzC,oBAAoB;YACpB,mBAAmB;YACnB,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD;;;;;;OAMG;IACI,8BAA8B,CAAC,KAAc,EAAE,YAAoB,EAAE,WAAmB,EAAE,WAAmB;QAClH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACjF,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;;OAMG;IACI,4BAA4B,CAAC,KAAc,EAAE,aAAqB,EAAE,aAAqB,EAAE,UAAkB;QAClH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAC/E,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrF,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAa,SAAS;IACZ,UAAU,CAAY;IACtB,gBAAgB,CAAW;IAC3B,gBAAgB,CAAW;IAC3B,WAAW,CAAU;IACrB,WAAW,CAAU;IAC7B,YAAoB,SAAoB;QACtC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IACD;;OAEG;IACI,MAAM,CAAC,MAAM,CAAC,iBAAwC;QAC3D,IAAI,iBAAiB,YAAY,qBAAS;YACxC,OAAO,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;aACrC,IAAI,iBAAiB,YAAY,mBAAQ;YAC5C,OAAO,IAAI,SAAS,CAAC,qBAAS,CAAC,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;;YAEpF,OAAO,IAAI,SAAS,CAAC,qBAAS,CAAC,cAAc,EAAE,CAAC,CAAC;IACrD,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,uBAAuB,CAAC,MAAe,EAAE,IAA0B,EAAE,OAAe,EAAE,OAAe,EAAE,OAAe;QAClI,IAAI,UAAU,CAAC;QACf,IAAI,IAAI,KAAK,SAAS;YACpB,UAAU,GAAG,mBAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAE,CAAC;;YAE9D,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,IAAI,SAAS,CAAC,qBAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD;;;;;;OAMG;IACH,IAAW,YAAY,KAAgB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE;;;;;;OAMG;IACI,YAAY,CAAC,UAAkB,EAAE,MAAgB;QACtD,OAAO,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IACD;;;;;OAKG;IACI,YAAY,CAAC,UAAkB,EAAE,MAAgB;QACtD,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,2CAA2C;IACpC,KAAK;QACV,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,oCAAoC;IAC7B,aAAa,CAAC,KAAgB;QACnC,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IACD,wCAAwC;IACjC,mBAAmB,CAAC,SAAoB;QAC7C,SAAS,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;OAGG;IACI,gBAAgB,CAAC,SAAoB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;OAGG;IACI,qBAAqB,CAAC,UAAmB;QAC9C,MAAM,QAAQ,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,QAAiB;QACpC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,wEAAwE;YACxE,uEAAuE;YACvE,MAAM,WAAW,GAAG,iBAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACxG,MAAM,WAAW,GAAG,WAAW,CAAC,8BAA8B,EAAE,CAAC;YACjE,+GAA+G;YAC/G,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,EAAE,GAAG,GAAG,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAE,4CAA4C;gBAC7G,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;oBAC1B,MAAM,GAAG,GAAG,aAAK,CAAC,wBAAwB,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;oBAClH,IAAI,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC;wBAC1C,OAAO,GAAG,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;OAQG;IACI,YAAY,CAAC,GAAU,EAAE,YAAkC,EAAE,GAA0B,EAAE,eAAsD;QACpJ,IAAI,GAAG;YACL,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,IAAI,eAAe,KAAK,SAAS;YAC/B,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7B,IAAI,YAAY;YACd,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,mFAAmF;QACnF,+FAA+F;QAC/F,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,mBAAQ,CAAC,2BAA2B,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,CAAC,CAAC;QACX,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,4BAAc,CAAC,kBAAkB,CAAC,yBAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;YACxH,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE;oBAC1C,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;YAC7B,CAAC;YACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,4DAA4D;IACrD,yBAAyB,CAAC,aAAqB,EAAE,aAAqB,EAAE,WAAmB,EAAE,WAAmB,EAAE,MAAgB;QACvI,MAAM,QAAQ,GAAG,yBAAyB,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,yBAAyB,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,yBAAyB,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,MAAM;YACT,MAAM,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;;YAE9B,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,8BAA8B;QAC9B,+CAA+C;QAC/C,0CAA0C;QAC1C,4CAA4C;QAC5C,8BAA8B;QAC9B,QAAQ,CAAC,iCAAiC,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC3G,QAAQ,CAAC,iCAAiC,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC3G,QAAQ,CAAC,iCAAiC,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC3G,EAAE;QACF,IAAI,CAAC,aAAK,CAAC,mBAAmB,CAAC,aAAa,GAAG,aAAa,CAAC,EAAE,CAAC;YAC9D,QAAQ,CAAC,8BAA8B,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YACzF,QAAQ,CAAC,8BAA8B,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YACzF,QAAQ,CAAC,8BAA8B,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAEzF,QAAQ,CAAC,8BAA8B,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YACzF,QAAQ,CAAC,8BAA8B,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YACzF,QAAQ,CAAC,8BAA8B,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,aAAK,CAAC,mBAAmB,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,CAAC;YAC1D,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YACzF,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YACzF,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YAEzF,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YACzF,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YACzF,QAAQ,CAAC,4BAA4B,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACI,cAAc,CAAC,YAAoB,EAAE,UAAkB,EAAE,MAAgB;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3F,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,qBAAqB,CAC1B,aAAqB,EAAE,WAAmB,EAC1C,aAAqB,EAAE,WAAmB,EAC1C,MAAc;QACd,4BAAc,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzF,4BAAc,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzF,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxE,sEAAsE;QACtE,MAAM,MAAM,GAAG,mBAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,oBAAS,CAAC,GAAG,CAAE,CAAC;QAC7G,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACpE,OAAO,aAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EACnF,uBAAU,CAAC,qBAAqB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;OAEG;IACI,mBAAmB,CAAC,MAA+B,EAAE,MAA+B,EAAE,MAAc;QACzG,OAAO,IAAI,CAAC,qBAAqB,CAC/B,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9G,CAAC;IACD;;;OAGG;IACI,kBAAkB,CAAC,KAAmC;QAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,+FAA+F;YAC/F,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,yBAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,mBAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,oBAAS,CAAC,GAAG,CAAC,CAAC;gBACpF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7C,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;gBACpC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;gBAErC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACjD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACnD,OAAO,aAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;OAKG;IACI,uCAAuC,CAAC,YAAqC,EAAE,YAAqC,EAAE,aAAuB,EAClJ,MAAc;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,gBAAgB,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;QAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,gBAAgB,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,mBAAmB,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,mBAAmB,KAAK,SAAS;YACnC,OAAO,SAAS,CAAC;QACnB,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;QACvF,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACrF,MAAM,UAAU,GAAG,2DAA4B,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;YAClH,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,+FAA+F;gBAC/F,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,yBAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,0BAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACxD,MAAM,OAAO,GAAG,0BAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,0BAAQ,CAAC,8BAA8B,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC,CAAC;gBACxG,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;oBACjF,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAChD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACjD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACnD,OAAO,aAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,uBAAU,CAAC,qBAAqB,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC5G,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;;;;OAUG;IACI,gCAAgC,CACrC,aAAqB,EAAE,WAAmB,EAC1C,aAAqB,EAAE,WAAmB,EAC1C,MAAkB;QAClB,4BAAc,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzF,4BAAc,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAEzF,MAAM,MAAM,GAAG,mBAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,oBAAS,CAAC,GAAG,CAAC,CAAC;QAC5G,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;gBACrE,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;OAKG;IACI,oBAAoB,CAAC,SAAgB,EAAE,aAAyB,EAAE,MAAc;QACrF,IAAI,aAAK,CAAC,iCAAiC,CAAC,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC;YACxE,OAAO,SAAS,CAAC;QACnB,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAC3C,OAAO,aAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IACD;;;;;OAKG;IACI,mBAAmB,CAAC,cAA0B,EAAE,QAAe,EAAE,MAAc;QACpF,IAAI,aAAK,CAAC,iCAAiC,CAAC,CAAC,EAAE,cAAc,CAAC,YAAY,CAAC;YACzE,OAAO,SAAS,CAAC;QACnB,IAAI,QAAQ,CAAC,wBAAwB;YACnC,OAAO,SAAS,CAAC;QACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,aAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IACD;;;;;;OAMG;IACI,gCAAgC,CACrC,MAA+B,EAC/B,0BAAkC,EAClC,MAA+B;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAE,CAAC;QAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAE,CAAC;QAC9F,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,0BAA0B,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,uCAAuC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjF,OAAO,GAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACI,4BAA4B,CAAC,YAAoB,EAAE,UAAkB,EAAE,iBAAiB,GAAG,IAAI,EAAE,MAAkC;QACxI,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,MAAM;YACT,OAAO,qDAAyB,CAAC,aAAa,CAC5C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,EACzE,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC,EAC9D,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACxE,+EAA+E;QAC/E,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACzF,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACnF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;;;;;;;OAYG;IACI,6BAA6B,CAAC,YAAoB,EAAE,UAAkB,EAC3E,KAAc,EACd,OAAiB,EACjB,KAAe,EACf,YAAsB,EACtB,QAAkB,EAClB,UAAoB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACjF,oBAAoB;QACpB,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAE5E,kBAAkB;QAClB,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1E,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE9E,mBAAmB;QACnB,MAAM,CAAC,WAAW,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;;;OAOG;IACI,oBAAoB,CAAC,YAAoB,EAAE,UAAkB,EAAE,MAAkB;QACtF,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD;;;;;;OAMG;IACI,sBAAsB,CAAC,YAAoB,EAAE,UAAkB,EAAE,MAAc;QACpF,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,qBAAqB,CAAC,MAAgB,EAAE,MAAgC;QAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,MAAM,eAAe,GAAG,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;QACtE,oBAAoB;QACpB,MAAM,GAAG,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACvG,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,mDAAuB,CAAC,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtF,CAAC;IAED;;;;OAIG;IACI,yCAAyC,CAAC,cAAqC,EAAE,WAAoC,EAAE,MAAgC;QAC5J,MAAM,MAAM,GAAG,SAAS,CAAC,sBAAsB,CAAC,cAAc,EAAE,WAAW,CAAC,gBAAgB,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;QAC3H,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,sBAAsB,CAAC,SAAgC,EAAE,YAAoB,EAAE,UAAkB,EAAE,MAAc;QAC7H,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,sBAAsB,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,MAAM;YACT,MAAM,GAAG,aAAK,CAAC,WAAW,EAAE,CAAC;QAC/B,4FAA4F;QAC5F,4BAAc,CAAC,sBAAsB,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,uDAAuD;IAChD,iBAAiB,CAAC,KAAc;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACnF,IAAI,UAAU,KAAK,SAAS;YAC1B,OAAO,UAAU,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,+GAA+G;IACxG,+BAA+B,CAAC,EAAU,EAAE,EAAU,EAAE,MAAe,EAAE,MAAe,EAAE,QAA+B;QAC9H,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChF,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9E,MAAM,MAAM,GAAG,IAAI,gCAAY,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,2DAA2D;gBAC3D,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;oBACZ,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;wBACf,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAChB,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;wBACf,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAChB,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxB,IAAI,QAAQ;4BACV,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/B,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,uDAAuD;oBACvD,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;wBACf,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAChB,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;wBACf,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAChB,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxB,IAAI,QAAQ;4BACV,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/B,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,0GAA0G;IACnG,2BAA2B,CAAC,GAAU,EAAE,QAA6C;QAC1F,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;eACrE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;eACxE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChF,+GAA+G;YAC/G,8BAA8B;YAC9B,sLAAsL;YACtL,MAAM,EAAE,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACvE,MAAM,EAAE,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACxE,MAAM,EAAE,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzE,MAAM,EAAE,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1E,MAAM,EAAE,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACzE,MAAM,EAAE,GAAG,0BAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3E,MAAM,mBAAmB,GAAa,EAAE,CAAC;YAEzC,IAAI,4BAAc,CAAC,0CAA0C,CAC3D,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAChB,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAC5B,mBAAmB,CAAC,EAAE,CAAC;gBACvB,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC7B,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;oBAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,OAAO,CAAC,CAAC;oBACpE,IAAI,mBAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;wBAC3B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC;gBACD,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,EAAE,EAAE,EAAE,CAAC;gBACX,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC7C,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBACvB,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;oBACnB,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;wBACZ,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,mBAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBAC7F,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;4BAChC,IAAI,QAAQ;gCACV,QAAQ,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;4BAClD,WAAW,EAAE,CAAC;wBAChB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,WAAW,GAAG,CAAC,CAAC;IACzB,CAAC;CACF;AAtmBD,8BAsmBC;AACD;;;;;;;GAOG;AACH,MAAa,cAAc;IAClB,SAAS,CAAY;IACrB,cAAc,CAAa;IAC3B,aAAa,CAAa;IACjC;;;;;OAKG;IACH,YAAoB,SAAoB,EAAE,cAA0B,EAAE,aAAyB;QAC7F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,aAAa,CAAC,SAAoB,EAAE,cAA0B,EAAE,aAAyB;QACrG,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IACtE,CAAC;IACD,uFAAuF;IAChF,iBAAiB,CAAC,iBAAyB,EAAE,gBAAwB,EAAE,MAAgB;QAC5F,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;IACjK,CAAC;IACD;;OAEG;IACI,4BAA4B,CAAC,iBAAyB,EAAE,gBAAwB,EAAE,MAAkC;QACzH,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,4BAA4B,CAClD,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EACxD,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EACtD,IAAI,EACJ,MAAM,CAAC,CAAC;QACV,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,qFAAqF;IAC9E,KAAK,CAAC,MAAgB;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5L,CAAC;IACD;;OAEG;IACI,YAAY,CAAC,GAAU,EAAE,eAAwB,EAAE,wCAAiD,KAAK;QAC9G,MAAM,MAAM,GAAoC,EAAE,CAAC;QACnD,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAA8B,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;YACtD,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;YAEpD,IAAI,CAAC,eAAe;mBACf,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;uBACrD,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;gBAC7D,IAAI,qCAAqC,EAAE,CAAC;oBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;oBACxF,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,+BAA+B,CAAC,eAAe,CAAC,CAAC;oBACtF,MAAM,CAAC,IAAI,CAAC,IAAI,qDAA6B,CAC3C,yCAAmB,CAAC,sBAAsB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EACxE,+CAAuB,CAAC,2BAA2B,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9F,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,IAAI,qDAA6B,CAC3C,yCAAmB,CAAC,sBAAsB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EACxE,+CAAuB,CAAC,2BAA2B,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3G,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACI,cAAc,CAAC,QAAiC,EAAE,yBAAkC,IAAI;QAC7F,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC;eACtE,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;IAC/F,CAAC;IAED;;;;;;;;OAQG;IACI,qBAAqB,CAAC,QAAiC,EAAE,MAAc;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC/G,IAAI,CAAC,GAAG;YACN,OAAO,SAAS,CAAC;QACnB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,GAAG,CAAC;IACb,CAAC;IACD;;;;;;OAMG;IACI,kBAAkB,CAAC,iBAAyB,EAAE,WAAmB,EAAE,IAAY,CAAC,EAAE,MAAgC;QACvH,OAAO,mDAAuB,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvK,CAAC;IACD,8DAA8D;IACvD,qBAAqB,CAAC,UAAmB;QAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;CACF;AArHD,wCAqHC;AACD;;GAEG;AACH,MAAM,qBAAsB,SAAQ,+BAAsB;IAChD,UAAU,CAAY;IACtB,WAAW,CAAW;IACtB,aAAa,CAAU;IACvB,QAAQ,CAAW;IACnB,QAAQ,CAAW;IACnB,MAAM,CAAW;IACjB,MAAM,CAAW;IACjB,WAAW,CAAW;IACtB,MAAM,CAAW;IACzB,YAAmB,SAAoB;QACrC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAErC,IAAI,CAAC,MAAM,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;IAClC,CAAC;IACM,kBAAkB,CAAC,UAAmB;QAC3C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,CAAC,UAAU;YACb,OAAO,SAAS,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,4BAAc,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,IAAI,wCAA+B,CAAC,IAAI,CAAC,CAAC;QACjE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,cAAc,CAAC,aAAa,EAAE,EAAE,CAAC;YACnC,EAAE,CAAC,YAAY,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;YACxC,EAAE,CAAC,UAAU,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,mDAAuB,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACpF,CAAC;IACM,QAAQ,CAAC,YAAoB,EAAE,UAAkB;QACtD,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC,YAAY,EAAE,UAAU,EACpE,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAC1B,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAC1B,IAAI,CAAC,WAAW,CAAC,CAAC;QACpB,0BAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3F,IAAI,CAAC,QAAQ,CAAC,sBAAsB;QAClC,QAAQ;QACR,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7E,0BAA0B;QAC1B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACrF,sBAAsB;QACtB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AACD;;;GAGG;AACH,MAAa,iBAAiB;IAC5B,8BAA8B;IACvB,YAAY,CAAS;IAC5B,+BAA+B;IACxB,UAAU,CAAS;IACnB,KAAK,CAAU;IACf,MAAM,CAAW;IACjB,IAAI,CAAW;IACf,OAAO,CAAW;IAClB,KAAK,CAAW;IAChB,UAAU,CAAW;IACrB,OAAO,CAAW;IACzB;QACE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,0BAAQ,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IACD,mDAAmD;IAC5C,kCAAkC,CAAC,SAAoB;QAC5D,SAAS,CAAC,6BAA6B,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3J,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IACO,MAAM,CAAC,SAAS,CAAY;IAC5B,MAAM,CAAC,SAAS,CAAY;IAC5B,MAAM,CAAC,YAAY,CAAY;IACvC;;;;;;;;OAQG;IACI,MAAM,CAAC,sBAAsB,CAAC,MAAyB,EAAE,MAAyB,EAAE,MAAyB,EAAE,MAAoB;QACxI,IAAI,CAAC,SAAS,GAAG,0BAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,0BAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,2EAA2E;QAC3E,uHAAuH;QACvH,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,4EAA4E;QAC5E,gGAAgG;QAChG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxE,+DAA+D;QAC/D,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC;cACjE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;cACzD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC;cAC/D,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACjE,uBAAuB;IACzB,CAAC;IACD;;OAEG;IACI,QAAQ;QACb,OAAO,mDAAuB,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACnF,CAAC;CACF;AAhED,8CAgEC;AACD;;;;GAIG;AACH,MAAa,kBAAkB;IACrB,WAAW,CAAQ;IACnB,WAAW,CAAsB;IACjC,kBAAkB,CAAqB;IAC/C,YAAoB,UAAiB;QACnC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,kBAAkB,CAAC,iBAA4B,EAC3D,WAAoC,EAAE,SAAkC,EAAE,OAAuB;QACjG,MAAM,cAAc,GAAG,iBAAiB,CAAC,gCAAgC,CAAC,WAAW,CAAC,gBAAgB,EAAE,WAAW,CAAC,eAAe,EACjI,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,WAAW,CAAC,gBAAgB,EAAE,WAAW,CAAC,eAAe,EAC/G,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,cAAc,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;YACvD,OAAO,SAAS,CAAC;QACnB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,YAAY,aAAK,EAAE,CAAC;YAC7B,QAAQ,GAAG,mBAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACrF,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,QAAQ,GAAG,GAAG;YAChB,QAAQ,GAAG,GAAG,CAAC;QACjB,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAChE,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,wBAAwB,GAAG,GAAG,GAAG,iBAAiB,CAAC;QACzD,YAAY,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;QAC/G,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,qBAAS,CAAC,qBAAqB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QAEjG,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,uCAAuC,CAAC,QAAQ,CAAC,CAAC;QAEzD,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,eAAe,GAAG,OAAO,CAAC;QAC9B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,aAAa,GAAG,MAAM,CAAC;QAC7B,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAChC,OAAO,OAAO,GAAG,EAAE,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBACjB,MAAM;YACR,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAChC,IAAI,eAAe,GAAG,aAAa;gBACjC,YAAY,EAAE,CAAC;;gBAEf,YAAY,GAAG,CAAC,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,mDAAuB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,MAAM,cAAc,GAAG,mDAAuB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACnC,mDAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;gBACnF,iBAAiB,CAAC,yCAAyC,CAAC,aAAa,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;gBACvG,CAAC,CAAC,YAAY,GAAG,cAAc,CAAC,gBAAgB,CAAC;gBACjD,CAAC,CAAC,UAAU,GAAG,cAAc,CAAC,eAAe,CAAC;gBAC9C,CAAC,CAAC,kCAAkC,CAAC,iBAAiB,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;QACD,OAAO,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,CAAC;IACO,uCAAuC,CAAC,QAAgB;QAC9D,IAAI,QAAQ,GAAG,CAAC;YACd,QAAQ,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,EAAE,YAAY,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YACjB,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAClC,CAAC,CAAC,YAAY,GAAG,YAAY,CAAC;YAC9B,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,qCAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3E,CAAC;IACO,WAAW,CAAC,cAAsB;QACxC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,mBAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YACxG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC;YACvC,OAAO,GAAG,mBAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACK,SAAS,CAAC,SAAoB;QACpC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,CAAC,CAAC,kCAAkC,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,sDAAsD;QACtD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE3C,8CAA8C;QAC9C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,iBAAiB,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACxH,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,KAAK;QACX,OAAO,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,EAAE,CAAC;IAC3D,CAAC;IACD;;;;;;;;;;OAUG;IACI,MAAM,CAAC,kCAAkC,CAAC,SAAoB,EACnE,MAA+B,EAC/B,MAA+B,EAAE,SAAiB,EAClD,4BAAoC,EACpC,4BAAoC;QACpC,SAAS,GAAG,mBAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,SAAS,CAAC,sBAAsB,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;QAClG,MAAM,OAAO,GAAG,SAAS,CAAC,sBAAsB,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;QAClG,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACnD,IAAI,OAAO,CAAC;YACZ,IAAI,SAAS,CAAC;YACd,IAAI,OAAO,CAAC;YACZ,IAAI,SAAS,CAAC;YAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,mBAAQ,CAAC,WAAW,CAAC,4BAA4B,EAAE,CAAC,GAAG,SAAS,EAAE,4BAA4B,CAAC,CAAC;gBAC1G,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACvE,MAAM,YAAY,GAAG,SAAS,CAAC,uCAAuC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChG,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,eAAe,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;oBACnD,IAAI,OAAO,KAAK,SAAS,IAAI,eAAe,GAAG,OAAO,EAAE,CAAC;wBACvD,OAAO,GAAG,eAAe,CAAC;wBAC1B,SAAS,GAAG,YAAY,CAAC;wBACzB,SAAS,GAAG,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;gBACpD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,oCAAoC,EAAE,SAAS,EAAE,CAAC;QACxF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CAEF;AAxKD,gDAwKC","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\n\r\nimport { CurveAndSurfaceLocationDetail, UVSurfaceLocationDetail } from \"../bspline/SurfaceLocationDetail\";\r\nimport { Clipper } from \"../clipping/ClipUtils\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\r\nimport { AnnounceNumberNumber, AnnounceNumberNumberCurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { AxisIndex, AxisOrder, Geometry } from \"../Geometry\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { Order3Bezier } from \"../numerics/BezierPolynomials\";\r\nimport { Newton2dUnboundedWithDerivative, NewtonEvaluatorRRtoRRD } from \"../numerics/Newton\";\r\nimport { SineCosinePolynomial, SphereImplicit, TrigPolynomial } from \"../numerics/Polynomials\";\r\nimport { TriDiagonalSystem } from \"../numerics/TriDiagonalSystem\";\r\nimport { Angle } from \"./Angle\";\r\nimport { AngleSweep } from \"./AngleSweep\";\r\nimport { UVSurface } from \"./GeometryHandler\";\r\nimport { LongitudeLatitudeNumber } from \"./LongitudeLatitudeAltitude\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"./Plane3dByOriginAndVectors\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Range1d, Range3d } from \"./Range\";\r\nimport { Ray3d } from \"./Ray3d\";\r\nimport { Transform } from \"./Transform\";\r\nimport { XYAndZ } from \"./XYZProps\";\r\n\r\n/**\r\n * For one component (x,y, or z) on the sphere\r\n * f(theta,phi) = c + (u * cos(theta) + v * sin(theta)) * cos(phi) + w * sin(phi)\r\n *\r\n * For the equator circle, phi=0, cos(phi) = 1, sin(phi)=0\r\n * f = u * cos(theta) + v * sin(theta).\r\n * with derivative\r\n * df / dTheta = - u * sin(theta) + v * cos(theta)\r\n * whose zero is tan(theta) = v/u\r\n * (and that has two solutions 180 degrees apart)\r\n * Then with that theta let A = u * cos(theta) + v * sin(theta)\r\n * f = A * cos(phi) + w * sin(phi)\r\n * df/dPhi = - A * sin(phi) + w * cos(phi)\r\n * tan(phi) = w / A\r\n * @internal\r\n */\r\nclass EllipsoidComponentExtrema {\r\n public c: number;\r\n public u: number;\r\n public v: number;\r\n public w: number;\r\n public axisIndex: AxisIndex;\r\n public theta0Radians: number;\r\n public phi0Radians: number;\r\n public cosTheta0: number;\r\n public sinTheta0: number;\r\n public cosPhi0: number;\r\n public sinPhi0: number;\r\n // temp vars used in arc range evaluation:\r\n private _axisRange: Range1d;\r\n private _trigForm: SineCosinePolynomial;\r\n public constructor(c: number, u: number, v: number, w: number, axisIndex: AxisIndex) {\r\n this.c = c;\r\n this.u = u;\r\n this.v = v;\r\n this.w = w;\r\n this.axisIndex = axisIndex;\r\n this.theta0Radians = Math.atan2(v, u);\r\n this.cosTheta0 = Math.cos(this.theta0Radians);\r\n this.sinTheta0 = Math.sin(this.theta0Radians);\r\n const A0 = u * this.cosTheta0 + v * this.sinTheta0;\r\n this.phi0Radians = Math.atan2(w, A0);\r\n this.cosPhi0 = Math.cos(this.phi0Radians);\r\n this.sinPhi0 = Math.sin(this.phi0Radians);\r\n this._axisRange = Range1d.createNull();\r\n this._trigForm = new SineCosinePolynomial(0, 0, 0);\r\n\r\n }\r\n /**\r\n * Create a component object with coefficients from a row of a `Transform`.\r\n * @param transform source transform.\r\n * @param axisIndex row index within the transform.\r\n */\r\n public static createTransformRow(transform: Transform, axisIndex: AxisIndex): EllipsoidComponentExtrema {\r\n const matrix = transform.matrix;\r\n return new EllipsoidComponentExtrema(transform.origin.at(axisIndex), matrix.at(axisIndex, 0), matrix.at(axisIndex, 1), matrix.at(axisIndex, 2), axisIndex);\r\n }\r\n public extendRangeForSmoothSurfacePoints(range: Range3d, theta0Radians: number, theta1Radians: number, phi0Radians: number, phi1Radians: number) {\r\n const delta = (this.u * this.cosTheta0 + this.v * this.sinTheta0) * this.cosPhi0 + this.w * this.sinPhi0;\r\n if (AngleSweep.isRadiansInStartEnd(this.theta0Radians, theta0Radians, theta1Radians)\r\n && AngleSweep.isRadiansInStartEnd(this.phi0Radians, phi0Radians, phi1Radians, false)) {\r\n range.extendSingleAxis(this.c + delta, this.axisIndex);\r\n }\r\n const thetaRadians = this.theta0Radians + Math.PI;\r\n const phiRadians = -this.phi0Radians;\r\n if (AngleSweep.isRadiansInStartEnd(thetaRadians, theta0Radians, theta1Radians)\r\n && AngleSweep.isRadiansInStartEnd(phiRadians, phi0Radians, phi1Radians, false)) {\r\n // cosTheta and sinTheta are both negated\r\n // sinPhi is negated\r\n // delta is negated\r\n range.extendSingleAxis(this.c - delta, this.axisIndex);\r\n }\r\n }\r\n /**\r\n * Extend range to include extrema of a phi-bounded arc at constant theta (i.e. a polar circle)\r\n * @param range range to extend\r\n * @param thetaRadians theta for arc\r\n * @param phi0Radians limit value on arc sweep\r\n * @param phi1Radians limit value on arc sweep\r\n */\r\n public extendRangeForConstantThetaArc(range: Range3d, thetaRadians: number, phi0Radians: number, phi1Radians: number) {\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n this._trigForm.set(this.c, (this.u * cosTheta + this.v * sinTheta), this.w);\r\n this._trigForm.rangeInStartEndRadians(phi0Radians, phi1Radians, this._axisRange);\r\n range.extendSingleAxis(this._axisRange.low, this.axisIndex);\r\n range.extendSingleAxis(this._axisRange.high, this.axisIndex);\r\n }\r\n\r\n /**\r\n * Extend range to include extrema of a theta-bounded arc at constant phi (i.e. a circle parallel to the equator)\r\n * @param range range to extend\r\n * @param phiRadians phi for arc\r\n * @param theta0Radians limit value on arc sweep\r\n * @param theta1Radians limit value on arc sweep\r\n */\r\n public extendRangeForConstantPhiArc(range: Range3d, theta0Radians: number, theta1Radians: number, phiRadians: number) {\r\n const cosPhi = Math.cos(phiRadians);\r\n const sinPhi = Math.sin(phiRadians);\r\n this._trigForm.set(this.c + this.w * sinPhi, this.u * cosPhi, this.v * cosPhi);\r\n this._trigForm.rangeInStartEndRadians(theta0Radians, theta1Radians, this._axisRange);\r\n range.extendSingleAxis(this._axisRange.low, this.axisIndex);\r\n range.extendSingleAxis(this._axisRange.high, this.axisIndex);\r\n }\r\n}\r\n\r\n/**\r\n * A complete unit sphere mapped by an arbitrary [[Transform]].\r\n * * The (unit) sphere parameterization with respect to longitude `theta` and latitude `phi` is\r\n * * `u = cos(theta) * cos (phi)`\r\n * * `v = sin(theta) * cos(phi)`\r\n * * `w = sin(phi)`\r\n * * The sphere (u,v,w) multiply the x,y,z columns of the Ellipsoid transform.\r\n * * Compare to [[Sphere]], which has the same parameterization, but is a [[SolidPrimitive]] with latitude sweep.\r\n * @public\r\n */\r\nexport class Ellipsoid implements Clipper {\r\n private _transform: Transform;\r\n private _workUnitVectorA: Vector3d;\r\n private _workUnitVectorB: Vector3d;\r\n private _workPointA: Point3d;\r\n private _workPointB: Point3d;\r\n private constructor(transform: Transform) {\r\n this._transform = transform;\r\n this._workUnitVectorA = Vector3d.create();\r\n this._workUnitVectorB = Vector3d.create();\r\n this._workPointA = Point3d.create();\r\n this._workPointB = Point3d.create();\r\n }\r\n /** Create with a clone (not capture) with given transform.\r\n * * If transform is undefined, create a unit sphere.\r\n */\r\n public static create(matrixOrTransform?: Transform | Matrix3d): Ellipsoid {\r\n if (matrixOrTransform instanceof Transform)\r\n return new Ellipsoid(matrixOrTransform);\r\n else if (matrixOrTransform instanceof Matrix3d)\r\n return new Ellipsoid(Transform.createOriginAndMatrix(undefined, matrixOrTransform));\r\n else\r\n return new Ellipsoid(Transform.createIdentity());\r\n }\r\n /**\r\n * Create a transform with given center and directions, applying the radii as multipliers for the respective columns of the axes.\r\n * @param center center of ellipsoid\r\n * @param axes x,y,z directions are columns of this matrix\r\n * @param radiusX multiplier to be applied to the x direction\r\n * @param radiusY multiplier to be applied to the y direction\r\n * @param radiusZ multiplier to be applied to the z direction\r\n */\r\n public static createCenterMatrixRadii(center: Point3d, axes: Matrix3d | undefined, radiusX: number, radiusY: number, radiusZ: number): Ellipsoid {\r\n let scaledAxes;\r\n if (axes === undefined)\r\n scaledAxes = Matrix3d.createScale(radiusX, radiusY, radiusZ)!;\r\n else\r\n scaledAxes = axes.scaleColumns(radiusX, radiusY, radiusZ);\r\n return new Ellipsoid(Transform.createOriginAndMatrix(center, scaledAxes));\r\n }\r\n /** Return a (REFERENCE TO) the transform from world space to the mapped sphere space.\r\n * * This maps coordinates \"relative to the sphere\" to world.\r\n * * Its inverse maps world coordinates into the sphere space.\r\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\r\n */\r\n public get transformRef(): Transform { return this._transform; }\r\n /**\r\n * * Convert a world point to point within the underlying mapped sphere space.\r\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\r\n * * This is undefined in the highly unusual case that the ellipsoid frame is singular.\r\n */\r\n public worldToLocal(worldPoint: XYAndZ, result?: Point3d): Point3d | undefined {\r\n return this._transform.multiplyInversePoint3d(worldPoint, result);\r\n }\r\n /**\r\n * * Convert a point within the underlying mapped sphere space to world coordinates.\r\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\r\n */\r\n public localToWorld(localPoint: XYAndZ, result?: Point3d): Point3d {\r\n return this._transform.multiplyPoint3d(localPoint, result);\r\n }\r\n\r\n /** return a clone with same coordinates */\r\n public clone(): Ellipsoid {\r\n return new Ellipsoid(this._transform.clone());\r\n }\r\n /** test equality of the 4 points */\r\n public isAlmostEqual(other: Ellipsoid): boolean {\r\n return this._transform.isAlmostEqual(other._transform);\r\n }\r\n /** Apply the transform to each point */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n transform.multiplyTransformTransform(this._transform, this._transform);\r\n return true;\r\n }\r\n /**\r\n * return a cloned and transformed ellipsoid.\r\n * @param transform\r\n */\r\n public cloneTransformed(transform: Transform): Ellipsoid | undefined {\r\n const result = this.clone();\r\n result.tryTransformInPlace(transform);\r\n return result;\r\n }\r\n /** Find the closest point of the (patch of the) ellipsoid.\r\n * * In general there are multiple points where a space point projects onto an ellipse.\r\n * * This searches for only one point, using heuristics which are reliable for points close to the surface but not for points distant from highly skewed ellipsoid\r\n */\r\n public projectPointToSurface(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\r\n const searcher = new EllipsoidClosestPoint(this);\r\n return searcher.searchClosestPoint(spacePoint);\r\n }\r\n\r\n /** Find the silhouette of the ellipsoid as viewed from a homogeneous eyepoint.\r\n * * Returns undefined if the eyepoint is inside the ellipsoid\r\n */\r\n public silhouetteArc(eyePoint: Point4d): Arc3d | undefined {\r\n const localEyePoint = this._transform.multiplyInversePoint4d(eyePoint);\r\n if (localEyePoint !== undefined) {\r\n // localEyePoint is now looking at a unit sphere centered at the origin.\r\n // the plane through the silhouette is the eye point with z negated ...\r\n const localPlaneA = Point4d.create(localEyePoint.x, localEyePoint.y, localEyePoint.z, -localEyePoint.w);\r\n const localPlaneB = localPlaneA.toPlane3dByOriginAndUnitNormal();\r\n // if the silhouette plane has origin inside the sphere, there is a silhouette with center at the plane origin.\r\n if (localPlaneB) {\r\n const rr = 1.0 - localPlaneB.getOriginRef().magnitudeSquared(); // squared distance radius of silhouette arc\r\n if (rr > 0.0 && rr <= 1.0) {\r\n const arc = Arc3d.createCenterNormalRadius(localPlaneB.getOriginRef(), localPlaneB.getNormalRef(), Math.sqrt(rr));\r\n if (arc.tryTransformInPlace(this._transform))\r\n return arc;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Compute intersections with a ray.\r\n * * Return the number of intersections\r\n * * Fill any combinations of arrays of\r\n * * rayFractions = fractions along the ray\r\n * * xyz = xyz intersection coordinates points in space\r\n * * thetaPhiRadians = sphere longitude and latitude in radians.\r\n * * For each optional array, caller must of course initialize an array (usually empty)\r\n * * return 0 if ray length is too small.\r\n */\r\n public intersectRay(ray: Ray3d, rayFractions: number[] | undefined, xyz: Point3d[] | undefined, thetaPhiRadians: LongitudeLatitudeNumber[] | undefined): number {\r\n if (xyz)\r\n xyz.length = 0;\r\n if (thetaPhiRadians !== undefined)\r\n thetaPhiRadians.length = 0;\r\n if (rayFractions)\r\n rayFractions.length = 0;\r\n // if ray comes in unit vector in large ellipsoid, localRay direction is minuscule.\r\n // use a ray scaled up so its direction vector magnitude is comparable to the ellipsoid radiusX\r\n const ray1 = ray.clone();\r\n const a0 = ray.direction.magnitude();\r\n const aX = this._transform.matrix.columnXMagnitude();\r\n const scale = Geometry.conditionalDivideCoordinate(aX, a0);\r\n if (scale === undefined)\r\n return 0;\r\n ray1.direction.scaleInPlace(scale);\r\n const localRay = ray1.cloneInverseTransformed(this._transform);\r\n if (localRay !== undefined) {\r\n const n = SphereImplicit.intersectSphereRay(Point3d.create(0, 0, 0), 1.0, localRay, rayFractions, xyz, thetaPhiRadians);\r\n if (rayFractions !== undefined) {\r\n for (let i = 0; i < rayFractions.length; i++)\r\n rayFractions[i] *= scale;\r\n }\r\n if (xyz !== undefined) {\r\n this._transform.multiplyPoint3dArrayInPlace(xyz);\r\n }\r\n return n;\r\n }\r\n return 0;\r\n }\r\n\r\n /** Return the range of a uv-aligned patch of the sphere. */\r\n public patchRangeStartEndRadians(theta0Radians: number, theta1Radians: number, phi0Radians: number, phi1Radians: number, result?: Range3d): Range3d {\r\n const xExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 0);\r\n const yExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 1);\r\n const zExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 2);\r\n if (!result)\r\n result = Range3d.createNull();\r\n else\r\n result.setNull();\r\n // Range extrema can occur at:\r\n // * 2 smooth surface points in each direction\r\n // * along low and high phi boundary arcs\r\n // * along low and high theta boundary arcs\r\n // smooth surface extrema . ..\r\n xExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\r\n yExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\r\n zExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\r\n //\r\n if (!Angle.isFullCircleRadians(theta1Radians - theta0Radians)) {\r\n xExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\r\n yExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\r\n zExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\r\n\r\n xExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\r\n yExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\r\n zExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\r\n }\r\n if (!Angle.isHalfCircleRadians(phi1Radians - phi0Radians)) {\r\n xExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\r\n yExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\r\n zExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\r\n\r\n xExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\r\n yExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\r\n zExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Evaluate a point on the ellipsoid at angles give in radians.\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param result optional point result\r\n */\r\n public radiansToPoint(thetaRadians: number, phiRadians: number, result?: Point3d): Point3d {\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const cosPhi = Math.cos(phiRadians);\r\n const sinPhi = Math.sin(phiRadians);\r\n return this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, result);\r\n }\r\n\r\n /**\r\n * * For a given pair of points on an ellipsoid, construct an arc (possibly elliptical) which\r\n * * passes through both points\r\n * * is completely within the ellipsoid surface\r\n * * has its centerEvaluate a point on the ellipsoid at angles give in radians.\r\n * * If the ellipsoid is a sphere, this is the shortest great-circle arc between the two points.\r\n * * If the ellipsoid is not a sphere, this is close to but not precisely the shortest path.\r\n * @param thetaARadians longitude, in radians, for pointA\r\n * @param phiARadians latitude, in radians, for pointA\r\n * @param thetaBRadians longitude, in radians, for pointB\r\n * @param phiBRadians latitude, in radians, for pointB\r\n * @param result optional preallocated result\r\n */\r\n public radiansPairToGreatArc(\r\n thetaARadians: number, phiARadians: number,\r\n thetaBRadians: number, phiBRadians: number,\r\n result?: Arc3d): Arc3d | undefined {\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaARadians, phiARadians, this._workUnitVectorA);\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaBRadians, phiBRadians, this._workUnitVectorB);\r\n const sweepAngle = this._workUnitVectorA.angleTo(this._workUnitVectorB);\r\n // the unit vectors (on unit sphere) are never 0, so this cannot fail.\r\n const matrix = Matrix3d.createRigidFromColumns(this._workUnitVectorA, this._workUnitVectorB, AxisOrder.XYZ)!;\r\n if (matrix !== undefined) {\r\n const matrix1 = this._transform.matrix.multiplyMatrixMatrix(matrix);\r\n return Arc3d.create(this._transform.getOrigin(), matrix1.columnX(), matrix1.columnY(),\r\n AngleSweep.createStartEndRadians(0.0, sweepAngle.radians), result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * See radiansPairToGreatArc, which does this computation with positions from `angleA` and `angleB` directly as radians\r\n */\r\n public anglePairToGreatArc(angleA: LongitudeLatitudeNumber, angleB: LongitudeLatitudeNumber, result?: Arc3d): Arc3d | undefined {\r\n return this.radiansPairToGreatArc(\r\n angleA.longitudeRadians, angleA.latitudeRadians, angleB.longitudeRadians, angleB.latitudeRadians, result);\r\n }\r\n /**\r\n * Construct an arc for the section cut of a plane with the ellipsoid.\r\n * * this is undefined if the plane does not intersect the ellipsoid.\r\n */\r\n public createPlaneSection(plane: Plane3dByOriginAndUnitNormal): Arc3d | undefined {\r\n const localPlane = plane.cloneTransformed(this._transform, true);\r\n if (localPlane !== undefined) {\r\n // construct center and arc vectors in the local system --- later transform them out to global.\r\n const center = localPlane.projectPointToPlane(Point3d.createZero());\r\n const d = center.magnitude();\r\n if (d < 1.0) {\r\n const frame = Matrix3d.createRigidHeadsUp(localPlane.getNormalRef(), AxisOrder.ZYX);\r\n const vector0 = frame.columnX();\r\n const vector90 = frame.columnY();\r\n const sectionRadius = Math.sqrt(1.0 - d * d);\r\n vector0.scaleInPlace(sectionRadius);\r\n vector90.scaleInPlace(sectionRadius);\r\n\r\n this._transform.multiplyPoint3d(center, center);\r\n this._transform.multiplyVector(vector0, vector0);\r\n this._transform.multiplyVector(vector90, vector90);\r\n return Arc3d.create(center, vector0, vector90, undefined);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct an arc which\r\n * * start at pointA (defined by its angle position)\r\n * * ends at pointB (defined by its angle position)\r\n * * contains the 3rd vector as an in-plane point.\r\n */\r\n public createSectionArcPointPointVectorInPlane(pointAnglesA: LongitudeLatitudeNumber, pointAnglesB: LongitudeLatitudeNumber, inPlaneVector: Vector3d,\r\n result?: Arc3d): Arc3d | undefined {\r\n const xyzA = this.radiansToPoint(pointAnglesA.longitudeRadians, pointAnglesA.latitudeRadians);\r\n const xyzB = this.radiansToPoint(pointAnglesB.longitudeRadians, pointAnglesB.latitudeRadians);\r\n const localA = this._transform.multiplyInversePoint3d(xyzA);\r\n const localB = this._transform.multiplyInversePoint3d(xyzB);\r\n const a = this._transform.matrix.maxAbs();\r\n const scaledInPlaneVector = inPlaneVector.scaleToLength(a);\r\n if (scaledInPlaneVector === undefined)\r\n return undefined;\r\n const localInPlaneVector = this._transform.matrix.multiplyInverse(scaledInPlaneVector);\r\n if (localA !== undefined && localB !== undefined && localInPlaneVector !== undefined) {\r\n const localPlane = Plane3dByOriginAndUnitNormal.createPointPointVectorInPlane(localA, localB, localInPlaneVector);\r\n if (localPlane !== undefined) {\r\n // construct center and arc vectors in the local system --- later transform them out to global.\r\n const center = localPlane.projectPointToPlane(Point3d.createZero());\r\n const vector0 = Vector3d.createStartEnd(center, localA);\r\n const vectorB = Vector3d.createStartEnd(center, localB);\r\n const vector90 = Vector3d.createRotateVectorAroundVector(vector0, localPlane.getNormalRef(), undefined);\r\n if (vector90 !== undefined) {\r\n const sweepRadians = vector0.planarRadiansTo(vectorB, localPlane.getNormalRef());\r\n this._transform.multiplyPoint3d(center, center);\r\n this._transform.multiplyVector(vector0, vector0);\r\n this._transform.multiplyVector(vector90, vector90);\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0, sweepRadians), result);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * * For a given pair of points on an ellipsoid, construct another ellipsoid\r\n * * touches the same xyz points in space\r\n * * has transformation modified so that the original two points are on the equator.\r\n * * Note that except for true sphere inputs, the result axes can be both non-perpendicular axes and of different lengths.\r\n * @param thetaARadians longitude, in radians, for pointA\r\n * @param phiARadians latitude, in radians, for pointA\r\n * @param thetaBRadians longitude, in radians, for pointB\r\n * @param phiBRadians latitude, in radians, for pointB\r\n * @param result optional preallocated result\r\n */\r\n public radiansPairToEquatorialEllipsoid(\r\n thetaARadians: number, phiARadians: number,\r\n thetaBRadians: number, phiBRadians: number,\r\n result?: Ellipsoid): Ellipsoid | undefined {\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaARadians, phiARadians, this._workUnitVectorA);\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaBRadians, phiBRadians, this._workUnitVectorB);\r\n\r\n const matrix = Matrix3d.createRigidFromColumns(this._workUnitVectorA, this._workUnitVectorB, AxisOrder.XYZ);\r\n if (matrix) {\r\n if (result) {\r\n this._transform.multiplyTransformMatrix3d(matrix, result._transform);\r\n return result;\r\n }\r\n return Ellipsoid.create(this._transform.multiplyTransformMatrix3d(matrix));\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return an arc (circular or elliptical) at constant longitude\r\n * @param longitude (strongly typed) longitude\r\n * @param latitude latitude sweep angles\r\n * @param result\r\n */\r\n public constantLongitudeArc(longitude: Angle, latitudeSweep: AngleSweep, result?: Arc3d): Arc3d | undefined {\r\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, latitudeSweep.sweepRadians))\r\n return undefined;\r\n const cosTheta = longitude.cos();\r\n const sinTheta = longitude.sin();\r\n const vector0 = this._transform.matrix.multiplyXY(cosTheta, sinTheta);\r\n const vector90 = this._transform.matrix.columnZ();\r\n const center = this._transform.getOrigin();\r\n return Arc3d.create(center, vector0, vector90, latitudeSweep, result);\r\n }\r\n /**\r\n * Return an arc (circular or elliptical) at constant longitude\r\n * @param latitude sweep angles\r\n * @param latitude (strongly typed) latitude\r\n * @param result\r\n */\r\n public constantLatitudeArc(longitudeSweep: AngleSweep, latitude: Angle, result?: Arc3d): Arc3d | undefined {\r\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, longitudeSweep.sweepRadians))\r\n return undefined;\r\n if (latitude.isAlmostNorthOrSouthPole)\r\n return undefined;\r\n const cosPhi = latitude.cos();\r\n const sinPhi = latitude.sin();\r\n const vector0 = this._transform.matrix.columnX(); vector0.scaleInPlace(cosPhi);\r\n const vector90 = this._transform.matrix.columnY(); vector90.scaleInPlace(cosPhi);\r\n const center = this._transform.multiplyXYZ(0, 0, sinPhi);\r\n return Arc3d.create(center, vector0, vector90, longitudeSweep, result);\r\n }\r\n /**\r\n * * create a section arc with and end at positions A and B, and in plane with the normal at a fractional\r\n * interpolation between.\r\n * @param angleA start point of arc (given as angles on this ellipsoid)\r\n * @param intermediateNormalFraction\r\n * @param angleB end point of arc (given as angles on this ellipsoid)\r\n */\r\n public sectionArcWithIntermediateNormal(\r\n angleA: LongitudeLatitudeNumber,\r\n intermediateNormalFraction: number,\r\n angleB: LongitudeLatitudeNumber): Arc3d {\r\n const normalA = this.radiansToUnitNormalRay(angleA.longitudeRadians, angleA.latitudeRadians)!;\r\n const normalB = this.radiansToUnitNormalRay(angleB.longitudeRadians, angleB.latitudeRadians)!;\r\n const normal = normalA.direction.interpolate(intermediateNormalFraction, normalB.direction);\r\n const arc = this.createSectionArcPointPointVectorInPlane(angleA, angleB, normal);\r\n return arc!;\r\n }\r\n\r\n /**\r\n * Evaluate a point and derivatives with respect to angle on the ellipsoid at angles give in radians.\r\n * * \"u direction\" vector of the returned plane is derivative with respect to longitude.\r\n * * \"v direction\" vector fo the returned plane is derivative with respect ot latitude.\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param applyCosPhiFactor selector for handling of theta (around equator derivative)\r\n * * if true, compute the properly scaled derivative, which goes to zero at the poles.\r\n * * If false, omit he cos(phi) factor on the derivative wrt theta. This ensures it is always nonzero and can be safely used in cross product for surface normal.\r\n * @param result optional plane result\r\n */\r\n public radiansToPointAndDerivatives(thetaRadians: number, phiRadians: number, applyCosPhiFactor = true, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const cosPhi = Math.cos(phiRadians);\r\n const cosPhiA = applyCosPhiFactor ? cosPhi : 1.0;\r\n const sinPhi = Math.sin(phiRadians);\r\n const matrix = this._transform.matrix;\r\n if (!result)\r\n return Plane3dByOriginAndVectors.createCapture(\r\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi),\r\n matrix.multiplyXYZ(-sinTheta * cosPhiA, cosTheta * cosPhiA, 0),\r\n matrix.multiplyXYZ(-sinPhi * cosTheta, -sinPhi * sinTheta, cosPhi));\r\n // in place modification requires direct reference to members of the result ...\r\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, result.origin);\r\n matrix.multiplyXYZ(-sinTheta * cosPhiA, cosTheta * cosPhiA, 0, result.vectorU);\r\n matrix.multiplyXYZ(-sinPhi * cosTheta, -sinPhi * sinTheta, cosPhi, result.vectorV);\r\n return result;\r\n }\r\n /**\r\n * Evaluate a point and derivatives wrt to theta, phi, thetaTheta, phiPhi, and thetaPhi.\r\n * All outputs are to caller-allocated points and vectors.\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param point (returned) surface point\r\n * @param d1Theta (returned) derivative wrt theta\r\n * @param d1Phi (returned) derivative wrt phi\r\n * @param d2ThetaTheta (returned) second derivative wrt theta twice\r\n * @param d2PhiPhi (returned) second derivative wrt phi twice\r\n * @param d2ThetaPhi (returned) second derivative wrt theta and phi\r\n * @param result optional plane result\r\n */\r\n public radiansToPointAnd2Derivatives(thetaRadians: number, phiRadians: number,\r\n point: Point3d,\r\n d1Theta: Vector3d,\r\n d1Phi: Vector3d,\r\n d2ThetaTheta: Vector3d,\r\n d2PhiPhi: Vector3d,\r\n d2ThetaPhi: Vector3d) {\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const cosPhi = Math.cos(phiRadians);\r\n const sinPhi = Math.sin(phiRadians);\r\n const matrix = this._transform.matrix;\r\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, point);\r\n // theta derivatives\r\n matrix.multiplyXYZ(-sinTheta * cosPhi, cosTheta * cosPhi, 0, d1Theta);\r\n matrix.multiplyXYZ(-cosTheta * cosPhi, -sinTheta * cosPhi, 0, d2ThetaTheta);\r\n\r\n // phi derivatives\r\n matrix.multiplyXYZ(-cosTheta * sinPhi, -sinTheta * sinPhi, cosPhi, d1Phi);\r\n matrix.multiplyXYZ(-cosTheta * cosPhi, -sinTheta * cosPhi, -sinPhi, d2PhiPhi);\r\n\r\n // mixed derivative\r\n matrix.multiplyXYZ(sinTheta * sinPhi, -cosTheta * sinPhi, 0, d2ThetaPhi);\r\n }\r\n\r\n /**\r\n * Evaluate a point and rigid local coordinate frame the ellipsoid at angles give in radians.\r\n * * The undefined return is only possible if the placement transform is singular (and even then only at critical angles)\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param result optional transform result\r\n *\r\n */\r\n public radiansToFrenetFrame(thetaRadians: number, phiRadians: number, result?: Transform): Transform | undefined {\r\n const plane = this.radiansToPointAndDerivatives(thetaRadians, phiRadians, false);\r\n return plane.toRigidFrame(result);\r\n }\r\n /**\r\n * Evaluate a point and unit normal at given angles.\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param result optional transform result\r\n *\r\n */\r\n public radiansToUnitNormalRay(thetaRadians: number, phiRadians: number, result?: Ray3d): Ray3d | undefined {\r\n const plane = this.radiansToPointAndDerivatives(thetaRadians, phiRadians, false);\r\n return plane.unitNormalRay(result);\r\n }\r\n\r\n /**\r\n * Find the (unique) extreme point for a given true surface perpendicular vector (outward)\r\n */\r\n public surfaceNormalToAngles(normal: Vector3d, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber {\r\n const matrix = this._transform.matrix;\r\n const conjugateVector = matrix.multiplyTransposeVector(normal);\r\n const thetaRadians = Math.atan2(conjugateVector.y, conjugateVector.x);\r\n // For that phi arc,\r\n const axy = -(conjugateVector.x * Math.cos(thetaRadians) + conjugateVector.y * Math.sin(thetaRadians));\r\n const az = conjugateVector.z;\r\n const phiRadians = Math.atan2(az, -axy);\r\n return LongitudeLatitudeNumber.createRadians(thetaRadians, phiRadians, 0.0, result);\r\n }\r\n\r\n /**\r\n * * Evaluate the surface normal on `other` ellipsoid at given angles\r\n * * If `other` is undefined, default to unit sphere.\r\n * * Find the angles for the same normal on `this` ellipsoid\r\n */\r\n public otherEllipsoidAnglesToThisEllipsoidAngles(otherEllipsoid: Ellipsoid | undefined, otherAngles: LongitudeLatitudeNumber, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber | undefined {\r\n const normal = Ellipsoid.radiansToUnitNormalRay(otherEllipsoid, otherAngles.longitudeRadians, otherAngles.latitudeRadians);\r\n if (normal !== undefined)\r\n return this.surfaceNormalToAngles(normal.direction, result);\r\n return undefined;\r\n }\r\n /**\r\n * * if ellipsoid is given, return its surface point and unit normal as a Ray3d.\r\n * * if not given, return surface point and unit normal for unit sphere.\r\n */\r\n public static radiansToUnitNormalRay(ellipsoid: Ellipsoid | undefined, thetaRadians: number, phiRadians: number, result?: Ray3d): Ray3d | undefined {\r\n if (ellipsoid) {\r\n return ellipsoid.radiansToUnitNormalRay(thetaRadians, phiRadians, result);\r\n }\r\n if (!result)\r\n result = Ray3d.createZAxis();\r\n // for unit sphere, the vector from center to surface point is identical to the unit normal.\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaRadians, phiRadians, result.origin);\r\n result.direction.setFromPoint3d(result.origin);\r\n return result;\r\n }\r\n /** Implementation of [[Clipper.isPointOnOrInside]]. */\r\n public isPointOnOrInside(point: Point3d): boolean {\r\n const localPoint = this._transform.multiplyInversePoint3d(point, this._workPointA);\r\n if (localPoint !== undefined)\r\n return localPoint.magnitude() <= 1.0;\r\n return false;\r\n }\r\n /** Announce \"in\" portions of a line segment. Implementation of [[Clipper.announceClippedSegmentIntervals]]. */\r\n public announceClippedSegmentIntervals(f0: number, f1: number, pointA: Point3d, pointB: Point3d, announce?: AnnounceNumberNumber): boolean {\r\n const localA = this._transform.multiplyInversePoint3d(pointA, this._workPointA);\r\n const localB = this._transform.multiplyInversePoint3d(pointB, this._workPointB);\r\n if (localA && localB) {\r\n const dotAA = Vector3d.dotProductAsXYAndZ(this._workPointA, this._workPointA);\r\n const dotAB = Vector3d.dotProductAsXYAndZ(this._workPointA, this._workPointB);\r\n const dotBB = Vector3d.dotProductAsXYAndZ(this._workPointB, this._workPointB);\r\n const bezier = new Order3Bezier(dotAA, dotAB, dotBB);\r\n const roots = bezier.roots(1.0, false);\r\n if (roots !== undefined && roots.length === 2) {\r\n // we know the roots are sorted. The f0,f1 might not be ..\r\n if (f0 < f1) {\r\n if (roots[0] < f0)\r\n roots[0] = f0;\r\n if (f1 < roots[1])\r\n roots[1] = f1;\r\n if (roots[0] < roots[1]) {\r\n if (announce)\r\n announce(roots[0], roots[1]);\r\n return true;\r\n }\r\n } else {\r\n // f0,f1 are reversed. do the outputs in the same sense\r\n if (roots[1] > f0)\r\n roots[1] = f0;\r\n if (roots[0] < f1)\r\n roots[0] = f1;\r\n if (roots[1] > roots[0]) {\r\n if (announce)\r\n announce(roots[1], roots[0]);\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /** Announce \"in\" portions of a line segment. Implementation of [[Clipper.announceClippedArcIntervals]] */\r\n public announceClippedArcIntervals(arc: Arc3d, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\r\n const arcData = arc.toVectors();\r\n let numAnnounce = 0;\r\n if (this._transform.multiplyInversePoint3d(arcData.center, arcData.center)\r\n && this._transform.matrix.multiplyInverse(arcData.vector0, arcData.vector0)\r\n && this._transform.matrix.multiplyInverse(arcData.vector90, arcData.vector90)) {\r\n // in local coordinates the arc parameterization is X = center + vector0 * cos(theta) + vector90 * sin(theta)\r\n // We want X DOT X === 1, viz\r\n // center DOT center + 2 * cos(theta) * center DOT vector0 + 2 * sin(theta) * center DOT vector90 + cos(theta) ^2 * vector0 DOT vector0 + sin (theta)^2 * vector90 DOT vector90 = 1\r\n const cc = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.center);\r\n const cu = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.vector0);\r\n const cv = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.vector90);\r\n const uv = Vector3d.dotProductAsXYAndZ(arcData.vector0, arcData.vector90);\r\n const uu = Vector3d.dotProductAsXYAndZ(arcData.vector0, arcData.vector0);\r\n const vv = Vector3d.dotProductAsXYAndZ(arcData.vector90, arcData.vector90);\r\n const intersectionRadians: number[] = [];\r\n\r\n if (TrigPolynomial.solveUnitCircleImplicitQuadricIntersection(\r\n uu, 2.0 * uv, vv,\r\n 2.0 * cu, 2.0 * cv, cc - 1.0,\r\n intersectionRadians)) {\r\n const fractions = [0.0, 1.0];\r\n for (const radians of intersectionRadians) {\r\n const fraction = arc.sweep.radiansToSignedPeriodicFraction(radians);\r\n if (Geometry.isIn01(fraction))\r\n fractions.push(fraction);\r\n }\r\n fractions.sort();\r\n let f0, f1;\r\n for (let i1 = 1; i1 < fractions.length; i1++) {\r\n f0 = fractions[i1 - 1];\r\n f1 = fractions[i1];\r\n if (f1 > f0) {\r\n const xyz = arc.fractionToPoint(Geometry.interpolate(fractions[i1 - 1], 0.5, fractions[i1]));\r\n if (this.isPointOnOrInside(xyz)) {\r\n if (announce)\r\n announce(fractions[i1 - 1], fractions[i1], arc);\r\n numAnnounce++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return numAnnounce > 0;\r\n }\r\n}\r\n/**\r\n * * An `EllipsoidPatch` is\r\n * * An underlying (full) `Ellipsoid` object\r\n * * an angular range (`AngleSweep`) of longitudes around the equator\r\n * * an angular range (`AngleSweep`) of latitudes, with 0 at the equator, +90 degrees at north pole.\r\n * * The `EllipsoidPatch` implements `UVSurface` methods, so a `PolyfaceBuilder` can generate facets in its method `addUVGridBody`\r\n * @public\r\n */\r\nexport class EllipsoidPatch implements UVSurface {\r\n public ellipsoid: Ellipsoid;\r\n public longitudeSweep: AngleSweep;\r\n public latitudeSweep: AngleSweep;\r\n /**\r\n * CAPTURE ellipsoid and sweeps as an EllipsoidPatch.\r\n * @param ellipsoid\r\n * @param longitudeSweep\r\n * @param latitudeSweep\r\n */\r\n private constructor(ellipsoid: Ellipsoid, longitudeSweep: AngleSweep, latitudeSweep: AngleSweep) {\r\n this.ellipsoid = ellipsoid;\r\n this.longitudeSweep = longitudeSweep;\r\n this.latitudeSweep = latitudeSweep;\r\n }\r\n /**\r\n * Create a new EllipsoidPatch, capturing (not cloning) all input object references.\r\n * @param ellipsoid full ellipsoid\r\n * @param longitudeSweep sweep of longitudes in the active patch\r\n * @param latitudeSweep sweep of latitudes in the active patch.\r\n */\r\n public static createCapture(ellipsoid: Ellipsoid, longitudeSweep: AngleSweep, latitudeSweep: AngleSweep): EllipsoidPatch {\r\n return new EllipsoidPatch(ellipsoid, longitudeSweep, latitudeSweep);\r\n }\r\n /** Return the point on the ellipsoid at fractional positions in the angular ranges. */\r\n public uvFractionToPoint(longitudeFraction: number, latitudeFraction: number, result?: Point3d): Point3d {\r\n return this.ellipsoid.radiansToPoint(this.longitudeSweep.fractionToRadians(longitudeFraction), this.latitudeSweep.fractionToRadians(latitudeFraction), result);\r\n }\r\n /** Return the point and derivative vectors on the ellipsoid at fractional positions in the angular ranges.\r\n * * Derivatives are with respect to fractional position.\r\n */\r\n public uvFractionToPointAndTangents(longitudeFraction: number, latitudeFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n result = this.ellipsoid.radiansToPointAndDerivatives(\r\n this.longitudeSweep.fractionToRadians(longitudeFraction),\r\n this.latitudeSweep.fractionToRadians(latitudeFraction),\r\n true,\r\n result);\r\n result.vectorU.scale(this.longitudeSweep.sweepRadians);\r\n result.vectorV.scale(this.latitudeSweep.sweepRadians);\r\n return result;\r\n }\r\n /** Return the range of the patch, considering both boundary and internal extrema. */\r\n public range(result?: Range3d): Range3d {\r\n return this.ellipsoid.patchRangeStartEndRadians(this.longitudeSweep.startRadians, this.longitudeSweep.endRadians, this.latitudeSweep.startRadians, this.latitudeSweep.endRadians, result);\r\n }\r\n /** Return intersections of the ray and surface.\r\n * * uv values in the intersections are in radians unless `convertIntersectionRadiansToFractions` is true requesting conversion to patch fractions.\r\n */\r\n public intersectRay(ray: Ray3d, restrictToPatch: boolean, convertIntersectionRadiansToFractions: boolean = false): CurveAndSurfaceLocationDetail[] {\r\n const result: CurveAndSurfaceLocationDetail[] = [];\r\n const rayFractions: number[] = [];\r\n const xyz: Point3d[] = [];\r\n const thetaPhi: LongitudeLatitudeNumber[] = [];\r\n const n = this.ellipsoid.intersectRay(ray, rayFractions, xyz, thetaPhi);\r\n for (let i = 0; i < n; i++) {\r\n const longitudeRadians = thetaPhi[i].longitudeRadians;\r\n const latitudeRadians = thetaPhi[i].latitudeRadians;\r\n\r\n if (!restrictToPatch\r\n || (this.longitudeSweep.isRadiansInSweep(longitudeRadians)\r\n && this.latitudeSweep.isRadiansInSweep(latitudeRadians))) {\r\n if (convertIntersectionRadiansToFractions) {\r\n const uFraction = this.longitudeSweep.radiansToSignedPeriodicFraction(longitudeRadians);\r\n const vFraction = this.latitudeSweep.radiansToSignedPeriodicFraction(latitudeRadians);\r\n result.push(new CurveAndSurfaceLocationDetail(\r\n CurveLocationDetail.createRayFractionPoint(ray, rayFractions[i], xyz[i]),\r\n UVSurfaceLocationDetail.createSurfaceUVNumbersPoint(this, uFraction, vFraction, xyz[i])));\r\n } else {\r\n result.push(new CurveAndSurfaceLocationDetail(\r\n CurveLocationDetail.createRayFractionPoint(ray, rayFractions[i], xyz[i]),\r\n UVSurfaceLocationDetail.createSurfaceUVNumbersPoint(this, longitudeRadians, latitudeRadians, xyz[i])));\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * test if the angles of the `LongitudeLatitudeNumber` are within the sweep ranges.\r\n * @param position longitude and latitude to test.\r\n * @param `allowPeriodicLongitude` true to allow the longitude to be in when shifted by a multiple of 2 PI\r\n * (latitude is never periodic for patches)\r\n */\r\n public containsAngles(position: LongitudeLatitudeNumber, allowPeriodicLongitude: boolean = true): boolean {\r\n return this.latitudeSweep.isRadiansInSweep(position.latitudeRadians, false)\r\n && this.longitudeSweep.isRadiansInSweep(position.longitudeRadians, allowPeriodicLongitude);\r\n }\r\n\r\n /**\r\n * Compute point (with altitude) at given angles and altitude.\r\n * * Never fails for non-singular ellipsoid.\r\n * * In the returned ray,\r\n * * ray.origin is the point at requested altitude.\r\n * * ray.direction is an outward-directed unit vector\r\n * @param position longitude, latitude, and height\r\n *\r\n */\r\n public anglesToUnitNormalRay(position: LongitudeLatitudeNumber, result?: Ray3d): Ray3d | undefined {\r\n const ray = this.ellipsoid.radiansToUnitNormalRay(position.longitudeRadians, position.latitudeRadians, result);\r\n if (!ray)\r\n return undefined;\r\n ray.origin = ray.fractionToPoint(position.altitude, ray.origin);\r\n return ray;\r\n }\r\n /**\r\n * Return simple angles of a fractional position in the patch.\r\n * @param thetaFraction fractional position in longitude (theta) interval\r\n * @param phiFraction fractional position in latitude (phi) interval\r\n * @param h optional altitude\r\n * @param result optional preallocated result.\r\n */\r\n public uvFractionToAngles(longitudeFraction: number, phiFraction: number, h: number = 0, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber {\r\n return LongitudeLatitudeNumber.createRadians(this.longitudeSweep.fractionToRadians(longitudeFraction), this.latitudeSweep.fractionToRadians(phiFraction), h, result);\r\n }\r\n /** Find the closest point of the (patch of the) ellipsoid. */\r\n public projectPointToSurface(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\r\n return this.ellipsoid.projectPointToSurface(spacePoint);\r\n }\r\n}\r\n/**\r\n * Internal class for searching for the closest point (projection of spacePoint) on an ellipsoid.\r\n */\r\nclass EllipsoidClosestPoint extends NewtonEvaluatorRRtoRRD {\r\n private _ellipsoid: Ellipsoid;\r\n private _spacePoint!: Point3d;\r\n private _surfacePoint: Point3d;\r\n private _d1Theta: Vector3d;\r\n private _d2Theta: Vector3d;\r\n private _d1Phi: Vector3d;\r\n private _d2Phi: Vector3d;\r\n private _d2ThetaPhi: Vector3d;\r\n private _delta: Vector3d;\r\n public constructor(ellipsoid: Ellipsoid) {\r\n super();\r\n this._ellipsoid = ellipsoid;\r\n this._surfacePoint = Point3d.create();\r\n this._d1Theta = Vector3d.create();\r\n this._d1Phi = Vector3d.create();\r\n this._d2Theta = Vector3d.create();\r\n this._d2Phi = Vector3d.create();\r\n this._d2ThetaPhi = Vector3d.create();\r\n\r\n this._delta = Vector3d.create();\r\n }\r\n public searchClosestPoint(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\r\n this._spacePoint = spacePoint;\r\n const localPoint = this._ellipsoid.transformRef.multiplyInversePoint3d(spacePoint);\r\n if (!localPoint)\r\n return undefined;\r\n const sphere = new SphereImplicit(1.0);\r\n const uv = sphere.xyzToThetaPhiR(localPoint);\r\n const newtonSearcher = new Newton2dUnboundedWithDerivative(this);\r\n newtonSearcher.setUV(uv.thetaRadians, uv.phiRadians);\r\n if (newtonSearcher.runIterations()) {\r\n uv.thetaRadians = newtonSearcher.getU();\r\n uv.phiRadians = newtonSearcher.getV();\r\n }\r\n return LongitudeLatitudeNumber.createRadians(uv.thetaRadians, uv.phiRadians, 0.0);\r\n }\r\n public evaluate(thetaRadians: number, phiRadians: number): boolean {\r\n this._ellipsoid.radiansToPointAnd2Derivatives(thetaRadians, phiRadians,\r\n this._surfacePoint,\r\n this._d1Theta, this._d1Phi,\r\n this._d2Theta, this._d2Phi,\r\n this._d2ThetaPhi);\r\n Vector3d.createStartEnd(this._spacePoint, this._surfacePoint, this._delta);\r\n const q = this._d1Theta.dotProduct(this._d1Phi) + this._delta.dotProduct(this._d2ThetaPhi);\r\n this.currentF.setOriginAndVectorsXYZ(\r\n // f,g,0\r\n this._delta.dotProduct(this._d1Theta), this._delta.dotProduct(this._d1Phi), 0,\r\n // df/dTheta, dg/dTheta, 0\r\n this._d1Theta.dotProduct(this._d1Theta) + this._delta.dotProduct(this._d2Theta), q, 0,\r\n // df/dPhi, dg/dPhi, 0\r\n q, this._d1Phi.dotProduct(this._d1Phi) + this._delta.dotProduct(this._d2Phi), 0);\r\n\r\n return true;\r\n }\r\n}\r\n/**\r\n * Detailed data for a point on a 2-angle parameter space.\r\n * @public\r\n */\r\nexport class GeodesicPathPoint {\r\n /** First angle, in radians */\r\n public thetaRadians: number;\r\n /** Second angle, in radians */\r\n public phiRadians: number;\r\n public point: Point3d;\r\n public dTheta: Vector3d;\r\n public dPhi: Vector3d;\r\n public d2Theta: Vector3d;\r\n public d2Phi: Vector3d;\r\n public d2ThetaPhi: Vector3d;\r\n public d1Cross: Vector3d;\r\n public constructor() {\r\n this.thetaRadians = 0;\r\n this.phiRadians = 0;\r\n this.point = Point3d.create();\r\n this.dTheta = Vector3d.create();\r\n this.dPhi = Vector3d.create();\r\n this.d2Theta = Vector3d.create();\r\n this.d2Phi = Vector3d.create();\r\n this.d2ThetaPhi = Vector3d.create();\r\n this.d1Cross = Vector3d.create();\r\n }\r\n /** Fill all evaluations at given theta and phi. */\r\n public evaluateDerivativesAtCurrentAngles(ellipsoid: Ellipsoid) {\r\n ellipsoid.radiansToPointAnd2Derivatives(this.thetaRadians, this.phiRadians, this.point, this.dTheta, this.dPhi, this.d2Theta, this.d2Phi, this.d2ThetaPhi);\r\n this.dTheta.crossProduct(this.dPhi, this.d1Cross);\r\n }\r\n private static _vectorAB?: Vector3d;\r\n private static _vectorCB?: Vector3d;\r\n private static _vectorCross?: Vector3d;\r\n /** Evaluate the newton function and derivatives:\r\n * `(UAB cross UCB) dot d1cross`\r\n * with as the central data, UAB = vector from pointA to pointB, UCB = vector from pointC to pointB.\r\n * * Return order is:\r\n * * values[0] = the function\r\n * * values[1] = derivative wrt pointA.phi\r\n * * values[2] = derivative wrt pointB.phi\r\n * * values[3] = derivative wrt pointC.phi\r\n */\r\n public static evaluateNewtonFunction(pointA: GeodesicPathPoint, pointB: GeodesicPathPoint, pointC: GeodesicPathPoint, values: Float64Array) {\r\n this._vectorAB = Vector3d.createStartEnd(pointA.point, pointB.point, this._vectorAB);\r\n this._vectorCB = Vector3d.createStartEnd(pointC.point, pointB.point, this._vectorCB);\r\n this._vectorCross = this._vectorAB.crossProduct(this._vectorCB);\r\n // this._vectorCross is the cross product of vectors from A to B and C to B\r\n // it should be perpendicular to (have zero dot product with) the surface normal, which is sitting in pointB as d1Cross\r\n values[0] = this._vectorCross.dotProduct(pointB.d1Cross);\r\n // Derivatives wrt phi at A, B, C creates derivatives of values[0] wrt each.\r\n // derivatives at neighbor appear only on their point-to-point vector, and with negative sign ..\r\n values[1] = - pointA.dPhi.tripleProduct(this._vectorCB, pointB.d1Cross);\r\n values[3] = - this._vectorAB.tripleProduct(pointC.dPhi, pointB.d1Cross);\r\n // values from pointB appear with positive sign everywhere . ..\r\n values[2] = pointB.dPhi.tripleProduct(this._vectorCB, pointB.d1Cross)\r\n + this._vectorAB.tripleProduct(pointB.dPhi, pointB.d1Cross)\r\n + this._vectorCross.tripleProduct(pointB.d2ThetaPhi, pointB.dPhi)\r\n + this._vectorCross.tripleProduct(pointB.dTheta, pointB.d2Phi);\r\n // CRUNCH CRUNCH CRUNCH\r\n }\r\n /**\r\n * Extract the two angles form this structure to a LongitudeLatitudeNumber structure.\r\n */\r\n public toAngles(): LongitudeLatitudeNumber {\r\n return LongitudeLatitudeNumber.createRadians(this.thetaRadians, this.phiRadians);\r\n }\r\n}\r\n/**\r\n * Algorithm implementation class for computing approximate optimal (shortest) path points.\r\n * * Call the static method `createGeodesicPath` to compute path points.\r\n * @public\r\n */\r\nexport class GeodesicPathSolver {\r\n private _defaultArc: Arc3d;\r\n private _pathPoints: GeodesicPathPoint[];\r\n private _tridiagonalSolver!: TriDiagonalSystem;\r\n private constructor(defaultArc: Arc3d) {\r\n this._pathPoints = [];\r\n this._defaultArc = defaultArc;\r\n }\r\n /**\r\n *\r\n * @param originalEllipsoid Given start and endpoints on an ellipsoid, compute points along a near-optimal shortest path.\r\n * * The points are located so that at each point the local surface normal is contained in the plane of the point and its two neighbors.\r\n * @param startAngles angles for the start of the path\r\n * @param endAngles angles for the end of the path\r\n * @param density If this is a number, it is the requested edge count. If this is an angle, it ias an angular spacing measured in the great arc through the two points.\r\n */\r\n public static createGeodesicPath(originalEllipsoid: Ellipsoid,\r\n startAngles: LongitudeLatitudeNumber, endAngles: LongitudeLatitudeNumber, density: number | Angle): GeodesicPathPoint[] | undefined {\r\n const workEllipsoid1 = originalEllipsoid.radiansPairToEquatorialEllipsoid(startAngles.longitudeRadians, startAngles.latitudeRadians,\r\n endAngles.longitudeRadians, endAngles.latitudeRadians);\r\n const workArc = originalEllipsoid.radiansPairToGreatArc(startAngles.longitudeRadians, startAngles.latitudeRadians,\r\n endAngles.longitudeRadians, endAngles.latitudeRadians);\r\n if (workEllipsoid1 === undefined || workArc === undefined)\r\n return undefined;\r\n let numEdges = 4;\r\n if (density instanceof Angle) {\r\n numEdges = Geometry.stepCount(density.radians, workArc.sweep.sweepRadians, 4, 180);\r\n } else if (Number.isFinite(density)) {\r\n numEdges = Math.max(numEdges, density);\r\n }\r\n if (numEdges > 180)\r\n numEdges = 180;\r\n const scaledMatrix = workEllipsoid1.transformRef.matrix.clone();\r\n const largestCoordinate = scaledMatrix.maxAbs();\r\n const inverseLargestCoordinate = 1.0 / largestCoordinate;\r\n scaledMatrix.scaleColumnsInPlace(inverseLargestCoordinate, inverseLargestCoordinate, inverseLargestCoordinate);\r\n const workEllipsoid = Ellipsoid.create(Transform.createOriginAndMatrix(undefined, scaledMatrix));\r\n\r\n const solver = new GeodesicPathSolver(workArc);\r\n solver.createInitialPointsAndTridiagonalSystem(numEdges);\r\n\r\n let numConverged = 0;\r\n let previousMaxDPhi = 10000.0;\r\n let numStep = 0;\r\n const dPhiTolerance = 1.0e-8;\r\n solver.setupStep(workEllipsoid);\r\n while (numStep < 15 && numConverged < 2) {\r\n if (!solver.solve())\r\n break;\r\n previousMaxDPhi = solver.applyUpdate(0.1);\r\n solver.setupStep(workEllipsoid);\r\n if (previousMaxDPhi < dPhiTolerance)\r\n numConverged++;\r\n else\r\n numConverged = 0;\r\n numStep++;\r\n }\r\n if (numConverged > 0) {\r\n const workAngles = LongitudeLatitudeNumber.createRadians(0, 0);\r\n const originalAngles = LongitudeLatitudeNumber.createRadians(0, 0);\r\n for (const p of solver._pathPoints) {\r\n LongitudeLatitudeNumber.createRadians(p.thetaRadians, p.phiRadians, 0, workAngles);\r\n originalEllipsoid.otherEllipsoidAnglesToThisEllipsoidAngles(workEllipsoid, workAngles, originalAngles);\r\n p.thetaRadians = originalAngles.longitudeRadians;\r\n p.phiRadians = originalAngles.latitudeRadians;\r\n p.evaluateDerivativesAtCurrentAngles(originalEllipsoid);\r\n }\r\n return solver._pathPoints;\r\n }\r\n return numConverged > 0 ? solver._pathPoints : undefined;\r\n }\r\n private createInitialPointsAndTridiagonalSystem(numEdges: number) {\r\n if (numEdges < 2)\r\n numEdges = 2;\r\n let f, thetaRadians;\r\n for (let i = 0; i <= numEdges; i++) {\r\n f = i / numEdges;\r\n thetaRadians = this._defaultArc.sweep.fractionToRadians(f);\r\n const p = new GeodesicPathPoint();\r\n p.thetaRadians = thetaRadians;\r\n p.phiRadians = 0.0;\r\n this._pathPoints.push(p);\r\n }\r\n this._tridiagonalSolver = new TriDiagonalSystem(this._pathPoints.length);\r\n }\r\n private applyUpdate(maxDPhiRadians: number): number {\r\n let dPhiMax = 0;\r\n for (let i = 0; i < this._pathPoints.length; i++) {\r\n const dPhi = Geometry.clampToStartEnd(this._tridiagonalSolver.getX(i), -maxDPhiRadians, maxDPhiRadians);\r\n this._pathPoints[i].phiRadians -= dPhi;\r\n dPhiMax = Geometry.maxAbsXY(dPhiMax, dPhi);\r\n }\r\n return dPhiMax;\r\n }\r\n\r\n /**\r\n * Set up a step with specified ellipsoid.\r\n * * ASSUME angles in _pathPoints are valid on given ellipsoid.\r\n * @param ellipsoid\r\n */\r\n private setupStep(ellipsoid: Ellipsoid) {\r\n for (const p of this._pathPoints) {\r\n p.evaluateDerivativesAtCurrentAngles(ellipsoid);\r\n }\r\n const lastRow = this._pathPoints.length - 1;\r\n // first and last points get trivial dPhi=0 equations:\r\n this._tridiagonalSolver.reset();\r\n this._tridiagonalSolver.addToRow(0, 0, 1, 0);\r\n this._tridiagonalSolver.addToB(0, 0);\r\n this._tridiagonalSolver.addToRow(lastRow, 0, 1, 0);\r\n this._tridiagonalSolver.addToB(lastRow, 0);\r\n\r\n // interior points get proper newton equations\r\n const values = new Float64Array(4);\r\n for (let i = 1; i < lastRow; i++) {\r\n GeodesicPathPoint.evaluateNewtonFunction(this._pathPoints[i - 1], this._pathPoints[i], this._pathPoints[i + 1], values);\r\n this._tridiagonalSolver.addToRow(i, values[1], values[2], values[3]);\r\n this._tridiagonalSolver.addToB(i, values[0]);\r\n }\r\n }\r\n\r\n private solve(): boolean {\r\n return this._tridiagonalSolver.factorAndBackSubstitute();\r\n }\r\n /**\r\n * Construct various section arcs (on the ellipsoid), using planes that (a) pass through the two given points and (b) have in-plane vector sampled between the normals of the two points.\r\n * * Each candidate ellipse has is in a plane with ellipsoid normal at vector constructed \"between\" the endpoint normals.\r\n * * The intermediate construction is by interpolation between stated fractions (which maybe outside 0 to 1)\r\n * @param ellipsoid\r\n * @param angleA start point of all candidates\r\n * @param angleB end point of all candidates\r\n * @param numSample number of ellipses to construct as candidates.\r\n * @param normalInterpolationFraction0\r\n * @param normalInterpolationFraction1\r\n */\r\n public static approximateMinimumLengthSectionArc(ellipsoid: Ellipsoid,\r\n angleA: LongitudeLatitudeNumber,\r\n angleB: LongitudeLatitudeNumber, numSample: number,\r\n normalInterpolationFraction0: number,\r\n normalInterpolationFraction1: number): { minLengthArc: Arc3d, minLengthNormalInterpolationFraction: number } | undefined {\r\n numSample = Geometry.clampToStartEnd(numSample, 2, 200);\r\n const normalA = ellipsoid.radiansToUnitNormalRay(angleA.longitudeRadians, angleA.latitudeRadians);\r\n const normalB = ellipsoid.radiansToUnitNormalRay(angleB.longitudeRadians, angleB.latitudeRadians);\r\n if (normalA !== undefined && normalB !== undefined) {\r\n let normalC;\r\n let resultArc;\r\n let lengthC;\r\n let fractionC;\r\n\r\n for (let i = 1; i <= numSample; i++) {\r\n const f = Geometry.interpolate(normalInterpolationFraction0, i / numSample, normalInterpolationFraction1);\r\n normalC = normalA.direction.interpolate(f, normalB.direction, normalC);\r\n const candidateArc = ellipsoid.createSectionArcPointPointVectorInPlane(angleA, angleB, normalC);\r\n if (candidateArc !== undefined) {\r\n const candidateLength = candidateArc.curveLength();\r\n if (lengthC === undefined || candidateLength < lengthC) {\r\n lengthC = candidateLength;\r\n resultArc = candidateArc;\r\n fractionC = f;\r\n }\r\n }\r\n }\r\n if (resultArc !== undefined && fractionC !== undefined)\r\n return { minLengthArc: resultArc, minLengthNormalInterpolationFraction: fractionC };\r\n }\r\n return undefined;\r\n }\r\n\r\n}\r\n"]}
|