@itwin/core-geometry 5.3.0-dev.16 → 5.3.0-dev.18
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.d.ts +15 -1
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +31 -2
- 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.d.ts +10 -13
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js +23 -22
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.d.ts +5 -5
- package/lib/cjs/curve/spiral/ClothoidSeries.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js +28 -16
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.d.ts +7 -6
- package/lib/cjs/curve/spiral/CubicEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js +29 -14
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.d.ts +30 -40
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js +43 -49
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts +2 -2
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js +17 -7
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +103 -95
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +132 -106
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +70 -52
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +97 -65
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts +7 -11
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +10 -12
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.d.ts +29 -24
- package/lib/cjs/curve/spiral/NormalizedTransition.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js +53 -35
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.d.ts +12 -17
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js +20 -23
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts +25 -23
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js +34 -29
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +43 -33
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js +56 -38
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.d.ts +27 -21
- package/lib/cjs/curve/spiral/XYCurveEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js +23 -18
- 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/Voronoi.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +15 -1
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +31 -2
- 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.d.ts +10 -13
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js +23 -22
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.d.ts +5 -5
- package/lib/esm/curve/spiral/ClothoidSeries.d.ts.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js +28 -16
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.d.ts +7 -6
- package/lib/esm/curve/spiral/CubicEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js +29 -14
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.d.ts +30 -40
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js +43 -49
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts +2 -2
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js +17 -7
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +103 -95
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +132 -106
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +70 -52
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +97 -65
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts +7 -11
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +10 -12
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.d.ts +29 -24
- package/lib/esm/curve/spiral/NormalizedTransition.d.ts.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js +53 -35
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.d.ts +12 -17
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js +20 -23
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts +25 -23
- package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js +34 -29
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +43 -33
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js +56 -38
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.d.ts +27 -21
- package/lib/esm/curve/spiral/XYCurveEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js +23 -18
- 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/Voronoi.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -21,35 +21,40 @@ import { Ray3d } from "../../geometry3d/Ray3d";
|
|
|
21
21
|
import { Plane3dByOriginAndVectors } from "../../geometry3d/Plane3dByOriginAndVectors";
|
|
22
22
|
/**
|
|
23
23
|
* An IntegratedSpiral3d is a curve defined by integrating its curvature.
|
|
24
|
-
* * The first integral of curvature (with respect to distance along the curve) is the bearing angle (in radians)
|
|
24
|
+
* * The first integral of curvature (with respect to distance along the curve) is the bearing angle (in radians).
|
|
25
25
|
* * Integrating (cos(theta), sin(theta)) gives displacement from the start point, and thus the actual curve position.
|
|
26
|
-
* * The curvature functions of interest are all symmetric snap functions in the NormalizedTransition class.
|
|
27
|
-
* *
|
|
26
|
+
* * The curvature functions of interest are all symmetric snap functions in the [[NormalizedTransition]] class.
|
|
27
|
+
* * [[TransitionConditionalProperties]] implements the computations of the interrelationship of radii, bearing, and length.
|
|
28
28
|
* @public
|
|
29
29
|
*/
|
|
30
30
|
export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
31
|
-
/** String name for schema properties */
|
|
31
|
+
/** String name for schema properties. */
|
|
32
32
|
curvePrimitiveType = "transitionSpiral";
|
|
33
|
-
/**
|
|
33
|
+
/** Start and end radii as a Segment1d. */
|
|
34
34
|
radius01;
|
|
35
|
-
/**
|
|
35
|
+
/** Start and end bearings as an AngleSweep. */
|
|
36
36
|
bearing01;
|
|
37
|
-
/**
|
|
37
|
+
/** Stroked approximation of entire spiral. */
|
|
38
38
|
_globalStrokes;
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* *
|
|
39
|
+
/**
|
|
40
|
+
* Stroked approximation of active spiral.
|
|
41
|
+
* * Same count as global -- possibly overly fine, but it gives some consistency between same clothoid constructed
|
|
42
|
+
* as partial versus complete.
|
|
43
|
+
* * If no trimming, this points to the same place as the _globalStrokes. DO NOT double transform.
|
|
42
44
|
*/
|
|
43
45
|
_activeStrokes;
|
|
44
|
-
/** Return the internal stroked form of the (possibly partial) spiral
|
|
45
|
-
get activeStrokes() {
|
|
46
|
+
/** Return the internal stroked form of the (possibly partial) spiral. */
|
|
47
|
+
get activeStrokes() {
|
|
48
|
+
return this._activeStrokes !== undefined ? this._activeStrokes : this._globalStrokes;
|
|
49
|
+
}
|
|
50
|
+
/** Evaluator for transition. */
|
|
46
51
|
_evaluator;
|
|
47
|
-
/** Total curve arc length (computed) */
|
|
52
|
+
/** Total curve arc length (computed). */
|
|
48
53
|
_arcLength01;
|
|
49
|
-
/** Curvatures (inverse radii) at start and end */
|
|
54
|
+
/** Curvatures (inverse radii) at start and end. */
|
|
50
55
|
_curvature01;
|
|
51
|
-
|
|
52
|
-
//
|
|
56
|
+
// constructor demands all bearing, radius, and length data.
|
|
57
|
+
// caller determines usual dependency of "any 4 determine the 5th".
|
|
53
58
|
constructor(spiralType, evaluator, radius01, bearing01, activeFractionInterval, localToWorld, arcLength, properties) {
|
|
54
59
|
super(spiralType, localToWorld, activeFractionInterval, properties);
|
|
55
60
|
this._evaluator = evaluator;
|
|
@@ -57,29 +62,32 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
57
62
|
this.bearing01 = bearing01;
|
|
58
63
|
this._arcLength01 = arcLength;
|
|
59
64
|
this._globalStrokes = LineString3d.create();
|
|
60
|
-
// initialize for compiler
|
|
65
|
+
// initialize for compiler; but this will be recomputed in refreshComputeProperties
|
|
61
66
|
this._curvature01 = Segment1d.create(0, 1);
|
|
62
67
|
this.refreshComputedProperties();
|
|
63
68
|
}
|
|
64
|
-
/**
|
|
69
|
+
/** Default spiral type name: clothoid. */
|
|
65
70
|
static defaultSpiralType = "clothoid";
|
|
66
|
-
/**
|
|
71
|
+
/** Use the integrated function to return an angle at fractional position. */
|
|
67
72
|
globalFractionToBearingRadians(fraction) {
|
|
68
73
|
const areaFraction = this._evaluator.fractionToArea(fraction);
|
|
69
74
|
const dx = this._arcLength01;
|
|
70
|
-
return this.bearing01.startRadians + areaFraction * dx * this._curvature01.signedDelta()
|
|
75
|
+
return this.bearing01.startRadians + areaFraction * dx * this._curvature01.signedDelta()
|
|
76
|
+
+ fraction * this._curvature01.x0 * dx;
|
|
71
77
|
}
|
|
72
|
-
/**
|
|
78
|
+
/** Use the integrated function to return an angle at fractional position. */
|
|
73
79
|
globalFractionToCurvature(fraction) {
|
|
74
80
|
const f = this._evaluator.fractionToCurvatureFraction(fraction);
|
|
75
81
|
return this._curvature01.fractionToPoint(f);
|
|
76
82
|
}
|
|
77
|
-
/** Return the bearing at given fraction of the active interval
|
|
83
|
+
/** Return the bearing at given fraction of the active interval. */
|
|
78
84
|
fractionToBearingRadians(activeFraction) {
|
|
79
85
|
const fraction = this.activeFractionInterval.fractionToPoint(activeFraction);
|
|
80
|
-
return this.bearing01.startRadians
|
|
86
|
+
return this.bearing01.startRadians
|
|
87
|
+
+ fraction * this._arcLength01 * (this._curvature01.x0 + 0.5 * fraction * (this._curvature01.x1 - this._curvature01.x0));
|
|
81
88
|
}
|
|
82
|
-
/**
|
|
89
|
+
/**
|
|
90
|
+
* Return the curvature at given fraction of the active interval.
|
|
83
91
|
* * The `undefined` result is to match the abstract class -- it cannot actually occur.
|
|
84
92
|
*/
|
|
85
93
|
fractionToCurvature(activeFraction) {
|
|
@@ -96,14 +104,15 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
96
104
|
IntegratedSpiral3d._gaussWeight = new Float64Array(5);
|
|
97
105
|
IntegratedSpiral3d._gaussMapper = (xA, xB, xMapped, wMapped) => Quadrature.setupGauss5(xA, xB, xMapped, wMapped);
|
|
98
106
|
}
|
|
99
|
-
/**
|
|
100
|
-
*
|
|
107
|
+
/**
|
|
108
|
+
* Evaluate and sum the gauss quadrature formulas to integrate cos(theta), sin(theta) fractional subset of a reference
|
|
109
|
+
* length (recall that theta is a nonlinear function of the fraction).
|
|
101
110
|
* * This is a single interval of gaussian integration.
|
|
102
|
-
* * The fraction is on the full spiral (not in the mapped active interval)
|
|
111
|
+
* * The fraction is on the full spiral (not in the mapped active interval).
|
|
103
112
|
* @param xyz advancing integrated point.
|
|
104
|
-
* @param fractionA fraction at start of interval
|
|
113
|
+
* @param fractionA fraction at start of interval.
|
|
105
114
|
* @param fractionB fraction at end of interval.
|
|
106
|
-
* @param unitArcLength length of curve for 0 to 1 fractional
|
|
115
|
+
* @param unitArcLength length of curve for 0 to 1 fractional.
|
|
107
116
|
*/
|
|
108
117
|
fullSpiralIncrementalIntegral(xyz, fractionA, fractionB, applyMatrix) {
|
|
109
118
|
const gaussFraction = IntegratedSpiral3d._gaussFraction;
|
|
@@ -124,7 +133,7 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
124
133
|
else
|
|
125
134
|
xyz.addXYZInPlace(dx, dy, 0.0);
|
|
126
135
|
}
|
|
127
|
-
/** Recompute strokes */
|
|
136
|
+
/** Recompute strokes. */
|
|
128
137
|
refreshComputedProperties() {
|
|
129
138
|
this._curvature01 = Segment1d.create(TransitionSpiral3d.radiusToCurvature(this.radius01.x0), TransitionSpiral3d.radiusToCurvature(this.radius01.x1));
|
|
130
139
|
this._globalStrokes.clear();
|
|
@@ -143,8 +152,9 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
143
152
|
if (this._activeStrokes === undefined)
|
|
144
153
|
this._activeStrokes = LineString3d.create();
|
|
145
154
|
this._activeStrokes.clear();
|
|
146
|
-
// finer strokes
|
|
147
|
-
//
|
|
155
|
+
// The active interval has finer strokes: it's the same fraction step but mapped to a sub-interval.
|
|
156
|
+
// Below assumes fractionToPoint depends upon the global strokes we just computed, and not
|
|
157
|
+
// on the active strokes we are computing.
|
|
148
158
|
for (let i = 0; i <= numInterval; i++) {
|
|
149
159
|
const localFraction = i * fractionStep;
|
|
150
160
|
this._activeStrokes.addPoint(this.fractionToPoint(localFraction));
|
|
@@ -153,10 +163,11 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
153
163
|
}
|
|
154
164
|
/**
|
|
155
165
|
* Create a transition spiral with radius and bearing conditions.
|
|
156
|
-
* @param radius01 radius (inverse curvature) at start and end
|
|
157
|
-
* @param bearing01 bearing angles at start and end. bearings are measured from the x axis, positive clockwise
|
|
166
|
+
* @param radius01 radius (inverse curvature) at start and end (radius of zero means straight line).
|
|
167
|
+
* @param bearing01 bearing angles at start and end. bearings are measured from the x axis, positive clockwise
|
|
168
|
+
* towards y axis.
|
|
158
169
|
* @param activeFractionInterval fractional limits of the active portion of the spiral.
|
|
159
|
-
* @param localToWorld placement frame.
|
|
170
|
+
* @param localToWorld placement frame. Fractional coordinate 0 is at the origin.
|
|
160
171
|
*/
|
|
161
172
|
static createRadiusRadiusBearingBearing(radius01, bearing01, activeFractionInterval, localToWorld, typeName) {
|
|
162
173
|
const arcLength = TransitionSpiral3d.radiusRadiusSweepRadiansToArcLength(radius01.x0, radius01.x1, bearing01.sweepRadians);
|
|
@@ -171,12 +182,13 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
171
182
|
* Create a transition spiral.
|
|
172
183
|
* * Inputs must provide exactly 4 of the 5 values `[radius0,radius1,bearing0,bearing1,length`.
|
|
173
184
|
* @param spiralType one of "clothoid", "bloss", "biquadratic", "cosine", "sine". If undefined, "clothoid" is used.
|
|
174
|
-
* @param radius0 radius (or 0 for tangent to line) at start
|
|
175
|
-
* @param radius1 radius (or 0 for tangent to line) at end
|
|
185
|
+
* @param radius0 radius (or 0 for tangent to line) at start.
|
|
186
|
+
* @param radius1 radius (or 0 for tangent to line) at end.
|
|
176
187
|
* @param bearing0 bearing, measured CCW from x axis at start.
|
|
177
188
|
* @param bearing1 bearing, measured CCW from x axis at end.
|
|
178
|
-
* @param fractionInterval optional fractional interval for an "active" portion of the curve.
|
|
179
|
-
*
|
|
189
|
+
* @param fractionInterval optional fractional interval for an "active" portion of the curve. If omitted, the full
|
|
190
|
+
* [0,1] is used.
|
|
191
|
+
* @param localToWorld placement transform.
|
|
180
192
|
*/
|
|
181
193
|
static createFrom4OutOf5(spiralType, radius0, radius1, bearing0, bearing1, arcLength, fractionInterval, localToWorld) {
|
|
182
194
|
if (spiralType === undefined)
|
|
@@ -203,11 +215,11 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
203
215
|
this._arcLength01 = other._arcLength01;
|
|
204
216
|
return this;
|
|
205
217
|
}
|
|
206
|
-
/** Deep clone of this spiral */
|
|
218
|
+
/** Deep clone of this spiral. */
|
|
207
219
|
clone() {
|
|
208
220
|
return new IntegratedSpiral3d(this._spiralType, this._evaluator, this.radius01.clone(), this.bearing01.clone(), this.activeFractionInterval.clone(), this.localToWorld.clone(), this._arcLength01, this._designProperties?.clone());
|
|
209
221
|
}
|
|
210
|
-
/**
|
|
222
|
+
/** Apply `transform` to this spiral's local to world transform. */
|
|
211
223
|
tryTransformInPlace(transformA) {
|
|
212
224
|
const rigidData = this.applyRigidPartOfTransform(transformA);
|
|
213
225
|
if (rigidData !== undefined) {
|
|
@@ -224,32 +236,50 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
224
236
|
startPoint(result) {
|
|
225
237
|
return this.activeStrokes.startPoint(result);
|
|
226
238
|
}
|
|
227
|
-
/**
|
|
239
|
+
/** Return the spiral end point. */
|
|
228
240
|
endPoint(result) {
|
|
229
241
|
return this.activeStrokes.endPoint(result);
|
|
230
242
|
}
|
|
231
|
-
/**
|
|
243
|
+
/** Test if the local to world transform places the spiral xy plane into `plane`. */
|
|
232
244
|
isInPlane(plane) {
|
|
233
245
|
return plane.isPointInPlane(this.localToWorld.origin)
|
|
234
246
|
&& Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnX(plane.getNormalRef()))
|
|
235
247
|
&& Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnY(plane.getNormalRef()));
|
|
236
248
|
}
|
|
237
|
-
/**
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
249
|
+
/**
|
|
250
|
+
* Return length of the spiral.
|
|
251
|
+
* * Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value.
|
|
252
|
+
*/
|
|
253
|
+
quickLength() {
|
|
254
|
+
return this.curveLength();
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Return length of the spiral.
|
|
258
|
+
* * Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value.
|
|
259
|
+
*/
|
|
260
|
+
curveLength() {
|
|
261
|
+
return this._arcLength01 * (this._activeFractionInterval.absoluteDelta());
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Return (unsigned) length of the spiral between fractions.
|
|
265
|
+
* * Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value.
|
|
266
|
+
*/
|
|
242
267
|
curveLengthBetweenFractions(fraction0, fraction1) {
|
|
243
268
|
return this._arcLength01 * (this._activeFractionInterval.absoluteDelta() * Math.abs(fraction1 - fraction0));
|
|
244
269
|
}
|
|
245
|
-
/** Test if `other` is an instance of `TransitionSpiral3d
|
|
246
|
-
isSameGeometryClass(other) {
|
|
247
|
-
|
|
270
|
+
/** Test if `other` is an instance of `TransitionSpiral3d`. */
|
|
271
|
+
isSameGeometryClass(other) {
|
|
272
|
+
return other instanceof TransitionSpiral3d;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Add strokes from this spiral to `dest`.
|
|
248
276
|
* * Linestrings will usually stroke as just their points.
|
|
249
277
|
* * If maxEdgeLength is given, this will sub-stroke within the linestring -- not what we want.
|
|
250
278
|
*/
|
|
251
|
-
emitStrokes(dest, options) {
|
|
252
|
-
|
|
279
|
+
emitStrokes(dest, options) {
|
|
280
|
+
this.activeStrokes.emitStrokes(dest, options);
|
|
281
|
+
}
|
|
282
|
+
/** Emit stroke fragments to `dest` handler. */
|
|
253
283
|
emitStrokableParts(dest, options) {
|
|
254
284
|
const n = this.computeStrokeCountForOptions(options);
|
|
255
285
|
dest.startParentCurvePrimitive(this);
|
|
@@ -264,8 +294,8 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
264
294
|
dest.endParentCurvePrimitive(this);
|
|
265
295
|
}
|
|
266
296
|
/**
|
|
267
|
-
*
|
|
268
|
-
* @param options StrokeOptions that determine count
|
|
297
|
+
* Return the stroke count required for given options.
|
|
298
|
+
* @param options StrokeOptions that determine count.
|
|
269
299
|
*/
|
|
270
300
|
computeStrokeCountForOptions(options) {
|
|
271
301
|
let numStroke;
|
|
@@ -280,8 +310,9 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
280
310
|
}
|
|
281
311
|
return numStroke;
|
|
282
312
|
}
|
|
283
|
-
/**
|
|
284
|
-
*
|
|
313
|
+
/**
|
|
314
|
+
* Reverse the active interval and active strokes.
|
|
315
|
+
* * Primary defining data remains unchanged.
|
|
285
316
|
*/
|
|
286
317
|
reverseInPlace() {
|
|
287
318
|
this.activeFractionInterval.reverseInPlace();
|
|
@@ -319,10 +350,10 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
319
350
|
}
|
|
320
351
|
else {
|
|
321
352
|
const clampedGlobalFraction = Geometry.clampToStartEnd(targetGlobalFraction, 0, 1);
|
|
322
|
-
const index0 = Math.trunc(clampedGlobalFraction * numStrokes); //
|
|
353
|
+
const index0 = Math.trunc(clampedGlobalFraction * numStrokes); // this indexes the point to the left of the query
|
|
323
354
|
const globalFraction0 = index0 / numStrokes;
|
|
324
355
|
result = this._globalStrokes.packedPoints.getPoint3dAtUncheckedPointIndex(index0, result);
|
|
325
|
-
// GeometryCoreTestIO.consoleLog("
|
|
356
|
+
// GeometryCoreTestIO.consoleLog("fractionToPoint ", activeFraction, this.activeFractionInterval, "( global integration " + globalFraction0 + " to " + globalFraction + ")", index0);
|
|
326
357
|
this.fullSpiralIncrementalIntegral(result, globalFraction0, targetGlobalFraction, true);
|
|
327
358
|
}
|
|
328
359
|
return result;
|
|
@@ -349,10 +380,11 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
349
380
|
result.matrix.applyGivensColumnOp(0, 1, c, s);
|
|
350
381
|
return result;
|
|
351
382
|
}
|
|
352
|
-
/**
|
|
353
|
-
*
|
|
354
|
-
* * origin at fractional position along the curve
|
|
355
|
-
* * vectorU is the first derivative, i.e. tangent vector with length equal to the rate of change with respect to
|
|
383
|
+
/**
|
|
384
|
+
* Return a plane with
|
|
385
|
+
* * origin at fractional position along the curve.
|
|
386
|
+
* * vectorU is the first derivative, i.e. tangent vector with length equal to the rate of change with respect to
|
|
387
|
+
* the fraction.
|
|
356
388
|
* * vectorV is the second derivative, i.e.derivative of vectorU.
|
|
357
389
|
*/
|
|
358
390
|
fractionToPointAnd2Derivatives(activeFraction, result) {
|
|
@@ -369,11 +401,11 @@ export class IntegratedSpiral3d extends TransitionSpiral3d {
|
|
|
369
401
|
vectorY.scaleInPlace(this.globalFractionToCurvature(globalFraction));
|
|
370
402
|
return Plane3dByOriginAndVectors.createCapture(origin, vectorX, vectorY, result);
|
|
371
403
|
}
|
|
372
|
-
/** Second step of double dispatch: call `handler.handleTransitionSpiral(this)
|
|
404
|
+
/** Second step of double dispatch: call `handler.handleTransitionSpiral(this)`. */
|
|
373
405
|
dispatchToGeometryHandler(handler) {
|
|
374
406
|
return handler.handleTransitionSpiral(this);
|
|
375
407
|
}
|
|
376
|
-
/**
|
|
408
|
+
/** Compare various coordinate quantities. */
|
|
377
409
|
isAlmostEqual(other) {
|
|
378
410
|
if (other instanceof IntegratedSpiral3d) {
|
|
379
411
|
return this.radius01.isAlmostEqual(other.radius01)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntegratedSpiral3d.js","sourceRoot":"","sources":["../../../../src/curve/spiral/IntegratedSpiral3d.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AAEvF;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IACxD,wCAAwC;IACxB,kBAAkB,GAAG,kBAAkB,CAAC;IAExD,yCAAyC;IAClC,QAAQ,CAAY;IAC3B,8CAA8C;IACvC,SAAS,CAAa;IAC7B,8CAA8C;IACtC,cAAc,CAAe;IACrC;;;OAGG;IACK,cAAc,CAAgB;IACtC,0EAA0E;IAC1E,IAAW,aAAa,KAAmB,OAAO,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC1H,UAAU,CAAuB;IACzC,wCAAwC;IAChC,YAAY,CAAS;IAC7B,kDAAkD;IAC1C,YAAY,CAAY;IAChC,+BAA+B;IAC/B,8HAA8H;IAC9H,YAAoB,UAA8B,EAChD,SAA+B,EAC/B,QAAmB,EACnB,SAAqB,EACrB,sBAAiC,EACjC,YAAuB,EACvB,SAAiB,EACjB,UAAuD;QACvD,KAAK,CAAC,UAAU,EAAE,YAAY,EAAE,sBAAsB,EAAE,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QAC5C,yFAAyF;QACzF,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACnC,CAAC;IACD,2CAA2C;IACpC,MAAM,CAAU,iBAAiB,GAAG,UAAU,CAAC;IAEtD,6EAA6E;IAEtE,8BAA8B,CAAC,QAAgB;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;IAClI,CAAC;IACD,6EAA6E;IACtE,yBAAyB,CAAC,QAAgB;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,uEAAuE;IAEhE,wBAAwB,CAAC,cAAsB;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,GAAG,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9J,CAAC;IACD;;OAEG;IACa,mBAAmB,CAAC,cAAsB;QACxD,uBAAuB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,2EAA2E;IAEnE,MAAM,CAAC,cAAc,CAAe;IACpC,MAAM,CAAC,YAAY,CAAe;IAClC,MAAM,CAAC,YAAY,CAAiF;IAC5G,0CAA0C;IACnC,MAAM,CAAC,aAAa;QACzB,kBAAkB,CAAC,cAAc,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACxD,kBAAkB,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACtD,kBAAkB,CAAC,YAAY,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnH,CAAC;IACD;;;;;;;;OAQG;IACK,6BAA6B,CAAC,GAAY,EAAE,SAAiB,EAAE,SAAiB,EAAE,WAAoB;QAC5G,MAAM,aAAa,GAAG,kBAAkB,CAAC,cAAc,CAAC;QACxD,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC;QACpD,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QAClG,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,EAAE,GAAG,GAAG,CAAC;QACb,IAAI,EAAE,GAAG,GAAG,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;YAC5B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,WAAW;YACb,QAAQ,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;;YAE7F,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAEnC,CAAC;IACD,wBAAwB;IACR,yBAAyB;QACvC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,MAAM,CAClC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EACtD,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,MAAM,YAAY,GAAG,GAAG,GAAG,WAAW,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;YACzC,MAAM,SAAS,GAAG,CAAC,GAAG,YAAY,CAAC;YACnC,IAAI,CAAC,6BAA6B,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAC9E,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;gBACnC,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;YAC9C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC5B,0EAA0E;YAC1E,mKAAmK;YACnK,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,aAAa,GAAG,CAAC,GAAG,YAAY,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,gCAAgC,CAAC,QAAmB,EAAE,SAAqB,EAAE,sBAAiC,EAAE,YAAuB,EAAE,QAAiB;QACtK,MAAM,SAAS,GAAG,kBAAkB,CAAC,mCAAmC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3H,IAAI,QAAQ,KAAK,SAAS;YACxB,QAAQ,GAAG,UAAU,CAAC;QACxB,MAAM,SAAS,GAAG,oBAAoB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,OAAO,IAAI,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAC/C,QAAQ,CAAC,KAAK,EAAE,EAChB,SAAS,CAAC,KAAK,EAAE,EAAE,sBAAsB,CAAC,KAAK,EAAE,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,SAAS,EAClF,IAAI,+BAA+B,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAC1D,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,EACxD,SAAS,CAAC,CAAC,CAAC;IAClB,CAAC;IACD;;;;;;;;;;OAUG;IACI,MAAM,CAAC,iBAAiB,CAC7B,UAA8B,EAC9B,OAA2B,EAC3B,OAA2B,EAC3B,QAA2B,EAC3B,QAA2B,EAC3B,SAA6B,EAC7B,gBAAuC,EACvC,YAAuB;QACvB,IAAI,UAAU,KAAK,SAAS;YAC1B,UAAU,GAAG,UAAU,CAAC;QAC1B,MAAM,SAAS,GAAG,oBAAoB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,+BAA+B,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACpC,OAAO,SAAS,CAAC;QACnB,IAAI,gBAAgB,KAAK,SAAS;YAChC,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,IAAI,kBAAkB,CAC3B,UAAU,EACV,SAAS,EACT,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAC5C,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,QAAS,EAAE,IAAI,CAAC,QAAS,CAAC,EACzD,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACpE,YAAY,EAAE,IAAI,CAAC,WAAY,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,kDAAkD;IAC3C,OAAO,CAAC,KAAyB;QACtC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,gCAAgC;IAChB,KAAK;QACnB,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAC7D,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAC7C,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,YAAY,EACjF,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,mEAAmE;IAC5D,mBAAmB,CAAC,UAAqB;QAE9C,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC;YACpC,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,KAAK,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IACrB,UAAU,CAAC,MAAgB;QACzC,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD,mCAAmC;IACnB,QAAQ,CAAC,MAAgB;QACvC,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,mFAAmF;IAC5E,SAAS,CAAC,KAAmC;QAClD,OAAO,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,MAAiB,CAAC;eAC3D,QAAQ,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;eACzF,QAAQ,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACjG,CAAC;IACD,kJAAkJ;IAC3I,WAAW,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACnD,kJAAkJ;IAClI,WAAW,KAAK,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5G,+KAA+K;IAC/J,2BAA2B,CAAC,SAAiB,EAAE,SAAiB;QAC9E,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;IAC9G,CAAC;IACD,6DAA6D;IACtD,mBAAmB,CAAC,KAAU,IAAa,OAAO,KAAK,YAAY,kBAAkB,CAAC,CAAC,CAAC;IAC/F;;;OAGG;IACI,WAAW,CAAC,IAAkB,EAAE,OAAuB,IAAU,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACxH,+CAA+C;IACxC,kBAAkB,CAAC,IAAoB,EAAE,OAAuB;QACrE,MAAM,CAAC,GAAG,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,6BAA6B,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC;QACtH,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,qCAAqC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IAEI,4BAA4B,CAAC,OAAuB;QACzD,IAAI,SAAS,CAAC;QACd,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9E,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAC5E,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACtE,SAAS,GAAG,OAAO,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IAEI,cAAc;QACnB,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IACvC,CAAC;IACD,qDAAqD;IAC9C,eAAe,CAAC,cAAsB,EAAE,MAAgB;QAC7D,MAAM,oBAAoB,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACzF,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/D,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;YACzB,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC;YACxD,MAAM,eAAe,GAAG,GAAG,GAAG,UAAU,CAAC;YACzC,IAAI,qBAAqB,GAAG,GAAG,CAAC;YAChC,IAAI,kBAAkB,GAAG,qBAAqB,GAAG,eAAe,CAAC;YACjE,OAAO,kBAAkB,GAAG,oBAAoB,EAAE,CAAC;gBACjD,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBAC5F,qBAAqB,GAAG,kBAAkB,CAAC;gBAC3C,kBAAkB,IAAI,eAAe,CAAC;YACxC,CAAC;YACD,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAChG,CAAC;aAAM,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;YAChC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;YACzD,MAAM,eAAe,GAAG,GAAG,GAAG,UAAU,CAAC;YACzC,IAAI,qBAAqB,GAAG,GAAG,CAAC;YAChC,IAAI,kBAAkB,GAAG,qBAAqB,GAAG,eAAe,CAAC;YACjE,OAAO,kBAAkB,GAAG,oBAAoB,EAAE,CAAC;gBACjD,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBAC5F,qBAAqB,GAAG,kBAAkB,CAAC;gBAC3C,kBAAkB,IAAI,eAAe,CAAC;YACxC,CAAC;YACD,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAChG,CAAC;aAAM,CAAC;YACN,MAAM,qBAAqB,GAAG,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,UAAU,CAAC,CAAC,CAAC,mDAAmD;YAClH,MAAM,eAAe,GAAG,MAAM,GAAG,UAAU,CAAC;YAC5C,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,+BAA+B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1F,sLAAsL;YACtL,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAE1F,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,oEAAoE;IAC7D,4BAA4B,CAAC,cAAsB,EAAE,MAAc;QACxE,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACnF,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAAC,cAAc,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACpG,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sDAAsD;IACtC,qBAAqB,CAAC,cAAsB,EAAE,MAAkB;QAC9E,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACnF,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAEzF,MAAM,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAAC,cAAc,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACI,8BAA8B,CAAC,cAAsB,EAAE,MAAkC;QAC9F,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAAC,cAAc,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,KAAK,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAC;QACrE,OAAO,yBAAyB,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACnF,CAAC;IACD,mFAAmF;IAC5E,yBAAyB,CAAC,OAAwB;QACvD,OAAO,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,4CAA4C;IAC5B,aAAa,CAAC,KAAqB;QACjD,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC;mBAC7C,IAAI,CAAC,SAAS,CAAC,6BAA6B,CAAC,KAAK,CAAC,SAAS,CAAC;mBAC7D,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;mBACnD,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC;mBAChE,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,KAAK,CAAC,sBAAsB,CAAC;mBACvE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;;AAEH,sDAAsD;AACtD,kBAAkB,CAAC,aAAa,EAAE,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { TransitionSpiral3d } from \"./TransitionSpiral3d\";\r\nimport { Segment1d } from \"../../geometry3d/Segment1d\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { NormalizedTransition } from \"./NormalizedTransition\";\r\nimport { TransitionConditionalProperties } from \"./TransitionConditionalProperties\";\r\nimport { Quadrature } from \"../../numerics/Quadrature\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Matrix3d } from \"../../geometry3d/Matrix3d\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { AxisOrder, Geometry } from \"../../Geometry\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Plane3dByOriginAndVectors } from \"../../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { GeometryQuery } from \"../GeometryQuery\";\r\n/**\r\n * An IntegratedSpiral3d is a curve defined by integrating its curvature.\r\n * * The first integral of curvature (with respect to distance along the curve) is the bearing angle (in radians)\r\n * * Integrating (cos(theta), sin(theta)) gives displacement from the start point, and thus the actual curve position.\r\n * * The curvature functions of interest are all symmetric snap functions in the NormalizedTransition class.\r\n * * `TransitionConditionalProperties` implements the computations of the interrelationship of radii, bearing, and length.\r\n * @public\r\n */\r\nexport class IntegratedSpiral3d extends TransitionSpiral3d {\r\n /** String name for schema properties */\r\n public readonly curvePrimitiveType = \"transitionSpiral\";\r\n\r\n /** start and end radii as a Segment1d */\r\n public radius01: Segment1d;\r\n /** start and end bearings as an AngleSweep */\r\n public bearing01: AngleSweep;\r\n /** stroked approximation of entire spiral. */\r\n private _globalStrokes: LineString3d;\r\n /** stroked approximation of active spiral.\r\n * * Same count as global -- possibly overly fine, but it gives some consistency between same clothoid constructed as partial versus complete.\r\n * * If no trimming, this points to the same place as the _globalStrokes !!! Don't double transform!!!\r\n */\r\n private _activeStrokes?: LineString3d;\r\n /** Return the internal stroked form of the (possibly partial) spiral */\r\n public get activeStrokes(): LineString3d { return this._activeStrokes !== undefined ? this._activeStrokes : this._globalStrokes; }\r\n private _evaluator: NormalizedTransition;\r\n /** Total curve arc length (computed) */\r\n private _arcLength01: number;\r\n /** Curvatures (inverse radii) at start and end */\r\n private _curvature01: Segment1d;\r\n /** evaluator for transition */\r\n // constructor demands all bearing, radius, and length data -- caller determines usual dependency of \"any 4 determine the 5th\"\r\n private constructor(spiralType: string | undefined,\r\n evaluator: NormalizedTransition,\r\n radius01: Segment1d,\r\n bearing01: AngleSweep,\r\n activeFractionInterval: Segment1d,\r\n localToWorld: Transform,\r\n arcLength: number,\r\n properties: TransitionConditionalProperties | undefined) {\r\n super(spiralType, localToWorld, activeFractionInterval, properties);\r\n this._evaluator = evaluator;\r\n this.radius01 = radius01;\r\n this.bearing01 = bearing01;\r\n this._arcLength01 = arcLength;\r\n this._globalStrokes = LineString3d.create();\r\n // initialize for compiler -- but this will be recomputed in refreshComputeProperties ...\r\n this._curvature01 = Segment1d.create(0, 1);\r\n this.refreshComputedProperties();\r\n }\r\n /** default spiral type name. (clothoid) */\r\n public static readonly defaultSpiralType = \"clothoid\";\r\n\r\n /** use the integrated function to return an angle at fractional position. */\r\n\r\n public globalFractionToBearingRadians(fraction: number): number {\r\n const areaFraction = this._evaluator.fractionToArea(fraction);\r\n const dx = this._arcLength01;\r\n return this.bearing01.startRadians + areaFraction * dx * this._curvature01.signedDelta() + fraction * this._curvature01.x0 * dx;\r\n }\r\n /** use the integrated function to return an angle at fractional position. */\r\n public globalFractionToCurvature(fraction: number): number {\r\n const f = this._evaluator.fractionToCurvatureFraction(fraction);\r\n return this._curvature01.fractionToPoint(f);\r\n }\r\n\r\n /** Return the bearing at given fraction of the active interval .... */\r\n\r\n public fractionToBearingRadians(activeFraction: number): number {\r\n const fraction = this.activeFractionInterval.fractionToPoint(activeFraction);\r\n return this.bearing01.startRadians + fraction * this._arcLength01 * (this._curvature01.x0 + 0.5 * fraction * (this._curvature01.x1 - this._curvature01.x0));\r\n }\r\n /** Return the curvature at given fraction of the active interval ...\r\n * * The `undefined` result is to match the abstract class -- it cannot actually occur.\r\n */\r\n public override fractionToCurvature(activeFraction: number): number | undefined {\r\n // BUG? active interval\r\n return this._curvature01.fractionToPoint(this.activeFractionInterval.fractionToPoint(activeFraction));\r\n }\r\n\r\n // These static variables are reused on calls to integrateFromStartFraction\r\n\r\n private static _gaussFraction: Float64Array;\r\n private static _gaussWeight: Float64Array;\r\n private static _gaussMapper: (xA: number, xB: number, arrayX: Float64Array, arrayW: Float64Array) => number;\r\n /** Initialize class level work arrays. */\r\n public static initWorkSpace() {\r\n IntegratedSpiral3d._gaussFraction = new Float64Array(5);\r\n IntegratedSpiral3d._gaussWeight = new Float64Array(5);\r\n IntegratedSpiral3d._gaussMapper = (xA, xB, xMapped, wMapped) => Quadrature.setupGauss5(xA, xB, xMapped, wMapped);\r\n }\r\n /** Evaluate and sum the gauss quadrature formulas to integrate cos(theta), sin(theta) fractional subset of a reference length.\r\n * (recall that theta is a nonlinear function of the fraction.)\r\n * * This is a single interval of gaussian integration.\r\n * * The fraction is on the full spiral (not in the mapped active interval)\r\n * @param xyz advancing integrated point.\r\n * @param fractionA fraction at start of interval\r\n * @param fractionB fraction at end of interval.\r\n * @param unitArcLength length of curve for 0 to 1 fractional\r\n */\r\n private fullSpiralIncrementalIntegral(xyz: Point3d, fractionA: number, fractionB: number, applyMatrix: boolean) {\r\n const gaussFraction = IntegratedSpiral3d._gaussFraction;\r\n const gaussWeight = IntegratedSpiral3d._gaussWeight;\r\n const numEval = IntegratedSpiral3d._gaussMapper(fractionA, fractionB, gaussFraction, gaussWeight);\r\n const deltaL = this._arcLength01;\r\n let w = 0;\r\n let dx = 0.0;\r\n let dy = 0.0;\r\n for (let k = 0; k < numEval; k++) {\r\n const radians = this.globalFractionToBearingRadians(gaussFraction[k]);\r\n w = gaussWeight[k] * deltaL;\r\n dx += w * Math.cos(radians);\r\n dy += w * Math.sin(radians);\r\n }\r\n if (applyMatrix)\r\n Matrix3d.xyzPlusMatrixTimesXYZ(xyz, this.localToWorld.matrix, { x: dx, y: dy, z: 0.0 }, xyz);\r\n else\r\n xyz.addXYZInPlace(dx, dy, 0.0);\r\n\r\n }\r\n /** Recompute strokes */\r\n public override refreshComputedProperties() {\r\n this._curvature01 = Segment1d.create(\r\n TransitionSpiral3d.radiusToCurvature(this.radius01.x0),\r\n TransitionSpiral3d.radiusToCurvature(this.radius01.x1));\r\n this._globalStrokes.clear();\r\n const currentPoint = Point3d.create();\r\n this._globalStrokes.appendStrokePoint(currentPoint);\r\n const numInterval = 16;\r\n\r\n const fractionStep = 1.0 / numInterval;\r\n for (let i = 1; i <= numInterval; i++) {\r\n const fraction0 = (i - 1) * fractionStep;\r\n const fraction1 = i * fractionStep;\r\n this.fullSpiralIncrementalIntegral(currentPoint, fraction0, fraction1, false);\r\n this._globalStrokes.appendStrokePoint(currentPoint);\r\n }\r\n this._globalStrokes.tryTransformInPlace(this.localToWorld);\r\n if (!this.activeFractionInterval.isExact01) {\r\n if (this._activeStrokes === undefined)\r\n this._activeStrokes = LineString3d.create();\r\n this._activeStrokes.clear();\r\n // finer strokes in the active interval ... same fraction step, but mapped\r\n // This assumes factionToPoint acts normally within refreshComputedProperties -- that depends on the global strokes we just computed, but not on the active strokes\r\n for (let i = 0; i <= numInterval; i++) {\r\n const localFraction = i * fractionStep;\r\n this._activeStrokes.addPoint(this.fractionToPoint(localFraction));\r\n }\r\n }\r\n }\r\n /**\r\n * Create a transition spiral with radius and bearing conditions.\r\n * @param radius01 radius (inverse curvature) at start and end. (radius of zero means straight line)\r\n * @param bearing01 bearing angles at start and end. bearings are measured from the x axis, positive clockwise towards y axis\r\n * @param activeFractionInterval fractional limits of the active portion of the spiral.\r\n * @param localToWorld placement frame. Fractional coordinate 0 is at the origin.\r\n */\r\n public static createRadiusRadiusBearingBearing(radius01: Segment1d, bearing01: AngleSweep, activeFractionInterval: Segment1d, localToWorld: Transform, typeName?: string) {\r\n const arcLength = TransitionSpiral3d.radiusRadiusSweepRadiansToArcLength(radius01.x0, radius01.x1, bearing01.sweepRadians);\r\n if (typeName === undefined)\r\n typeName = \"clothoid\";\r\n const evaluator = NormalizedTransition.findEvaluator(typeName);\r\n if (!evaluator)\r\n return undefined;\r\n return new IntegratedSpiral3d(typeName, evaluator,\r\n radius01.clone(),\r\n bearing01.clone(), activeFractionInterval.clone(), localToWorld.clone(), arcLength,\r\n new TransitionConditionalProperties(radius01.x0, radius01.x1,\r\n bearing01.startAngle.clone(), bearing01.endAngle.clone(),\r\n undefined));\r\n }\r\n /**\r\n * Create a transition spiral.\r\n * * Inputs must provide exactly 4 of the 5 values `[radius0,radius1,bearing0,bearing1,length`.\r\n * @param spiralType one of \"clothoid\", \"bloss\", \"biquadratic\", \"cosine\", \"sine\". If undefined, \"clothoid\" is used.\r\n * @param radius0 radius (or 0 for tangent to line) at start\r\n * @param radius1 radius (or 0 for tangent to line) at end\r\n * @param bearing0 bearing, measured CCW from x axis at start.\r\n * @param bearing1 bearing, measured CCW from x axis at end.\r\n * @param fractionInterval optional fractional interval for an \"active\" portion of the curve. if omitted, the full [0,1] is used.\r\n * @param localToWorld placement transform\r\n */\r\n public static createFrom4OutOf5(\r\n spiralType: string | undefined,\r\n radius0: number | undefined,\r\n radius1: number | undefined,\r\n bearing0: Angle | undefined,\r\n bearing1: Angle | undefined,\r\n arcLength: number | undefined,\r\n fractionInterval: undefined | Segment1d,\r\n localToWorld: Transform): IntegratedSpiral3d | undefined {\r\n if (spiralType === undefined)\r\n spiralType = \"clothoid\";\r\n const evaluator = NormalizedTransition.findEvaluator(spiralType);\r\n if (!evaluator)\r\n return undefined;\r\n const data = new TransitionConditionalProperties(radius0, radius1, bearing0, bearing1, arcLength);\r\n const data1 = data.clone();\r\n if (!data.tryResolveAnySingleUnknown())\r\n return undefined;\r\n if (fractionInterval === undefined)\r\n fractionInterval = Segment1d.create(0, 1);\r\n return new IntegratedSpiral3d(\r\n spiralType,\r\n evaluator,\r\n Segment1d.create(data.radius0, data.radius1),\r\n AngleSweep.createStartEnd(data.bearing0!, data.bearing1!),\r\n fractionInterval ? fractionInterval.clone() : Segment1d.create(0, 1),\r\n localToWorld, data.curveLength!, data1);\r\n }\r\n /** Copy all defining data from another spiral. */\r\n public setFrom(other: IntegratedSpiral3d): IntegratedSpiral3d {\r\n this.localToWorld.setFrom(other.localToWorld);\r\n this.radius01.setFrom(other.radius01);\r\n this._curvature01.setFrom(other._curvature01);\r\n this.bearing01.setFrom(other.bearing01);\r\n this.localToWorld.setFrom(other.localToWorld);\r\n this.activeFractionInterval.setFrom(other.activeFractionInterval);\r\n this._arcLength01 = other._arcLength01;\r\n return this;\r\n }\r\n /** Deep clone of this spiral */\r\n public override clone(): IntegratedSpiral3d {\r\n return new IntegratedSpiral3d(this._spiralType, this._evaluator,\r\n this.radius01.clone(), this.bearing01.clone(),\r\n this.activeFractionInterval.clone(), this.localToWorld.clone(), this._arcLength01,\r\n this._designProperties?.clone());\r\n }\r\n\r\n /** apply `transform` to this spiral's local to world transform. */\r\n public tryTransformInPlace(transformA: Transform): boolean {\r\n\r\n const rigidData = this.applyRigidPartOfTransform(transformA);\r\n if (rigidData !== undefined) {\r\n this._curvature01.x0 /= rigidData.scale;\r\n this._curvature01.x1 /= rigidData.scale;\r\n this.radius01.x0 *= rigidData.scale;\r\n this.radius01.x1 *= rigidData.scale;\r\n this._arcLength01 *= rigidData.scale;\r\n }\r\n this.refreshComputedProperties();\r\n return true;\r\n }\r\n\r\n /** Return the spiral start point. */\r\n public override startPoint(result?: Point3d): Point3d {\r\n return this.activeStrokes.startPoint(result);\r\n }\r\n /** return the spiral end point. */\r\n public override endPoint(result?: Point3d): Point3d {\r\n return this.activeStrokes.endPoint(result);\r\n }\r\n /** test if the local to world transform places the spiral xy plane into `plane` */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n return plane.isPointInPlane(this.localToWorld.origin as Point3d)\r\n && Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnX(plane.getNormalRef()))\r\n && Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnY(plane.getNormalRef()));\r\n }\r\n /** Return length of the spiral. Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value. */\r\n public quickLength() { return this.curveLength(); }\r\n /** Return length of the spiral. Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value. */\r\n public override curveLength() { return this._arcLength01 * (this._activeFractionInterval.absoluteDelta()); }\r\n /** Return (unsigned) length of the spiral between fractions. Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value. */\r\n public override curveLengthBetweenFractions(fraction0: number, fraction1: number) {\r\n return this._arcLength01 * (this._activeFractionInterval.absoluteDelta() * Math.abs(fraction1 - fraction0));\r\n }\r\n /** Test if `other` is an instance of `TransitionSpiral3d` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof TransitionSpiral3d; }\r\n /** Add strokes from this spiral to `dest`.\r\n * * Linestrings will usually stroke as just their points.\r\n * * If maxEdgeLength is given, this will sub-stroke within the linestring -- not what we want.\r\n */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void { this.activeStrokes.emitStrokes(dest, options); }\r\n /** emit stroke fragments to `dest` handler. */\r\n public emitStrokableParts(dest: IStrokeHandler, options?: StrokeOptions): void {\r\n const n = this.computeStrokeCountForOptions(options);\r\n dest.startParentCurvePrimitive(this);\r\n const activeStrokes = this.activeStrokes;\r\n const preferPrimary = dest.needPrimaryGeometryForStrokes === undefined ? false : dest.needPrimaryGeometryForStrokes();\r\n if (!preferPrimary && n <= activeStrokes.numPoints()) {\r\n this.activeStrokes.emitStrokableParts(dest, options);\r\n } else {\r\n dest.announceIntervalForUniformStepStrokes(this, n, 0.0, 1.0);\r\n }\r\n dest.endParentCurvePrimitive(this);\r\n }\r\n\r\n /**\r\n * return the stroke count required for given options.\r\n * @param options StrokeOptions that determine count\r\n */\r\n\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n let numStroke;\r\n if (options) {\r\n const rMin = Math.min(Math.abs(this.radius01.x0), Math.abs(this.radius01.x1));\r\n numStroke = options.applyTolerancesToArc(rMin, this.bearing01.sweepRadians);\r\n numStroke = options.applyMaxEdgeLength(numStroke, this.curveLength());\r\n numStroke = options.applyMinStrokesPerPrimitive(numStroke);\r\n } else {\r\n numStroke = StrokeOptions.applyAngleTol(undefined, 4, this.bearing01.sweepRadians);\r\n }\r\n return numStroke;\r\n }\r\n\r\n /** Reverse the active interval and active strokes.\r\n * * Primary defining data remains unchanged !!!\r\n */\r\n\r\n public reverseInPlace(): void {\r\n this.activeFractionInterval.reverseInPlace();\r\n if (this._activeStrokes === undefined)\r\n this._activeStrokes = this._globalStrokes.clone();\r\n this._activeStrokes.reverseInPlace();\r\n }\r\n /** Evaluate curve point with respect to fraction. */\r\n public fractionToPoint(activeFraction: number, result?: Point3d): Point3d {\r\n const targetGlobalFraction = this.activeFractionInterval.fractionToPoint(activeFraction);\r\n const numStrokes = this._globalStrokes.packedPoints.length - 1;\r\n if (activeFraction > 1.0) {\r\n result = this._globalStrokes.packedPoints.back(result)!;\r\n const integrationStep = 1.0 / numStrokes;\r\n let currentGlobalFraction = 1.0;\r\n let nextGlobalFraction = currentGlobalFraction + integrationStep;\r\n while (nextGlobalFraction < targetGlobalFraction) {\r\n this.fullSpiralIncrementalIntegral(result, currentGlobalFraction, nextGlobalFraction, true);\r\n currentGlobalFraction = nextGlobalFraction;\r\n nextGlobalFraction += integrationStep;\r\n }\r\n this.fullSpiralIncrementalIntegral(result, currentGlobalFraction, targetGlobalFraction, true);\r\n } else if (activeFraction < 0.0) {\r\n result = this._globalStrokes.packedPoints.front(result)!;\r\n const integrationStep = 1.0 / numStrokes;\r\n let currentGlobalFraction = 0.0;\r\n let nextGlobalFraction = currentGlobalFraction - integrationStep;\r\n while (nextGlobalFraction > targetGlobalFraction) {\r\n this.fullSpiralIncrementalIntegral(result, currentGlobalFraction, nextGlobalFraction, true);\r\n currentGlobalFraction = nextGlobalFraction;\r\n nextGlobalFraction -= integrationStep;\r\n }\r\n this.fullSpiralIncrementalIntegral(result, currentGlobalFraction, targetGlobalFraction, true);\r\n } else {\r\n const clampedGlobalFraction = Geometry.clampToStartEnd(targetGlobalFraction, 0, 1);\r\n const index0 = Math.trunc(clampedGlobalFraction * numStrokes); // This indexes the point to the left of the query.\r\n const globalFraction0 = index0 / numStrokes;\r\n result = this._globalStrokes.packedPoints.getPoint3dAtUncheckedPointIndex(index0, result);\r\n // GeometryCoreTestIO.consoleLog(\" fractionToPoint \", activeFraction, this.activeFractionInterval, \"( global integration \" + globalFraction0 + \" to \" + globalFraction + \")\", index0);\r\n this.fullSpiralIncrementalIntegral(result, globalFraction0, targetGlobalFraction, true);\r\n\r\n }\r\n return result;\r\n }\r\n /** Evaluate curve point and derivative with respect to fraction. */\r\n public fractionToPointAndDerivative(activeFraction: number, result?: Ray3d): Ray3d {\r\n const globalFraction = this.activeFractionInterval.fractionToPoint(activeFraction);\r\n result = result ? result : Ray3d.createZero();\r\n this.fractionToPoint(activeFraction, result.origin);\r\n const radians = this.globalFractionToBearingRadians(globalFraction);\r\n const a = this._arcLength01 * this.activeFractionInterval.signedDelta();\r\n this.localToWorld.matrix.multiplyXY(a * Math.cos(radians), a * Math.sin(radians), result.direction);\r\n return result;\r\n }\r\n\r\n /** Return the frenet frame at fractional position. */\r\n public override fractionToFrenetFrame(activeFraction: number, result?: Transform): Transform {\r\n const globalFraction = this.activeFractionInterval.fractionToPoint(activeFraction);\r\n result = result ? result : Transform.createIdentity();\r\n result.origin.setFrom(this.fractionToPoint(activeFraction));\r\n Matrix3d.createRigidFromMatrix3d(this.localToWorld.matrix, AxisOrder.XYZ, result.matrix);\r\n\r\n const radians = this.globalFractionToBearingRadians(globalFraction);\r\n const c = Math.cos(radians);\r\n const s = Math.sin(radians);\r\n result.matrix.applyGivensColumnOp(0, 1, c, s);\r\n return result;\r\n }\r\n /** Return a plane with\r\n *\r\n * * origin at fractional position along the curve\r\n * * vectorU is the first derivative, i.e. tangent vector with length equal to the rate of change with respect to the fraction.\r\n * * vectorV is the second derivative, i.e.derivative of vectorU.\r\n */\r\n public fractionToPointAnd2Derivatives(activeFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors | undefined {\r\n const globalFraction = this.activeFractionInterval.fractionToPoint(activeFraction);\r\n const origin = this.fractionToPoint(activeFraction);\r\n const radians = this.globalFractionToBearingRadians(globalFraction);\r\n const c = Math.cos(radians);\r\n const s = Math.sin(radians);\r\n const delta = this.activeFractionInterval.signedDelta();\r\n const a = delta;\r\n const b = a * delta;\r\n const vectorX = this.localToWorld.matrix.multiplyXY(a * c, a * s);\r\n const vectorY = this.localToWorld.matrix.multiplyXY(-b * s, b * c);\r\n vectorY.scaleInPlace(this.globalFractionToCurvature(globalFraction));\r\n return Plane3dByOriginAndVectors.createCapture(origin, vectorX, vectorY, result);\r\n }\r\n /** Second step of double dispatch: call `handler.handleTransitionSpiral(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleTransitionSpiral(this);\r\n }\r\n\r\n /** compare various coordinate quantities */\r\n public override isAlmostEqual(other?: GeometryQuery): boolean {\r\n if (other instanceof IntegratedSpiral3d) {\r\n return this.radius01.isAlmostEqual(other.radius01)\r\n && this.bearing01.isAlmostEqualAllowPeriodShift(other.bearing01)\r\n && this.localToWorld.isAlmostEqual(other.localToWorld)\r\n && Geometry.isSameCoordinate(this._arcLength01, other._arcLength01)\r\n && this.activeFractionInterval.isAlmostEqual(other.activeFractionInterval)\r\n && this._curvature01.isAlmostEqual(other._curvature01);\r\n }\r\n return false;\r\n }\r\n}\r\n// at load time, initialize gauss quadrature workspace\r\nIntegratedSpiral3d.initWorkSpace();\r\n"]}
|
|
1
|
+
{"version":3,"file":"IntegratedSpiral3d.js","sourceRoot":"","sources":["../../../../src/curve/spiral/IntegratedSpiral3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { TransitionSpiral3d } from \"./TransitionSpiral3d\";\nimport { Segment1d } from \"../../geometry3d/Segment1d\";\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\nimport { Transform } from \"../../geometry3d/Transform\";\nimport { LineString3d } from \"../LineString3d\";\nimport { NormalizedTransition } from \"./NormalizedTransition\";\nimport { TransitionConditionalProperties } from \"./TransitionConditionalProperties\";\nimport { Quadrature } from \"../../numerics/Quadrature\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Matrix3d } from \"../../geometry3d/Matrix3d\";\nimport { Angle } from \"../../geometry3d/Angle\";\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { AxisOrder, Geometry } from \"../../Geometry\";\nimport { StrokeOptions } from \"../StrokeOptions\";\nimport { GeometryHandler, IStrokeHandler } from \"../../geometry3d/GeometryHandler\";\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\nimport { Plane3dByOriginAndVectors } from \"../../geometry3d/Plane3dByOriginAndVectors\";\nimport { GeometryQuery } from \"../GeometryQuery\";\n\n/**\n * An IntegratedSpiral3d is a curve defined by integrating its curvature.\n * * The first integral of curvature (with respect to distance along the curve) is the bearing angle (in radians).\n * * Integrating (cos(theta), sin(theta)) gives displacement from the start point, and thus the actual curve position.\n * * The curvature functions of interest are all symmetric snap functions in the [[NormalizedTransition]] class.\n * * [[TransitionConditionalProperties]] implements the computations of the interrelationship of radii, bearing, and length.\n * @public\n */\nexport class IntegratedSpiral3d extends TransitionSpiral3d {\n /** String name for schema properties. */\n public readonly curvePrimitiveType = \"transitionSpiral\";\n /** Start and end radii as a Segment1d. */\n public radius01: Segment1d;\n /** Start and end bearings as an AngleSweep. */\n public bearing01: AngleSweep;\n /** Stroked approximation of entire spiral. */\n private _globalStrokes: LineString3d;\n /**\n * Stroked approximation of active spiral.\n * * Same count as global -- possibly overly fine, but it gives some consistency between same clothoid constructed\n * as partial versus complete.\n * * If no trimming, this points to the same place as the _globalStrokes. DO NOT double transform.\n */\n private _activeStrokes?: LineString3d;\n /** Return the internal stroked form of the (possibly partial) spiral. */\n public get activeStrokes(): LineString3d {\n return this._activeStrokes !== undefined ? this._activeStrokes : this._globalStrokes;\n }\n /** Evaluator for transition. */\n private _evaluator: NormalizedTransition;\n /** Total curve arc length (computed). */\n private _arcLength01: number;\n /** Curvatures (inverse radii) at start and end. */\n private _curvature01: Segment1d;\n // constructor demands all bearing, radius, and length data.\n // caller determines usual dependency of \"any 4 determine the 5th\".\n private constructor(\n spiralType: string | undefined,\n evaluator: NormalizedTransition,\n radius01: Segment1d,\n bearing01: AngleSweep,\n activeFractionInterval: Segment1d,\n localToWorld: Transform,\n arcLength: number,\n properties: TransitionConditionalProperties | undefined,\n ) {\n super(spiralType, localToWorld, activeFractionInterval, properties);\n this._evaluator = evaluator;\n this.radius01 = radius01;\n this.bearing01 = bearing01;\n this._arcLength01 = arcLength;\n this._globalStrokes = LineString3d.create();\n // initialize for compiler; but this will be recomputed in refreshComputeProperties\n this._curvature01 = Segment1d.create(0, 1);\n this.refreshComputedProperties();\n }\n /** Default spiral type name: clothoid. */\n public static readonly defaultSpiralType = \"clothoid\";\n /** Use the integrated function to return an angle at fractional position. */\n public globalFractionToBearingRadians(fraction: number): number {\n const areaFraction = this._evaluator.fractionToArea(fraction);\n const dx = this._arcLength01;\n return this.bearing01.startRadians + areaFraction * dx * this._curvature01.signedDelta()\n + fraction * this._curvature01.x0 * dx;\n }\n /** Use the integrated function to return an angle at fractional position. */\n public globalFractionToCurvature(fraction: number): number {\n const f = this._evaluator.fractionToCurvatureFraction(fraction);\n return this._curvature01.fractionToPoint(f);\n }\n /** Return the bearing at given fraction of the active interval. */\n public fractionToBearingRadians(activeFraction: number): number {\n const fraction = this.activeFractionInterval.fractionToPoint(activeFraction);\n return this.bearing01.startRadians\n + fraction * this._arcLength01 * (this._curvature01.x0 + 0.5 * fraction * (this._curvature01.x1 - this._curvature01.x0));\n }\n /**\n * Return the curvature at given fraction of the active interval.\n * * The `undefined` result is to match the abstract class -- it cannot actually occur.\n */\n public override fractionToCurvature(activeFraction: number): number | undefined {\n // BUG? active interval\n return this._curvature01.fractionToPoint(this.activeFractionInterval.fractionToPoint(activeFraction));\n }\n // These static variables are reused on calls to integrateFromStartFraction\n private static _gaussFraction: Float64Array;\n private static _gaussWeight: Float64Array;\n private static _gaussMapper: (xA: number, xB: number, arrayX: Float64Array, arrayW: Float64Array) => number;\n /** Initialize class level work arrays. */\n public static initWorkSpace() {\n IntegratedSpiral3d._gaussFraction = new Float64Array(5);\n IntegratedSpiral3d._gaussWeight = new Float64Array(5);\n IntegratedSpiral3d._gaussMapper = (xA, xB, xMapped, wMapped) => Quadrature.setupGauss5(xA, xB, xMapped, wMapped);\n }\n /**\n * Evaluate and sum the gauss quadrature formulas to integrate cos(theta), sin(theta) fractional subset of a reference\n * length (recall that theta is a nonlinear function of the fraction).\n * * This is a single interval of gaussian integration.\n * * The fraction is on the full spiral (not in the mapped active interval).\n * @param xyz advancing integrated point.\n * @param fractionA fraction at start of interval.\n * @param fractionB fraction at end of interval.\n * @param unitArcLength length of curve for 0 to 1 fractional.\n */\n private fullSpiralIncrementalIntegral(xyz: Point3d, fractionA: number, fractionB: number, applyMatrix: boolean) {\n const gaussFraction = IntegratedSpiral3d._gaussFraction;\n const gaussWeight = IntegratedSpiral3d._gaussWeight;\n const numEval = IntegratedSpiral3d._gaussMapper(fractionA, fractionB, gaussFraction, gaussWeight);\n const deltaL = this._arcLength01;\n let w = 0;\n let dx = 0.0;\n let dy = 0.0;\n for (let k = 0; k < numEval; k++) {\n const radians = this.globalFractionToBearingRadians(gaussFraction[k]);\n w = gaussWeight[k] * deltaL;\n dx += w * Math.cos(radians);\n dy += w * Math.sin(radians);\n }\n if (applyMatrix)\n Matrix3d.xyzPlusMatrixTimesXYZ(xyz, this.localToWorld.matrix, { x: dx, y: dy, z: 0.0 }, xyz);\n else\n xyz.addXYZInPlace(dx, dy, 0.0);\n }\n /** Recompute strokes. */\n public override refreshComputedProperties() {\n this._curvature01 = Segment1d.create(\n TransitionSpiral3d.radiusToCurvature(this.radius01.x0),\n TransitionSpiral3d.radiusToCurvature(this.radius01.x1),\n );\n this._globalStrokes.clear();\n const currentPoint = Point3d.create();\n this._globalStrokes.appendStrokePoint(currentPoint);\n const numInterval = 16;\n const fractionStep = 1.0 / numInterval;\n for (let i = 1; i <= numInterval; i++) {\n const fraction0 = (i - 1) * fractionStep;\n const fraction1 = i * fractionStep;\n this.fullSpiralIncrementalIntegral(currentPoint, fraction0, fraction1, false);\n this._globalStrokes.appendStrokePoint(currentPoint);\n }\n this._globalStrokes.tryTransformInPlace(this.localToWorld);\n if (!this.activeFractionInterval.isExact01) {\n if (this._activeStrokes === undefined)\n this._activeStrokes = LineString3d.create();\n this._activeStrokes.clear();\n // The active interval has finer strokes: it's the same fraction step but mapped to a sub-interval.\n // Below assumes fractionToPoint depends upon the global strokes we just computed, and not\n // on the active strokes we are computing.\n for (let i = 0; i <= numInterval; i++) {\n const localFraction = i * fractionStep;\n this._activeStrokes.addPoint(this.fractionToPoint(localFraction));\n }\n }\n }\n /**\n * Create a transition spiral with radius and bearing conditions.\n * @param radius01 radius (inverse curvature) at start and end (radius of zero means straight line).\n * @param bearing01 bearing angles at start and end. bearings are measured from the x axis, positive clockwise\n * towards y axis.\n * @param activeFractionInterval fractional limits of the active portion of the spiral.\n * @param localToWorld placement frame. Fractional coordinate 0 is at the origin.\n */\n public static createRadiusRadiusBearingBearing(\n radius01: Segment1d,\n bearing01: AngleSweep,\n activeFractionInterval: Segment1d,\n localToWorld: Transform,\n typeName?: string,\n ): IntegratedSpiral3d | undefined {\n const arcLength = TransitionSpiral3d.radiusRadiusSweepRadiansToArcLength(\n radius01.x0, radius01.x1, bearing01.sweepRadians,\n );\n if (typeName === undefined)\n typeName = \"clothoid\";\n const evaluator = NormalizedTransition.findEvaluator(typeName);\n if (!evaluator)\n return undefined;\n return new IntegratedSpiral3d(\n typeName,\n evaluator,\n radius01.clone(),\n bearing01.clone(),\n activeFractionInterval.clone(),\n localToWorld.clone(),\n arcLength,\n new TransitionConditionalProperties(\n radius01.x0, radius01.x1, bearing01.startAngle.clone(), bearing01.endAngle.clone(), undefined,\n ),\n );\n }\n /**\n * Create a transition spiral.\n * * Inputs must provide exactly 4 of the 5 values `[radius0,radius1,bearing0,bearing1,length`.\n * @param spiralType one of \"clothoid\", \"bloss\", \"biquadratic\", \"cosine\", \"sine\". If undefined, \"clothoid\" is used.\n * @param radius0 radius (or 0 for tangent to line) at start.\n * @param radius1 radius (or 0 for tangent to line) at end.\n * @param bearing0 bearing, measured CCW from x axis at start.\n * @param bearing1 bearing, measured CCW from x axis at end.\n * @param fractionInterval optional fractional interval for an \"active\" portion of the curve. If omitted, the full\n * [0,1] is used.\n * @param localToWorld placement transform.\n */\n public static createFrom4OutOf5(\n spiralType: string | undefined,\n radius0: number | undefined,\n radius1: number | undefined,\n bearing0: Angle | undefined,\n bearing1: Angle | undefined,\n arcLength: number | undefined,\n fractionInterval: undefined | Segment1d,\n localToWorld: Transform,\n ): IntegratedSpiral3d | undefined {\n if (spiralType === undefined)\n spiralType = \"clothoid\";\n const evaluator = NormalizedTransition.findEvaluator(spiralType);\n if (!evaluator)\n return undefined;\n const data = new TransitionConditionalProperties(radius0, radius1, bearing0, bearing1, arcLength);\n const data1 = data.clone();\n if (!data.tryResolveAnySingleUnknown())\n return undefined;\n if (fractionInterval === undefined)\n fractionInterval = Segment1d.create(0, 1);\n return new IntegratedSpiral3d(\n spiralType,\n evaluator,\n Segment1d.create(data.radius0, data.radius1),\n AngleSweep.createStartEnd(data.bearing0!, data.bearing1!),\n fractionInterval ? fractionInterval.clone() : Segment1d.create(0, 1),\n localToWorld,\n data.curveLength!,\n data1,\n );\n }\n /** Copy all defining data from another spiral. */\n public setFrom(other: IntegratedSpiral3d): IntegratedSpiral3d {\n this.localToWorld.setFrom(other.localToWorld);\n this.radius01.setFrom(other.radius01);\n this._curvature01.setFrom(other._curvature01);\n this.bearing01.setFrom(other.bearing01);\n this.localToWorld.setFrom(other.localToWorld);\n this.activeFractionInterval.setFrom(other.activeFractionInterval);\n this._arcLength01 = other._arcLength01;\n return this;\n }\n /** Deep clone of this spiral. */\n public override clone(): IntegratedSpiral3d {\n return new IntegratedSpiral3d(\n this._spiralType,\n this._evaluator,\n this.radius01.clone(),\n this.bearing01.clone(),\n this.activeFractionInterval.clone(),\n this.localToWorld.clone(),\n this._arcLength01,\n this._designProperties?.clone(),\n );\n }\n /** Apply `transform` to this spiral's local to world transform. */\n public tryTransformInPlace(transformA: Transform): boolean {\n const rigidData = this.applyRigidPartOfTransform(transformA);\n if (rigidData !== undefined) {\n this._curvature01.x0 /= rigidData.scale;\n this._curvature01.x1 /= rigidData.scale;\n this.radius01.x0 *= rigidData.scale;\n this.radius01.x1 *= rigidData.scale;\n this._arcLength01 *= rigidData.scale;\n }\n this.refreshComputedProperties();\n return true;\n }\n /** Return the spiral start point. */\n public override startPoint(result?: Point3d): Point3d {\n return this.activeStrokes.startPoint(result);\n }\n /** Return the spiral end point. */\n public override endPoint(result?: Point3d): Point3d {\n return this.activeStrokes.endPoint(result);\n }\n /** Test if the local to world transform places the spiral xy plane into `plane`. */\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\n return plane.isPointInPlane(this.localToWorld.origin as Point3d)\n && Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnX(plane.getNormalRef()))\n && Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnY(plane.getNormalRef()));\n }\n /**\n * Return length of the spiral.\n * * Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value.\n */\n public quickLength() {\n return this.curveLength();\n }\n /**\n * Return length of the spiral.\n * * Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value.\n */\n public override curveLength() {\n return this._arcLength01 * (this._activeFractionInterval.absoluteDelta());\n }\n /**\n * Return (unsigned) length of the spiral between fractions.\n * * Because TransitionSpiral is parameterized directly in terms of distance along, this is a simple return value.\n */\n public override curveLengthBetweenFractions(fraction0: number, fraction1: number) {\n return this._arcLength01 * (this._activeFractionInterval.absoluteDelta() * Math.abs(fraction1 - fraction0));\n }\n /** Test if `other` is an instance of `TransitionSpiral3d`. */\n public isSameGeometryClass(other: any): boolean {\n return other instanceof TransitionSpiral3d;\n }\n /**\n * Add strokes from this spiral to `dest`.\n * * Linestrings will usually stroke as just their points.\n * * If maxEdgeLength is given, this will sub-stroke within the linestring -- not what we want.\n */\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\n this.activeStrokes.emitStrokes(dest, options);\n }\n /** Emit stroke fragments to `dest` handler. */\n public emitStrokableParts(dest: IStrokeHandler, options?: StrokeOptions): void {\n const n = this.computeStrokeCountForOptions(options);\n dest.startParentCurvePrimitive(this);\n const activeStrokes = this.activeStrokes;\n const preferPrimary = dest.needPrimaryGeometryForStrokes === undefined ? false : dest.needPrimaryGeometryForStrokes();\n if (!preferPrimary && n <= activeStrokes.numPoints()) {\n this.activeStrokes.emitStrokableParts(dest, options);\n } else {\n dest.announceIntervalForUniformStepStrokes(this, n, 0.0, 1.0);\n }\n dest.endParentCurvePrimitive(this);\n }\n /**\n * Return the stroke count required for given options.\n * @param options StrokeOptions that determine count.\n */\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\n let numStroke;\n if (options) {\n const rMin = Math.min(Math.abs(this.radius01.x0), Math.abs(this.radius01.x1));\n numStroke = options.applyTolerancesToArc(rMin, this.bearing01.sweepRadians);\n numStroke = options.applyMaxEdgeLength(numStroke, this.curveLength());\n numStroke = options.applyMinStrokesPerPrimitive(numStroke);\n } else {\n numStroke = StrokeOptions.applyAngleTol(undefined, 4, this.bearing01.sweepRadians);\n }\n return numStroke;\n }\n /**\n * Reverse the active interval and active strokes.\n * * Primary defining data remains unchanged.\n */\n public reverseInPlace(): void {\n this.activeFractionInterval.reverseInPlace();\n if (this._activeStrokes === undefined)\n this._activeStrokes = this._globalStrokes.clone();\n this._activeStrokes.reverseInPlace();\n }\n /** Evaluate curve point with respect to fraction. */\n public fractionToPoint(activeFraction: number, result?: Point3d): Point3d {\n const targetGlobalFraction = this.activeFractionInterval.fractionToPoint(activeFraction);\n const numStrokes = this._globalStrokes.packedPoints.length - 1;\n if (activeFraction > 1.0) {\n result = this._globalStrokes.packedPoints.back(result)!;\n const integrationStep = 1.0 / numStrokes;\n let currentGlobalFraction = 1.0;\n let nextGlobalFraction = currentGlobalFraction + integrationStep;\n while (nextGlobalFraction < targetGlobalFraction) {\n this.fullSpiralIncrementalIntegral(result, currentGlobalFraction, nextGlobalFraction, true);\n currentGlobalFraction = nextGlobalFraction;\n nextGlobalFraction += integrationStep;\n }\n this.fullSpiralIncrementalIntegral(result, currentGlobalFraction, targetGlobalFraction, true);\n } else if (activeFraction < 0.0) {\n result = this._globalStrokes.packedPoints.front(result)!;\n const integrationStep = 1.0 / numStrokes;\n let currentGlobalFraction = 0.0;\n let nextGlobalFraction = currentGlobalFraction - integrationStep;\n while (nextGlobalFraction > targetGlobalFraction) {\n this.fullSpiralIncrementalIntegral(result, currentGlobalFraction, nextGlobalFraction, true);\n currentGlobalFraction = nextGlobalFraction;\n nextGlobalFraction -= integrationStep;\n }\n this.fullSpiralIncrementalIntegral(result, currentGlobalFraction, targetGlobalFraction, true);\n } else {\n const clampedGlobalFraction = Geometry.clampToStartEnd(targetGlobalFraction, 0, 1);\n const index0 = Math.trunc(clampedGlobalFraction * numStrokes); // this indexes the point to the left of the query\n const globalFraction0 = index0 / numStrokes;\n result = this._globalStrokes.packedPoints.getPoint3dAtUncheckedPointIndex(index0, result);\n // GeometryCoreTestIO.consoleLog(\"fractionToPoint \", activeFraction, this.activeFractionInterval, \"( global integration \" + globalFraction0 + \" to \" + globalFraction + \")\", index0);\n this.fullSpiralIncrementalIntegral(result, globalFraction0, targetGlobalFraction, true);\n\n }\n return result;\n }\n /** Evaluate curve point and derivative with respect to fraction. */\n public fractionToPointAndDerivative(activeFraction: number, result?: Ray3d): Ray3d {\n const globalFraction = this.activeFractionInterval.fractionToPoint(activeFraction);\n result = result ? result : Ray3d.createZero();\n this.fractionToPoint(activeFraction, result.origin);\n const radians = this.globalFractionToBearingRadians(globalFraction);\n const a = this._arcLength01 * this.activeFractionInterval.signedDelta();\n this.localToWorld.matrix.multiplyXY(a * Math.cos(radians), a * Math.sin(radians), result.direction);\n return result;\n }\n /** Return the frenet frame at fractional position. */\n public override fractionToFrenetFrame(activeFraction: number, result?: Transform): Transform {\n const globalFraction = this.activeFractionInterval.fractionToPoint(activeFraction);\n result = result ? result : Transform.createIdentity();\n result.origin.setFrom(this.fractionToPoint(activeFraction));\n Matrix3d.createRigidFromMatrix3d(this.localToWorld.matrix, AxisOrder.XYZ, result.matrix);\n const radians = this.globalFractionToBearingRadians(globalFraction);\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n result.matrix.applyGivensColumnOp(0, 1, c, s);\n return result;\n }\n /**\n * Return a plane with\n * * origin at fractional position along the curve.\n * * vectorU is the first derivative, i.e. tangent vector with length equal to the rate of change with respect to\n * the fraction.\n * * vectorV is the second derivative, i.e.derivative of vectorU.\n */\n public fractionToPointAnd2Derivatives(\n activeFraction: number, result?: Plane3dByOriginAndVectors,\n ): Plane3dByOriginAndVectors | undefined {\n const globalFraction = this.activeFractionInterval.fractionToPoint(activeFraction);\n const origin = this.fractionToPoint(activeFraction);\n const radians = this.globalFractionToBearingRadians(globalFraction);\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n const delta = this.activeFractionInterval.signedDelta();\n const a = delta;\n const b = a * delta;\n const vectorX = this.localToWorld.matrix.multiplyXY(a * c, a * s);\n const vectorY = this.localToWorld.matrix.multiplyXY(-b * s, b * c);\n vectorY.scaleInPlace(this.globalFractionToCurvature(globalFraction));\n return Plane3dByOriginAndVectors.createCapture(origin, vectorX, vectorY, result);\n }\n /** Second step of double dispatch: call `handler.handleTransitionSpiral(this)`. */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleTransitionSpiral(this);\n }\n /** Compare various coordinate quantities. */\n public override isAlmostEqual(other?: GeometryQuery): boolean {\n if (other instanceof IntegratedSpiral3d) {\n return this.radius01.isAlmostEqual(other.radius01)\n && this.bearing01.isAlmostEqualAllowPeriodShift(other.bearing01)\n && this.localToWorld.isAlmostEqual(other.localToWorld)\n && Geometry.isSameCoordinate(this._arcLength01, other._arcLength01)\n && this.activeFractionInterval.isAlmostEqual(other.activeFractionInterval)\n && this._curvature01.isAlmostEqual(other._curvature01);\n }\n return false;\n }\n}\n// at load time, initialize gauss quadrature workspace\nIntegratedSpiral3d.initWorkSpace();\n"]}
|
|
@@ -2,16 +2,11 @@ import { CubicEvaluator } from "./CubicEvaluator";
|
|
|
2
2
|
/**
|
|
3
3
|
* MX Cubic along arc.
|
|
4
4
|
* This is y= m*x^3 with
|
|
5
|
-
* * x any point on the x axis
|
|
6
|
-
* * `fraction` along the spiral goes to `x = fraction * Lx
|
|
7
|
-
* * m is (1/6RL)
|
|
5
|
+
* * x any point on the x axis.
|
|
6
|
+
* * `fraction` along the spiral goes to `x = fraction * Lx`.
|
|
7
|
+
* * m is (1/6RL).
|
|
8
8
|
* * construction length L is nominal along the curve.
|
|
9
9
|
* * x length Lx is along the axis, determined by two terms of the clothoid x series.
|
|
10
|
-
* *
|
|
11
|
-
* @param localToWorld
|
|
12
|
-
* @param nominalL1
|
|
13
|
-
* @param nominalR1
|
|
14
|
-
* @param activeInterval
|
|
15
10
|
* @internal
|
|
16
11
|
*/
|
|
17
12
|
export declare class MXCubicAlongArcEvaluator extends CubicEvaluator {
|
|
@@ -23,14 +18,15 @@ export declare class MXCubicAlongArcEvaluator extends CubicEvaluator {
|
|
|
23
18
|
static computeCubicM(length1: number, radius1: number): number | undefined;
|
|
24
19
|
static create(length1: number, radius1: number): MXCubicAlongArcEvaluator | undefined;
|
|
25
20
|
scaleInPlace(scaleFactor: number): void;
|
|
26
|
-
/**
|
|
21
|
+
/** Return a deep copy of the evaluator. */
|
|
27
22
|
clone(): MXCubicAlongArcEvaluator;
|
|
28
|
-
/** Member by member matchup
|
|
23
|
+
/** Member by member matchup. */
|
|
29
24
|
isAlmostEqual(other: any): boolean;
|
|
30
25
|
/**
|
|
31
26
|
* Return a (fast but mediocre) approximation of spiral x position as function of approximate distance along the curve.
|
|
32
27
|
* * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.
|
|
33
|
-
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
28
|
+
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
29
|
+
* CurvePrimitive measurements.
|
|
34
30
|
* @param x distance along the x axis.
|
|
35
31
|
*/
|
|
36
32
|
static approximateDistanceAlongToX(nominalLength1: number, nominalRadius1: number, nominalDistanceAlong: number): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MXCubicAlongArcSpiralEvaluator.d.ts","sourceRoot":"","sources":["../../../../src/curve/spiral/MXCubicAlongArcSpiralEvaluator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"MXCubicAlongArcSpiralEvaluator.d.ts","sourceRoot":"","sources":["../../../../src/curve/spiral/MXCubicAlongArcSpiralEvaluator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;;;;;GASG;AACH,qBAAa,wBAAyB,SAAQ,cAAc;IACnD,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,OAAO;IAKP,kCAAkC;WACpB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;WAInE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAO5E,YAAY,CAAC,WAAW,EAAE,MAAM;IAKhD,2CAA2C;IACpC,KAAK,IAAI,wBAAwB;IAGxC,gCAAgC;IACzB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAOzC;;;;;;OAMG;WACW,2BAA2B,CACvC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAC3E,MAAM;CAMV"}
|
|
@@ -10,16 +10,11 @@ import { CubicEvaluator } from "./CubicEvaluator";
|
|
|
10
10
|
/**
|
|
11
11
|
* MX Cubic along arc.
|
|
12
12
|
* This is y= m*x^3 with
|
|
13
|
-
* * x any point on the x axis
|
|
14
|
-
* * `fraction` along the spiral goes to `x = fraction * Lx
|
|
15
|
-
* * m is (1/6RL)
|
|
13
|
+
* * x any point on the x axis.
|
|
14
|
+
* * `fraction` along the spiral goes to `x = fraction * Lx`.
|
|
15
|
+
* * m is (1/6RL).
|
|
16
16
|
* * construction length L is nominal along the curve.
|
|
17
17
|
* * x length Lx is along the axis, determined by two terms of the clothoid x series.
|
|
18
|
-
* *
|
|
19
|
-
* @param localToWorld
|
|
20
|
-
* @param nominalL1
|
|
21
|
-
* @param nominalR1
|
|
22
|
-
* @param activeInterval
|
|
23
18
|
* @internal
|
|
24
19
|
*/
|
|
25
20
|
export class MXCubicAlongArcEvaluator extends CubicEvaluator {
|
|
@@ -48,9 +43,11 @@ export class MXCubicAlongArcEvaluator extends CubicEvaluator {
|
|
|
48
43
|
this.nominalRadius1 *= scaleFactor;
|
|
49
44
|
super.scaleInPlace(scaleFactor);
|
|
50
45
|
}
|
|
51
|
-
/**
|
|
52
|
-
clone() {
|
|
53
|
-
|
|
46
|
+
/** Return a deep copy of the evaluator. */
|
|
47
|
+
clone() {
|
|
48
|
+
return new MXCubicAlongArcEvaluator(this.nominalLength1, this.nominalRadius1, this.axisLength, this.cubicM);
|
|
49
|
+
}
|
|
50
|
+
/** Member by member matchup. */
|
|
54
51
|
isAlmostEqual(other) {
|
|
55
52
|
if (other instanceof MXCubicAlongArcEvaluator) {
|
|
56
53
|
return Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)
|
|
@@ -61,7 +58,8 @@ export class MXCubicAlongArcEvaluator extends CubicEvaluator {
|
|
|
61
58
|
/**
|
|
62
59
|
* Return a (fast but mediocre) approximation of spiral x position as function of approximate distance along the curve.
|
|
63
60
|
* * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.
|
|
64
|
-
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
61
|
+
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
62
|
+
* CurvePrimitive measurements.
|
|
65
63
|
* @param x distance along the x axis.
|
|
66
64
|
*/
|
|
67
65
|
static approximateDistanceAlongToX(nominalLength1, nominalRadius1, nominalDistanceAlong) {
|