@itwin/core-geometry 5.9.0-dev.7 → 5.9.0-dev.9
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/lib/cjs/Geometry.d.ts +8 -6
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +8 -6
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts +7 -0
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +11 -0
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +11 -2
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +25 -15
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +15 -6
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +15 -6
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.d.ts +1 -1
- package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurve.js +2 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +21 -0
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +59 -0
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +13 -12
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +12 -11
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +17 -4
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +114 -18
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +3 -11
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +1 -91
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.d.ts +13 -6
- package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js +13 -6
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js +1 -2
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +1 -2
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +1 -2
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +113 -103
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +368 -337
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +2 -3
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +20 -32
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +1 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +9 -3
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +1 -2
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +10 -4
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +3 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +6 -2
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.d.ts +33 -4
- package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js +79 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +9 -6
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +20 -10
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +9 -6
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +20 -10
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +4 -4
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +5 -4
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/Newton.d.ts +44 -13
- package/lib/cjs/numerics/Newton.d.ts.map +1 -1
- package/lib/cjs/numerics/Newton.js +73 -23
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +14 -14
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +14 -14
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js +2 -2
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +15 -15
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +1 -1
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +3 -3
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/Geometry.d.ts +8 -6
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +8 -6
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +7 -0
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +11 -0
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +11 -2
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +25 -15
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +15 -6
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +15 -6
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.d.ts +1 -1
- package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurve.js +2 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +21 -0
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +59 -0
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +13 -12
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +12 -11
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +17 -4
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +116 -20
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +3 -11
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +2 -92
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.d.ts +13 -6
- package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/esm/curve/StrokeOptions.js +13 -6
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js +1 -2
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +1 -2
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +1 -2
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +113 -103
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +370 -339
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +2 -3
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +20 -32
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +1 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +9 -3
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +1 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +10 -4
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +3 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +6 -2
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.d.ts +33 -4
- package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js +77 -0
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +9 -6
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +20 -10
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +9 -6
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +20 -10
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +4 -4
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +5 -4
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js +1 -1
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/Newton.d.ts +44 -13
- package/lib/esm/numerics/Newton.d.ts.map +1 -1
- package/lib/esm/numerics/Newton.js +71 -22
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +14 -14
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +14 -14
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js +2 -2
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +15 -15
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +1 -1
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +3 -3
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/package.json +3 -3
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +0 -23
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +0 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js +0 -37
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +0 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +0 -23
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +0 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js +0 -33
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurveCurveCloseApproachXY.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveCloseApproachXY.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { BSplineCurve3d, BSplineCurve3dBase } from \"../../bspline/BSplineCurve\";\nimport { BSplineCurve3dH } from \"../../bspline/BSplineCurve3dH\";\nimport { Geometry } from \"../../Geometry\";\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\nimport { GrowableFloat64Array } from \"../../geometry3d/GrowableFloat64Array\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Range3d } from \"../../geometry3d/Range\";\nimport {\n CurveCurveCloseApproachXYRRtoRRD, CurvePointCloseApproachXYRtoRD, Newton1dUnbounded, Newton2dUnboundedWithDerivative,\n} from \"../../numerics/Newton\";\nimport { AnalyticRoots } from \"../../numerics/Polynomials\";\nimport { SmallSystem } from \"../../numerics/SmallSystem\";\nimport { Arc3d } from \"../Arc3d\";\nimport { CurveChainWithDistanceIndex } from \"../CurveChainWithDistanceIndex\";\nimport { CurveCollection } from \"../CurveCollection\";\nimport { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { AnyCurve } from \"../CurveTypes\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\n\n// cspell:word XYRR currentdFdX\n\n/**\n * Handler class for XY close approach between _geometryB and another geometry.\n * * Approach means the XY distance (z is ignored) between _geometryB and another geometry.\n * * Closest approach is a measure of the proximity of one curve to another. It's the length of the shortest line\n * segment perpendicular to both curves; if the curves intersect, the closest approach is zero. In the context of\n * this class, z-coordinates are ignored, so the closest approach is as seen in the top view. If you have coplanar\n * input curves and want to find closest approach in their plane, rotate them first into a plane parallel to the\n * xy-plane, then afterward, rotate the results back as required.\n * * Close approach can also be from a curve endpoint perpendicular to another curve or from a curve endpoint to\n * another curve endpoint.\n * * Instances are initialized and called from CurveCurve.\n * * geometryB is saved for later reference.\n * @internal\n */\nexport class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {\n private _geometryB: AnyCurve | undefined;\n private setGeometryB(geometryB: AnyCurve | undefined) {\n this._geometryB = geometryB;\n }\n /**\n * Maximum XY distance (z is ignored). Approach larger than this is not interesting.\n * This is caller defined and can be undefined.\n */\n private _maxDistanceToAccept: number | undefined;\n /** Squared max distance. Default is [[Geometry.smallMetricDistanceSquared]]. */\n private _maxDistanceSquared: number;\n /**\n * Start and end points of line segments that meet closest approach criteria, i.e., they are perpendicular to\n * both curves and their length is smaller than _maxDistanceToAccept.\n */\n private _results: CurveLocationDetailPair[];\n\n private static _workPointAA0 = Point3d.create();\n private static _workPointAA1 = Point3d.create();\n private static _workPointBB0 = Point3d.create();\n private static _workPointBB1 = Point3d.create();\n private static _workPointB = Point3d.create();\n\n /**\n * Constructor.\n * @param geometryB second curve for intersection. Saved for reference by specific handler methods.\n */\n public constructor(geometryB?: AnyCurve) {\n super();\n this.setGeometryB(geometryB);\n this._maxDistanceSquared = Geometry.smallMetricDistanceSquared;\n this._results = [];\n }\n /** Set the (possibly undefined) max XY distance (z is ignored) to accept. */\n public set maxDistanceToAccept(value: number | undefined) {\n this._maxDistanceToAccept = value;\n if (this._maxDistanceToAccept !== undefined && this._maxDistanceToAccept > 0)\n this._maxDistanceSquared = this._maxDistanceToAccept * this._maxDistanceToAccept;\n }\n /** Access the (possibly undefined) max XY distance (z is ignored) to accept. */\n public get maxDistanceToAccept(): number | undefined {\n return this._maxDistanceToAccept;\n }\n /** Ask if the maxDistanceToAccept value is defined and positive */\n public get isMaxDistanceSet(): boolean {\n return this._maxDistanceToAccept !== undefined && this._maxDistanceToAccept > 0;\n }\n /** Reset the geometry and flags, leaving all other parts unchanged (and preserving accumulated intersections) */\n public resetGeometry(geometryB: AnyCurve) {\n this.setGeometryB(geometryB);\n }\n /** returns true if `fraction` is in [0,1] within tolerance */\n private acceptFraction(fraction: number, fractionTol: number = 1.0e-12) {\n if (fraction < -fractionTol)\n return false;\n if (fraction > 1.0 + fractionTol)\n return false;\n return true;\n }\n /**\n * Return the results structure for the intersection calculation, structured as an array of CurveLocationDetailPair.\n * @param reinitialize if true, a new results structure is created for use by later calls.\n */\n public grabPairedResults(reinitialize: boolean = false): CurveLocationDetailPair[] {\n const result = this._results;\n if (reinitialize)\n this._results = [];\n return result;\n }\n /**\n * If distance between pointA and pointB is less than maxDistance, record CurveLocationDetailPair which is\n * the approach from pointA to pointB.\n */\n private testAndRecordPointPairApproach(\n cpA: CurvePrimitive, fA: number, pointA: Point3d, cpB: CurvePrimitive, fB: number, pointB: Point3d, reversed: boolean,\n ): void {\n const d2 = pointA.distanceSquaredXY(pointB);\n if (d2 < this._maxDistanceSquared) {\n const d = Math.sqrt(d2);\n const detailA = CurveLocationDetail.createCurveFractionPointDistance(cpA, fA, pointA, d);\n const detailB = CurveLocationDetail.createCurveFractionPointDistance(cpB, fB, pointB, d);\n const pair = CurveLocationDetailPair.createCapture(detailA, detailB);\n if (reversed)\n pair.swapDetails();\n this._results.push(pair);\n }\n }\n /**\n * Create a close approach pair if XY distance is within maxDistance.\n * @param localFractionA a fraction on first curve\n * @param cpA the first curve\n * @param fractionA0 start of the first curve\n * @param fractionA1 end of the first curve\n * @param localFractionB a fraction on second curve\n * @param cpB the second curve\n * @param fractionB0 start of the second curve\n * @param fractionB1 end of the second curve\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\n */\n private recordPointWithLocalFractions(\n localFractionA: number,\n cpA: CurvePrimitive,\n fractionA0: number,\n fractionA1: number,\n localFractionB: number,\n cpB: CurvePrimitive,\n fractionB0: number,\n fractionB1: number,\n reversed: boolean,\n ): void {\n const globalFractionA = Geometry.interpolate(fractionA0, localFractionA, fractionA1);\n const globalFractionB = Geometry.interpolate(fractionB0, localFractionB, fractionB1);\n // ignore duplicate of most recent approach\n const numPrevious = this._results.length;\n if (numPrevious > 0) {\n const oldDetailA = this._results[numPrevious - 1].detailA;\n const oldDetailB = this._results[numPrevious - 1].detailB;\n if (reversed) {\n if (oldDetailB.isSameCurveAndFraction({ curve: cpA, fraction: globalFractionA }) &&\n oldDetailA.isSameCurveAndFraction({ curve: cpB, fraction: globalFractionB }))\n return;\n } else {\n if (oldDetailA.isSameCurveAndFraction({ curve: cpA, fraction: globalFractionA }) &&\n oldDetailB.isSameCurveAndFraction({ curve: cpB, fraction: globalFractionB }))\n return;\n }\n }\n const pointA = cpA.fractionToPoint(globalFractionA);\n const pointB = cpB.fractionToPoint(globalFractionB);\n const d2 = pointA.distanceSquaredXY(pointB);\n if (d2 > this._maxDistanceSquared)\n return;\n const d = Math.sqrt(d2);\n const detailA = CurveLocationDetail.createCurveFractionPointDistance(cpA, globalFractionA, pointA, d);\n const detailB = CurveLocationDetail.createCurveFractionPointDistance(cpB, globalFractionB, pointB, d);\n detailA.setIntervalRole(CurveIntervalRole.isolated);\n detailB.setIntervalRole(CurveIntervalRole.isolated);\n if (reversed)\n this._results.push(new CurveLocationDetailPair(detailB, detailA));\n else\n this._results.push(new CurveLocationDetailPair(detailA, detailB));\n }\n /**\n * Capture a close approach pair that has point and local fraction but not curve.\n * * Record the pair, each detail modified with global fraction and input curve.\n * * Pair is neither modified nor recorded if it would be a duplicate of the last recorded pair.\n * @param pair details computed with local fractions\n * @param cpA curveA\n * @param fractionA0 global start fraction on curveA\n * @param fractionA1 global end fraction on curveA\n * @param cpB curveB\n * @param fractionB0 global start fraction on curveB\n * @param fractionB1 global end fraction on curveB\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\n */\n private capturePairWithLocalFractions(\n pair: CurveLocationDetailPair,\n cpA: CurvePrimitive,\n fractionA0: number,\n fractionA1: number,\n cpB: CurvePrimitive,\n fractionB0: number,\n fractionB1: number,\n reversed: boolean,\n ) {\n const globalFractionA = Geometry.interpolate(fractionA0, pair.detailA.fraction, fractionA1);\n const globalFractionB = Geometry.interpolate(fractionB0, pair.detailB.fraction, fractionB1);\n // ignore duplicate of most recent pair\n const numPrevious = this._results.length;\n if (numPrevious > 0) {\n const oldDetailA = this._results[numPrevious - 1].detailA;\n const oldDetailB = this._results[numPrevious - 1].detailB;\n if (reversed) {\n if (oldDetailB.isSameCurveAndFraction({ curve: cpA, fraction: globalFractionA }) &&\n oldDetailA.isSameCurveAndFraction({ curve: cpB, fraction: globalFractionB }))\n return;\n } else {\n if (oldDetailA.isSameCurveAndFraction({ curve: cpA, fraction: globalFractionA }) &&\n oldDetailB.isSameCurveAndFraction({ curve: cpB, fraction: globalFractionB }))\n return;\n }\n }\n // recompute the points just in case\n CurveLocationDetail.createCurveEvaluatedFraction(cpA, globalFractionA, pair.detailA);\n CurveLocationDetail.createCurveEvaluatedFraction(cpB, globalFractionB, pair.detailB);\n pair.detailA.a = pair.detailB.a = pair.detailA.point.distanceXY(pair.detailB.point);\n pair.detailA.setIntervalRole(CurveIntervalRole.isolated);\n pair.detailB.setIntervalRole(CurveIntervalRole.isolated);\n if (reversed)\n pair.swapDetails();\n this._results.push(pair);\n }\n private static updatePointToSegmentDistance(\n fractionA: number,\n pointA: Point3d,\n pointB0: Point3d,\n pointB1: Point3d,\n fractionB: number,\n maxDistanceSquared: number,\n closestApproach: CurveLocationDetailPair, // modified on return\n ): boolean {\n let updated = false;\n if (fractionB < 0)\n fractionB = 0;\n else if (fractionB > 1)\n fractionB = 1;\n this._workPointB = pointB0.interpolate(fractionB, pointB1, this._workPointB);\n const distanceSquared = this._workPointB.distanceSquaredXY(pointA);\n if (distanceSquared <= Math.min(maxDistanceSquared, closestApproach.detailA.a)) {\n closestApproach.detailA.setFP(fractionA, pointA, undefined, distanceSquared);\n closestApproach.detailB.setFP(fractionB, this._workPointB, undefined, distanceSquared);\n updated = true;\n }\n return updated;\n }\n /**\n * Return fractions of close approach within maxDistance between two line segments (a0,a1) and (b0,b1).\n * * Math details can be found at core/geometry/internaldocs/Curve.md\n * @param a0 start point of line a\n * @param a1 end point of line a\n * @param b0 start point of line b\n * @param b1 end point of line b\n * @param maxDistanceSquared maximum distance squared (assumed to be positive)\n * @returns the fractional (not xy) coordinates in result.x and result.y. result.x is fraction on line a.\n * result.y is fraction on line b.\n */\n private static segmentSegmentBoundedApproach(\n a0: Point3d,\n a1: Point3d,\n b0: Point3d,\n b1: Point3d,\n maxDistanceSquared: number,\n ): CurveLocationDetailPair | undefined {\n const ux = a1.x - a0.x;\n const uy = a1.y - a0.y;\n const vx = b1.x - b0.x;\n const vy = b1.y - b0.y;\n const e00x = b0.x - a0.x;\n const e00y = b0.y - a0.y;\n const e01x = b1.x - a0.x;\n const e01y = b1.y - a0.y;\n const e10x = b0.x - a1.x;\n const e10y = b0.y - a1.y;\n const hab0 = Geometry.crossProductXYXY(ux, uy, e00x, e00y);\n const hab1 = Geometry.crossProductXYXY(ux, uy, e01x, e01y);\n const hba0 = -Geometry.crossProductXYXY(vx, vy, e00x, e00y);\n const hba1 = -Geometry.crossProductXYXY(vx, vy, e10x, e10y);\n if (hab0 * hab1 < 0.0 && hba0 * hba1 < 0.0) { // true intersection, strictly within both segments\n const fractionA = -hba0 / (hba1 - hba0);\n const fractionB = -hab0 / (hab1 - hab0);\n return CurveLocationDetailPair.createCapture(\n CurveLocationDetail.createCurveFractionPoint(undefined, fractionA, a0.interpolate(fractionA, a1)),\n CurveLocationDetail.createCurveFractionPoint(undefined, fractionB, b0.interpolate(fractionB, b1)),\n );\n }\n // there's no intersection, so find the closest approach within maxDistance from an endpoint\n const closestApproach = new CurveLocationDetailPair();\n closestApproach.detailA.a = 2 * maxDistanceSquared; // init to an approach that's too far away\n let reversed = false;\n const uu = Geometry.hypotenuseSquaredXY(ux, uy);\n if (hab0 * hab0 <= maxDistanceSquared * uu) { // test distance of b0 to u\n const fractionA = Geometry.safeDivideFraction(Geometry.dotProductXYXY(ux, uy, e00x, e00y), uu, 0.0);\n if (this.updatePointToSegmentDistance(0, b0, a0, a1, fractionA, maxDistanceSquared, closestApproach))\n reversed = true;\n }\n if (hab1 * hab1 <= maxDistanceSquared * uu) { // test distance of b1 to u\n const fractionA = Geometry.safeDivideFraction(Geometry.dotProductXYXY(ux, uy, e01x, e01y), uu, 0.0);\n if (this.updatePointToSegmentDistance(1, b1, a0, a1, fractionA, maxDistanceSquared, closestApproach))\n reversed = true;\n }\n const vv = Geometry.hypotenuseSquaredXY(vx, vy);\n if (hba0 * hba0 <= maxDistanceSquared * vv) { // test distance of a0 to v\n const fractionB = Geometry.safeDivideFraction(-Geometry.dotProductXYXY(vx, vy, e00x, e00y), vv, 0.0);\n if (this.updatePointToSegmentDistance(0, a0, b0, b1, fractionB, maxDistanceSquared, closestApproach))\n reversed = false;\n }\n if (hba1 * hba1 <= maxDistanceSquared * vv) { // test distance of a1 to v\n const fractionB = Geometry.safeDivideFraction(-Geometry.dotProductXYXY(vx, vy, e10x, e10y), vv, 0.0);\n if (this.updatePointToSegmentDistance(1, a1, b0, b1, fractionB, maxDistanceSquared, closestApproach))\n reversed = false;\n }\n if (closestApproach.detailA.a > maxDistanceSquared)\n return undefined;\n if (reversed)\n closestApproach.swapDetails();\n return closestApproach;\n }\n /**\n * Check different combination of fractions on curveA and curveB. If distance between points at 2 fractions\n * is less than maxDistance, record CurveLocationDetailPair which is the approach between the 2 points.\n * Optionally, record close approaches of one curve's points if they fall between the other curve's points.\n * * If an input curve is a LineString3d, then the corresponding fractions must define a segment of the line string.\n * @param cpA curveA\n * @param fA0 fraction0 on curveA\n * @param fA1 fraction1 on curveA\n * @param testProjectionOnA whether to record projections of the given curveB points onto curveA\n * @param cpB curveB\n * @param fB0 fraction0 on curveB\n * @param fB1 fraction0 on curveB\n * @param testProjectionOnB whether to record projections of the given curveA points onto curveB\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\n */\n private testAndRecordFractionalPairApproach(\n cpA: CurvePrimitive,\n fA0: number,\n fA1: number,\n testProjectionOnA: boolean,\n cpB: CurvePrimitive,\n fB0: number,\n fB1: number,\n testProjectionOnB: boolean,\n reversed: boolean,\n ): void {\n const pointA0 = cpA.fractionToPoint(fA0);\n const pointA1 = cpA.fractionToPoint(fA1);\n const pointB0 = cpB.fractionToPoint(fB0);\n const pointB1 = cpB.fractionToPoint(fB1);\n this.testAndRecordPointPairApproach(cpA, fA0, pointA0, cpB, fB0, pointB0, reversed);\n this.testAndRecordPointPairApproach(cpA, fA1, pointA1, cpB, fB0, pointB0, reversed);\n this.testAndRecordPointPairApproach(cpA, fA0, pointA0, cpB, fB1, pointB1, reversed);\n this.testAndRecordPointPairApproach(cpA, fA1, pointA1, cpB, fB1, pointB1, reversed);\n if (testProjectionOnB) {\n this.testAndRecordProjection(cpA, fA0, pointA0, cpB, fB0, fB1, reversed);\n this.testAndRecordProjection(cpA, fA1, pointA1, cpB, fB0, fB1, reversed);\n }\n if (testProjectionOnA) {\n this.testAndRecordProjection(cpB, fB0, pointB0, cpA, fA0, fA1, !reversed);\n this.testAndRecordProjection(cpB, fB1, pointB1, cpA, fA0, fA1, !reversed);\n }\n }\n /**\n * Return XY closest approach between a curve primitive and a point.\n * Currently, this function only supports Arc3d and LineSegment.\n * Note that this function doesn't handle endpoints.\n */\n private getPointCurveClosestApproachXYNewton(curveP: CurvePrimitive, pointQ: Point3d): CurveLocationDetail | undefined {\n if (!(curveP instanceof Arc3d) && !(curveP instanceof LineSegment3d)) {\n assert(false, \"getPointCurveClosestApproachXYNewton only supports Arc3d and LineSegment\");\n }\n const seeds = [0.2, 0.4, 0.6, 0.8]; // HEURISTIC: arcs have up to 4 perpendiculars; lines have only 1\n const newtonEvaluator = new CurvePointCloseApproachXYRtoRD(curveP, pointQ);\n const newtonSearcher = new Newton1dUnbounded(newtonEvaluator, 100); // observed convergence to 1.0e-11 in 66 iters\n let minCloseApproachLength = Geometry.largeCoordinateResult;\n let minCurvePFraction: number | undefined;\n let minPointP: Point3d | undefined;\n for (const seed of seeds) {\n newtonSearcher.setX(seed);\n if (newtonSearcher.runIterations()) {\n const curvePFraction = newtonSearcher.getX();\n if (this.acceptFraction(curvePFraction)) {\n const pointP = curveP.fractionToPoint(curvePFraction);\n const closeApproachLength = pointP.distanceSquaredXY(pointQ);\n if (closeApproachLength < minCloseApproachLength) {\n minCloseApproachLength = closeApproachLength;\n minCurvePFraction = curvePFraction;\n minPointP = pointP;\n }\n }\n }\n }\n if (minCurvePFraction && minPointP)\n return CurveLocationDetail.createCurveFractionPoint(curveP, minCurvePFraction, minPointP);\n return undefined;\n }\n /**\n * Find the closest xy approach between `pointA` and `cpB`. Add the approach if it's within `fB0` and `fB1`.\n * * Does not test the endpoints of `cpB`.\n * * The only types supported for `cpB` are Arc3d, LineSegment3d, and LineString3d.\n * * If `cpB` is a LineString3d, then the interval `[fB0, fB1]` must correspond to a segment of the line string.\n */\n private testAndRecordProjection(\n cpA: CurvePrimitive, fA: number, pointA: Point3d, cpB: CurvePrimitive, fB0: number, fB1: number, reversed: boolean,\n ) {\n let detail: CurveLocationDetail | undefined;\n if (cpB instanceof LineString3d) {\n const segParamsB = cpB.globalFractionToSegmentIndexAndLocalFraction(fB0 <= fB1 ? fB0 : fB1);\n const segIndexB = (segParamsB.fraction < 0.999999) ? segParamsB.index : segParamsB.index + 1;\n const segmentB = cpB.getIndexedSegment(segIndexB);\n if (segmentB && (detail = this.getPointCurveClosestApproachXYNewton(segmentB, pointA)))\n LineString3d.convertLocalToGlobalDetail(detail, segIndexB, cpB.numEdges(), cpB);\n } else {\n detail = this.getPointCurveClosestApproachXYNewton(cpB, pointA);\n }\n if (detail) {\n const fB = Geometry.restrictToInterval(detail.fraction, fB0, fB1);\n if (fB === detail.fraction) { // if fraction is within fB0 and fB1\n this.testAndRecordPointPairApproach(cpA, fA, pointA, cpB, detail.fraction, detail.point, reversed);\n }\n }\n }\n /**\n * Compute closest xy approach of two line segments.\n * Filter by extension rules.\n * Record with fraction mapping.\n * * The fraction mappings allow portions of a linestring to be passed here.\n */\n private computeSegmentSegment3D(\n cpA: CurvePrimitive,\n pointA0: Point3d,\n fractionA0: number,\n pointA1: Point3d,\n fractionA1: number,\n cpB: CurvePrimitive,\n pointB0: Point3d,\n fractionB0: number,\n pointB1: Point3d,\n fractionB1: number,\n reversed: boolean,\n ): void {\n // compute a pair with fractions local to segments\n const approach = CurveCurveCloseApproachXY.segmentSegmentBoundedApproach(\n pointA0, pointA1, pointB0, pointB1, this._maxDistanceSquared,\n );\n // adjust the pair to refer to input curves and global fractions, then record it if new\n if (approach) {\n approach.detailA.setCurve(cpA);\n approach.detailB.setCurve(cpB);\n this.capturePairWithLocalFractions(approach, cpA, fractionA0, fractionA1, cpB, fractionB0, fractionB1, reversed);\n }\n }\n /** Low level dispatch of segment with segment. */\n private dispatchSegmentSegment(\n cpA: CurvePrimitive,\n pointA0: Point3d,\n fractionA0: number,\n pointA1: Point3d,\n fractionA1: number,\n cpB: CurvePrimitive,\n pointB0: Point3d,\n fractionB0: number,\n pointB1: Point3d,\n fractionB1: number,\n reversed: boolean,\n ): void {\n this.computeSegmentSegment3D(\n cpA, pointA0, fractionA0, pointA1, fractionA1,\n cpB, pointB0, fractionB0, pointB1, fractionB1,\n reversed,\n );\n }\n /**\n * Compute the perpendiculars between a line segment and an arc, without extending either curve.\n * * One or two perpendiculars will be found.\n * * Each perpendicular segment starts or ends on the arc where the arc tangent is parallel to the line tangent.\n * * Perpendiculars from an endpoint are not explicitly computed.\n * @param cpA line segment or line string; if it is a line string, then the fractions must specify a segment\n * @param pointA0 start point of the segment\n * @param fractionA0 fraction of the start of the segment\n * @param pointA1 end point of the segment\n * @param fractionA1 fraction of the end of the segment\n * @param arc the arc\n * @param reversed swap the details in the recorded pair (default: false)\n */\n public allPerpendicularsSegmentArcBounded(cpA: CurvePrimitive, pointA0: Point3d, fractionA0: number, pointA1: Point3d, fractionA1: number, arc: Arc3d, reversed: boolean = false): void {\n const dotUT = arc.vector0.crossProductStartEndXY(pointA0, pointA1);\n const dotVT = arc.vector90.crossProductStartEndXY(pointA0, pointA1);\n const parallelRadians = Math.atan2(dotVT, dotUT);\n for (const radians1 of [parallelRadians, parallelRadians + Math.PI]) {\n const arcPoint = arc.radiansToPoint(radians1);\n const fArc = arc.sweep.radiansToSignedPeriodicFraction(radians1);\n if (this.acceptFraction(fArc)) { // reject solution outside arc sweep\n const fLine = SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0, pointA1, arcPoint);\n if (fLine !== undefined && this.acceptFraction(fLine))\n this.recordPointWithLocalFractions(fLine, cpA, fractionA0, fractionA1, fArc, arc, 0, 1, reversed);\n }\n }\n }\n /**\n * Low level dispatch of line segment with arc.\n * Find close approaches within maxDistance between a line segments (pointA0, pointA1) and an arc.\n * To consider:\n * 1) intersection between arc and segment.\n * 2) endpoints to endpoints or endpoints projection to the other curve.\n * 3) arc tangent parallel to line segment (or line string).\n * @param cpA curve A (line segment or line string; if it is a line string, then the fractions must specify a segment)\n * @param pointA0 start point of the segment\n * @param fractionA0 fraction of the start of the segment\n * @param pointA1 end point of the segment\n * @param fractionA1 fraction of the end of the segment\n * @param arc the arc\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\n */\n private dispatchSegmentArc(\n cpA: CurvePrimitive,\n pointA0: Point3d,\n fractionA0: number,\n pointA1: Point3d,\n fractionA1: number,\n arc: Arc3d,\n reversed: boolean,\n ): void {\n // 1) intersection between arc and line segment (or string).\n // Suppose:\n // Arc: X = C + cU + sV where c = cos(theta) and s = sin(theta)\n // Line: contains points A0 and A1\n // The arc intersects the line at point X if det(A0, A1, X) = 0 with homogeneous xyw points and vectors.\n // With equational X: det(A0, A1, C) + c*det(A0, A1, U) + s*det(A0, A1, V) = 0.\n // solve for theta.\n // evaluate points.\n // project back to line.\n let intersectionFound = false;\n const data = arc.toTransformedVectors();\n const pointA0Local = pointA0;\n const pointA1Local = pointA1;\n const alpha = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.center, 1); // det(A0, A1, C)\n const beta = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector0, 0); // det(A0, A1, U)\n const gamma = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector90, 0); // det(A0, A1, V)\n const cosines = new GrowableFloat64Array(2);\n const sines = new GrowableFloat64Array(2);\n const radians = new GrowableFloat64Array(2);\n const numRoots = AnalyticRoots.appendImplicitLineUnitCircleIntersections( // solve the equation\n alpha, beta, gamma, cosines, sines, radians,\n );\n for (let i = 0; i < numRoots; i++) {\n const arcPoint = data.center.plus2Scaled(\n data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i),\n );\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians.atUncheckedIndex(i));\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);\n // only add if the point is within the start and end fractions of both line segment and arc\n if (lineFraction !== undefined && this.acceptFraction(lineFraction) && this.acceptFraction(arcFraction)) {\n this.recordPointWithLocalFractions(\n lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed,\n );\n intersectionFound = true;\n }\n }\n if (intersectionFound)\n return;\n // 2) endpoints to endpoints or endpoints projection to the other curve.\n this.testAndRecordFractionalPairApproach(cpA, fractionA0, fractionA1, true, arc, 0, 1, true, reversed);\n // 3) arc tangent parallel to line segment (or string).\n // If line does not intersect the arc, then the closest (and/or the furthest) point on arc to the line is a\n // point where the tangent line on arc at that point is parallel to the line.\n this.allPerpendicularsSegmentArcBounded(cpA, pointA0, fractionA0, pointA1, fractionA1, arc, reversed);\n }\n /**\n * Compute segments perpendicular to two elliptical arcs, without extending either curve.\n * * Perpendiculars from an endpoint are not explicitly computed.\n * * Intersections are also found by this search: they are reported as zero-length segments.\n * @param reversed swap the details in the recorded pair (default: false)\n */\n public allPerpendicularsArcArcBounded(arc0: Arc3d, arc1: Arc3d, reversed: boolean = false): void {\n const newtonEvaluator = new CurveCurveCloseApproachXYRRtoRRD(arc0, arc1);\n // HEURISTIC: 2 ellipses have up to 8 perpendiculars and up to 4 intersections\n const seedDelta = 1 / 10; // denominator 9 fails the unit test\n const seedStart = seedDelta / 2;\n const newtonSearcher = new Newton2dUnboundedWithDerivative(newtonEvaluator, 100); // observed convergence to 1.0e-11 in 49 iters\n for (let seedU = seedStart; seedU < 1; seedU += seedDelta) {\n for (let seedV = seedStart; seedV < 1; seedV += seedDelta) {\n newtonSearcher.setUV(seedU, seedV);\n if (newtonSearcher.runIterations()) {\n const frac0 = newtonSearcher.getU();\n const frac1 = newtonSearcher.getV();\n if (this.acceptFraction(frac0) && this.acceptFraction(frac1)) {\n this.recordPointWithLocalFractions(frac0, arc0, 0, 1, frac1, arc1, 0, 1, reversed);\n }\n }\n }\n }\n }\n /** Low level dispatch of arc with Arc3d. */\n private dispatchArcArc(cpA: Arc3d, cpB: Arc3d, reversed: boolean): void {\n const rangeA = cpA.range();\n const rangeB = cpB.range();\n if (this._maxDistanceToAccept)\n rangeA.expandInPlace(this._maxDistanceToAccept);\n if (!rangeB.intersectsRangeXY(rangeA))\n return;\n // 1) endpoints to endpoints or endpoints projection to the other curve\n this.testAndRecordFractionalPairApproach(cpA, 0, 1, true, cpB, 0, 1, true, reversed);\n // 2) perpendicular line between 2 arcs (includes intersections)\n this.allPerpendicularsArcArcBounded(cpA, cpB, reversed);\n }\n /** Low level dispatch of arc with (beziers of) a bspline curve */\n private dispatchArcBsplineCurve3d(cpA: Arc3d, cpB: BSplineCurve3d, reversed: boolean): void {\n const ls = LineString3d.create();\n cpB.emitStrokes(ls);\n this.computeArcLineString(cpA, ls, reversed);\n }\n /** Low level dispatch of (beziers of) a bspline curve with (beziers of) a bspline curve */\n private dispatchBSplineCurve3dBSplineCurve3d(\n bcurveA: BSplineCurve3dBase, bcurveB: BSplineCurve3dBase, reversed: boolean,\n ): void {\n const lsA = LineString3d.create();\n bcurveA.emitStrokes(lsA);\n const lsB = LineString3d.create();\n bcurveB.emitStrokes(lsB);\n this.computeLineStringLineString(lsA, lsB, reversed);\n }\n /** Low level dispatch of linestring with (beziers of) a bspline curve */\n public dispatchLineStringBSplineCurve(lsA: LineString3d, curveB: BSplineCurve3d, reversed: boolean): void {\n const lsB = LineString3d.create();\n curveB.emitStrokes(lsB);\n this.computeLineStringLineString(lsA, lsB, reversed);\n }\n /** Low level dispatch of segment with (beziers of) a bspline curve */\n public dispatchSegmentBsplineCurve(segA: LineSegment3d, curveB: BSplineCurve3d, reversed: boolean): void {\n const lsB = LineString3d.create();\n curveB.emitStrokes(lsB);\n this.computeSegmentLineString(segA, lsB, reversed);\n }\n /** Detail computation for segment approaching linestring. */\n public computeSegmentLineString(segA: LineSegment3d, lsB: LineString3d, reversed: boolean): void {\n const numB = lsB.numPoints();\n const deltaFracB = Geometry.safeDivideFraction(1, numB - 1, 0);\n const pointA0 = segA.point0Ref;\n const pointA1 = segA.point1Ref;\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\n for (let i = 0; i < numB - 1; ++i) {\n const fB0 = i * deltaFracB; // global linestring fractions\n const fB1 = (i + 1 === numB - 1) ? 1.0 : (i + 1) * deltaFracB; // make sure we nail the end fraction\n lsB.packedPoints.getPoint3dAtUncheckedPointIndex(i, pointB0);\n lsB.packedPoints.getPoint3dAtUncheckedPointIndex(i + 1, pointB1);\n this.dispatchSegmentSegment(segA, pointA0, 0.0, pointA1, 1.0, lsB, pointB0, fB0, pointB1, fB1, reversed);\n }\n }\n /** Detail computation for arc approaching linestring. */\n public computeArcLineString(arcA: Arc3d, lsB: LineString3d, reversed: boolean): void {\n const rangeA = arcA.range();\n const rangeB = lsB.range();\n if (this._maxDistanceToAccept)\n rangeA.expandInPlace(this._maxDistanceToAccept);\n if (!rangeB.intersectsRangeXY(rangeA))\n return;\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\n const numB = lsB.numPoints();\n if (numB > 1) {\n const dfB = 1.0 / (numB - 1);\n let fB0;\n let fB1;\n fB0 = 0.0;\n lsB.pointAt(0, pointB0);\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\n lsB.pointAt(ib, pointB1);\n fB1 = ib * dfB;\n this.dispatchSegmentArc(lsB, pointB0, fB0, pointB1, fB1, arcA, !reversed);\n }\n }\n }\n /** Low level dispatch of curve collection. */\n private dispatchCurveCollection(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\n const geomB = this._geometryB; // save\n if (!geomB || !geomB.children || !(geomB instanceof CurveCollection))\n return;\n for (const child of geomB.children) {\n this.resetGeometry(child);\n geomAHandler(geomA);\n }\n this._geometryB = geomB; // restore\n }\n /** Low level dispatch to geomA given a CurveChainWithDistanceIndex in geometryB. */\n private dispatchCurveChainWithDistanceIndex(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\n if (!this._geometryB || !(this._geometryB instanceof CurveChainWithDistanceIndex))\n return;\n if (geomA instanceof CurveChainWithDistanceIndex) {\n assert(false, \"call handleCurveChainWithDistanceIndex(geomA) instead\");\n }\n const index0 = this._results.length;\n const geomB = this._geometryB; // save\n for (const child of geomB.path.children) {\n this.resetGeometry(child);\n geomAHandler(geomA);\n }\n this.resetGeometry(geomB); // restore\n this._results = CurveChainWithDistanceIndex.convertChildDetailToChainDetail(this._results, index0, undefined, geomB, true);\n }\n /** Double dispatch handler for strongly typed segment. */\n public override handleLineSegment3d(segmentA: LineSegment3d): any {\n if (this._geometryB instanceof LineSegment3d) {\n const segmentB = this._geometryB;\n this.dispatchSegmentSegment(\n segmentA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0,\n segmentB, segmentB.point0Ref, 0.0, segmentB.point1Ref, 1.0,\n false,\n );\n } else if (this._geometryB instanceof LineString3d) {\n this.computeSegmentLineString(segmentA, this._geometryB, false);\n } else if (this._geometryB instanceof Arc3d) {\n this.dispatchSegmentArc(segmentA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._geometryB, false);\n } else if (this._geometryB instanceof BSplineCurve3d) {\n this.dispatchSegmentBsplineCurve(segmentA, this._geometryB, false);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(segmentA, this.handleLineSegment3d.bind(this));\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(segmentA, this.handleLineSegment3d.bind(this));\n }\n return undefined;\n }\n /**\n * Set bits for comparison to range xy\n * * bit 0x01 => x smaller than range.low.x\n * * bit 0x02 => x larger than range.high.x\n * * bit 0x04 => y smaller than range.low.y\n * * bit 0x08 => y larger than range.high.y\n * * If we divide XY plane into 9 areas using the range, the function returns 0 for points\n * inside the range. Below is other binary numbers returned by the function for all 9 areas:\n * 1001 | 1000 | 1010\n * ------------------\n * 1 | 0 | 10\n * ------------------\n * 101 | 100 | 110\n * @param xy point to test\n * @param range range for comparison\n */\n private classifyBitsPointRangeXY(x: number, y: number, range: Range3d): number {\n let result = 0;\n if (x < range.low.x)\n result = 0x01;\n else if (x > range.high.x)\n result = 0x02;\n // note the OR operation\n if (y < range.low.y)\n result |= 0x04;\n else if (y > range.high.y)\n result |= 0x08;\n return result;\n }\n /** Low level dispatch of line string with line string. */\n private computeLineStringLineString(lsA: LineString3d, lsB: LineString3d, reversed: boolean): void {\n const rangeA = lsA.range();\n const rangeB = lsB.range();\n if (this._maxDistanceToAccept)\n rangeA.expandInPlace(this._maxDistanceToAccept);\n if (!rangeB.intersectsRangeXY(rangeA))\n return;\n let bitB0: number;\n let bitB1: number;\n const rangeA1 = Range3d.createNull();\n const pointA0 = CurveCurveCloseApproachXY._workPointAA0;\n const pointA1 = CurveCurveCloseApproachXY._workPointAA1;\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\n const numA = lsA.numPoints();\n const numB = lsB.numPoints();\n if (numA > 1 && numB > 1) {\n const dfA = 1.0 / (numA - 1);\n const dfB = 1.0 / (numB - 1);\n let fA0 = 0.0;\n let fA1, fB0, fB1;\n lsA.pointAt(0, pointA0);\n for (let ia = 1; ia < numA; ia++, pointA0.setFrom(pointA1), fA0 = fA1) {\n fA1 = ia * dfA;\n fB0 = 0.0;\n lsA.pointAt(ia, pointA1);\n // rangeA1 is around line segment [A0,A1] expanded by max distance\n rangeA1.setNull();\n rangeA1.extendPoint(pointA0);\n rangeA1.extendPoint(pointA1);\n if (this._maxDistanceToAccept)\n rangeA1.expandInPlace(this._maxDistanceToAccept);\n if (rangeA1.intersectsRangeXY(rangeB)) {\n lsB.pointAt(0, pointB0);\n bitB0 = this.classifyBitsPointRangeXY(pointB0.x, pointB0.y, rangeA1);\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1, bitB0 = bitB1) {\n lsB.pointAt(ib, pointB1);\n bitB1 = this.classifyBitsPointRangeXY(pointB1.x, pointB1.y, rangeA1);\n fB1 = ib * dfB;\n // DO NOT study the segment in detail if both bitB bits are on for any of the 4 planes\n // (i.e., no intersection between rangeA1 and the range around line segment [B0,B1])\n if ((bitB0 & bitB1) === 0)\n this.dispatchSegmentSegment(lsA, pointA0, fA0, pointA1, fA1, lsB, pointB0, fB0, pointB1, fB1, reversed);\n }\n }\n }\n }\n }\n /** Double dispatch handler for strongly typed linestring. */\n public override handleLineString3d(lsA: LineString3d): any {\n if (this._geometryB instanceof LineString3d) {\n const lsB = this._geometryB;\n this.computeLineStringLineString(lsA, lsB, false);\n } else if (this._geometryB instanceof LineSegment3d) {\n this.computeSegmentLineString(this._geometryB, lsA, true);\n } else if (this._geometryB instanceof Arc3d) {\n this.computeArcLineString(this._geometryB, lsA, true);\n } else if (this._geometryB instanceof BSplineCurve3d) {\n this.dispatchLineStringBSplineCurve(lsA, this._geometryB, false);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(lsA, this.handleLineString3d.bind(this));\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(lsA, this.handleLineString3d.bind(this));\n }\n return undefined;\n }\n /** Double dispatch handler for strongly typed arc. */\n public override handleArc3d(arc0: Arc3d): any {\n if (this._geometryB instanceof LineSegment3d) {\n this.dispatchSegmentArc(\n this._geometryB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, arc0, true,\n );\n } else if (this._geometryB instanceof LineString3d) {\n this.computeArcLineString(arc0, this._geometryB, false);\n } else if (this._geometryB instanceof Arc3d) {\n this.dispatchArcArc(arc0, this._geometryB, false);\n } else if (this._geometryB instanceof BSplineCurve3d) {\n this.dispatchArcBsplineCurve3d(arc0, this._geometryB, false);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(arc0, this.handleArc3d.bind(this));\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(arc0, this.handleArc3d.bind(this));\n }\n return undefined;\n }\n /** Double dispatch handler for strongly typed bspline curve. */\n public override handleBSplineCurve3d(curve: BSplineCurve3d): any {\n if (this._geometryB instanceof LineSegment3d) {\n this.dispatchSegmentBsplineCurve(this._geometryB, curve, true);\n } else if (this._geometryB instanceof LineString3d) {\n this.dispatchLineStringBSplineCurve(this._geometryB, curve, true);\n } else if (this._geometryB instanceof Arc3d) {\n this.dispatchArcBsplineCurve3d(this._geometryB, curve, true);\n } else if (this._geometryB instanceof BSplineCurve3dBase) {\n this.dispatchBSplineCurve3dBSplineCurve3d(curve, this._geometryB, false);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(curve, this.handleBSplineCurve3d.bind(this));\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(curve, this.handleBSplineCurve3d.bind(this));\n }\n return undefined;\n }\n /** Double dispatch handler for strongly typed CurveChainWithDistanceIndex. */\n public override handleCurveChainWithDistanceIndex(chain: CurveChainWithDistanceIndex): any {\n super.handleCurveChainWithDistanceIndex(chain);\n // if _geometryB is also a CurveChainWithDistanceIndex, it will already have been converted by dispatchCurveChainWithDistanceIndex\n this._results = CurveChainWithDistanceIndex.convertChildDetailToChainDetail(this._results, 0, chain, undefined, true);\n }\n /** Double dispatch handler for strongly typed homogeneous bspline curve .. */\n public override handleBSplineCurve3dH(_curve: BSplineCurve3dH): any {\n /*\n //NEEDS WORK -- make \"dispatch\" methods tolerant of both 3d and 3dH.\n // \"easy\" if both present BezierCurve3dH span loaders\n if (this._geometryB instanceof LineSegment3d) {\n this.dispatchSegmentBsplineCurve(\n this._geometryB, this._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB,\n curve, this._extendA, true);\n } else if (this._geometryB instanceof LineString3d) {\n this.dispatchLineStringBSplineCurve(this._geometryB, this._extendB, curve, this._extendA, true);\n } else if (this._geometryB instanceof Arc3d) {\n this.dispatchArcBsplineCurve3d(this._geometryB, this._extendB, curve, this._extendA, true);\n }\n */\n return undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CurveCurveCloseApproachXY.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveCloseApproachXY.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,sDAA2E;AAC3E,6DAAgF;AAEhF,6CAA0C;AAC1C,sEAAkF;AAClF,gFAA6E;AAC7E,sEAA2D;AAC3D,kDAAiD;AACjD,kDAA0G;AAC1G,4DAA2D;AAC3D,4DAAyD;AACzD,oCAAiC;AACjC,gFAA6E;AAC7E,wDAAqD;AACrD,8CAA2C;AAC3C,gEAAyG;AACzG,sDAAmD;AAEnD,oDAAiD;AACjD,kDAA+C;AAC/C,8CAA2C;AAC3C,qEAAkE;AAGlE,+BAA+B;AAE/B;;;;;;;;;;;;;GAaG;AACH,MAAa,yBAA0B,SAAQ,gDAA8B;IACnE,UAAU,CAAuB;IACzC;;;OAGG;IACK,oBAAoB,CAAqB;IACjD,gFAAgF;IACxE,mBAAmB,CAAS;IAC5B,YAAY,CAAS;IACrB,gBAAgB,CAAS;IACjC;;;OAGG;IACK,QAAQ,CAAuC;IAE/C,MAAM,CAAC,aAAa,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;IACxC,MAAM,CAAC,aAAa,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;IACxC,MAAM,CAAC,aAAa,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;IACxC,MAAM,CAAC,aAAa,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;IACxC,MAAM,CAAC,WAAW,GAAG,yBAAO,CAAC,MAAM,EAAE,CAAC;IAE9C;;;;;OAKG;IACH,YAAmB,SAAoB,EAAE,cAAsB,mBAAQ,CAAC,mBAAmB,EAAE,kBAA0B,mBAAQ,CAAC,eAAe;QAC7I,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,SAAS,YAAY,uBAAU,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,IAAI,CAAC,mBAAmB,GAAG,mBAAQ,CAAC,0BAA0B,CAAC;QAC/D,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QACxC,MAAM,OAAO,GAAG,6CAAuB,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,GAAG,IAAI,0BAAW,CAA0B,OAAO,EAAE,8BAAe,CAAC,MAAM,CAAC,CAAC;IAC5F,CAAC;IACD,6EAA6E;IAC7E,IAAW,mBAAmB,CAAC,KAAyB;QACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;YACtC,IAAI,CAAC,mBAAmB,GAAG,mBAAQ,CAAC,0BAA0B,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,mBAAmB,GAAG,KAAK,GAAG,KAAK,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,gFAAgF;IAChF,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IACD,mEAAmE;IACnE,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,oBAAoB,KAAK,SAAS,IAAI,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;IAClF,CAAC;IACD;;;;OAIG;IACI,aAAa,CAAC,SAAoB;QACvC,IAAI,SAAS;YACX,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IACD,8DAA8D;IACtD,cAAc,CAAC,QAAgB,EAAE,cAAsB,OAAO;QACpE,IAAI,QAAQ,GAAG,CAAC,WAAW;YACzB,OAAO,KAAK,CAAC;QACf,IAAI,QAAQ,GAAG,GAAG,GAAG,WAAW;YAC9B,OAAO,KAAK,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,0FAA0F;IACnF,iBAAiB;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;IACD;;;;;;;;;;;;OAYG;IACK,sBAAsB,CAC5B,GAAmB,EAAE,EAAU,EAAE,MAA2B,EAC5D,GAAmB,EAAE,EAAU,EAAE,MAA2B,EAC5D,QAAiB;QAEjB,IAAI,CAAC,MAAM;YACT,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM;YACT,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,OAAO,GAAG,yCAAmB,CAAC,gCAAgC,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,yCAAmB,CAAC,gCAAgC,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACzF,OAAO,CAAC,eAAe,CAAC,uCAAiB,CAAC,QAAQ,CAAC,CAAC;YACpD,OAAO,CAAC,eAAe,CAAC,uCAAiB,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,6CAAuB,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrE,IAAI,QAAQ;gBACV,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD;;;;;;OAMG;IACK,iBAAiB,CAAC,IAA6B,EAAE,QAAiB;QACxE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,EAAE,GAAG,IAAI,CAAC,mBAAmB;YAC/B,OAAO;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,uCAAiB,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,uCAAiB,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,QAAQ;YACV,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD;;;;;;;;;;;;;OAaG;IACK,sBAAsB,CAC5B,IAA6B,EAC7B,GAAmB,EAAE,UAAkB,EAAE,UAAkB,EAC3D,GAAmB,EAAE,UAAkB,EAAE,UAAkB,EAC3D,QAAiB;QAEjB,MAAM,eAAe,GAAG,mBAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5F,MAAM,eAAe,GAAG,mBAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,EAAE,GAAG,IAAI,CAAC,mBAAmB;YAC/B,OAAO;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,yCAAmB,CAAC,gCAAgC,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpG,yCAAmB,CAAC,gCAAgC,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,uCAAiB,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,uCAAiB,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,QAAQ;YACV,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,oEAAoE;IAC5D,MAAM,CAAC,4BAA4B,CACzC,eAAwC,EACxC,SAAiB,EAAE,MAAe,EAClC,SAAiB,EAAE,OAAgB,EAAE,OAAgB,EACrD,kBAA0B;QAE1B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC;YACf,SAAS,GAAG,CAAC,CAAC;aACX,IAAI,SAAS,GAAG,CAAC;YACpB,SAAS,GAAG,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,eAAe,IAAI,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YAC7E,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YAC7E,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD;;;;;;;;;;;OAWG;IACK,MAAM,CAAC,6BAA6B,CAC1C,EAAW,EAAE,EAAW,EACxB,EAAW,EAAE,EAAW,EACxB,kBAA0B;QAE1B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,mBAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,mBAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,mBAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,CAAC,mBAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,mDAAmD;YAC/F,MAAM,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YACxC,OAAO,6CAAuB,CAAC,aAAa,CAC1C,yCAAmB,CAAC,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EACjG,yCAAmB,CAAC,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAClG,CAAC;QACJ,CAAC;QACD,4FAA4F;QAC5F,MAAM,eAAe,GAAG,IAAI,6CAAuB,EAAE,CAAC;QACtD,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC,0CAA0C;QAC9F,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,EAAE,GAAG,mBAAQ,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,IAAI,GAAG,IAAI,IAAI,kBAAkB,GAAG,EAAE,EAAE,CAAC,CAAC,2BAA2B;YACvE,MAAM,SAAS,GAAG,mBAAQ,CAAC,kBAAkB,CAAC,mBAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACpG,IAAI,IAAI,CAAC,4BAA4B,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC;gBAClG,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,IAAI,kBAAkB,GAAG,EAAE,EAAE,CAAC,CAAC,2BAA2B;YACvE,MAAM,SAAS,GAAG,mBAAQ,CAAC,kBAAkB,CAAC,mBAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACpG,IAAI,IAAI,CAAC,4BAA4B,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC;gBAClG,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,MAAM,EAAE,GAAG,mBAAQ,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,IAAI,GAAG,IAAI,IAAI,kBAAkB,GAAG,EAAE,EAAE,CAAC,CAAC,2BAA2B;YACvE,MAAM,SAAS,GAAG,mBAAQ,CAAC,kBAAkB,CAAC,CAAC,mBAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACrG,IAAI,IAAI,CAAC,4BAA4B,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC;gBAClG,QAAQ,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,IAAI,kBAAkB,GAAG,EAAE,EAAE,CAAC,CAAC,2BAA2B;YACvE,MAAM,SAAS,GAAG,mBAAQ,CAAC,kBAAkB,CAAC,CAAC,mBAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACrG,IAAI,IAAI,CAAC,4BAA4B,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC;gBAClG,QAAQ,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,kBAAkB;YAChD,OAAO,SAAS,CAAC;QACnB,IAAI,QAAQ;YACV,eAAe,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,eAAe,CAAC;IACzB,CAAC;IACD;;;;;;OAMG;IACK,+BAA+B,CAAC,GAAmB,EAAE,GAAmB,EAAE,QAAiB;QACjG,MAAM,EAAE,GAAG,yBAAyB,CAAC,WAAW,CAAC;QACjD,uGAAuG;QACvG,MAAM,WAAW,GAAG,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,YAAY,aAAK,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;QAClG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YACxE,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;YACzE,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,+DAA+D;IACvD,uBAAuB,CAAC,GAAmB,EAAE,EAAU,EAAE,MAAe,EAAE,GAAmB,EAAE,QAAiB;QACtH,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM;YACR,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/F,CAAC;IACD;;;;;OAKG;IACK,qBAAqB,CAC3B,GAAmB,EAAE,OAAgB,EAAE,UAAkB,EAAE,OAAgB,EAAE,UAAkB,EAC/F,GAAmB,EAAE,OAAgB,EAAE,UAAkB,EAAE,OAAgB,EAAE,UAAkB,EAC/F,QAAiB;QAEjB,kDAAkD;QAClD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,6BAA6B,CACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAC7D,CAAC;QACF,uFAAuF;QACvF,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IACD;;;;;;;;OAQG;IACK,0CAA0C,CAChD,MAAe,EAAE,IAAa,EAAE,IAAW,EAC3C,QAA4H;QAE5H,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjD,KAAK,MAAM,QAAQ,IAAI,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,QAAQ,CAAC,CAAC;YACzE,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,oCAAoC;gBAC1E,MAAM,YAAY,GAAG,yBAAW,CAAC,oCAAoC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC9F,IAAI,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;oBACjE,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;;;;;;;OASG;IACK,iBAAiB,CAAC,KAAoB,EAAE,IAAW,EAAE,QAAiB;QAC5E,4DAA4D;QAC5D,WAAW;QACX,+DAA+D;QAC/D,kCAAkC;QAClC,wGAAwG;QACxG,gFAAgF;QAChF,mBAAmB;QACnB,mBAAmB;QACnB,wBAAwB;QACxB,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,mBAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB;QACnH,MAAM,IAAI,GAAG,mBAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB;QAClH,MAAM,KAAK,GAAG,mBAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB;QACpH,MAAM,OAAO,GAAG,IAAI,2CAAoB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,2CAAoB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,2CAAoB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,2BAAa,CAAC,yCAAyC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACtH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9H,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5F,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,oCAAoC;gBAC1E,MAAM,YAAY,GAAG,yBAAW,CAAC,oCAAoC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAClH,IAAI,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;oBACpE,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACnG,iBAAiB,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,iBAAiB;YACnB,OAAO;QACT,yEAAyE;QACzE,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5D,2CAA2C;QAC3C,2GAA2G;QAC3G,6EAA6E;QAC7E,IAAI,CAAC,0CAA0C,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EACpF,CAAC,YAAoB,EAAE,SAA8B,EAAE,WAAmB,EAAE,QAA6B,EAAE,EAAE,CAC3G,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CACrG,CAAC;IACJ,CAAC;IACD;;;;;;;OAOG;IACI,8BAA8B,CAAC,IAAW,EAAE,IAAW,EAAE,WAAoB,KAAK;QACvF,MAAM,eAAe,GAAG,IAAI,yCAAgC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzE,oDAAoD;QACpD,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,oCAAoC;QAC9D,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;QAChC,MAAM,cAAc,GAAG,IAAI,wCAA+B,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC,8CAA8C;QAChI,KAAK,IAAI,KAAK,GAAG,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC;YAC1D,KAAK,IAAI,KAAK,GAAG,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC1D,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACnC,IAAI,cAAc,CAAC,aAAa,EAAE,EAAE,CAAC;oBACnC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;oBACxC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;oBACxC,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;wBACrE,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAChG,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,4CAA4C;IACpC,cAAc,CAAC,GAAU,EAAE,GAAU,EAAE,QAAiB;QAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,oBAAoB;YAC3B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACnC,OAAO;QACT,uEAAuE;QACvE,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzD,gEAAgE;QAChE,IAAI,CAAC,8BAA8B,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IACD,kEAAkE;IAC1D,yBAAyB,CAAC,GAAU,EAAE,GAAmB,EAAE,QAAiB;QAClF,MAAM,EAAE,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QACjC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,2FAA2F;IACnF,oCAAoC,CAC1C,OAA2B,EAAE,OAA2B,EAAE,QAAiB;QAE3E,MAAM,GAAG,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,yEAAyE;IACjE,8BAA8B,CAAC,GAAiB,EAAE,MAAsB,EAAE,QAAiB;QACjG,MAAM,GAAG,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,sEAAsE;IAC9D,2BAA2B,CAAC,IAAmB,EAAE,MAAsB,EAAE,QAAiB;QAChG,MAAM,GAAG,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD,6DAA6D;IACrD,wBAAwB,CAAC,IAAmB,EAAE,GAAiB,EAAE,QAAiB;QACxF,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,mBAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC;QACxD,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,8BAA8B;YAC1D,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAE,qCAAqC;YACrG,GAAG,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7D,GAAG,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IACD,yDAAyD;IACjD,oBAAoB,CAAC,IAAW,EAAE,GAAiB,EAAE,QAAiB;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,oBAAoB;YAC3B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACnC,OAAO;QACT,MAAM,EAAE,GAAG,yBAAyB,CAAC,aAAa,CAAC;QACnD,MAAM,EAAE,GAAG,yBAAyB,CAAC,aAAa,CAAC;QACnD,0BAA0B;QAC1B,MAAM,aAAa,GAAG,uBAAU,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACjG,KAAK,MAAM,YAAY,IAAI,aAAa;YACtC,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACjD,4DAA4D;QAC5D,MAAM,KAAK,GAAG,mBAAQ,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC7F,oEAAoE;QACpE,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1D,4DAA4D;QAC5D,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,0CAA0C,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAC1D,CAAC,YAAoB,EAAE,SAA8B,EAAE,WAAmB,EAAE,QAA6B,EAAE,EAAE;gBAC3G,MAAM,WAAW,GAAG,GAAG,CAAC,4CAA4C,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBACzF,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAClG,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IACD;;;;;;;;;;;;;;;OAeG;IACK,wBAAwB,CAAC,CAAS,EAAE,CAAS,EAAE,KAAc;QACnE,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,GAAG,IAAI,CAAC;aACX,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,GAAG,IAAI,CAAC;QAChB,wBAAwB;QACxB,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,IAAI,IAAI,CAAC;aACZ,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,IAAI,IAAI,CAAC;QACjB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,0DAA0D;IAClD,2BAA2B,CAAC,GAAiB,EAAE,GAAiB,EAAE,QAAiB;QACzF,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,oBAAoB;YAC3B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACnC,OAAO;QACT,IAAI,KAAa,CAAC;QAClB,IAAI,KAAa,CAAC;QAClB,MAAM,OAAO,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC;QACxD,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC;QACxD,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC;QACxD,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC;QACxD,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,GAAG,GAAG,GAAG,CAAC;YACd,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YAClB,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACxB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;gBACtE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;gBACf,GAAG,GAAG,GAAG,CAAC;gBACV,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACzB,kEAAkE;gBAClE,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC7B,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC7B,IAAI,IAAI,CAAC,oBAAoB;oBAC3B,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBACxB,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBACrE,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC;wBACrF,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;wBACzB,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBACrE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;wBACf,sFAAsF;wBACtF,oFAAoF;wBACpF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;4BACvB,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAC3G,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,8CAA8C;IACtC,uBAAuB,CAAC,KAAe,EAAE,YAAiC;QAChF,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO;QACtC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,YAAY,iCAAe,CAAC;YAClE,OAAO;QACT,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU;IACrC,CAAC;IACD,oFAAoF;IAC5E,mCAAmC,CAAC,KAAe,EAAE,YAAiC;QAC5F,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,YAAY,yDAA2B,CAAC;YAC/E,OAAO;QACT,IAAI,KAAK,YAAY,yDAA2B;YAC9C,IAAA,qBAAM,EAAC,KAAK,EAAE,uDAAuD,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAClD,YAAY,CAAC,OAAO,CAAC,CAAC,IAA6B,EAAE,EAAE;YACrD,yDAA2B,CAAC,qCAAqC,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAC1F,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,OAAO,CAAC,CAAC,IAA6B,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,0DAA0D;IAC1C,mBAAmB,CAAC,QAAuB;QACzD,IAAI,IAAI,CAAC,UAAU,YAAY,6BAAa,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,IAAI,CAAC,qBAAqB,CACxB,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAC1D,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAC1D,KAAK,CACN,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,2BAAY,EAAE,CAAC;YACnD,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,aAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,6BAAc,EAAE,CAAC;YACrD,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,uCAAkB,EAAE,CAAC;YACzD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,iCAAe,EAAE,CAAC;YACtD,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,yDAA2B,EAAE,CAAC;YAClE,IAAI,CAAC,mCAAmC,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,6DAA6D;IAC7C,kBAAkB,CAAC,GAAiB;QAClD,IAAI,IAAI,CAAC,UAAU,YAAY,6BAAa,EAAE,CAAC;YAC7C,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,2BAAY,EAAE,CAAC;YACnD,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,aAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,6BAAc,EAAE,CAAC;YACrD,IAAI,CAAC,8BAA8B,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,uCAAkB,EAAE,CAAC;YACzD,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,iCAAe,EAAE,CAAC;YACtD,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,yDAA2B,EAAE,CAAC;YAClE,IAAI,CAAC,mCAAmC,CAAC,GAAG,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,sDAAsD;IACtC,WAAW,CAAC,IAAW;QACrC,IAAI,IAAI,CAAC,UAAU,YAAY,6BAAa,EAAE,CAAC;YAC7C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,2BAAY,EAAE,CAAC;YACnD,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,aAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,6BAAc,EAAE,CAAC;YACrD,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,uCAAkB,EAAE,CAAC;YACzD,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,iCAAe,EAAE,CAAC;YACtD,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,yDAA2B,EAAE,CAAC;YAClE,IAAI,CAAC,mCAAmC,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,gEAAgE;IAChD,oBAAoB,CAAC,MAAsB;QACzD,IAAI,IAAI,CAAC,UAAU,YAAY,6BAAa,EAAE,CAAC;YAC7C,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,2BAAY,EAAE,CAAC;YACnD,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,aAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,iCAAkB,EAAE,CAAC;YACzD,IAAI,CAAC,oCAAoC,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,uCAAkB,EAAE,CAAC;YACzD,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,iCAAe,EAAE,CAAC;YACtD,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,yDAA2B,EAAE,CAAC;YAClE,IAAI,CAAC,mCAAmC,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;OAOG;IACK,2BAA2B,CACjC,KAAgC,EAAE,MAAsB,EAAE,OAA2B,EAAE,QAAQ,GAAG,KAAK;QAEvG,MAAM,kBAAkB,GAAG,IAAI,yCAAgC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjF,MAAM,cAAc,GAAG,IAAI,wCAA+B,CAAC,kBAAkB,EAAE,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW;QACtH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACvD,IAAA,qBAAM,EAAC,OAAO,CAAC,KAAK,YAAY,2BAAY,EAAE,mCAAmC,CAAC,CAAC;YACnF,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,sGAAsG;YAChK,IAAI,cAAc,CAAC,aAAa,EAAE,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;oBAClE,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YACvG,CAAC,CAAC,6BAA6B;QACjC,CAAC;IACH,CAAC;IACD;;;;;;OAMG;IACK,WAAW,CAAC,KAAqB,EAAE,OAAuB,EAAE,MAAqB;QACvF,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,2BAAY,CAAC,MAAM,EAAE,CAAC;QACnD,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,4FAA4F;IACpF,mCAAmC,CAAC,MAAsB,EAAE,GAAiB,EAAE,QAAiB;QACtG,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,uBAAuB;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,0CAA0C;QAC1G,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,iDAAiD;QAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,2FAA2F;YAC3F,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ;gBAChC,MAAM,CAAC,WAAW,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACrD,WAAW,CAAC,OAAO,CAAC,CAAC,IAA6B,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,0BAA0B;QAC9G,OAAO,eAAe,CAAC;IACzB,CAAC;IACD;;;;;OAKG;IACK,mBAAmB,CAAC,MAAsB,EAAE,OAA2B,EAAE,QAAiB;QAChG,0GAA0G;QAC1G,MAAM,aAAa,GAAG,uBAAU,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACvG,KAAK,MAAM,YAAY,IAAI,aAAa;YACtC,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACjD,mHAAmH;QACnH,IAAI,GAAG,GAAG,MAAM,CAAC;QACjB,IAAI,MAAM,YAAY,uCAAkB;YACtC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,mCAAmC,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3E,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnE,IAAI,MAAM,YAAY,2BAAY,EAAE,CAAC,CAAC,8DAA8D;YAClG,MAAM,KAAK,GAAG,mBAAQ,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,EAAE,GAAG,yBAAyB,CAAC,aAAa,CAAC;YACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,CAAC,+BAA+B,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IACD,+DAA+D;IAC/C,sBAAsB,CAAC,MAA0B;QAC/D,IAAI,IAAI,CAAC,UAAU,YAAY,yDAA2B,EAAE,CAAC;YAC3D,IAAI,CAAC,mCAAmC,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,+BAAc,EAAE,CAAC;YACrD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,iCAAe,EAAE,CAAC;YACtD,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,8EAA8E;IAC9D,iCAAiC,CAAC,KAAkC;QAClF,KAAK,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAC/C,kIAAkI;QAClI,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAClD,YAAY,CAAC,OAAO,CAAC,CAAC,IAA6B,EAAE,EAAE;YACrD,yDAA2B,CAAC,qCAAqC,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YAC1F,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IACD,8EAA8E;IAC9D,qBAAqB,CAAC,MAAuB;QAC3D;;;;;;;;;;;;UAYE;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;;AA3yBH,8DA4yBC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { assert, DuplicatePolicy, SortedArray } from \"@itwin/core-bentley\";\nimport { BSplineCurve3d, BSplineCurve3dBase } from \"../../bspline/BSplineCurve\";\nimport { BSplineCurve3dH } from \"../../bspline/BSplineCurve3dH\";\nimport { Geometry } from \"../../Geometry\";\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\nimport { GrowableFloat64Array } from \"../../geometry3d/GrowableFloat64Array\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Range3d } from \"../../geometry3d/Range\";\nimport { CurveCurveCloseApproachXYRRtoRRD, Newton2dUnboundedWithDerivative } from \"../../numerics/Newton\";\nimport { AnalyticRoots } from \"../../numerics/Polynomials\";\nimport { SmallSystem } from \"../../numerics/SmallSystem\";\nimport { Arc3d } from \"../Arc3d\";\nimport { CurveChainWithDistanceIndex } from \"../CurveChainWithDistanceIndex\";\nimport { CurveCollection } from \"../CurveCollection\";\nimport { CurveCurve } from \"../CurveCurve\";\nimport { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { AnyCurve } from \"../CurveTypes\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { ProxyCurve } from \"../ProxyCurve\";\nimport { TransitionSpiral3d } from \"../spiral/TransitionSpiral3d\";\nimport { StrokeOptions } from \"../StrokeOptions\";\n\n// cspell:word XYRR currentdFdX\n\n/**\n * Handler class for XY close approach between _geometryB and another geometry.\n * * Approach means the XY distance (z is ignored) between _geometryB and another geometry.\n * * Closest approach is a measure of the proximity of one curve to another. It's the length of the shortest line\n * segment perpendicular to both curves; if the curves intersect, the closest approach is zero. In the context of\n * this class, z-coordinates are ignored, so the closest approach is as seen in the top view. If you have coplanar\n * input curves and want to find closest approach in their plane, rotate them first into a plane parallel to the\n * xy-plane, then afterward, rotate the results back as required.\n * * Close approach can also be from a curve endpoint perpendicular to another curve or from a curve endpoint to\n * another curve endpoint.\n * * Instances are initialized and called from CurveCurve.\n * * geometryB is saved for later reference.\n * @internal\n */\nexport class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {\n private _geometryB: AnyCurve | undefined;\n /**\n * Maximum XY distance (z is ignored). Approach larger than this is not interesting.\n * This is caller defined and can be undefined.\n */\n private _maxDistanceToAccept: number | undefined;\n /** Squared max distance. Default is [[Geometry.smallMetricDistanceSquared]]. */\n private _maxDistanceSquared: number;\n private _xyTolerance: number;\n private _newtonTolerance: number;\n /**\n * Start and end points of line segments that meet closest approach criteria, i.e., they are perpendicular to\n * both curves and their length is smaller than _maxDistanceToAccept.\n */\n private _results: SortedArray<CurveLocationDetailPair>;\n\n private static _workPointAA0 = Point3d.create();\n private static _workPointAA1 = Point3d.create();\n private static _workPointBB0 = Point3d.create();\n private static _workPointBB1 = Point3d.create();\n private static _workPointB = Point3d.create();\n\n /**\n * Constructor.\n * @param geometryB second curve for intersection. Saved for reference by specific handler methods.\n * @param xyTolerance optional tolerance for comparing xy points (default [[Geometry.smallMetricDistance]]).\n * @param newtonTolerance optional relative fraction tolerance for Newton iteration (default [[Geometry.smallNewtonStep]]).\n */\n public constructor(geometryB?: AnyCurve, xyTolerance: number = Geometry.smallMetricDistance, newtonTolerance: number = Geometry.smallNewtonStep) {\n super();\n this._geometryB = geometryB instanceof ProxyCurve ? geometryB.proxyCurve : geometryB;\n this._maxDistanceSquared = Geometry.smallMetricDistanceSquared;\n this._xyTolerance = xyTolerance;\n this._newtonTolerance = newtonTolerance;\n const compare = CurveLocationDetailPair.comparePairsByPoints(xyTolerance, true);\n this._results = new SortedArray<CurveLocationDetailPair>(compare, DuplicatePolicy.Retain);\n }\n /** Set the (possibly undefined) max XY distance (z is ignored) to accept. */\n public set maxDistanceToAccept(value: number | undefined) {\n if (value === undefined) {\n this._maxDistanceToAccept = undefined;\n this._maxDistanceSquared = Geometry.smallMetricDistanceSquared;\n } else {\n this._maxDistanceToAccept = Math.abs(value);\n this._maxDistanceSquared = value * value;\n }\n }\n /** Access the (possibly undefined) max XY distance (z is ignored) to accept. */\n public get maxDistanceToAccept(): number | undefined {\n return this._maxDistanceToAccept;\n }\n /** Ask if the maxDistanceToAccept value is defined and positive */\n public get isMaxDistanceSet(): boolean {\n return this._maxDistanceToAccept !== undefined && this._maxDistanceToAccept > 0;\n }\n /**\n * Reset the geometry.\n * * Undefined inputs are ignored.\n * * All other instance data is unchanged, including accumulated intersections.\n */\n public resetGeometry(geometryB?: AnyCurve) {\n if (geometryB)\n this._geometryB = geometryB;\n }\n /** returns true if `fraction` is in [0,1] within tolerance */\n private acceptFraction(fraction: number, fractionTol: number = 1.0e-12) {\n if (fraction < -fractionTol)\n return false;\n if (fraction > 1.0 + fractionTol)\n return false;\n return true;\n }\n /** Extract (and clear) the results, structured as an array of CurveLocationDetailPair. */\n public grabPairedResults(): CurveLocationDetailPair[] {\n return this._results.extractArray();\n }\n /**\n * Create and record a close-approach pair from raw curve/fraction/point data.\n * * If points are undefined, they are computed from the fractions via `fractionToPoint`.\n * * Fractions are global (i.e., relative to the full curve, not a sub-segment).\n * * The pair is recorded only if the XY distance is within `_maxDistanceSquared`.\n * @param cpA first curve\n * @param fA global fraction on cpA\n * @param pointA point on cpA at fA, or undefined to compute from fA\n * @param cpB second curve\n * @param fB global fraction on cpB\n * @param pointB point on cpB at fB, or undefined to compute from fB\n * @param reversed if true, swap detailA and detailB before recording\n */\n private testAndRecordPointPair(\n cpA: CurvePrimitive, fA: number, pointA: Point3d | undefined,\n cpB: CurvePrimitive, fB: number, pointB: Point3d | undefined,\n reversed: boolean\n ): void {\n if (!pointA)\n pointA = cpA.fractionToPoint(fA);\n if (!pointB)\n pointB = cpB.fractionToPoint(fB);\n const d2 = pointA.distanceSquaredXY(pointB);\n if (d2 <= this._maxDistanceSquared) {\n const d = Math.sqrt(d2);\n const detailA = CurveLocationDetail.createCurveFractionPointDistance(cpA, fA, pointA, d);\n const detailB = CurveLocationDetail.createCurveFractionPointDistance(cpB, fB, pointB, d);\n detailA.setIntervalRole(CurveIntervalRole.isolated);\n detailB.setIntervalRole(CurveIntervalRole.isolated);\n const pair = CurveLocationDetailPair.createCapture(detailA, detailB);\n if (reversed)\n pair.swapDetails();\n this._results.insert(pair);\n }\n }\n /**\n * Record a pre-built close-approach pair with global fractions already set.\n * * Computes and stores the XY distance on both details.\n * * The pair is recorded only if the XY distance is within `_maxDistanceSquared`.\n * @param pair details with global fractions and points already set; modified in place\n * @param reversed if true, swap detailA and detailB before recording\n */\n private testAndRecordPair(pair: CurveLocationDetailPair, reversed: boolean) {\n const d2 = pair.detailA.point.distanceSquaredXY(pair.detailB.point);\n if (d2 > this._maxDistanceSquared)\n return;\n const d = Math.sqrt(d2);\n pair.detailA.a = pair.detailB.a = d;\n pair.detailA.setIntervalRole(CurveIntervalRole.isolated);\n pair.detailB.setIntervalRole(CurveIntervalRole.isolated);\n if (reversed)\n pair.swapDetails();\n this._results.insert(pair);\n }\n /**\n * Convert a close-approach pair from local (sub-segment) fractions to global fractions, then record it.\n * * Local fractions in the pair are interpolated into the global fraction ranges.\n * * Points are recomputed from the parent curves at the global fractions.\n * * The pair is recorded only if the XY distance is within `_maxDistanceSquared`.\n * @param pair local details (curve unspecified); modified in place with global fractions, curves, and points\n * @param cpA parent curve A\n * @param fractionA0 global fraction corresponding to local fraction 0 on curve A\n * @param fractionA1 global fraction corresponding to local fraction 1 on curve A\n * @param cpB parent curve B\n * @param fractionB0 global fraction corresponding to local fraction 0 on curve B\n * @param fractionB1 global fraction corresponding to local fraction 1 on curve B\n * @param reversed if true, swap detailA and detailB before recording\n */\n private testAndRecordLocalPair(\n pair: CurveLocationDetailPair,\n cpA: CurvePrimitive, fractionA0: number, fractionA1: number,\n cpB: CurvePrimitive, fractionB0: number, fractionB1: number,\n reversed: boolean,\n ) {\n const globalFractionA = Geometry.interpolate(fractionA0, pair.detailA.fraction, fractionA1);\n const globalFractionB = Geometry.interpolate(fractionB0, pair.detailB.fraction, fractionB1);\n const pointA = cpA.fractionToPoint(globalFractionA);\n const pointB = cpB.fractionToPoint(globalFractionB);\n const d2 = pointA.distanceSquaredXY(pointB);\n if (d2 > this._maxDistanceSquared)\n return;\n const d = Math.sqrt(d2);\n CurveLocationDetail.createCurveFractionPointDistance(cpA, globalFractionA, pointA, d, pair.detailA);\n CurveLocationDetail.createCurveFractionPointDistance(cpB, globalFractionB, pointB, d, pair.detailB);\n pair.detailA.setIntervalRole(CurveIntervalRole.isolated);\n pair.detailB.setIntervalRole(CurveIntervalRole.isolated);\n if (reversed)\n pair.swapDetails();\n this._results.insert(pair);\n }\n /** Modify the current closest approach if the inputs are closer. */\n private static updatePointToSegmentDistance(\n closestApproach: CurveLocationDetailPair,\n fractionA: number, pointA: Point3d,\n fractionB: number, pointB0: Point3d, pointB1: Point3d,\n maxDistanceSquared: number,\n ): boolean {\n let updated = false;\n if (fractionB < 0)\n fractionB = 0;\n else if (fractionB > 1)\n fractionB = 1;\n const pointB = pointB0.interpolate(fractionB, pointB1, this._workPointB);\n const distanceSquared = pointB.distanceSquaredXY(pointA);\n if (distanceSquared <= Math.min(maxDistanceSquared, closestApproach.detailA.a)) {\n closestApproach.detailA.setFP(fractionA, pointA, undefined, distanceSquared);\n closestApproach.detailB.setFP(fractionB, pointB, undefined, distanceSquared);\n updated = true;\n }\n return updated;\n }\n /**\n * Return fractions of close approach within maxDistance between two line segments (a0,a1) and (b0,b1).\n * * Math details can be found at core/geometry/internaldocs/Curve.md\n * @param a0 start point of line a\n * @param a1 end point of line a\n * @param b0 start point of line b\n * @param b1 end point of line b\n * @param maxDistanceSquared maximum distance squared (assumed to be positive)\n * @returns a pair of details for the closest approach, or `undefined` if no approach is within `maxDistanceSquared`.\n * `detailA.fraction` is the fraction on segment a; `detailB.fraction` is the fraction on segment b. Returned\n * details store the *squared* distance in the `a` property.\n */\n private static segmentSegmentBoundedApproach(\n a0: Point3d, a1: Point3d,\n b0: Point3d, b1: Point3d,\n maxDistanceSquared: number,\n ): CurveLocationDetailPair | undefined {\n const ux = a1.x - a0.x;\n const uy = a1.y - a0.y;\n const vx = b1.x - b0.x;\n const vy = b1.y - b0.y;\n const e00x = b0.x - a0.x;\n const e00y = b0.y - a0.y;\n const e01x = b1.x - a0.x;\n const e01y = b1.y - a0.y;\n const e10x = b0.x - a1.x;\n const e10y = b0.y - a1.y;\n const hab0 = Geometry.crossProductXYXY(ux, uy, e00x, e00y);\n const hab1 = Geometry.crossProductXYXY(ux, uy, e01x, e01y);\n const hba0 = -Geometry.crossProductXYXY(vx, vy, e00x, e00y);\n const hba1 = -Geometry.crossProductXYXY(vx, vy, e10x, e10y);\n if (hab0 * hab1 < 0.0 && hba0 * hba1 < 0.0) { // true intersection, strictly within both segments\n const fractionA = -hba0 / (hba1 - hba0);\n const fractionB = -hab0 / (hab1 - hab0);\n return CurveLocationDetailPair.createCapture(\n CurveLocationDetail.createCurveFractionPoint(undefined, fractionA, a0.interpolate(fractionA, a1)),\n CurveLocationDetail.createCurveFractionPoint(undefined, fractionB, b0.interpolate(fractionB, b1)),\n );\n }\n // there's no intersection, so find the closest approach within maxDistance from an endpoint\n const closestApproach = new CurveLocationDetailPair();\n closestApproach.detailA.a = 2 * maxDistanceSquared; // init to an approach that's too far away\n let reversed = false;\n const uu = Geometry.hypotenuseSquaredXY(ux, uy);\n if (hab0 * hab0 <= maxDistanceSquared * uu) { // test distance of b0 to u\n const fractionA = Geometry.safeDivideFraction(Geometry.dotProductXYXY(ux, uy, e00x, e00y), uu, 0.0);\n if (this.updatePointToSegmentDistance(closestApproach, 0, b0, fractionA, a0, a1, maxDistanceSquared))\n reversed = true;\n }\n if (hab1 * hab1 <= maxDistanceSquared * uu) { // test distance of b1 to u\n const fractionA = Geometry.safeDivideFraction(Geometry.dotProductXYXY(ux, uy, e01x, e01y), uu, 0.0);\n if (this.updatePointToSegmentDistance(closestApproach, 1, b1, fractionA, a0, a1, maxDistanceSquared))\n reversed = true;\n }\n const vv = Geometry.hypotenuseSquaredXY(vx, vy);\n if (hba0 * hba0 <= maxDistanceSquared * vv) { // test distance of a0 to v\n const fractionB = Geometry.safeDivideFraction(-Geometry.dotProductXYXY(vx, vy, e00x, e00y), vv, 0.0);\n if (this.updatePointToSegmentDistance(closestApproach, 0, a0, fractionB, b0, b1, maxDistanceSquared))\n reversed = false;\n }\n if (hba1 * hba1 <= maxDistanceSquared * vv) { // test distance of a1 to v\n const fractionB = Geometry.safeDivideFraction(-Geometry.dotProductXYXY(vx, vy, e10x, e10y), vv, 0.0);\n if (this.updatePointToSegmentDistance(closestApproach, 1, a1, fractionB, b0, b1, maxDistanceSquared))\n reversed = false;\n }\n if (closestApproach.detailA.a > maxDistanceSquared)\n return undefined;\n if (reversed)\n closestApproach.swapDetails();\n return closestApproach;\n }\n /**\n * Compute closest approaches from the endpoints of each curve (if open) to the other curve.\n * Record a [[CurveLocationDetailPair]] if such a distance is less than [[maxDistance]].\n * @param cpA curveA\n * @param cpB curveB\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to curveA).\n */\n private testAndRecordEndPointApproaches(cpA: CurvePrimitive, cpB: CurvePrimitive, reversed: boolean): void {\n const pt = CurveCurveCloseApproachXY._workPointB;\n // in closest approach context, endpoints of full sweep arcs are artificial locations, and thus ignored\n const isClosedArc = (curve: CurvePrimitive) => curve instanceof Arc3d && curve.sweep.isFullCircle;\n if (!isClosedArc(cpA)) {\n this.testAndRecordProjection(cpA, 0, cpA.startPoint(pt), cpB, reversed);\n this.testAndRecordProjection(cpA, 1, cpA.endPoint(pt), cpB, reversed);\n }\n if (!isClosedArc(cpB)) {\n this.testAndRecordProjection(cpB, 0, cpB.startPoint(pt), cpA, !reversed);\n this.testAndRecordProjection(cpB, 1, cpB.endPoint(pt), cpA, !reversed);\n }\n }\n /** Find the closest xy approach between `pointA` and `cpB`. */\n private testAndRecordProjection(cpA: CurvePrimitive, fA: number, pointA: Point3d, cpB: CurvePrimitive, reversed: boolean): void {\n const detail = cpB.closestPointXY(pointA);\n if (detail)\n this.testAndRecordPointPair(cpA, fA, pointA, cpB, detail.fraction, detail.point, reversed);\n }\n /**\n * Compute closest xy approach of two line segments.\n * Filter by extension rules.\n * Record with fraction mapping.\n * * The fraction mappings allow portions of a linestring to be passed here.\n */\n private computeSegmentSegment(\n cpA: CurvePrimitive, pointA0: Point3d, fractionA0: number, pointA1: Point3d, fractionA1: number,\n cpB: CurvePrimitive, pointB0: Point3d, fractionB0: number, pointB1: Point3d, fractionB1: number,\n reversed: boolean,\n ): void {\n // compute a pair with fractions local to segments\n const approach = CurveCurveCloseApproachXY.segmentSegmentBoundedApproach(\n pointA0, pointA1, pointB0, pointB1, this._maxDistanceSquared,\n );\n // adjust the pair to refer to input curves and global fractions, then record it if new\n if (approach) {\n approach.detailA.setCurve(cpA);\n approach.detailB.setCurve(cpB);\n this.testAndRecordLocalPair(approach, cpA, fractionA0, fractionA1, cpB, fractionB0, fractionB1, reversed);\n }\n }\n /**\n * Compute the perpendiculars between a line segment and an arc, without extending either curve.\n * * One or two perpendiculars will be found.\n * * Each perpendicular segment starts or ends on the arc where the arc tangent is parallel to the line tangent.\n * @param startA line segment start point\n * @param endA line segment end point\n * @param arcB the arc\n * @param announce callback to receive line and arc fractions and optional points of each perpendicular segment computed.\n */\n private announceAllPerpendicularsSegmentArcBounded(\n startA: Point3d, endA: Point3d, arcB: Arc3d,\n announce: (lineFraction: number, linePoint: Point3d | undefined, arcFraction: number, arcPoint: Point3d | undefined) => void,\n ): void {\n const dotUT = arcB.vector0.crossProductStartEndXY(startA, endA);\n const dotVT = arcB.vector90.crossProductStartEndXY(startA, endA);\n const parallelRadians = Math.atan2(dotVT, dotUT);\n for (const radians1 of [parallelRadians, parallelRadians + Math.PI]) {\n const arcPoint = arcB.radiansToPoint(radians1);\n const arcFraction = arcB.sweep.radiansToSignedPeriodicFraction(radians1);\n if (this.acceptFraction(arcFraction)) { // reject solution outside arc sweep\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(startA, endA, arcPoint);\n if (lineFraction !== undefined && this.acceptFraction(lineFraction))\n announce(lineFraction, undefined, arcFraction, arcPoint);\n }\n }\n }\n /**\n * Find close approaches within maxDistance between a line segment and an arc.\n * To consider:\n * 1) intersection between arc and segment.\n * 2) endpoints to endpoints, or endpoints projection to the other curve.\n * 3) arc tangent parallel to line segment\n * @param lineA the line segment\n * @param arcB the arc\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to arcA).\n */\n private computeSegmentArc(lineA: LineSegment3d, arcB: Arc3d, reversed: boolean): void {\n // 1) intersection between arc and line segment (or string).\n // Suppose:\n // Arc: X = C + cU + sV where c = cos(theta) and s = sin(theta)\n // Line: contains points A0 and A1\n // The arc intersects the line at point X if det(A0, A1, X) = 0 with homogeneous xyw points and vectors.\n // With equational X: det(A0, A1, C) + c*det(A0, A1, U) + s*det(A0, A1, V) = 0.\n // solve for theta.\n // evaluate points.\n // project back to line.\n let intersectionFound = false;\n const data = arcB.toTransformedVectors();\n const alpha = Geometry.tripleProductXYW(lineA.point0Ref, 1, lineA.point1Ref, 1, data.center, 1); // det(A0, A1, C)\n const beta = Geometry.tripleProductXYW(lineA.point0Ref, 1, lineA.point1Ref, 1, data.vector0, 0); // det(A0, A1, U)\n const gamma = Geometry.tripleProductXYW(lineA.point0Ref, 1, lineA.point1Ref, 1, data.vector90, 0); // det(A0, A1, V)\n const cosines = new GrowableFloat64Array(2);\n const sines = new GrowableFloat64Array(2);\n const radians = new GrowableFloat64Array(2);\n const numRoots = AnalyticRoots.appendImplicitLineUnitCircleIntersections(alpha, beta, gamma, cosines, sines, radians);\n for (let i = 0; i < numRoots; i++) {\n const arcPoint = data.center.plus2Scaled(data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i));\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians.atUncheckedIndex(i));\n if (this.acceptFraction(arcFraction)) { // reject solution outside arc sweep\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(lineA.point0Ref, lineA.point1Ref, arcPoint);\n if (lineFraction !== undefined && this.acceptFraction(lineFraction)) {\n this.testAndRecordPointPair(lineA, lineFraction, undefined, arcB, arcFraction, arcPoint, reversed);\n intersectionFound = true;\n }\n }\n }\n if (intersectionFound)\n return;\n // 2) endpoints to endpoints, or endpoints projection to the other curve.\n this.testAndRecordEndPointApproaches(lineA, arcB, reversed);\n // 3) arc tangent parallel to line segment.\n // If line does not intersect the arc, then the closest (and/or the furthest) point on arc to the line is a\n // point where the tangent line on arc at that point is parallel to the line.\n this.announceAllPerpendicularsSegmentArcBounded(lineA.point0Ref, lineA.point1Ref, arcB,\n (lineFraction: number, linePoint: Point3d | undefined, arcFraction: number, arcPoint: Point3d | undefined) =>\n this.testAndRecordPointPair(lineA, lineFraction, linePoint, arcB, arcFraction, arcPoint, reversed),\n );\n }\n /**\n * Compute segments perpendicular to two elliptical arcs, without extending either curve.\n * * Perpendiculars from an endpoint are not explicitly computed.\n * * Intersections are also found by this search: they are reported as zero-length segments.\n * @param arcA first arc\n * @param arcB second arc\n * @param reversed swap the details in the recorded pair (default: false)\n */\n public allPerpendicularsArcArcBounded(arcA: Arc3d, arcB: Arc3d, reversed: boolean = false): void {\n const newtonEvaluator = new CurveCurveCloseApproachXYRRtoRRD(arcA, arcB);\n // HEURISTIC: 2 ellipses have up to 8 perpendiculars\n const seedDelta = 1 / 10; // denominator 9 fails the unit test\n const seedStart = seedDelta / 2;\n const newtonSearcher = new Newton2dUnboundedWithDerivative(newtonEvaluator, 100); // observed convergence to 1.0e-11 in 49 iters\n for (let seedU = seedStart; seedU < 1; seedU += seedDelta) {\n for (let seedV = seedStart; seedV < 1; seedV += seedDelta) {\n newtonSearcher.setUV(seedU, seedV);\n if (newtonSearcher.runIterations()) {\n const fractionA = newtonSearcher.getU();\n const fractionB = newtonSearcher.getV();\n if (this.acceptFraction(fractionA) && this.acceptFraction(fractionB)) {\n this.testAndRecordPointPair(arcA, fractionA, undefined, arcB, fractionB, undefined, reversed);\n }\n }\n }\n }\n }\n /** Low level dispatch of arc with Arc3d. */\n private dispatchArcArc(cpA: Arc3d, cpB: Arc3d, reversed: boolean): void {\n const rangeA = cpA.range();\n const rangeB = cpB.range();\n if (this._maxDistanceToAccept)\n rangeA.expandInPlace(this._maxDistanceToAccept);\n if (!rangeB.intersectsRangeXY(rangeA))\n return;\n // 1) endpoints to endpoints or endpoints projection to the other curve\n this.testAndRecordEndPointApproaches(cpA, cpB, reversed);\n // 2) perpendicular line between 2 arcs (includes intersections)\n this.allPerpendicularsArcArcBounded(cpA, cpB, reversed);\n }\n /** Low level dispatch of arc with (beziers of) a bspline curve */\n private dispatchArcBsplineCurve3d(cpA: Arc3d, cpB: BSplineCurve3d, reversed: boolean): void {\n const ls = LineString3d.create();\n cpB.emitStrokes(ls);\n this.computeArcLineString(cpA, ls, reversed);\n }\n /** Low level dispatch of (beziers of) a bspline curve with (beziers of) a bspline curve */\n private dispatchBSplineCurve3dBSplineCurve3d(\n bcurveA: BSplineCurve3dBase, bcurveB: BSplineCurve3dBase, reversed: boolean,\n ): void {\n const lsA = LineString3d.create();\n bcurveA.emitStrokes(lsA);\n const lsB = LineString3d.create();\n bcurveB.emitStrokes(lsB);\n this.computeLineStringLineString(lsA, lsB, reversed);\n }\n /** Low level dispatch of linestring with (beziers of) a bspline curve */\n private dispatchLineStringBSplineCurve(lsA: LineString3d, curveB: BSplineCurve3d, reversed: boolean): void {\n const lsB = LineString3d.create();\n curveB.emitStrokes(lsB);\n this.computeLineStringLineString(lsA, lsB, reversed);\n }\n /** Low level dispatch of segment with (beziers of) a bspline curve */\n private dispatchSegmentBsplineCurve(segA: LineSegment3d, curveB: BSplineCurve3d, reversed: boolean): void {\n const lsB = LineString3d.create();\n curveB.emitStrokes(lsB);\n this.computeSegmentLineString(segA, lsB, reversed);\n }\n /** Detail computation for segment approaching linestring. */\n private computeSegmentLineString(segA: LineSegment3d, lsB: LineString3d, reversed: boolean): void {\n const numB = lsB.numPoints();\n const deltaFracB = Geometry.safeDivideFraction(1, numB - 1, 0);\n const pointA0 = segA.point0Ref;\n const pointA1 = segA.point1Ref;\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\n for (let i = 0; i < numB - 1; ++i) {\n const fB0 = i * deltaFracB; // global linestring fractions\n const fB1 = (i + 1 === numB - 1) ? 1.0 : (i + 1) * deltaFracB; // make sure we nail the end fraction\n lsB.packedPoints.getPoint3dAtUncheckedPointIndex(i, pointB0);\n lsB.packedPoints.getPoint3dAtUncheckedPointIndex(i + 1, pointB1);\n this.computeSegmentSegment(segA, pointA0, 0.0, pointA1, 1.0, lsB, pointB0, fB0, pointB1, fB1, reversed);\n }\n }\n /** Detail computation for arc approaching linestring. */\n private computeArcLineString(arcA: Arc3d, lsB: LineString3d, reversed: boolean): void {\n const rangeA = arcA.range();\n const rangeB = lsB.range();\n if (this._maxDistanceToAccept)\n rangeA.expandInPlace(this._maxDistanceToAccept);\n if (!rangeB.intersectsRangeXY(rangeA))\n return;\n const v0 = CurveCurveCloseApproachXY._workPointBB0;\n const v1 = CurveCurveCloseApproachXY._workPointBB1;\n // 1. record intersections\n const intersections = CurveCurve.intersectionXYPairs(arcA, false, lsB, false, this._xyTolerance);\n for (const intersection of intersections)\n this.testAndRecordPair(intersection, reversed);\n // 2. record linestring interior vertex projections onto arc\n const fStep = Geometry.safeDivideFraction(1.0, lsB.numEdges(), 0);\n for (let i = 1; i < lsB.numEdges(); ++i)\n this.testAndRecordProjection(lsB, i * fStep, lsB.pointAtUnchecked(i, v0), arcA, !reversed);\n // 3. record arc/linestring endpoint projections onto linestring/arc\n this.testAndRecordEndPointApproaches(arcA, lsB, reversed);\n // 4. record perpendiculars from within a segment to the arc\n lsB.startPoint(v0);\n for (let iSeg = 0; iSeg < lsB.numEdges(); ++iSeg, v0.setFrom(v1)) {\n lsB.pointAtUnchecked(iSeg + 1, v1);\n this.announceAllPerpendicularsSegmentArcBounded(v0, v1, arcA,\n (lineFraction: number, linePoint: Point3d | undefined, arcFraction: number, arcPoint: Point3d | undefined) => {\n const fLineString = lsB.segmentIndexAndLocalFractionToGlobalFraction(iSeg, lineFraction);\n this.testAndRecordPointPair(arcA, arcFraction, arcPoint, lsB, fLineString, linePoint, reversed);\n },\n );\n }\n }\n /**\n * Set bits for comparison to range xy\n * * bit 0x01 => x smaller than range.low.x\n * * bit 0x02 => x larger than range.high.x\n * * bit 0x04 => y smaller than range.low.y\n * * bit 0x08 => y larger than range.high.y\n * * If we divide XY plane into 9 areas using the range, the function returns 0 for points\n * inside the range. Below is other binary numbers returned by the function for all 9 areas:\n * 1001 | 1000 | 1010\n * ------------------\n * 1 | 0 | 10\n * ------------------\n * 101 | 100 | 110\n * @param xy point to test\n * @param range range for comparison\n */\n private classifyBitsPointRangeXY(x: number, y: number, range: Range3d): number {\n let result = 0;\n if (x < range.low.x)\n result = 0x01;\n else if (x > range.high.x)\n result = 0x02;\n // note the OR operation\n if (y < range.low.y)\n result |= 0x04;\n else if (y > range.high.y)\n result |= 0x08;\n return result;\n }\n /** Low level dispatch of line string with line string. */\n private computeLineStringLineString(lsA: LineString3d, lsB: LineString3d, reversed: boolean): void {\n const rangeA = lsA.range();\n const rangeB = lsB.range();\n if (this._maxDistanceToAccept)\n rangeA.expandInPlace(this._maxDistanceToAccept);\n if (!rangeB.intersectsRangeXY(rangeA))\n return;\n let bitB0: number;\n let bitB1: number;\n const rangeA1 = Range3d.createNull();\n const pointA0 = CurveCurveCloseApproachXY._workPointAA0;\n const pointA1 = CurveCurveCloseApproachXY._workPointAA1;\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\n const numA = lsA.numPoints();\n const numB = lsB.numPoints();\n if (numA > 1 && numB > 1) {\n const dfA = 1.0 / (numA - 1);\n const dfB = 1.0 / (numB - 1);\n let fA0 = 0.0;\n let fA1, fB0, fB1;\n lsA.pointAt(0, pointA0);\n for (let ia = 1; ia < numA; ia++, pointA0.setFrom(pointA1), fA0 = fA1) {\n fA1 = ia * dfA;\n fB0 = 0.0;\n lsA.pointAt(ia, pointA1);\n // rangeA1 is around line segment [A0,A1] expanded by max distance\n rangeA1.setNull();\n rangeA1.extendPoint(pointA0);\n rangeA1.extendPoint(pointA1);\n if (this._maxDistanceToAccept)\n rangeA1.expandInPlace(this._maxDistanceToAccept);\n if (rangeA1.intersectsRangeXY(rangeB)) {\n lsB.pointAt(0, pointB0);\n bitB0 = this.classifyBitsPointRangeXY(pointB0.x, pointB0.y, rangeA1);\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1, bitB0 = bitB1) {\n lsB.pointAt(ib, pointB1);\n bitB1 = this.classifyBitsPointRangeXY(pointB1.x, pointB1.y, rangeA1);\n fB1 = ib * dfB;\n // DO NOT study the segment in detail if both bitB bits are on for any of the 4 planes\n // (i.e., no intersection between rangeA1 and the range around line segment [B0,B1])\n if ((bitB0 & bitB1) === 0)\n this.computeSegmentSegment(lsA, pointA0, fA0, pointA1, fA1, lsB, pointB0, fB0, pointB1, fB1, reversed);\n }\n }\n }\n }\n }\n /** Low level dispatch of curve collection. */\n private dispatchCurveCollection(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\n const geomB = this._geometryB; // save\n if (!geomB || !geomB.children || !(geomB instanceof CurveCollection))\n return;\n for (const child of geomB.children) {\n this.resetGeometry(child);\n geomAHandler(geomA);\n }\n this._geometryB = geomB; // restore\n }\n /** Low level dispatch to geomA given a CurveChainWithDistanceIndex in geometryB. */\n private dispatchCurveChainWithDistanceIndex(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\n if (!this._geometryB || !(this._geometryB instanceof CurveChainWithDistanceIndex))\n return;\n if (geomA instanceof CurveChainWithDistanceIndex)\n assert(false, \"call handleCurveChainWithDistanceIndex(geomA) instead\");\n const saveResults = this.grabPairedResults();\n const geomB = this._geometryB;\n for (const child of geomB.path.children) {\n this.resetGeometry(child);\n geomAHandler(geomA);\n }\n this.resetGeometry(geomB);\n const childResults = this._results.extractArray();\n childResults.forEach((pair: CurveLocationDetailPair) => {\n CurveChainWithDistanceIndex.convertChildDetailToChainDetailSingle(pair, undefined, geomB);\n this._results.insert(pair);\n });\n saveResults.forEach((pair: CurveLocationDetailPair) => this._results.insert(pair));\n }\n /** Double dispatch handler for strongly typed segment. */\n public override handleLineSegment3d(segmentA: LineSegment3d): any {\n if (this._geometryB instanceof LineSegment3d) {\n const segmentB = this._geometryB;\n this.computeSegmentSegment(\n segmentA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0,\n segmentB, segmentB.point0Ref, 0.0, segmentB.point1Ref, 1.0,\n false,\n );\n } else if (this._geometryB instanceof LineString3d) {\n this.computeSegmentLineString(segmentA, this._geometryB, false);\n } else if (this._geometryB instanceof Arc3d) {\n this.computeSegmentArc(segmentA, this._geometryB, false);\n } else if (this._geometryB instanceof BSplineCurve3d) {\n this.dispatchSegmentBsplineCurve(segmentA, this._geometryB, false);\n } else if (this._geometryB instanceof TransitionSpiral3d) {\n this.dispatchCurveSpiral(segmentA, this._geometryB, false);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(segmentA, this.handleLineSegment3d.bind(this));\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(segmentA, this.handleLineSegment3d.bind(this));\n }\n return undefined;\n }\n /** Double dispatch handler for strongly typed linestring. */\n public override handleLineString3d(lsA: LineString3d): any {\n if (this._geometryB instanceof LineSegment3d) {\n this.computeSegmentLineString(this._geometryB, lsA, true);\n } else if (this._geometryB instanceof LineString3d) {\n this.computeLineStringLineString(lsA, this._geometryB, false);\n } else if (this._geometryB instanceof Arc3d) {\n this.computeArcLineString(this._geometryB, lsA, true);\n } else if (this._geometryB instanceof BSplineCurve3d) {\n this.dispatchLineStringBSplineCurve(lsA, this._geometryB, false);\n } else if (this._geometryB instanceof TransitionSpiral3d) {\n this.dispatchCurveSpiral(lsA, this._geometryB, false);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(lsA, this.handleLineString3d.bind(this));\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(lsA, this.handleLineString3d.bind(this));\n }\n return undefined;\n }\n /** Double dispatch handler for strongly typed arc. */\n public override handleArc3d(arcA: Arc3d): any {\n if (this._geometryB instanceof LineSegment3d) {\n this.computeSegmentArc(this._geometryB, arcA, true);\n } else if (this._geometryB instanceof LineString3d) {\n this.computeArcLineString(arcA, this._geometryB, false);\n } else if (this._geometryB instanceof Arc3d) {\n this.dispatchArcArc(arcA, this._geometryB, false);\n } else if (this._geometryB instanceof BSplineCurve3d) {\n this.dispatchArcBsplineCurve3d(arcA, this._geometryB, false);\n } else if (this._geometryB instanceof TransitionSpiral3d) {\n this.dispatchCurveSpiral(arcA, this._geometryB, false);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(arcA, this.handleArc3d.bind(this));\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(arcA, this.handleArc3d.bind(this));\n }\n return undefined;\n }\n /** Double dispatch handler for strongly typed bspline curve. */\n public override handleBSplineCurve3d(curveA: BSplineCurve3d): any {\n if (this._geometryB instanceof LineSegment3d) {\n this.dispatchSegmentBsplineCurve(this._geometryB, curveA, true);\n } else if (this._geometryB instanceof LineString3d) {\n this.dispatchLineStringBSplineCurve(this._geometryB, curveA, true);\n } else if (this._geometryB instanceof Arc3d) {\n this.dispatchArcBsplineCurve3d(this._geometryB, curveA, true);\n } else if (this._geometryB instanceof BSplineCurve3dBase) {\n this.dispatchBSplineCurve3dBSplineCurve3d(curveA, this._geometryB, false);\n } else if (this._geometryB instanceof TransitionSpiral3d) {\n this.dispatchCurveSpiral(curveA, this._geometryB, false);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(curveA, this.handleBSplineCurve3d.bind(this));\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(curveA, this.handleBSplineCurve3d.bind(this));\n }\n return undefined;\n }\n /**\n * Process seeds for xy close approach between the curve and spiral.\n * * Refine each result via Newton iteration. If it doesn't converge, remove it.\n * @param seeds The initial seed results to refine.\n * @param curveA The other curve primitive. May also be a transition spiral.\n * @param spiralB The transition spiral.\n * @param reversed whether `spiralB` data is in `detailA` of each recorded pair, and `curveA` data in `detailB`.\n */\n private refineSpiralResultsByNewton(\n seeds: CurveLocationDetailPair[], curveA: CurvePrimitive, spiralB: TransitionSpiral3d, reversed = false\n ): void {\n const xyMatchingFunction = new CurveCurveCloseApproachXYRRtoRRD(curveA, spiralB);\n const newtonSearcher = new Newton2dUnboundedWithDerivative(xyMatchingFunction, 50, this._newtonTolerance); // seen: 47\n for (const seed of seeds) {\n const detailA = reversed ? seed.detailB : seed.detailA;\n const detailB = reversed ? seed.detailA : seed.detailB;\n assert(detailB.curve instanceof LineString3d, \"Caller has discretized the spiral\");\n newtonSearcher.setUV(detailA.fraction, detailB.fraction); // use linestring fraction as spiral param; it generally yields a closer point than fractional length!\n if (newtonSearcher.runIterations()) {\n const fractionA = newtonSearcher.getU();\n const fractionB = newtonSearcher.getV();\n if (this.acceptFraction(fractionA) && this.acceptFraction(fractionB))\n this.testAndRecordPointPair(curveA, fractionA, undefined, spiralB, fractionB, undefined, reversed);\n } // ignore failure to converge\n }\n }\n /**\n * Append stroke points and return the line string.\n * * This is a convenient wrapper for [[CurvePrimitive.emitStrokes]] but the analogous instance method cannot be added\n * to that class due to the ensuing recursion with subclass [[LineString3d]].\n * @param options options for stroking the instance curve.\n * @param result object to receive appended stroke points; if omitted, a new object is created, populated, and returned.\n */\n private strokeCurve(curve: CurvePrimitive, options?: StrokeOptions, result?: LineString3d): LineString3d {\n const ls = result ? result : LineString3d.create();\n curve.emitStrokes(ls, options);\n return ls;\n }\n /** Find and return the close approaches between curveA and the discretization of curveB. */\n private computeDiscreteCloseApproachResults(curveA: CurvePrimitive, lsB: LineString3d, reversed: boolean): CurveLocationDetailPair[] {\n const maxDist = this.maxDistanceToAccept;\n const saveResults = this.grabPairedResults(); // save current results\n const geomB = this._geometryB;\n this.maxDistanceToAccept = maxDist ? maxDist * 1.2 : undefined; // HEURISTIC: allow slack for Newton seeds\n this.resetGeometry(curveA);\n this.handleLineString3d(lsB); // populate empty results with discrete solutions\n if (!reversed) {\n // handleLineString3d put lsB data into detailA, so if we aren't reversing, we need to swap\n for (const result of this._results)\n result.swapDetails();\n }\n this.resetGeometry(geomB);\n this.maxDistanceToAccept = maxDist;\n const discreteResults = this._results.extractArray();\n saveResults.forEach((pair: CurveLocationDetailPair) => this._results.insert(pair)); // restore current results\n return discreteResults;\n }\n /**\n * Compute the XY close approach of a curve and a spiral.\n * @param curveA curve to find its close approach with spiralB. May also be a transition spiral.\n * @param spiralB transition spiral to find its close approach with curveA.\n * @param reversed whether `spiralB` data will be recorded in `detailA` of each result, and `curveA` data in `detailB`.\n */\n private dispatchCurveSpiral(curveA: CurvePrimitive, spiralB: TransitionSpiral3d, reversed: boolean): void {\n // explicit search for intersections (Newton converges too slowly on DirectSpiral3d tangent intersections)\n const intersections = CurveCurve.intersectionXYPairs(curveA, false, spiralB, false, this._xyTolerance);\n for (const intersection of intersections)\n this.testAndRecordPair(intersection, reversed);\n // append seeds computed by solving the discretized spiral close approach problem, then refine the seeds via Newton\n let cpA = curveA;\n if (curveA instanceof TransitionSpiral3d)\n cpA = this.strokeCurve(curveA);\n const cpB = this.strokeCurve(spiralB);\n const seeds = this.computeDiscreteCloseApproachResults(cpA, cpB, reversed);\n this.refineSpiralResultsByNewton(seeds, curveA, spiralB, reversed);\n if (curveA instanceof LineString3d) { // explicitly test corners (where Newton converges too slowly)\n const fStep = Geometry.safeDivideFraction(1.0, curveA.numEdges(), 0);\n const v0 = CurveCurveCloseApproachXY._workPointBB0;\n for (let i = 1; i < curveA.numEdges(); ++i)\n this.testAndRecordProjection(curveA, i * fStep, curveA.pointAtUnchecked(i, v0), spiralB, reversed);\n }\n this.testAndRecordEndPointApproaches(curveA, spiralB, reversed);\n }\n /** Double dispatch handler for strongly typed spiral curve. */\n public override handleTransitionSpiral(spiral: TransitionSpiral3d): any {\n if (this._geometryB instanceof CurveChainWithDistanceIndex) {\n this.dispatchCurveChainWithDistanceIndex(spiral, this.handleTransitionSpiral.bind(this));\n } else if (this._geometryB instanceof CurvePrimitive) {\n this.dispatchCurveSpiral(this._geometryB, spiral, true);\n } else if (this._geometryB instanceof CurveCollection) {\n this.dispatchCurveCollection(spiral, this.handleTransitionSpiral.bind(this));\n }\n return undefined;\n }\n /** Double dispatch handler for strongly typed CurveChainWithDistanceIndex. */\n public override handleCurveChainWithDistanceIndex(chain: CurveChainWithDistanceIndex): any {\n super.handleCurveChainWithDistanceIndex(chain);\n // if _geometryB is also a CurveChainWithDistanceIndex, it will already have been converted by dispatchCurveChainWithDistanceIndex\n const childResults = this._results.extractArray();\n childResults.forEach((pair: CurveLocationDetailPair) => {\n CurveChainWithDistanceIndex.convertChildDetailToChainDetailSingle(pair, chain, undefined);\n this._results.insert(pair);\n });\n }\n /** Double dispatch handler for strongly typed homogeneous bspline curve .. */\n public override handleBSplineCurve3dH(_curve: BSplineCurve3dH): any {\n /*\n //NEEDS WORK -- make \"dispatch\" methods tolerant of both 3d and 3dH.\n // \"easy\" if both present BezierCurve3dH span loaders\n if (this._geometryB instanceof LineSegment3d) {\n this.dispatchSegmentBsplineCurve(\n this._geometryB, this._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB,\n curve, this._extendA, true);\n } else if (this._geometryB instanceof LineString3d) {\n this.dispatchLineStringBSplineCurve(this._geometryB, this._extendB, curve, this._extendA, true);\n } else if (this._geometryB instanceof Arc3d) {\n this.dispatchArcBsplineCurve3d(this._geometryB, this._extendB, curve, this._extendA, true);\n }\n */\n return undefined;\n }\n}\n"]}
|
|
@@ -169,12 +169,11 @@ export declare class CurveCurveIntersectXY extends RecurseToCurvesGeometryHandle
|
|
|
169
169
|
handleBSplineCurve3d(curveA: BSplineCurve3d): any;
|
|
170
170
|
/**
|
|
171
171
|
* Process tail of `this._results` for xy-intersections between the curve and spiral.
|
|
172
|
-
* *
|
|
173
|
-
* case remove it.
|
|
172
|
+
* * Refine each result via Newton iteration. If it doesn't converge, remove it.
|
|
174
173
|
* @param curveA The other curve primitive. May also be a transition spiral.
|
|
175
174
|
* @param spiralB The transition spiral.
|
|
176
175
|
* @param index0 index of first entry in tail of `this._results` to refine.
|
|
177
|
-
* @param reversed
|
|
176
|
+
* @param reversed whether `spiralB` data is in `detailA` of each recorded pair, and `curveA` data in `detailB`.
|
|
178
177
|
*/
|
|
179
178
|
private refineSpiralResultsByNewton;
|
|
180
179
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurveCurveIntersectXY.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveIntersectXY.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CurveCurveIntersectXY.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveIntersectXY.ts"],"names":[],"mappings":"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"}
|
|
@@ -979,12 +979,11 @@ class CurveCurveIntersectXY extends GeometryHandler_1.RecurseToCurvesGeometryHan
|
|
|
979
979
|
}
|
|
980
980
|
/**
|
|
981
981
|
* Process tail of `this._results` for xy-intersections between the curve and spiral.
|
|
982
|
-
* *
|
|
983
|
-
* case remove it.
|
|
982
|
+
* * Refine each result via Newton iteration. If it doesn't converge, remove it.
|
|
984
983
|
* @param curveA The other curve primitive. May also be a transition spiral.
|
|
985
984
|
* @param spiralB The transition spiral.
|
|
986
985
|
* @param index0 index of first entry in tail of `this._results` to refine.
|
|
987
|
-
* @param reversed
|
|
986
|
+
* @param reversed whether `spiralB` data is in `detailA` of each recorded pair, and `curveA` data in `detailB`.
|
|
988
987
|
*/
|
|
989
988
|
refineSpiralResultsByNewton(curveA, spiralB, index0, reversed = false) {
|
|
990
989
|
if (index0 >= this._results.length)
|
|
@@ -994,25 +993,16 @@ class CurveCurveIntersectXY extends GeometryHandler_1.RecurseToCurvesGeometryHan
|
|
|
994
993
|
const maxIterations = 100; // observed 73 iterations to convergence in tangent case
|
|
995
994
|
const newtonSearcher = new Newton_1.Newton2dUnboundedWithDerivative(xyMatchingFunction, maxIterations);
|
|
996
995
|
const fractionTol = 2 * newtonSearcher.stepSizeTolerance; // relative cluster diameter for Newton convergence
|
|
997
|
-
const
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
if (a.detailA.point.isAlmostEqualXY(b.detailA.point, this._coincidentGeometryContext.tolerance))
|
|
1003
|
-
return 0;
|
|
1004
|
-
return a.detailA.fraction - b.detailA.fraction;
|
|
1005
|
-
};
|
|
1006
|
-
const myResults = new core_bentley_1.SortedArray(comparePairs, core_bentley_1.DuplicatePolicy.Retain);
|
|
1007
|
-
const pushToMyResults = (cpA, fA, cpB, fB) => {
|
|
1008
|
-
const detailA = CurveLocationDetail_1.CurveLocationDetail.createCurveFractionPoint(cpA, fA, cpA.fractionToPoint(fA));
|
|
1009
|
-
const detailB = CurveLocationDetail_1.CurveLocationDetail.createCurveFractionPoint(cpB, fB, cpB.fractionToPoint(fB));
|
|
996
|
+
const compare = CurveLocationDetail_1.CurveLocationDetailPair.comparePairsByFractions(fractionTol, this._coincidentGeometryContext.tolerance, true);
|
|
997
|
+
const myResults = new core_bentley_1.SortedArray(compare, core_bentley_1.DuplicatePolicy.Retain);
|
|
998
|
+
const pushToMyResults = (cpA, fA, pA, cpB, fB, pB) => {
|
|
999
|
+
const detailA = CurveLocationDetail_1.CurveLocationDetail.createCurveFractionPoint(cpA, fA, pA);
|
|
1000
|
+
const detailB = CurveLocationDetail_1.CurveLocationDetail.createCurveFractionPoint(cpB, fB, pB);
|
|
1010
1001
|
detailA.setIntervalRole(CurveLocationDetail_1.CurveIntervalRole.isolated);
|
|
1011
1002
|
detailB.setIntervalRole(CurveLocationDetail_1.CurveIntervalRole.isolated);
|
|
1012
|
-
|
|
1013
|
-
myResults.insert(new CurveLocationDetail_1.CurveLocationDetailPair(reversed ? detailB : detailA, reversed ? detailA : detailB), () => pushed = true);
|
|
1014
|
-
return pushed;
|
|
1003
|
+
myResults.insert(new CurveLocationDetail_1.CurveLocationDetailPair(reversed ? detailB : detailA, reversed ? detailA : detailB));
|
|
1015
1004
|
};
|
|
1005
|
+
const strictTolerance = this._coincidentGeometryContext.tolerance * 0.0001;
|
|
1016
1006
|
for (let i = index0; i < this._results.length; i++) {
|
|
1017
1007
|
const pair = this._results[i];
|
|
1018
1008
|
const detailA = reversed ? pair.detailB : pair.detailA;
|
|
@@ -1021,18 +1011,16 @@ class CurveCurveIntersectXY extends GeometryHandler_1.RecurseToCurvesGeometryHan
|
|
|
1021
1011
|
const extendA0 = reversed ? this._extendB0 : this._extendA0;
|
|
1022
1012
|
const extendA1 = reversed ? this._extendB1 : this._extendA1;
|
|
1023
1013
|
newtonSearcher.setUV(detailA.fraction, detailB.fraction); // use linestring fraction as spiral param; it generally yields a closer point than fractional length!
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
if (curveA.fractionToPoint(fractionA).isAlmostEqualXY(spiralB.fractionToPoint(fractionB), this._coincidentGeometryContext.tolerance))
|
|
1035
|
-
pushToMyResults(curveA, fractionA, spiralB, fractionB);
|
|
1014
|
+
let converged = newtonSearcher.runIterations();
|
|
1015
|
+
const fractionA = newtonSearcher.getU();
|
|
1016
|
+
const fractionB = newtonSearcher.getV();
|
|
1017
|
+
if (this.acceptFraction(extendA0, fractionA, extendA1) && this.acceptFraction(false, fractionB, false)) {
|
|
1018
|
+
const pointA = curveA.fractionToPoint(fractionA, CurveCurveIntersectXY._workPointA0);
|
|
1019
|
+
const pointB = spiralB.fractionToPoint(fractionB, CurveCurveIntersectXY._workPointB0);
|
|
1020
|
+
if (!converged) // Newton may have found close points even if it didn't converge parametrically
|
|
1021
|
+
converged = pointA.isAlmostEqualXY(pointB, strictTolerance); // we can afford to be choosy
|
|
1022
|
+
if (converged)
|
|
1023
|
+
pushToMyResults(curveA, fractionA, pointA, spiralB, fractionB, pointB);
|
|
1036
1024
|
}
|
|
1037
1025
|
}
|
|
1038
1026
|
this._results.splice(index0, this._results.length - index0, ...myResults.extractArray());
|
|
@@ -1077,7 +1065,7 @@ class CurveCurveIntersectXY extends GeometryHandler_1.RecurseToCurvesGeometryHan
|
|
|
1077
1065
|
*/
|
|
1078
1066
|
appendDiscreteIntersectionResults(curveA, extendA0, extendA1, lsB, reversed) {
|
|
1079
1067
|
const i0 = this._results.length;
|
|
1080
|
-
// handleLineString3d requires us to swap geometries
|
|
1068
|
+
// handleLineString3d requires us to swap geometries
|
|
1081
1069
|
const geomB = this._geometryB;
|
|
1082
1070
|
const extendB0 = this._extendB0;
|
|
1083
1071
|
const extendB1 = this._extendB1;
|