@itwin/core-geometry 4.10.0-dev.31 → 4.10.0-dev.33
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.js +2 -2
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.d.ts.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js +0 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.d.ts +5 -3
- package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +5 -4
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +7 -5
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +9 -7
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +21 -2
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +45 -10
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.d.ts +18 -15
- package/lib/cjs/curve/CurveExtendMode.d.ts.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js +18 -17
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +9 -5
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +9 -5
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.d.ts.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js +0 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js +0 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/OffsetOptions.d.ts.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js +4 -4
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/Path.d.ts +14 -0
- package/lib/cjs/curve/Path.d.ts.map +1 -1
- package/lib/cjs/curve/Path.js +27 -0
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.d.ts.map +1 -1
- package/lib/cjs/curve/PointString3d.js +0 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js +0 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +0 -2
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +0 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js +0 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +5 -4
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +0 -1
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js +2 -3
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js +0 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +1 -3
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js +0 -1
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/Range1dArray.js +2 -2
- package/lib/cjs/numerics/Range1dArray.js.map +1 -1
- package/lib/cjs/polyface/AuxData.d.ts.map +1 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +0 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts +2 -2
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js +0 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js +0 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +0 -1
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.d.ts.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js +0 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/esm/Geometry.js +2 -2
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.d.ts.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js +0 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts +5 -3
- package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js +5 -4
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +7 -5
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +9 -7
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +21 -2
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +45 -10
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.d.ts +18 -15
- package/lib/esm/curve/CurveExtendMode.d.ts.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js +18 -17
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +9 -5
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +9 -5
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.d.ts.map +1 -1
- package/lib/esm/curve/CurveProcessor.js +0 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/esm/curve/LineSegment3d.js +0 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/OffsetOptions.d.ts.map +1 -1
- package/lib/esm/curve/OffsetOptions.js +4 -4
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/Path.d.ts +14 -0
- package/lib/esm/curve/Path.d.ts.map +1 -1
- package/lib/esm/curve/Path.js +27 -0
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.d.ts.map +1 -1
- package/lib/esm/curve/PointString3d.js +0 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/esm/curve/StrokeOptions.js +0 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +0 -2
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +0 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js +0 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +5 -4
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +0 -1
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js +0 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js +0 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +1 -3
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js +0 -1
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/polyface/AuxData.d.ts.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js +0 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts +2 -2
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js +0 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js +0 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +0 -1
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.d.ts.map +1 -1
- package/lib/esm/serialization/DeepCompare.js +0 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurveCurveIntersectXYZ.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveIntersectXYZ.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { BSplineCurve3d, BSplineCurve3dBase } from \"../../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../../bspline/BSplineCurve3dH\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Vector2d } from \"../../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { TrigPolynomial } from \"../../numerics/Polynomials\";\r\nimport { SmallSystem } from \"../../numerics/SmallSystem\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveChainWithDistanceIndex } from \"../CurveChainWithDistanceIndex\";\r\nimport { CurveCollection } from \"../CurveCollection\";\r\nimport { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { AnyCurve } from \"../CurveTypes\";\r\nimport { GeometryQuery } from \"../GeometryQuery\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\n\r\n// cspell:word XYRR\r\n\r\n/**\r\n * Handler class for XYZ intersections between _geometryB and another geometry.\r\n * * Instances are initialized and called from CurveCurve.\r\n * * geometryB is saved for later reference.\r\n * @internal\r\n */\r\nexport class CurveCurveIntersectXYZ extends RecurseToCurvesGeometryHandler {\r\n private _extendA0: boolean;\r\n private _extendA1: boolean;\r\n private _geometryB: AnyCurve;\r\n private _extendB0: boolean;\r\n private _extendB1: boolean;\r\n private _results: CurveLocationDetailPair[];\r\n private static _workVector2dA = Vector2d.create();\r\n private static _workPointAA0 = Point3d.create();\r\n private static _workPointAA1 = Point3d.create();\r\n private static _workPointBB0 = Point3d.create();\r\n private static _workPointBB1 = Point3d.create();\r\n /**\r\n * @param extendA flag to enable using extension of the other geometry.\r\n * @param geometryB second curve for intersection. Saved for reference by specific handler methods.\r\n * @param extendB flag for extension of geometryB.\r\n */\r\n public constructor(extendA: boolean, geometryB: AnyCurve, extendB: boolean) {\r\n super();\r\n this._extendA0 = extendA;\r\n this._extendA1 = extendA;\r\n this._geometryB = geometryB;\r\n this._extendB0 = extendB;\r\n this._extendB1 = extendB;\r\n this._results = [];\r\n }\r\n /** Reset the geometry, leaving all other parts unchanged (and preserving accumulated intersections). */\r\n public resetGeometry(geometryB: AnyCurve): void {\r\n this._geometryB = geometryB;\r\n }\r\n /**\r\n * Return the results structure for the intersection calculation, structured as an array of CurveLocationDetailPair.\r\n * @param reinitialize if true, a new results structure is created for use by later calls.\r\n */\r\n public grabPairedResults(reinitialize: boolean = false): CurveLocationDetailPair[] {\r\n const result = this._results;\r\n if (reinitialize)\r\n this._results = [];\r\n return result;\r\n }\r\n /** Accept the fraction if it falls inside (possibly extended) fraction range. */\r\n private acceptFraction(extend0: boolean, fraction: number, extend1: boolean, fractionTol: number = 1.0e-12): boolean {\r\n // Note that default tol is tighter than Geometry.smallFraction. We aggressively toss intersections past endpoints.\r\n if (!extend0 && fraction < -fractionTol)\r\n return false;\r\n if (!extend1 && fraction > 1.0 + fractionTol)\r\n return false;\r\n return true;\r\n }\r\n /**\r\n * Compute intersection of two line segments.\r\n * Filter by extension rules.\r\n * Reject if evaluated points do not match coordinates (e.g. close approach point).\r\n * Record with fraction mapping.\r\n */\r\n private recordPointWithLocalFractions(\r\n localFractionA: number,\r\n cpA: CurvePrimitive,\r\n fractionA0: number,\r\n fractionA1: number,\r\n localFractionB: number,\r\n cpB: CurvePrimitive,\r\n fractionB0: number,\r\n fractionB1: number,\r\n reversed: boolean,\r\n ): void {\r\n const globalFractionA = Geometry.interpolate(fractionA0, localFractionA, fractionA1);\r\n const globalFractionB = Geometry.interpolate(fractionB0, localFractionB, fractionB1);\r\n // ignore duplicate of most recent point\r\n const numPrevious = this._results.length;\r\n if (numPrevious > 0) {\r\n const oldDetailA = this._results[numPrevious - 1].detailA;\r\n const oldDetailB = this._results[numPrevious - 1].detailB;\r\n if (reversed) {\r\n if (oldDetailB.isSameCurveAndFraction({ curve: cpA, fraction: globalFractionA }) &&\r\n oldDetailA.isSameCurveAndFraction({ curve: cpB, fraction: globalFractionB }))\r\n return;\r\n } else {\r\n if (oldDetailA.isSameCurveAndFraction({ curve: cpA, fraction: globalFractionA }) &&\r\n oldDetailB.isSameCurveAndFraction({ curve: cpB, fraction: globalFractionB }))\r\n return;\r\n }\r\n }\r\n const pointA = cpA.fractionToPoint(globalFractionA);\r\n const pointB = cpB.fractionToPoint(globalFractionB);\r\n if (!pointA.isAlmostEqualMetric(pointB))\r\n return;\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(cpA, globalFractionA, pointA);\r\n detailA.setIntervalRole(CurveIntervalRole.isolated);\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(cpB, globalFractionB, pointB);\r\n detailB.setIntervalRole(CurveIntervalRole.isolated);\r\n if (reversed) {\r\n const pair = new CurveLocationDetailPair(detailB, detailA);\r\n this._results.push(pair);\r\n } else {\r\n const pair = new CurveLocationDetailPair(detailA, detailB);\r\n this._results.push(pair);\r\n }\r\n }\r\n /**\r\n * Compute intersection of two line segments.\r\n * Filter by extension rules.\r\n * Record with fraction mapping.\r\n */\r\n private computeSegmentSegment3D(\r\n cpA: CurvePrimitive,\r\n extendA0: boolean,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n extendA1: boolean,\r\n cpB: CurvePrimitive,\r\n extendB0: boolean,\r\n pointB0: Point3d,\r\n fractionB0: number,\r\n pointB1: Point3d,\r\n fractionB1: number,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): void {\r\n const uv = CurveCurveIntersectXYZ._workVector2dA;\r\n if (SmallSystem.lineSegment3dClosestApproachUnbounded(pointA0, pointA1, pointB0, pointB1, uv) &&\r\n this.acceptFraction(extendA0, uv.x, extendA1) && this.acceptFraction(extendB0, uv.y, extendB1)) {\r\n this.recordPointWithLocalFractions(uv.x, cpA, fractionA0, fractionA1, uv.y, cpB, fractionB0, fractionB1, reversed);\r\n }\r\n }\r\n // Caller accesses data from a line segment and passes to here.\r\n // The line segment in question might be (a) a full line segment or (b) a fragment within a linestring.\r\n // The fraction and extend parameters allow all combinations to be passed in.\r\n // This method applies transform.\r\n private dispatchSegmentSegment(\r\n cpA: CurvePrimitive,\r\n extendA0: boolean,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n extendA1: boolean,\r\n cpB: CurvePrimitive,\r\n extendB0: boolean,\r\n pointB0: Point3d,\r\n fractionB0: number,\r\n pointB1: Point3d,\r\n fractionB1: number,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): void {\r\n this.computeSegmentSegment3D(\r\n cpA, extendA0, pointA0, fractionA0, pointA1, fractionA1, extendA1,\r\n cpB, extendB0, pointB0, fractionB0, pointB1, fractionB1, extendB1,\r\n reversed,\r\n );\r\n }\r\n /**\r\n * Create a plane whose normal is the \"better\" cross product: `vectorA.crossProduct(vectorB)` or\r\n * `vectorA.crossProduct(vectorC)`\r\n * * The heuristic for \"better\" is:\r\n * * first choice is cross product with `vectorB`, if `vectorA` and `vectorB` are sufficiently far from parallel\r\n * (or anti-parallel).\r\n * * otherwise use vectorC\r\n * @param origin plane origin\r\n * @param vectorA vector which must be in the plane.\r\n * @param cosineValue largest cosine of the angle theta between vectorA and vectorB to prefer their cross product, e.g.\r\n * passing 0.94 ~ cos(20deg) will switch to using vectorC in the cross product if theta < ~20deg or theta > ~160deg.\r\n * @param vectorB first candidate for additional in-plane vector\r\n * @param vectorC second candidate for additional in-plane vector\r\n */\r\n public createPlaneWithPreferredPerpendicular(\r\n origin: Point3d, vectorA: Vector3d, cosineValue: number, vectorB: Vector3d, vectorC: Vector3d,\r\n ): Plane3dByOriginAndUnitNormal | undefined {\r\n cosineValue = Geometry.restrictToInterval(Math.abs(cosineValue), 0.0, 1.0 - Geometry.smallFraction);\r\n const dotAA = vectorA.magnitudeSquared();\r\n const dotBB = vectorB.magnitudeSquared();\r\n const dotAB = Math.abs(vectorA.dotProduct(vectorB));\r\n const cross = vectorA.unitCrossProduct(\r\n dotAB * dotAB <= cosineValue * cosineValue * dotAA * dotBB ? vectorB : vectorC,\r\n );\r\n if (cross)\r\n return Plane3dByOriginAndUnitNormal.create(origin, cross);\r\n return undefined;\r\n }\r\n // Caller accesses data from a linestring or segment and passes it here.\r\n // The line in question might be (a) a full line segment or (b) a fragment within a linestring.\r\n // The fraction and extend parameters allow all combinations to be passed in.\r\n private dispatchSegmentArc(\r\n cpA: CurvePrimitive,\r\n extendA0: boolean,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n extendA1: boolean,\r\n arc: Arc3d,\r\n extendB0: boolean,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): void {\r\n const lineVector = Vector3d.createStartEnd(pointA0, pointA1);\r\n const cosValue = 0.94; // cosine of 20 degrees\r\n const plane = this.createPlaneWithPreferredPerpendicular(\r\n pointA0, lineVector, cosValue, arc.perpendicularVector, arc.vector0,\r\n );\r\n if (plane !== undefined) {\r\n const candidates: CurveLocationDetail[] = [];\r\n arc.appendPlaneIntersectionPoints(plane, candidates);\r\n let lineFraction;\r\n let linePoint: Point3d | undefined;\r\n for (const c of candidates) {\r\n const arcFraction = arc.sweep.fractionToSignedPeriodicFraction(c.fraction, extendB0);\r\n if (this.acceptFraction(extendB0, arcFraction, extendB1)) {\r\n lineFraction = SmallSystem.lineSegment3dClosestPointUnbounded(pointA0, pointA1, c.point);\r\n if (lineFraction !== undefined) {\r\n linePoint = pointA0.interpolate(lineFraction, pointA1, linePoint);\r\n if (linePoint.isAlmostEqualMetric(c.point) && this.acceptFraction(extendA0, lineFraction, extendA1)) {\r\n this.recordPointWithLocalFractions(\r\n lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // Caller promises arcs are coplanar.\r\n // Passes \"other\" as {center, vector0, vector90} in local xy space of cpA\r\n // Solves the arc-arc equations for that local ellipse with unit circle.\r\n // Solution fractions map directly to original arcs.\r\n private dispatchArcArcInPlane(\r\n cpA: Arc3d, extendA0: boolean, extendA1: boolean, cpB: Arc3d, extendB0: boolean, extendB1: boolean, reversed: boolean,\r\n ): void {\r\n const otherVectors = cpA.otherArcAsLocalVectors(cpB);\r\n if (otherVectors !== undefined) {\r\n const ellipseRadians: number[] = [];\r\n const circleRadians: number[] = [];\r\n TrigPolynomial.solveUnitCircleHomogeneousEllipseIntersection(\r\n otherVectors.center.x, otherVectors.center.y, 1.0,\r\n otherVectors.vector0.x, otherVectors.vector0.y, 0.0,\r\n otherVectors.vector90.x, otherVectors.vector90.y, 0.0,\r\n ellipseRadians, circleRadians,\r\n );\r\n for (let i = 0; i < ellipseRadians.length; i++) {\r\n const fractionA = cpA.sweep.radiansToSignedFraction(circleRadians[i], extendA0);\r\n const fractionB = cpB.sweep.radiansToSignedFraction(ellipseRadians[i], extendB0);\r\n // hm .. do we really need to check the fractions? We know they are internal to the beziers\r\n if (this.acceptFraction(extendA0, fractionA, extendA1) && this.acceptFraction(extendB0, fractionB, extendB1)) {\r\n this.recordPointWithLocalFractions(fractionA, cpA, 0, 1, fractionB, cpB, 0, 1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n // Caller accesses data from two arcs.\r\n // Selects the best conditioned arc (in xy parts) as \"circle after inversion\".\r\n // Solves the arc-arc equations.\r\n private dispatchArcArc(\r\n cpA: Arc3d, extendA0: boolean, extendA1: boolean, cpB: Arc3d, extendB0: boolean, extendB1: boolean, reversed: boolean,\r\n ): void {\r\n // If arcs are in different planes:\r\n // 1) Intersect each plane with the other arc (quadratic)\r\n // 2) accept points that appear in both intersection sets.\r\n // If arcs are in parallel planes -- no intersections.\r\n // If arcs are in the same plane -- xy intersection in that plane.\r\n const planeA = Plane3dByOriginAndUnitNormal.create(cpA.center, cpA.perpendicularVector);\r\n const planeB = Plane3dByOriginAndUnitNormal.create(cpB.center, cpB.perpendicularVector);\r\n if (planeA === undefined || planeB === undefined)\r\n return;\r\n if (planeA.getNormalRef().isParallelTo(planeB.getNormalRef())) {\r\n if (planeA.isPointInPlane(planeB.getOriginRef()) && planeB.isPointInPlane(planeA.getOriginRef()))\r\n this.dispatchArcArcInPlane(cpA, extendA0, extendA1, cpB, extendB0, extendB1, reversed);\r\n } else {\r\n const arcBPoints: CurveLocationDetail[] = [];\r\n cpB.appendPlaneIntersectionPoints(planeA, arcBPoints);\r\n const arcAPoints: CurveLocationDetail[] = [];\r\n cpA.appendPlaneIntersectionPoints(planeB, arcAPoints);\r\n for (const detailB of arcBPoints) {\r\n for (const detailA of arcAPoints) {\r\n if (detailA.point.isAlmostEqual(detailB.point)) {\r\n const arcFractionA = cpA.sweep.fractionToSignedPeriodicFraction(detailA.fraction, extendA0);\r\n const arcFractionB = cpB.sweep.fractionToSignedPeriodicFraction(detailB.fraction, extendB0);\r\n if (this.acceptFraction(extendA0, arcFractionA, extendA1)\r\n && this.acceptFraction(extendB0, arcFractionB, extendB1)) {\r\n this.recordPointWithLocalFractions(arcFractionA, cpA, 0, 1, arcFractionB, cpB, 0, 1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // Caller accesses data from two arcs.\r\n // Selects the best conditioned arc (in xy parts) as \"circle after inversion\".\r\n // Solves the arc-arc equations.\r\n private dispatchArcBsplineCurve3d(\r\n _arc: Arc3d,\r\n _extendA0: boolean,\r\n _extendA1: boolean,\r\n _cpB: BSplineCurve3d,\r\n _extendB0: boolean,\r\n _extendB1: boolean,\r\n _reversed: boolean,\r\n ): void {\r\n // TODO: B-spline XYZ intersection implementation\r\n /*\r\n // Arc: X = C + cU + sV\r\n // implicitize the arc as viewed. This \"3d\" matrix is homogeneous \"XYW\" not \"xyz\"\r\n let matrixA: Matrix3d;\r\n if (this._worldToLocalPerspective) {\r\n const dataA = cpA.toTransformedPoint4d(this._worldToLocalPerspective);\r\n matrixA = Matrix3d.createColumnsXYW(\r\n dataA.vector0, dataA.vector0.w, dataA.vector90, dataA.vector90.w, dataA.center, dataA.center.w,\r\n );\r\n } else {\r\n const dataA = cpA.toTransformedVectors(this._worldToLocalAffine);\r\n matrixA = Matrix3d.createColumnsXYW(dataA.vector0, 0, dataA.vector90, 0, dataA.center, 1);\r\n }\r\n // The worldToLocal has moved the arc vectors into local space.\r\n // matrixA captures the xyw parts (ignoring z)\r\n // for any point in world space,\r\n // THIS CODE ONLY WORKS FOR\r\n const matrixAInverse = matrixA.inverse();\r\n if (matrixAInverse) {\r\n const orderF = cpB.order; // order of the beziers for simple coordinates\r\n const orderG = 2 * orderF - 1; // order of the (single) bezier for squared coordinates.\r\n const coffF = new Float64Array(orderF);\r\n const univariateBezierG = new UnivariateBezier(orderG);\r\n const axx = matrixAInverse.at(0, 0);\r\n const axy = matrixAInverse.at(0, 1);\r\n const axz = 0.0;\r\n const axw = matrixAInverse.at(0, 2);\r\n const ayx = matrixAInverse.at(1, 0);\r\n const ayy = matrixAInverse.at(1, 1);\r\n const ayz = 0.0;\r\n const ayw = matrixAInverse.at(1, 2);\r\n const awx = matrixAInverse.at(2, 0);\r\n const awy = matrixAInverse.at(2, 1);\r\n const awz = 0.0;\r\n const aww = matrixAInverse.at(2, 2);\r\n\r\n if (matrixAInverse) {\r\n let bezier: BezierCurve3dH | undefined;\r\n for (let spanIndex = 0; ; spanIndex++) {\r\n bezier = cpB.getSaturatedBezierSpan3dH(spanIndex, bezier);\r\n if (!bezier) break;\r\n if (this._worldToLocalPerspective)\r\n bezier.tryMultiplyMatrix4dInPlace(this._worldToLocalPerspective);\r\n else if (this._worldToLocalAffine)\r\n bezier.tryTransformInPlace(this._worldToLocalAffine);\r\n univariateBezierG.zero();\r\n bezier.poleProductsXYZW(coffF, axx, axy, axz, axw);\r\n univariateBezierG.addSquaredSquaredBezier(coffF, 1.0);\r\n bezier.poleProductsXYZW(coffF, ayx, ayy, ayz, ayw);\r\n univariateBezierG.addSquaredSquaredBezier(coffF, 1.0);\r\n bezier.poleProductsXYZW(coffF, awx, awy, awz, aww);\r\n univariateBezierG.addSquaredSquaredBezier(coffF, -1.0);\r\n const roots = univariateBezierG.roots(0.0, true);\r\n if (roots) {\r\n for (const root of roots) {\r\n const fractionB = bezier.fractionToParentFraction(root);\r\n // The univariate bezier (which has been transformed by the view transform) evaluates into xyw space\r\n const bcurvePoint4d = bezier.fractionToPoint4d(root);\r\n const c = bcurvePoint4d.dotProductXYZW(axx, axy, axz, axw);\r\n const s = bcurvePoint4d.dotProductXYZW(ayx, ayy, ayz, ayw);\r\n const arcFraction = cpA.sweep.radiansToSignedFraction(Math.atan2(s, c), _extendA0);\r\n if (this.acceptFraction(_extendA0, arcFraction, _extendA1) &&\r\n this.acceptFraction(_extendB0, fractionB, _extendB1)) {\r\n this.recordPointWithLocalFractions(\r\n arcFraction, cpA, 0, 1, fractionB, cpB, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n */\r\n }\r\n // TODO: Bezier XYZ intersection implementation\r\n /*\r\n // Apply the transformation to bezier curves. Optionally construct ranges.\r\n private transformBeziers(beziers: BezierCurve3dH[]): void {\r\n if (this._worldToLocalAffine) {\r\n for (const bezier of beziers) bezier.tryTransformInPlace(this._worldToLocalAffine);\r\n } else if (this._worldToLocalPerspective) {\r\n for (const bezier of beziers) bezier.tryMultiplyMatrix4dInPlace(this._worldToLocalPerspective);\r\n }\r\n }\r\n */\r\n /*\r\n private getRanges(beziers: BezierCurveBase[]): Range3d[] {\r\n const ranges: Range3d[] = [];\r\n ranges.length = 0;\r\n for (const b of beziers) {\r\n ranges.push(b.range());\r\n }\r\n return ranges;\r\n }\r\n private dispatchBezierBezierStrokeFirst(\r\n bezierA: BezierCurve3dH,\r\n bcurveA: BSplineCurve3dBase,\r\n strokeCountA: number,\r\n bezierB: BezierCurve3dH,\r\n bcurveB: BSplineCurve3dBase,\r\n _strokeCountB: number,\r\n univariateBezierB: UnivariateBezier, // caller-allocated for univariate coefficients.\r\n reversed: boolean,\r\n ) {\r\n if (!this._xyzwA0)\r\n this._xyzwA0 = Point4d.create();\r\n if (!this._xyzwA1)\r\n this._xyzwA1 = Point4d.create();\r\n if (!this._xyzwPlane)\r\n this._xyzwPlane = Point4d.create();\r\n if (!this._xyzwB)\r\n this._xyzwB = Point4d.create();\r\n const roots = univariateBezierG.roots(0.0, true);\r\n if (roots) {\r\n for (const root of roots) {\r\n const fractionB = bezier.fractionToParentFraction(root);\r\n // The univariate bezier (which has been transformed by the view transform) evaluates into xyw space\r\n const bcurvePoint4d = bezier.fractionToPoint4d(root);\r\n const c = bcurvePoint4d.dotProductXYZW(axx, axy, axz, axw);\r\n const s = bcurvePoint4d.dotProductXYZW(ayx, ayy, ayz, ayw);\r\n const arcFraction = cpA.sweep.radiansToSignedFraction(Math.atan2(s, c), extendA0);\r\n if (this.acceptFraction(extendA0, arcFraction, extendA1) && this.acceptFraction(extendB0, fractionB, extendB1)) {\r\n this.recordPointWithLocalFractions(\r\n arcFraction, cpA, 0, 1, fractionB, cpB, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n bezierA.fractionToPoint4d(0.0, this._xyzwA0);\r\n let f0 = 0.0;\r\n let f1 = 1.0;\r\n const intervalTolerance = 1.0e-5;\r\n const df = 1.0 / strokeCountA;\r\n for (let i = 1; i <= strokeCountA; i++ , f0 = f1, this._xyzwA0.setFrom(this._xyzwA1)) {\r\n f1 = i * df;\r\n bezierA.fractionToPoint4d(f1, this._xyzwA1);\r\n Point4d.createPlanePointPointZ(this._xyzwA0, this._xyzwA1, this._xyzwPlane);\r\n bezierB.poleProductsXYZW(\r\n univariateBezierB.coffs, this._xyzwPlane.x, this._xyzwPlane.y, this._xyzwPlane.z, this._xyzwPlane.w,\r\n );\r\n let errors = 0;\r\n const roots = univariateBezierB.roots(0.0, true);\r\n if (roots)\r\n for (const r of roots) {\r\n const bezierBFraction = r;\r\n bezierB.fractionToPoint4d(bezierBFraction, this._xyzwB);\r\n const segmentAFraction = SmallSystem.lineSegment3dHXYClosestPointUnbounded(this._xyzwA0, this._xyzwA1, this._xyzwB);\r\n if (segmentAFraction && Geometry.isIn01WithTolerance(segmentAFraction, intervalTolerance)) {\r\n const bezierAFraction = Geometry.interpolate(f0, segmentAFraction, f1);\r\n // TODO implement newton search\r\n const xyMatchingFunction = new BezierBezierIntersectionXYRRToRRD(bezierA, bezierB);\r\n const newtonSearcher = new Newton2dUnboundedWithDerivative(xyMatchingFunction);\r\n newtonSearcher.setUV(bezierAFraction, bezierBFraction);\r\n if (newtonSearcher.runIterations()) {\r\n bezierAFraction = newtonSearcher.getU();\r\n bezierBFraction = newtonSearcher.getV();\r\n }\r\n // We have a near intersection at fractions on the two beziers !!!\r\n // Iterate on the curves for a true intersection ....\r\n // NEEDS WORK -- just accept . . .\r\n const bcurveAFraction = bezierA.fractionToParentFraction(bezierAFraction);\r\n const bcurveBFraction = bezierB.fractionToParentFraction(bezierBFraction);\r\n const xyzA0 = bezierA.fractionToPoint(bezierAFraction);\r\n const xyzA1 = bcurveA.fractionToPoint(bcurveAFraction);\r\n const xyzB0 = bezierB.fractionToPoint(bezierBFraction);\r\n const xyzB1 = bcurveB.fractionToPoint(bcurveBFraction);\r\n if (!xyzA0.isAlmostEqualXY(xyzA1))\r\n errors++;\r\n if (!xyzB0.isAlmostEqualXY(xyzB1))\r\n errors++;\r\n if (errors > 0 && !xyzA0.isAlmostEqual(xyzB0))\r\n errors++;\r\n if (errors > 0 && !xyzA1.isAlmostEqual(xyzB1))\r\n errors++;\r\n if (this.acceptFraction(false, bcurveAFraction, false) &&\r\n this.acceptFraction(false, bcurveBFraction, false)) {\r\n this.recordPointWithLocalFractions(\r\n bcurveAFraction, bcurveA, 0, 1, bcurveBFraction, bcurveB, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n */\r\n // Caller accesses data from two arcs.\r\n // Selects the best conditioned arc (in xy parts) as \"circle after inversion\".\r\n // Solves the arc-arc equations.\r\n private dispatchBSplineCurve3dBSplineCurve3d(\r\n _bcurveA: BSplineCurve3dBase, _bcurveB: BSplineCurve3dBase, _reversed: boolean,\r\n ): void {\r\n // TODO: B-spline XYZ intersection implementation\r\n /*\r\n const bezierSpanA = bcurveA.collectBezierSpans(true) as BezierCurve3dH[];\r\n const bezierSpanB = bcurveB.collectBezierSpans(true) as BezierCurve3dH[];\r\n const numA = bezierSpanA.length;\r\n const numB = bezierSpanB.length;\r\n this.transformBeziers(bezierSpanA);\r\n this.transformBeziers(bezierSpanB);\r\n const rangeA = this.getRanges(bezierSpanA);\r\n const rangeB = this.getRanges(bezierSpanB);\r\n const orderA = bcurveA.order;\r\n const orderB = bcurveB.order;\r\n const univariateCoffsA = new UnivariateBezier(orderA);\r\n const univariateCoffsB = new UnivariateBezier(orderB);\r\n for (let a = 0; a < numA; a++) {\r\n for (let b = 0; b < numB; b++) {\r\n if (rangeA[a].intersectsRangeXY(rangeB[b])) {\r\n const strokeCountA = bezierSpanA[a].computeStrokeCountForOptions();\r\n const strokeCountB = bezierSpanB[b].computeStrokeCountForOptions();\r\n if (strokeCountA < strokeCountB)\r\n this.dispatchBezierBezierStrokeFirst(\r\n bezierSpanA[a], bcurveA, strokeCountA, bezierSpanB[b], bcurveB, strokeCountB, univariateCoffsB, _reversed,\r\n );\r\n else\r\n this.dispatchBezierBezierStrokeFirst(\r\n bezierSpanB[b], bcurveB, strokeCountB, bezierSpanA[a], bcurveA, strokeCountA, univariateCoffsA, !_reversed,\r\n );\r\n }\r\n }\r\n }\r\n */\r\n }\r\n /*\r\n /**\r\n * Apply the projection transform (if any) to (xyz, w).\r\n * @param xyz xyz parts of input point.\r\n * @param w weight to use for homogeneous effects.\r\n */\r\n /*\r\n private projectPoint(xyz: XYAndZ, w: number = 1.0): Point4d {\r\n if (this._worldToLocalPerspective)\r\n return this._worldToLocalPerspective.multiplyPoint3d(xyz, w);\r\n if (this._worldToLocalAffine)\r\n return this._worldToLocalAffine.multiplyXYZW(xyz.x, xyz.y, xyz.z, w);\r\n return Point4d.createFromPointAndWeight(xyz, w);\r\n }\r\n private mapNPCPlaneToWorld(npcPlane: Point4d, worldPlane: Point4d) {\r\n // for NPC pointY, Y^ * H = 0 is \"on\" plane H. (Hat is transpose)\r\n // NPC Y is A*X for our transform A and worldPointX.\r\n // hence (A X)^ * H = 0\r\n // hence X^ * A^ * H = 0\r\n // hence K = A^ * H\r\n if (this._worldToLocalAffine) {\r\n this._worldToLocalAffine.multiplyTransposeXYZW(npcPlane.x, npcPlane.y, npcPlane.z, npcPlane.w, worldPlane);\r\n } else if (this._worldToLocalPerspective) {\r\n this._worldToLocalPerspective.multiplyTransposePoint4d(npcPlane, worldPlane);\r\n } else {\r\n npcPlane.clone(worldPlane);\r\n }\r\n }\r\n */\r\n // Caller accesses data from segment and bsplineCurve\r\n // Selects the best conditioned arc (in xy parts) as \"circle after inversion\"\r\n // Solves the arc-arc equations\r\n private dispatchSegmentBsplineCurve(\r\n _cpA: CurvePrimitive,\r\n _extendA0: boolean,\r\n _pointA0: Point3d,\r\n _fractionA0: number,\r\n _pointA1: Point3d,\r\n _fractionA1: number,\r\n _extendA1: boolean,\r\n _bcurve: BSplineCurve3d,\r\n _extendB0: boolean,\r\n _extendB1: boolean,\r\n _reversed: boolean,\r\n ): void {\r\n // TODO: B-spline XYZ intersection implementation\r\n /*\r\n const pointA0H = this.projectPoint(pointA0);\r\n const pointA1H = this.projectPoint(pointA1);\r\n const planeCoffs = Point4d.createPlanePointPointZ(pointA0H, pointA1H);\r\n this.mapNPCPlaneToWorld(planeCoffs, planeCoffs);\r\n // NOW .. we have a plane in world space. Intersect it with the bspline:\r\n const intersections: CurveLocationDetail[] = [];\r\n bcurve.appendPlaneIntersectionPoints(planeCoffs, intersections);\r\n // intersections has WORLD points with bspline fractions.\r\n // (the bspline fractions are all good 0..1 fractions within the spline).\r\n // accept those that are within the segment range.\r\n for (const detail of intersections) {\r\n const fractionB = detail.fraction;\r\n const curvePoint = detail.point;\r\n const curvePointH = this.projectPoint(curvePoint);\r\n const lineFraction = SmallSystem.lineSegment3dHXYClosestPointUnbounded(pointA0H, pointA1H, curvePointH);\r\n if (lineFraction !== undefined && this.acceptFraction(_extendA0, lineFraction, _extendA1) &&\r\n this.acceptFraction(_extendB0, fractionB, _extendB1)) {\r\n this.recordPointWithLocalFractions(\r\n lineFraction, cpA, fractionA0, fractionA1, fractionB, bcurve, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n */\r\n }\r\n /** Low level dispatch of linestring with (beziers of) a bspline curve */\r\n public dispatchLineStringBSplineCurve(\r\n _lsA: LineString3d,\r\n _extendA0: boolean,\r\n _extendA1: boolean,\r\n _curveB: BSplineCurve3d,\r\n _extendB0: boolean,\r\n _extendB1: boolean,\r\n _reversed: boolean,\r\n ): any {\r\n // TODO: B-spline XYZ intersection implementation\r\n /*\r\n const numA = lsA.numPoints();\r\n if (numA > 1) {\r\n const dfA = 1.0 / (numA - 1);\r\n let fA0;\r\n let fA1;\r\n fA0 = 0.0;\r\n const pointA0 = CurveCurveIntersectXYZ._workPointA0;\r\n const pointA1 = CurveCurveIntersectXYZ._workPointA1;\r\n lsA.pointAt(0, pointA0);\r\n for (let iA = 1; iA < numA; iA++, pointA0.setFrom(pointA1), fA0 = fA1) {\r\n lsA.pointAt(iA, pointA1);\r\n fA1 = iA * dfA;\r\n this.dispatchSegmentBsplineCurve(\r\n lsA, iA === 1 && _extendA0, pointA0, fA0, pointA1, fA1, (iA + 1) === numA && _extendA1,\r\n curveB, _extendB0, _extendB1 reversed);\r\n }\r\n }\r\n return undefined;\r\n */\r\n }\r\n /** Detail computation for segment intersecting linestring. */\r\n public computeSegmentLineString(\r\n lsA: LineSegment3d,\r\n extendA0: boolean,\r\n extendA1: boolean,\r\n lsB: LineString3d,\r\n extendB0: boolean,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): any {\r\n const pointA0 = lsA.point0Ref;\r\n const pointA1 = lsA.point1Ref;\r\n const pointB0 = CurveCurveIntersectXYZ._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXYZ._workPointBB1;\r\n const numB = lsB.numPoints();\r\n if (numB > 1) {\r\n const dfB = 1.0 / (numB - 1);\r\n let fB0;\r\n let fB1;\r\n fB0 = 0.0;\r\n lsB.pointAt(0, pointB0);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\r\n lsB.pointAt(ib, pointB1);\r\n fB1 = ib * dfB;\r\n this.dispatchSegmentSegment(\r\n lsA, extendA0, pointA0, 0.0, pointA1, 1.0, extendA1,\r\n lsB, ib === 1 && extendB0, pointB0, fB0, pointB1, fB1, (ib + 1) === numB && extendB1,\r\n reversed,\r\n );\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Detail computation for arc intersecting linestring. */\r\n public computeArcLineString(\r\n arcA: Arc3d,\r\n extendA0: boolean,\r\n extendA1: boolean,\r\n lsB: LineString3d,\r\n extendB0: boolean,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): any {\r\n const pointB0 = CurveCurveIntersectXYZ._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXYZ._workPointBB1;\r\n const numB = lsB.numPoints();\r\n if (numB > 1) {\r\n const dfB = 1.0 / (numB - 1);\r\n let fB0;\r\n let fB1;\r\n fB0 = 0.0;\r\n lsB.pointAt(0, pointB0);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\r\n lsB.pointAt(ib, pointB1);\r\n fB1 = ib * dfB;\r\n this.dispatchSegmentArc(\r\n lsB, ib === 1 && extendB0, pointB0, fB0, pointB1, fB1,\r\n (ib + 1) === numB && extendB1, arcA, extendA0, extendA1, !reversed,\r\n );\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Detail computation for linestring intersecting linestring. */\r\n private computeLineStringLineString(lsA: LineString3d, lsB: LineString3d, reversed: boolean): void {\r\n const pointA0 = CurveCurveIntersectXYZ._workPointAA0;\r\n const pointA1 = CurveCurveIntersectXYZ._workPointAA1;\r\n const pointB0 = CurveCurveIntersectXYZ._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXYZ._workPointBB1;\r\n const numA = lsA.numPoints();\r\n const numB = lsB.numPoints();\r\n if (numA > 1 && numB > 1) {\r\n lsA.pointAt(0, pointA0);\r\n const dfA = 1.0 / (numA - 1);\r\n const dfB = 1.0 / (numB - 1);\r\n let fA0 = 0.0;\r\n let fB0;\r\n let fA1;\r\n let fB1;\r\n lsA.pointAt(0, pointA0);\r\n for (let ia = 1; ia < numA; ia++, pointA0.setFrom(pointA1), fA0 = fA1) {\r\n fA1 = ia * dfA;\r\n fB0 = 0.0;\r\n lsA.pointAt(ia, pointA1);\r\n lsB.pointAt(0, pointB0);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\r\n lsB.pointAt(ib, pointB1);\r\n fB1 = ib * dfB;\r\n this.dispatchSegmentSegment(\r\n lsA, ia === 1 && this._extendA0, pointA0, fA0, pointA1, fA1, (ia + 1) === numA && this._extendA1,\r\n lsB, ib === 1 && this._extendB0, pointB0, fB0, pointB1, fB1, (ib + 1) === numB && this._extendB1,\r\n reversed,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Low level dispatch of curve collection.\r\n * We take care of extend variables of geometry's children here if geometry is Path or Loop.\r\n */\r\n private dispatchCurveCollection(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\r\n const geomB = this._geometryB; // save\r\n if (!geomB || !geomB.children || !(geomB instanceof CurveCollection))\r\n return;\r\n const children = geomB.children;\r\n const extendB0 = this._extendB0; // save\r\n const extendB1 = this._extendB1; // save\r\n for (let i = 0; i < children.length; i++) {\r\n this.resetGeometry(children[i]);\r\n if (geomB instanceof Path && children.length > 1) {\r\n if (i === 0)\r\n this._extendB1 = false; // first child can only extend from start\r\n else if (i === children.length - 1)\r\n this._extendB0 = false; // last child can only extend from end\r\n else\r\n this._extendB0 = this._extendB1 = false; // middle children cannot extend\r\n } else if (geomB instanceof Loop) {\r\n this._extendB0 = this._extendB1 = false; // Loops cannot extend\r\n }\r\n geomAHandler(geomA);\r\n this._extendB0 = extendB0; // restore\r\n this._extendB1 = extendB1; // restore\r\n }\r\n this.resetGeometry(geomB); // restore\r\n }\r\n /**\r\n * Low level dispatch of CurveChainWithDistanceIndex.\r\n * We take care of extend variables of geometry's children here if geometry.path is Path or Loop.\r\n */\r\n private dispatchCurveChainWithDistanceIndex(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\r\n if (!this._geometryB || !(this._geometryB instanceof CurveChainWithDistanceIndex))\r\n return;\r\n if (geomA instanceof CurveChainWithDistanceIndex) {\r\n assert(false, \"call handleCurveChainWithDistanceIndex(geomA) instead\");\r\n return;\r\n }\r\n const index0 = this._results.length;\r\n const geomB = this._geometryB; // save\r\n this.resetGeometry(geomB.path);\r\n this.dispatchCurveCollection(geomA, geomAHandler);\r\n this.resetGeometry(geomB); // restore\r\n this._results = CurveChainWithDistanceIndex.convertChildDetailToChainDetail(\r\n this._results, index0, undefined, geomB, true,\r\n );\r\n }\r\n /**\r\n * Invoke `child.dispatchToGeometryHandler(this)` for each child in the array returned by the query `g.children`.\r\n * We take care of extend variables of geometry's children here if geometry is Path or Loop.\r\n */\r\n public override handleChildren(g: GeometryQuery): any {\r\n const children = g.children;\r\n const extendA0 = this._extendA0; // save\r\n const extendA1 = this._extendA1; // save\r\n if (children)\r\n for (let i = 0; i < children.length; i++) {\r\n if (g instanceof Path && children.length > 1) {\r\n if (i === 0)\r\n this._extendA1 = false; // first child can only extend from start\r\n else if (i === children.length - 1)\r\n this._extendA0 = false; // last child can only extend from end\r\n else\r\n this._extendA0 = this._extendA1 = false; // middle children cannot extend\r\n } else if (g instanceof Loop) {\r\n this._extendA0 = this._extendA1 = false; // Loops cannot extend\r\n }\r\n children[i].dispatchToGeometryHandler(this);\r\n this._extendA0 = extendA0; // restore\r\n this._extendA1 = extendA1; // restore\r\n }\r\n }\r\n /** Double dispatch handler for strongly typed segment. */\r\n public override handleLineSegment3d(segmentA: LineSegment3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n const segmentB = this._geometryB;\r\n this.dispatchSegmentSegment(\r\n segmentA, this._extendA0, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA1,\r\n segmentB, this._extendB0, segmentB.point0Ref, 0.0, segmentB.point1Ref, 1.0, this._extendB1,\r\n false,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeSegmentLineString(\r\n segmentA, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchSegmentArc(\r\n segmentA, this._extendA0, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA1,\r\n this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n segmentA, this._extendA0, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA1,\r\n this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(segmentA, this.handleLineSegment3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(segmentA, this.handleLineSegment3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** double dispatch handler for strongly typed linestring. */\r\n public override handleLineString3d(lsA: LineString3d): any {\r\n if (this._geometryB instanceof LineString3d) {\r\n const lsB = this._geometryB;\r\n this.computeLineStringLineString(lsA, lsB, false);\r\n } else if (this._geometryB instanceof LineSegment3d) {\r\n this.computeSegmentLineString(\r\n this._geometryB, this._extendB0, this._extendB1, lsA, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.computeArcLineString(\r\n this._geometryB, this._extendB0, this._extendB1, lsA, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchLineStringBSplineCurve(\r\n lsA, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(lsA, this.handleLineString3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(lsA, this.handleLineString3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed arc. */\r\n public override handleArc3d(arc0: Arc3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentArc(\r\n this._geometryB, this._extendB0, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB1,\r\n arc0, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeArcLineString(\r\n arc0, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcArc(\r\n arc0, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchArcBsplineCurve3d(\r\n arc0, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(arc0, this.handleArc3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(arc0, this.handleArc3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed bspline curve. */\r\n public override handleBSplineCurve3d(curve: BSplineCurve3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n this._geometryB, this._extendB0, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB1,\r\n curve, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(\r\n this._geometryB, this._extendB0, this._extendB1, curve, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(\r\n this._geometryB, this._extendB0, this._extendB1, curve, this._extendA0, this._extendA1, true,\r\n\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3dBase) {\r\n this.dispatchBSplineCurve3dBSplineCurve3d(curve, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(curve, this.handleBSplineCurve3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(curve, this.handleBSplineCurve3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed CurveChainWithDistanceIndex. */\r\n public override handleCurveChainWithDistanceIndex(chain: CurveChainWithDistanceIndex): any {\r\n super.handleCurveChainWithDistanceIndex(chain);\r\n // if _geometryB is also a CurveChainWithDistanceIndex, it will already have been converted by dispatchCurveChainWithDistanceIndex\r\n this._results = CurveChainWithDistanceIndex.convertChildDetailToChainDetail(this._results, 0, chain, undefined, true);\r\n }\r\n /** Double dispatch handler for strongly typed homogeneous bspline curve. */\r\n public override handleBSplineCurve3dH(_curve: BSplineCurve3dH): any {\r\n /*\r\n // NEEDS WORK -- make \"dispatch\" methods tolerant of both 3d and 3dH\r\n // \"easy\" if both present BezierCurve3dH span loaders\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n this._geometryB, this._extendB0, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB1,\r\n curve, this._extendA0, this.extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(\r\n this._geometryB, this._extendB0, this._extendB1, curve, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(\r\n this._geometryB, this._extendB0, this._extendB1, curve, this._extendA0, this._extendA1, true,\r\n );\r\n }\r\n */\r\n return undefined;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"CurveCurveIntersectXYZ.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveIntersectXYZ.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAIzG,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,mBAAmB;AAEnB;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,8BAA8B;IAYxE;;;;OAIG;IACH,YAAmB,OAAgB,EAAE,SAAmB,EAAE,OAAgB;QACxE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,wGAAwG;IACjG,aAAa,CAAC,SAAmB;QACtC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IACD;;;OAGG;IACI,iBAAiB,CAAC,eAAwB,KAAK;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7B,IAAI,YAAY;YACd,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,iFAAiF;IACzE,cAAc,CAAC,OAAgB,EAAE,QAAgB,EAAE,OAAgB,EAAE,cAAsB,OAAO;QACxG,mHAAmH;QACnH,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,WAAW;YACrC,OAAO,KAAK,CAAC;QACf,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,GAAG,GAAG,WAAW;YAC1C,OAAO,KAAK,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;OAKG;IACK,6BAA6B,CACnC,cAAsB,EACtB,GAAmB,EACnB,UAAkB,EAClB,UAAkB,EAClB,cAAsB,EACtB,GAAmB,EACnB,UAAkB,EAClB,UAAkB,EAClB,QAAiB;QAEjB,MAAM,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QACrF,wCAAwC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,UAAU,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;oBAC9E,UAAU,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;oBAC5E,OAAO;YACX,CAAC;iBAAM,CAAC;gBACN,IAAI,UAAU,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;oBAC9E,UAAU,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;oBAC5E,OAAO;YACX,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC;YACrC,OAAO;QACT,MAAM,OAAO,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QAC3F,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QAC3F,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,IAAI,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD;;;;OAIG;IACK,uBAAuB,CAC7B,GAAmB,EACnB,QAAiB,EACjB,OAAgB,EAChB,UAAkB,EAClB,OAAgB,EAChB,UAAkB,EAClB,QAAiB,EACjB,GAAmB,EACnB,QAAiB,EACjB,OAAgB,EAChB,UAAkB,EAClB,OAAgB,EAChB,UAAkB,EAClB,QAAiB,EACjB,QAAiB;QAEjB,MAAM,EAAE,GAAG,sBAAsB,CAAC,cAAc,CAAC;QACjD,IAAI,WAAW,CAAC,qCAAqC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;YAC3F,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjG,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;IACD,+DAA+D;IAC/D,uGAAuG;IACvG,6EAA6E;IAC7E,iCAAiC;IACzB,sBAAsB,CAC5B,GAAmB,EACnB,QAAiB,EACjB,OAAgB,EAChB,UAAkB,EAClB,OAAgB,EAChB,UAAkB,EAClB,QAAiB,EACjB,GAAmB,EACnB,QAAiB,EACjB,OAAgB,EAChB,UAAkB,EAClB,OAAgB,EAChB,UAAkB,EAClB,QAAiB,EACjB,QAAiB;QAEjB,IAAI,CAAC,uBAAuB,CAC1B,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EACjE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EACjE,QAAQ,CACT,CAAC;IACJ,CAAC;IACD;;;;;;;;;;;;;OAaG;IACI,qCAAqC,CAC1C,MAAe,EAAE,OAAiB,EAAE,WAAmB,EAAE,OAAiB,EAAE,OAAiB;QAE7F,WAAW,GAAG,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QACpG,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CACpC,KAAK,GAAG,KAAK,IAAI,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAC/E,CAAC;QACF,IAAI,KAAK;YACP,OAAO,4BAA4B,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,wEAAwE;IACxE,+FAA+F;IAC/F,6EAA6E;IACrE,kBAAkB,CACxB,GAAmB,EACnB,QAAiB,EACjB,OAAgB,EAChB,UAAkB,EAClB,OAAgB,EAChB,UAAkB,EAClB,QAAiB,EACjB,GAAU,EACV,QAAiB,EACjB,QAAiB,EACjB,QAAiB;QAEjB,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,uBAAuB;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,qCAAqC,CACtD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,OAAO,CACpE,CAAC;QACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,UAAU,GAA0B,EAAE,CAAC;YAC7C,GAAG,CAAC,6BAA6B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,YAAY,CAAC;YACjB,IAAI,SAA8B,CAAC;YACnC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACrF,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;oBACzD,YAAY,GAAG,WAAW,CAAC,kCAAkC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;oBACzF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;wBAC/B,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;wBAClE,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;4BACpG,IAAI,CAAC,6BAA6B,CAChC,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAC5E,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,qCAAqC;IACrC,yEAAyE;IACzE,wEAAwE;IACxE,oDAAoD;IAC5C,qBAAqB,CAC3B,GAAU,EAAE,QAAiB,EAAE,QAAiB,EAAE,GAAU,EAAE,QAAiB,EAAE,QAAiB,EAAE,QAAiB;QAErH,MAAM,YAAY,GAAG,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACrD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAa,EAAE,CAAC;YACpC,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,cAAc,CAAC,6CAA6C,CAC1D,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EACjD,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EACnD,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,EACrD,cAAc,EAAE,aAAa,CAC9B,CAAC;YACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAChF,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACjF,4FAA4F;gBAC5F,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAC7G,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC3F,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,sCAAsC;IACtC,8EAA8E;IAC9E,gCAAgC;IACxB,cAAc,CACpB,GAAU,EAAE,QAAiB,EAAE,QAAiB,EAAE,GAAU,EAAE,QAAiB,EAAE,QAAiB,EAAE,QAAiB;QAErH,mCAAmC;QACnC,yDAAyD;QACzD,0DAA0D;QAC1D,sDAAsD;QACtD,kEAAkE;QAClE,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACxF,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAC9C,OAAO;QACT,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;YAC9D,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC9F,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAA0B,EAAE,CAAC;YAC7C,GAAG,CAAC,6BAA6B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,UAAU,GAA0B,EAAE,CAAC;YAC7C,GAAG,CAAC,6BAA6B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACtD,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;gBACjC,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;oBACjC,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;wBAC5F,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;wBAC5F,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;+BACpD,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;4BAC3D,IAAI,CAAC,6BAA6B,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;wBACjG,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,sCAAsC;IACtC,8EAA8E;IAC9E,gCAAgC;IACxB,yBAAyB,CAC/B,IAAW,EACX,SAAkB,EAClB,SAAkB,EAClB,IAAoB,EACpB,SAAkB,EAClB,SAAkB,EAClB,SAAkB;QAElB,iDAAiD;QACjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAwEE;IACJ,CAAC;IACD,+CAA+C;IAC/C;;;;;;;;;MASE;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAkGE;IACF,sCAAsC;IACtC,8EAA8E;IAC9E,gCAAgC;IACxB,oCAAoC,CAC1C,QAA4B,EAAE,QAA4B,EAAE,SAAkB;QAE9E,iDAAiD;QACjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA6BE;IACJ,CAAC;IACD;;;;;OAKG;IACH;;;;;;;;;;;;;;;;;;;;;;MAsBE;IACF,qDAAqD;IACrD,6EAA6E;IAC7E,+BAA+B;IACvB,2BAA2B,CACjC,IAAoB,EACpB,SAAkB,EAClB,QAAiB,EACjB,WAAmB,EACnB,QAAiB,EACjB,WAAmB,EACnB,SAAkB,EAClB,OAAuB,EACvB,SAAkB,EAClB,SAAkB,EAClB,SAAkB;QAElB,iDAAiD;QACjD;;;;;;;;;;;;;;;;;;;;;;;UAuBE;IACJ,CAAC;IACD,yEAAyE;IAClE,8BAA8B,CACnC,IAAkB,EAClB,SAAkB,EAClB,SAAkB,EAClB,OAAuB,EACvB,SAAkB,EAClB,SAAkB,EAClB,SAAkB;QAElB,iDAAiD;QACjD;;;;;;;;;;;;;;;;;;;UAmBE;IACJ,CAAC;IACD,8DAA8D;IACvD,wBAAwB,CAC7B,GAAkB,EAClB,QAAiB,EACjB,QAAiB,EACjB,GAAiB,EACjB,QAAiB,EACjB,QAAiB,EACjB,QAAiB;QAEjB,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;QAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;QAC9B,MAAM,OAAO,GAAG,sBAAsB,CAAC,aAAa,CAAC;QACrD,MAAM,OAAO,GAAG,sBAAsB,CAAC,aAAa,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,GAAG,CAAC;YACR,IAAI,GAAG,CAAC;YACR,GAAG,GAAG,GAAG,CAAC;YACV,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,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACzB,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;gBACf,IAAI,CAAC,sBAAsB,CACzB,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EACnD,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,QAAQ,EACpF,QAAQ,CACT,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,0DAA0D;IACnD,oBAAoB,CACzB,IAAW,EACX,QAAiB,EACjB,QAAiB,EACjB,GAAiB,EACjB,QAAiB,EACjB,QAAiB,EACjB,QAAiB;QAEjB,MAAM,OAAO,GAAG,sBAAsB,CAAC,aAAa,CAAC;QACrD,MAAM,OAAO,GAAG,sBAAsB,CAAC,aAAa,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,GAAG,CAAC;YACR,IAAI,GAAG,CAAC;YACR,GAAG,GAAG,GAAG,CAAC;YACV,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,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACzB,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;gBACf,IAAI,CAAC,kBAAkB,CACrB,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EACrD,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,CACnE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,iEAAiE;IACzD,2BAA2B,CAAC,GAAiB,EAAE,GAAiB,EAAE,QAAiB;QACzF,MAAM,OAAO,GAAG,sBAAsB,CAAC,aAAa,CAAC;QACrD,MAAM,OAAO,GAAG,sBAAsB,CAAC,aAAa,CAAC;QACrD,MAAM,OAAO,GAAG,sBAAsB,CAAC,aAAa,CAAC;QACrD,MAAM,OAAO,GAAG,sBAAsB,CAAC,aAAa,CAAC;QACrD,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,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACxB,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,CAAC;YACR,IAAI,GAAG,CAAC;YACR,IAAI,GAAG,CAAC;YACR,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,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACxB,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;oBACtE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;oBACzB,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;oBACf,IAAI,CAAC,sBAAsB,CACzB,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,EAChG,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,EAChG,QAAQ,CACT,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;OAGG;IACK,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,eAAe,CAAC;YAClE,OAAO;QACT,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,KAAK,YAAY,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,KAAK,CAAC;oBACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,yCAAyC;qBAC9D,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC;oBAChC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,sCAAsC;;oBAE9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,gCAAgC;YAC7E,CAAC;iBAAM,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,sBAAsB;YACjE,CAAC;YACD,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,UAAU;YACrC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,UAAU;QACvC,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;IACvC,CAAC;IACD;;;OAGG;IACK,mCAAmC,CAAC,KAAe,EAAE,YAAiC;QAC5F,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,YAAY,2BAA2B,CAAC;YAC/E,OAAO;QACT,IAAI,KAAK,YAAY,2BAA2B,EAAE,CAAC;YACjD,MAAM,CAAC,KAAK,EAAE,uDAAuD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO;QACtC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;QACrC,IAAI,CAAC,QAAQ,GAAG,2BAA2B,CAAC,+BAA+B,CACzE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAC9C,CAAC;IACJ,CAAC;IACD;;;KAGC;IACe,cAAc,CAAC,CAAgB;QAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO;QACxC,IAAI,QAAQ;YACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,YAAY,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC,KAAK,CAAC;wBACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,yCAAyC;yBAC9D,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC;wBAChC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,sCAAsC;;wBAE9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,gCAAgC;gBAC7E,CAAC;qBAAM,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;oBAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,sBAAsB;gBACjE,CAAC;gBACD,QAAQ,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,UAAU;gBACrC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,UAAU;YACvC,CAAC;IACL,CAAC;IACD,0DAA0D;IAC1C,mBAAmB,CAAC,QAAuB;QACzD,IAAI,IAAI,CAAC,UAAU,YAAY,aAAa,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,IAAI,CAAC,sBAAsB,CACzB,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAC1F,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAC1F,KAAK,CACN,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,YAAY,EAAE,CAAC;YACnD,IAAI,CAAC,wBAAwB,CAC3B,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CACjG,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,KAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,kBAAkB,CACrB,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAC1F,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CACvD,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,cAAc,EAAE,CAAC;YACrD,IAAI,CAAC,2BAA2B,CAC9B,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAC1F,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CACvD,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,eAAe,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,2BAA2B,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,YAAY,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;YAC5B,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,aAAa,EAAE,CAAC;YACpD,IAAI,CAAC,wBAAwB,CAC3B,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAC3F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,KAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,oBAAoB,CACvB,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAC3F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,cAAc,EAAE,CAAC;YACrD,IAAI,CAAC,8BAA8B,CACjC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAC5F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,eAAe,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,2BAA2B,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,aAAa,EAAE,CAAC;YAC7C,IAAI,CAAC,kBAAkB,CACrB,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAC/G,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAC3C,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,YAAY,EAAE,CAAC;YACnD,IAAI,CAAC,oBAAoB,CACvB,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAC7F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,KAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,cAAc,CACjB,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAC7F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,cAAc,EAAE,CAAC;YACrD,IAAI,CAAC,yBAAyB,CAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAC7F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,eAAe,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,2BAA2B,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,KAAqB;QACxD,IAAI,IAAI,CAAC,UAAU,YAAY,aAAa,EAAE,CAAC;YAC7C,IAAI,CAAC,2BAA2B,CAC9B,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAC/G,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAC5C,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,YAAY,EAAE,CAAC;YACnD,IAAI,CAAC,8BAA8B,CACjC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAC7F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,KAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAE7F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,kBAAkB,EAAE,CAAC;YACzD,IAAI,CAAC,oCAAoC,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,eAAe,EAAE,CAAC;YACtD,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,YAAY,2BAA2B,EAAE,CAAC;YAClE,IAAI,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxF,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,IAAI,CAAC,QAAQ,GAAG,2BAA2B,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACxH,CAAC;IACD,4EAA4E;IAC5D,qBAAqB,CAAC,MAAuB;QAC3D;;;;;;;;;;;;;;;;;UAiBE;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;;AAz5Bc,qCAAc,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;AACnC,oCAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AACjC,oCAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AACjC,oCAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AACjC,oCAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { BSplineCurve3d, BSplineCurve3dBase } from \"../../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../../bspline/BSplineCurve3dH\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Vector2d } from \"../../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { TrigPolynomial } from \"../../numerics/Polynomials\";\r\nimport { SmallSystem } from \"../../numerics/SmallSystem\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveChainWithDistanceIndex } from \"../CurveChainWithDistanceIndex\";\r\nimport { CurveCollection } from \"../CurveCollection\";\r\nimport { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { AnyCurve } from \"../CurveTypes\";\r\nimport { GeometryQuery } from \"../GeometryQuery\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\n\r\n// cspell:word XYRR\r\n\r\n/**\r\n * Handler class for XYZ intersections between _geometryB and another geometry.\r\n * * Instances are initialized and called from CurveCurve.\r\n * * geometryB is saved for later reference.\r\n * @internal\r\n */\r\nexport class CurveCurveIntersectXYZ extends RecurseToCurvesGeometryHandler {\r\n private _extendA0: boolean;\r\n private _extendA1: boolean;\r\n private _geometryB: AnyCurve;\r\n private _extendB0: boolean;\r\n private _extendB1: boolean;\r\n private _results: CurveLocationDetailPair[];\r\n private static _workVector2dA = Vector2d.create();\r\n private static _workPointAA0 = Point3d.create();\r\n private static _workPointAA1 = Point3d.create();\r\n private static _workPointBB0 = Point3d.create();\r\n private static _workPointBB1 = Point3d.create();\r\n /**\r\n * @param extendA flag to enable using extension of the other geometry.\r\n * @param geometryB second curve for intersection. Saved for reference by specific handler methods.\r\n * @param extendB flag for extension of geometryB.\r\n */\r\n public constructor(extendA: boolean, geometryB: AnyCurve, extendB: boolean) {\r\n super();\r\n this._extendA0 = extendA;\r\n this._extendA1 = extendA;\r\n this._geometryB = geometryB;\r\n this._extendB0 = extendB;\r\n this._extendB1 = extendB;\r\n this._results = [];\r\n }\r\n /** Reset the geometry, leaving all other parts unchanged (and preserving accumulated intersections). */\r\n public resetGeometry(geometryB: AnyCurve): void {\r\n this._geometryB = geometryB;\r\n }\r\n /**\r\n * Return the results structure for the intersection calculation, structured as an array of CurveLocationDetailPair.\r\n * @param reinitialize if true, a new results structure is created for use by later calls.\r\n */\r\n public grabPairedResults(reinitialize: boolean = false): CurveLocationDetailPair[] {\r\n const result = this._results;\r\n if (reinitialize)\r\n this._results = [];\r\n return result;\r\n }\r\n /** Accept the fraction if it falls inside (possibly extended) fraction range. */\r\n private acceptFraction(extend0: boolean, fraction: number, extend1: boolean, fractionTol: number = 1.0e-12): boolean {\r\n // Note that default tol is tighter than Geometry.smallFraction. We aggressively toss intersections past endpoints.\r\n if (!extend0 && fraction < -fractionTol)\r\n return false;\r\n if (!extend1 && fraction > 1.0 + fractionTol)\r\n return false;\r\n return true;\r\n }\r\n /**\r\n * Compute intersection of two line segments.\r\n * Filter by extension rules.\r\n * Reject if evaluated points do not match coordinates (e.g. close approach point).\r\n * Record with fraction mapping.\r\n */\r\n private recordPointWithLocalFractions(\r\n localFractionA: number,\r\n cpA: CurvePrimitive,\r\n fractionA0: number,\r\n fractionA1: number,\r\n localFractionB: number,\r\n cpB: CurvePrimitive,\r\n fractionB0: number,\r\n fractionB1: number,\r\n reversed: boolean,\r\n ): void {\r\n const globalFractionA = Geometry.interpolate(fractionA0, localFractionA, fractionA1);\r\n const globalFractionB = Geometry.interpolate(fractionB0, localFractionB, fractionB1);\r\n // ignore duplicate of most recent point\r\n const numPrevious = this._results.length;\r\n if (numPrevious > 0) {\r\n const oldDetailA = this._results[numPrevious - 1].detailA;\r\n const oldDetailB = this._results[numPrevious - 1].detailB;\r\n if (reversed) {\r\n if (oldDetailB.isSameCurveAndFraction({ curve: cpA, fraction: globalFractionA }) &&\r\n oldDetailA.isSameCurveAndFraction({ curve: cpB, fraction: globalFractionB }))\r\n return;\r\n } else {\r\n if (oldDetailA.isSameCurveAndFraction({ curve: cpA, fraction: globalFractionA }) &&\r\n oldDetailB.isSameCurveAndFraction({ curve: cpB, fraction: globalFractionB }))\r\n return;\r\n }\r\n }\r\n const pointA = cpA.fractionToPoint(globalFractionA);\r\n const pointB = cpB.fractionToPoint(globalFractionB);\r\n if (!pointA.isAlmostEqualMetric(pointB))\r\n return;\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(cpA, globalFractionA, pointA);\r\n detailA.setIntervalRole(CurveIntervalRole.isolated);\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(cpB, globalFractionB, pointB);\r\n detailB.setIntervalRole(CurveIntervalRole.isolated);\r\n if (reversed) {\r\n const pair = new CurveLocationDetailPair(detailB, detailA);\r\n this._results.push(pair);\r\n } else {\r\n const pair = new CurveLocationDetailPair(detailA, detailB);\r\n this._results.push(pair);\r\n }\r\n }\r\n /**\r\n * Compute intersection of two line segments.\r\n * Filter by extension rules.\r\n * Record with fraction mapping.\r\n */\r\n private computeSegmentSegment3D(\r\n cpA: CurvePrimitive,\r\n extendA0: boolean,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n extendA1: boolean,\r\n cpB: CurvePrimitive,\r\n extendB0: boolean,\r\n pointB0: Point3d,\r\n fractionB0: number,\r\n pointB1: Point3d,\r\n fractionB1: number,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): void {\r\n const uv = CurveCurveIntersectXYZ._workVector2dA;\r\n if (SmallSystem.lineSegment3dClosestApproachUnbounded(pointA0, pointA1, pointB0, pointB1, uv) &&\r\n this.acceptFraction(extendA0, uv.x, extendA1) && this.acceptFraction(extendB0, uv.y, extendB1)) {\r\n this.recordPointWithLocalFractions(uv.x, cpA, fractionA0, fractionA1, uv.y, cpB, fractionB0, fractionB1, reversed);\r\n }\r\n }\r\n // Caller accesses data from a line segment and passes to here.\r\n // The line segment in question might be (a) a full line segment or (b) a fragment within a linestring.\r\n // The fraction and extend parameters allow all combinations to be passed in.\r\n // This method applies transform.\r\n private dispatchSegmentSegment(\r\n cpA: CurvePrimitive,\r\n extendA0: boolean,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n extendA1: boolean,\r\n cpB: CurvePrimitive,\r\n extendB0: boolean,\r\n pointB0: Point3d,\r\n fractionB0: number,\r\n pointB1: Point3d,\r\n fractionB1: number,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): void {\r\n this.computeSegmentSegment3D(\r\n cpA, extendA0, pointA0, fractionA0, pointA1, fractionA1, extendA1,\r\n cpB, extendB0, pointB0, fractionB0, pointB1, fractionB1, extendB1,\r\n reversed,\r\n );\r\n }\r\n /**\r\n * Create a plane whose normal is the \"better\" cross product: `vectorA.crossProduct(vectorB)` or\r\n * `vectorA.crossProduct(vectorC)`\r\n * * The heuristic for \"better\" is:\r\n * * first choice is cross product with `vectorB`, if `vectorA` and `vectorB` are sufficiently far from parallel\r\n * (or anti-parallel).\r\n * * otherwise use vectorC\r\n * @param origin plane origin\r\n * @param vectorA vector which must be in the plane.\r\n * @param cosineValue largest cosine of the angle theta between vectorA and vectorB to prefer their cross product, e.g.\r\n * passing 0.94 ~ cos(20deg) will switch to using vectorC in the cross product if theta < ~20deg or theta > ~160deg.\r\n * @param vectorB first candidate for additional in-plane vector\r\n * @param vectorC second candidate for additional in-plane vector\r\n */\r\n public createPlaneWithPreferredPerpendicular(\r\n origin: Point3d, vectorA: Vector3d, cosineValue: number, vectorB: Vector3d, vectorC: Vector3d,\r\n ): Plane3dByOriginAndUnitNormal | undefined {\r\n cosineValue = Geometry.restrictToInterval(Math.abs(cosineValue), 0.0, 1.0 - Geometry.smallFraction);\r\n const dotAA = vectorA.magnitudeSquared();\r\n const dotBB = vectorB.magnitudeSquared();\r\n const dotAB = Math.abs(vectorA.dotProduct(vectorB));\r\n const cross = vectorA.unitCrossProduct(\r\n dotAB * dotAB <= cosineValue * cosineValue * dotAA * dotBB ? vectorB : vectorC,\r\n );\r\n if (cross)\r\n return Plane3dByOriginAndUnitNormal.create(origin, cross);\r\n return undefined;\r\n }\r\n // Caller accesses data from a linestring or segment and passes it here.\r\n // The line in question might be (a) a full line segment or (b) a fragment within a linestring.\r\n // The fraction and extend parameters allow all combinations to be passed in.\r\n private dispatchSegmentArc(\r\n cpA: CurvePrimitive,\r\n extendA0: boolean,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n extendA1: boolean,\r\n arc: Arc3d,\r\n extendB0: boolean,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): void {\r\n const lineVector = Vector3d.createStartEnd(pointA0, pointA1);\r\n const cosValue = 0.94; // cosine of 20 degrees\r\n const plane = this.createPlaneWithPreferredPerpendicular(\r\n pointA0, lineVector, cosValue, arc.perpendicularVector, arc.vector0,\r\n );\r\n if (plane !== undefined) {\r\n const candidates: CurveLocationDetail[] = [];\r\n arc.appendPlaneIntersectionPoints(plane, candidates);\r\n let lineFraction;\r\n let linePoint: Point3d | undefined;\r\n for (const c of candidates) {\r\n const arcFraction = arc.sweep.fractionToSignedPeriodicFraction(c.fraction, extendB0);\r\n if (this.acceptFraction(extendB0, arcFraction, extendB1)) {\r\n lineFraction = SmallSystem.lineSegment3dClosestPointUnbounded(pointA0, pointA1, c.point);\r\n if (lineFraction !== undefined) {\r\n linePoint = pointA0.interpolate(lineFraction, pointA1, linePoint);\r\n if (linePoint.isAlmostEqualMetric(c.point) && this.acceptFraction(extendA0, lineFraction, extendA1)) {\r\n this.recordPointWithLocalFractions(\r\n lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // Caller promises arcs are coplanar.\r\n // Passes \"other\" as {center, vector0, vector90} in local xy space of cpA\r\n // Solves the arc-arc equations for that local ellipse with unit circle.\r\n // Solution fractions map directly to original arcs.\r\n private dispatchArcArcInPlane(\r\n cpA: Arc3d, extendA0: boolean, extendA1: boolean, cpB: Arc3d, extendB0: boolean, extendB1: boolean, reversed: boolean,\r\n ): void {\r\n const otherVectors = cpA.otherArcAsLocalVectors(cpB);\r\n if (otherVectors !== undefined) {\r\n const ellipseRadians: number[] = [];\r\n const circleRadians: number[] = [];\r\n TrigPolynomial.solveUnitCircleHomogeneousEllipseIntersection(\r\n otherVectors.center.x, otherVectors.center.y, 1.0,\r\n otherVectors.vector0.x, otherVectors.vector0.y, 0.0,\r\n otherVectors.vector90.x, otherVectors.vector90.y, 0.0,\r\n ellipseRadians, circleRadians,\r\n );\r\n for (let i = 0; i < ellipseRadians.length; i++) {\r\n const fractionA = cpA.sweep.radiansToSignedFraction(circleRadians[i], extendA0);\r\n const fractionB = cpB.sweep.radiansToSignedFraction(ellipseRadians[i], extendB0);\r\n // hm .. do we really need to check the fractions? We know they are internal to the beziers\r\n if (this.acceptFraction(extendA0, fractionA, extendA1) && this.acceptFraction(extendB0, fractionB, extendB1)) {\r\n this.recordPointWithLocalFractions(fractionA, cpA, 0, 1, fractionB, cpB, 0, 1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n // Caller accesses data from two arcs.\r\n // Selects the best conditioned arc (in xy parts) as \"circle after inversion\".\r\n // Solves the arc-arc equations.\r\n private dispatchArcArc(\r\n cpA: Arc3d, extendA0: boolean, extendA1: boolean, cpB: Arc3d, extendB0: boolean, extendB1: boolean, reversed: boolean,\r\n ): void {\r\n // If arcs are in different planes:\r\n // 1) Intersect each plane with the other arc (quadratic)\r\n // 2) accept points that appear in both intersection sets.\r\n // If arcs are in parallel planes -- no intersections.\r\n // If arcs are in the same plane -- xy intersection in that plane.\r\n const planeA = Plane3dByOriginAndUnitNormal.create(cpA.center, cpA.perpendicularVector);\r\n const planeB = Plane3dByOriginAndUnitNormal.create(cpB.center, cpB.perpendicularVector);\r\n if (planeA === undefined || planeB === undefined)\r\n return;\r\n if (planeA.getNormalRef().isParallelTo(planeB.getNormalRef())) {\r\n if (planeA.isPointInPlane(planeB.getOriginRef()) && planeB.isPointInPlane(planeA.getOriginRef()))\r\n this.dispatchArcArcInPlane(cpA, extendA0, extendA1, cpB, extendB0, extendB1, reversed);\r\n } else {\r\n const arcBPoints: CurveLocationDetail[] = [];\r\n cpB.appendPlaneIntersectionPoints(planeA, arcBPoints);\r\n const arcAPoints: CurveLocationDetail[] = [];\r\n cpA.appendPlaneIntersectionPoints(planeB, arcAPoints);\r\n for (const detailB of arcBPoints) {\r\n for (const detailA of arcAPoints) {\r\n if (detailA.point.isAlmostEqual(detailB.point)) {\r\n const arcFractionA = cpA.sweep.fractionToSignedPeriodicFraction(detailA.fraction, extendA0);\r\n const arcFractionB = cpB.sweep.fractionToSignedPeriodicFraction(detailB.fraction, extendB0);\r\n if (this.acceptFraction(extendA0, arcFractionA, extendA1)\r\n && this.acceptFraction(extendB0, arcFractionB, extendB1)) {\r\n this.recordPointWithLocalFractions(arcFractionA, cpA, 0, 1, arcFractionB, cpB, 0, 1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // Caller accesses data from two arcs.\r\n // Selects the best conditioned arc (in xy parts) as \"circle after inversion\".\r\n // Solves the arc-arc equations.\r\n private dispatchArcBsplineCurve3d(\r\n _arc: Arc3d,\r\n _extendA0: boolean,\r\n _extendA1: boolean,\r\n _cpB: BSplineCurve3d,\r\n _extendB0: boolean,\r\n _extendB1: boolean,\r\n _reversed: boolean,\r\n ): void {\r\n // TODO: B-spline XYZ intersection implementation\r\n /*\r\n // Arc: X = C + cU + sV\r\n // implicitize the arc as viewed. This \"3d\" matrix is homogeneous \"XYW\" not \"xyz\"\r\n let matrixA: Matrix3d;\r\n if (this._worldToLocalPerspective) {\r\n const dataA = cpA.toTransformedPoint4d(this._worldToLocalPerspective);\r\n matrixA = Matrix3d.createColumnsXYW(\r\n dataA.vector0, dataA.vector0.w, dataA.vector90, dataA.vector90.w, dataA.center, dataA.center.w,\r\n );\r\n } else {\r\n const dataA = cpA.toTransformedVectors(this._worldToLocalAffine);\r\n matrixA = Matrix3d.createColumnsXYW(dataA.vector0, 0, dataA.vector90, 0, dataA.center, 1);\r\n }\r\n // The worldToLocal has moved the arc vectors into local space.\r\n // matrixA captures the xyw parts (ignoring z)\r\n // for any point in world space,\r\n // THIS CODE ONLY WORKS FOR\r\n const matrixAInverse = matrixA.inverse();\r\n if (matrixAInverse) {\r\n const orderF = cpB.order; // order of the beziers for simple coordinates\r\n const orderG = 2 * orderF - 1; // order of the (single) bezier for squared coordinates.\r\n const coffF = new Float64Array(orderF);\r\n const univariateBezierG = new UnivariateBezier(orderG);\r\n const axx = matrixAInverse.at(0, 0);\r\n const axy = matrixAInverse.at(0, 1);\r\n const axz = 0.0;\r\n const axw = matrixAInverse.at(0, 2);\r\n const ayx = matrixAInverse.at(1, 0);\r\n const ayy = matrixAInverse.at(1, 1);\r\n const ayz = 0.0;\r\n const ayw = matrixAInverse.at(1, 2);\r\n const awx = matrixAInverse.at(2, 0);\r\n const awy = matrixAInverse.at(2, 1);\r\n const awz = 0.0;\r\n const aww = matrixAInverse.at(2, 2);\r\n\r\n if (matrixAInverse) {\r\n let bezier: BezierCurve3dH | undefined;\r\n for (let spanIndex = 0; ; spanIndex++) {\r\n bezier = cpB.getSaturatedBezierSpan3dH(spanIndex, bezier);\r\n if (!bezier) break;\r\n if (this._worldToLocalPerspective)\r\n bezier.tryMultiplyMatrix4dInPlace(this._worldToLocalPerspective);\r\n else if (this._worldToLocalAffine)\r\n bezier.tryTransformInPlace(this._worldToLocalAffine);\r\n univariateBezierG.zero();\r\n bezier.poleProductsXYZW(coffF, axx, axy, axz, axw);\r\n univariateBezierG.addSquaredSquaredBezier(coffF, 1.0);\r\n bezier.poleProductsXYZW(coffF, ayx, ayy, ayz, ayw);\r\n univariateBezierG.addSquaredSquaredBezier(coffF, 1.0);\r\n bezier.poleProductsXYZW(coffF, awx, awy, awz, aww);\r\n univariateBezierG.addSquaredSquaredBezier(coffF, -1.0);\r\n const roots = univariateBezierG.roots(0.0, true);\r\n if (roots) {\r\n for (const root of roots) {\r\n const fractionB = bezier.fractionToParentFraction(root);\r\n // The univariate bezier (which has been transformed by the view transform) evaluates into xyw space\r\n const bcurvePoint4d = bezier.fractionToPoint4d(root);\r\n const c = bcurvePoint4d.dotProductXYZW(axx, axy, axz, axw);\r\n const s = bcurvePoint4d.dotProductXYZW(ayx, ayy, ayz, ayw);\r\n const arcFraction = cpA.sweep.radiansToSignedFraction(Math.atan2(s, c), _extendA0);\r\n if (this.acceptFraction(_extendA0, arcFraction, _extendA1) &&\r\n this.acceptFraction(_extendB0, fractionB, _extendB1)) {\r\n this.recordPointWithLocalFractions(\r\n arcFraction, cpA, 0, 1, fractionB, cpB, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n */\r\n }\r\n // TODO: Bezier XYZ intersection implementation\r\n /*\r\n // Apply the transformation to bezier curves. Optionally construct ranges.\r\n private transformBeziers(beziers: BezierCurve3dH[]): void {\r\n if (this._worldToLocalAffine) {\r\n for (const bezier of beziers) bezier.tryTransformInPlace(this._worldToLocalAffine);\r\n } else if (this._worldToLocalPerspective) {\r\n for (const bezier of beziers) bezier.tryMultiplyMatrix4dInPlace(this._worldToLocalPerspective);\r\n }\r\n }\r\n */\r\n /*\r\n private getRanges(beziers: BezierCurveBase[]): Range3d[] {\r\n const ranges: Range3d[] = [];\r\n ranges.length = 0;\r\n for (const b of beziers) {\r\n ranges.push(b.range());\r\n }\r\n return ranges;\r\n }\r\n private dispatchBezierBezierStrokeFirst(\r\n bezierA: BezierCurve3dH,\r\n bcurveA: BSplineCurve3dBase,\r\n strokeCountA: number,\r\n bezierB: BezierCurve3dH,\r\n bcurveB: BSplineCurve3dBase,\r\n _strokeCountB: number,\r\n univariateBezierB: UnivariateBezier, // caller-allocated for univariate coefficients.\r\n reversed: boolean,\r\n ) {\r\n if (!this._xyzwA0)\r\n this._xyzwA0 = Point4d.create();\r\n if (!this._xyzwA1)\r\n this._xyzwA1 = Point4d.create();\r\n if (!this._xyzwPlane)\r\n this._xyzwPlane = Point4d.create();\r\n if (!this._xyzwB)\r\n this._xyzwB = Point4d.create();\r\n const roots = univariateBezierG.roots(0.0, true);\r\n if (roots) {\r\n for (const root of roots) {\r\n const fractionB = bezier.fractionToParentFraction(root);\r\n // The univariate bezier (which has been transformed by the view transform) evaluates into xyw space\r\n const bcurvePoint4d = bezier.fractionToPoint4d(root);\r\n const c = bcurvePoint4d.dotProductXYZW(axx, axy, axz, axw);\r\n const s = bcurvePoint4d.dotProductXYZW(ayx, ayy, ayz, ayw);\r\n const arcFraction = cpA.sweep.radiansToSignedFraction(Math.atan2(s, c), extendA0);\r\n if (this.acceptFraction(extendA0, arcFraction, extendA1) && this.acceptFraction(extendB0, fractionB, extendB1)) {\r\n this.recordPointWithLocalFractions(\r\n arcFraction, cpA, 0, 1, fractionB, cpB, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n bezierA.fractionToPoint4d(0.0, this._xyzwA0);\r\n let f0 = 0.0;\r\n let f1 = 1.0;\r\n const intervalTolerance = 1.0e-5;\r\n const df = 1.0 / strokeCountA;\r\n for (let i = 1; i <= strokeCountA; i++ , f0 = f1, this._xyzwA0.setFrom(this._xyzwA1)) {\r\n f1 = i * df;\r\n bezierA.fractionToPoint4d(f1, this._xyzwA1);\r\n Point4d.createPlanePointPointZ(this._xyzwA0, this._xyzwA1, this._xyzwPlane);\r\n bezierB.poleProductsXYZW(\r\n univariateBezierB.coffs, this._xyzwPlane.x, this._xyzwPlane.y, this._xyzwPlane.z, this._xyzwPlane.w,\r\n );\r\n let errors = 0;\r\n const roots = univariateBezierB.roots(0.0, true);\r\n if (roots)\r\n for (const r of roots) {\r\n const bezierBFraction = r;\r\n bezierB.fractionToPoint4d(bezierBFraction, this._xyzwB);\r\n const segmentAFraction = SmallSystem.lineSegment3dHXYClosestPointUnbounded(this._xyzwA0, this._xyzwA1, this._xyzwB);\r\n if (segmentAFraction && Geometry.isIn01WithTolerance(segmentAFraction, intervalTolerance)) {\r\n const bezierAFraction = Geometry.interpolate(f0, segmentAFraction, f1);\r\n // TODO implement newton search\r\n const xyMatchingFunction = new BezierBezierIntersectionXYRRToRRD(bezierA, bezierB);\r\n const newtonSearcher = new Newton2dUnboundedWithDerivative(xyMatchingFunction);\r\n newtonSearcher.setUV(bezierAFraction, bezierBFraction);\r\n if (newtonSearcher.runIterations()) {\r\n bezierAFraction = newtonSearcher.getU();\r\n bezierBFraction = newtonSearcher.getV();\r\n }\r\n // We have a near intersection at fractions on the two beziers !!!\r\n // Iterate on the curves for a true intersection ....\r\n // NEEDS WORK -- just accept . . .\r\n const bcurveAFraction = bezierA.fractionToParentFraction(bezierAFraction);\r\n const bcurveBFraction = bezierB.fractionToParentFraction(bezierBFraction);\r\n const xyzA0 = bezierA.fractionToPoint(bezierAFraction);\r\n const xyzA1 = bcurveA.fractionToPoint(bcurveAFraction);\r\n const xyzB0 = bezierB.fractionToPoint(bezierBFraction);\r\n const xyzB1 = bcurveB.fractionToPoint(bcurveBFraction);\r\n if (!xyzA0.isAlmostEqualXY(xyzA1))\r\n errors++;\r\n if (!xyzB0.isAlmostEqualXY(xyzB1))\r\n errors++;\r\n if (errors > 0 && !xyzA0.isAlmostEqual(xyzB0))\r\n errors++;\r\n if (errors > 0 && !xyzA1.isAlmostEqual(xyzB1))\r\n errors++;\r\n if (this.acceptFraction(false, bcurveAFraction, false) &&\r\n this.acceptFraction(false, bcurveBFraction, false)) {\r\n this.recordPointWithLocalFractions(\r\n bcurveAFraction, bcurveA, 0, 1, bcurveBFraction, bcurveB, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n */\r\n // Caller accesses data from two arcs.\r\n // Selects the best conditioned arc (in xy parts) as \"circle after inversion\".\r\n // Solves the arc-arc equations.\r\n private dispatchBSplineCurve3dBSplineCurve3d(\r\n _bcurveA: BSplineCurve3dBase, _bcurveB: BSplineCurve3dBase, _reversed: boolean,\r\n ): void {\r\n // TODO: B-spline XYZ intersection implementation\r\n /*\r\n const bezierSpanA = bcurveA.collectBezierSpans(true) as BezierCurve3dH[];\r\n const bezierSpanB = bcurveB.collectBezierSpans(true) as BezierCurve3dH[];\r\n const numA = bezierSpanA.length;\r\n const numB = bezierSpanB.length;\r\n this.transformBeziers(bezierSpanA);\r\n this.transformBeziers(bezierSpanB);\r\n const rangeA = this.getRanges(bezierSpanA);\r\n const rangeB = this.getRanges(bezierSpanB);\r\n const orderA = bcurveA.order;\r\n const orderB = bcurveB.order;\r\n const univariateCoffsA = new UnivariateBezier(orderA);\r\n const univariateCoffsB = new UnivariateBezier(orderB);\r\n for (let a = 0; a < numA; a++) {\r\n for (let b = 0; b < numB; b++) {\r\n if (rangeA[a].intersectsRangeXY(rangeB[b])) {\r\n const strokeCountA = bezierSpanA[a].computeStrokeCountForOptions();\r\n const strokeCountB = bezierSpanB[b].computeStrokeCountForOptions();\r\n if (strokeCountA < strokeCountB)\r\n this.dispatchBezierBezierStrokeFirst(\r\n bezierSpanA[a], bcurveA, strokeCountA, bezierSpanB[b], bcurveB, strokeCountB, univariateCoffsB, _reversed,\r\n );\r\n else\r\n this.dispatchBezierBezierStrokeFirst(\r\n bezierSpanB[b], bcurveB, strokeCountB, bezierSpanA[a], bcurveA, strokeCountA, univariateCoffsA, !_reversed,\r\n );\r\n }\r\n }\r\n }\r\n */\r\n }\r\n /*\r\n /**\r\n * Apply the projection transform (if any) to (xyz, w).\r\n * @param xyz xyz parts of input point.\r\n * @param w weight to use for homogeneous effects.\r\n */\r\n /*\r\n private projectPoint(xyz: XYAndZ, w: number = 1.0): Point4d {\r\n if (this._worldToLocalPerspective)\r\n return this._worldToLocalPerspective.multiplyPoint3d(xyz, w);\r\n if (this._worldToLocalAffine)\r\n return this._worldToLocalAffine.multiplyXYZW(xyz.x, xyz.y, xyz.z, w);\r\n return Point4d.createFromPointAndWeight(xyz, w);\r\n }\r\n private mapNPCPlaneToWorld(npcPlane: Point4d, worldPlane: Point4d) {\r\n // for NPC pointY, Y^ * H = 0 is \"on\" plane H. (Hat is transpose)\r\n // NPC Y is A*X for our transform A and worldPointX.\r\n // hence (A X)^ * H = 0\r\n // hence X^ * A^ * H = 0\r\n // hence K = A^ * H\r\n if (this._worldToLocalAffine) {\r\n this._worldToLocalAffine.multiplyTransposeXYZW(npcPlane.x, npcPlane.y, npcPlane.z, npcPlane.w, worldPlane);\r\n } else if (this._worldToLocalPerspective) {\r\n this._worldToLocalPerspective.multiplyTransposePoint4d(npcPlane, worldPlane);\r\n } else {\r\n npcPlane.clone(worldPlane);\r\n }\r\n }\r\n */\r\n // Caller accesses data from segment and bsplineCurve\r\n // Selects the best conditioned arc (in xy parts) as \"circle after inversion\"\r\n // Solves the arc-arc equations\r\n private dispatchSegmentBsplineCurve(\r\n _cpA: CurvePrimitive,\r\n _extendA0: boolean,\r\n _pointA0: Point3d,\r\n _fractionA0: number,\r\n _pointA1: Point3d,\r\n _fractionA1: number,\r\n _extendA1: boolean,\r\n _bcurve: BSplineCurve3d,\r\n _extendB0: boolean,\r\n _extendB1: boolean,\r\n _reversed: boolean,\r\n ): void {\r\n // TODO: B-spline XYZ intersection implementation\r\n /*\r\n const pointA0H = this.projectPoint(pointA0);\r\n const pointA1H = this.projectPoint(pointA1);\r\n const planeCoffs = Point4d.createPlanePointPointZ(pointA0H, pointA1H);\r\n this.mapNPCPlaneToWorld(planeCoffs, planeCoffs);\r\n // NOW .. we have a plane in world space. Intersect it with the bspline:\r\n const intersections: CurveLocationDetail[] = [];\r\n bcurve.appendPlaneIntersectionPoints(planeCoffs, intersections);\r\n // intersections has WORLD points with bspline fractions.\r\n // (the bspline fractions are all good 0..1 fractions within the spline).\r\n // accept those that are within the segment range.\r\n for (const detail of intersections) {\r\n const fractionB = detail.fraction;\r\n const curvePoint = detail.point;\r\n const curvePointH = this.projectPoint(curvePoint);\r\n const lineFraction = SmallSystem.lineSegment3dHXYClosestPointUnbounded(pointA0H, pointA1H, curvePointH);\r\n if (lineFraction !== undefined && this.acceptFraction(_extendA0, lineFraction, _extendA1) &&\r\n this.acceptFraction(_extendB0, fractionB, _extendB1)) {\r\n this.recordPointWithLocalFractions(\r\n lineFraction, cpA, fractionA0, fractionA1, fractionB, bcurve, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n */\r\n }\r\n /** Low level dispatch of linestring with (beziers of) a bspline curve */\r\n public dispatchLineStringBSplineCurve(\r\n _lsA: LineString3d,\r\n _extendA0: boolean,\r\n _extendA1: boolean,\r\n _curveB: BSplineCurve3d,\r\n _extendB0: boolean,\r\n _extendB1: boolean,\r\n _reversed: boolean,\r\n ): any {\r\n // TODO: B-spline XYZ intersection implementation\r\n /*\r\n const numA = lsA.numPoints();\r\n if (numA > 1) {\r\n const dfA = 1.0 / (numA - 1);\r\n let fA0;\r\n let fA1;\r\n fA0 = 0.0;\r\n const pointA0 = CurveCurveIntersectXYZ._workPointA0;\r\n const pointA1 = CurveCurveIntersectXYZ._workPointA1;\r\n lsA.pointAt(0, pointA0);\r\n for (let iA = 1; iA < numA; iA++, pointA0.setFrom(pointA1), fA0 = fA1) {\r\n lsA.pointAt(iA, pointA1);\r\n fA1 = iA * dfA;\r\n this.dispatchSegmentBsplineCurve(\r\n lsA, iA === 1 && _extendA0, pointA0, fA0, pointA1, fA1, (iA + 1) === numA && _extendA1,\r\n curveB, _extendB0, _extendB1 reversed);\r\n }\r\n }\r\n return undefined;\r\n */\r\n }\r\n /** Detail computation for segment intersecting linestring. */\r\n public computeSegmentLineString(\r\n lsA: LineSegment3d,\r\n extendA0: boolean,\r\n extendA1: boolean,\r\n lsB: LineString3d,\r\n extendB0: boolean,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): any {\r\n const pointA0 = lsA.point0Ref;\r\n const pointA1 = lsA.point1Ref;\r\n const pointB0 = CurveCurveIntersectXYZ._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXYZ._workPointBB1;\r\n const numB = lsB.numPoints();\r\n if (numB > 1) {\r\n const dfB = 1.0 / (numB - 1);\r\n let fB0;\r\n let fB1;\r\n fB0 = 0.0;\r\n lsB.pointAt(0, pointB0);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\r\n lsB.pointAt(ib, pointB1);\r\n fB1 = ib * dfB;\r\n this.dispatchSegmentSegment(\r\n lsA, extendA0, pointA0, 0.0, pointA1, 1.0, extendA1,\r\n lsB, ib === 1 && extendB0, pointB0, fB0, pointB1, fB1, (ib + 1) === numB && extendB1,\r\n reversed,\r\n );\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Detail computation for arc intersecting linestring. */\r\n public computeArcLineString(\r\n arcA: Arc3d,\r\n extendA0: boolean,\r\n extendA1: boolean,\r\n lsB: LineString3d,\r\n extendB0: boolean,\r\n extendB1: boolean,\r\n reversed: boolean,\r\n ): any {\r\n const pointB0 = CurveCurveIntersectXYZ._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXYZ._workPointBB1;\r\n const numB = lsB.numPoints();\r\n if (numB > 1) {\r\n const dfB = 1.0 / (numB - 1);\r\n let fB0;\r\n let fB1;\r\n fB0 = 0.0;\r\n lsB.pointAt(0, pointB0);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\r\n lsB.pointAt(ib, pointB1);\r\n fB1 = ib * dfB;\r\n this.dispatchSegmentArc(\r\n lsB, ib === 1 && extendB0, pointB0, fB0, pointB1, fB1,\r\n (ib + 1) === numB && extendB1, arcA, extendA0, extendA1, !reversed,\r\n );\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Detail computation for linestring intersecting linestring. */\r\n private computeLineStringLineString(lsA: LineString3d, lsB: LineString3d, reversed: boolean): void {\r\n const pointA0 = CurveCurveIntersectXYZ._workPointAA0;\r\n const pointA1 = CurveCurveIntersectXYZ._workPointAA1;\r\n const pointB0 = CurveCurveIntersectXYZ._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXYZ._workPointBB1;\r\n const numA = lsA.numPoints();\r\n const numB = lsB.numPoints();\r\n if (numA > 1 && numB > 1) {\r\n lsA.pointAt(0, pointA0);\r\n const dfA = 1.0 / (numA - 1);\r\n const dfB = 1.0 / (numB - 1);\r\n let fA0 = 0.0;\r\n let fB0;\r\n let fA1;\r\n let fB1;\r\n lsA.pointAt(0, pointA0);\r\n for (let ia = 1; ia < numA; ia++, pointA0.setFrom(pointA1), fA0 = fA1) {\r\n fA1 = ia * dfA;\r\n fB0 = 0.0;\r\n lsA.pointAt(ia, pointA1);\r\n lsB.pointAt(0, pointB0);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\r\n lsB.pointAt(ib, pointB1);\r\n fB1 = ib * dfB;\r\n this.dispatchSegmentSegment(\r\n lsA, ia === 1 && this._extendA0, pointA0, fA0, pointA1, fA1, (ia + 1) === numA && this._extendA1,\r\n lsB, ib === 1 && this._extendB0, pointB0, fB0, pointB1, fB1, (ib + 1) === numB && this._extendB1,\r\n reversed,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Low level dispatch of curve collection.\r\n * We take care of extend variables of geometry's children here if geometry is Path or Loop.\r\n */\r\n private dispatchCurveCollection(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\r\n const geomB = this._geometryB; // save\r\n if (!geomB || !geomB.children || !(geomB instanceof CurveCollection))\r\n return;\r\n const children = geomB.children;\r\n const extendB0 = this._extendB0; // save\r\n const extendB1 = this._extendB1; // save\r\n for (let i = 0; i < children.length; i++) {\r\n this.resetGeometry(children[i]);\r\n if (geomB instanceof Path && children.length > 1) {\r\n if (i === 0)\r\n this._extendB1 = false; // first child can only extend from start\r\n else if (i === children.length - 1)\r\n this._extendB0 = false; // last child can only extend from end\r\n else\r\n this._extendB0 = this._extendB1 = false; // middle children cannot extend\r\n } else if (geomB instanceof Loop) {\r\n this._extendB0 = this._extendB1 = false; // Loops cannot extend\r\n }\r\n geomAHandler(geomA);\r\n this._extendB0 = extendB0; // restore\r\n this._extendB1 = extendB1; // restore\r\n }\r\n this.resetGeometry(geomB); // restore\r\n }\r\n /**\r\n * Low level dispatch of CurveChainWithDistanceIndex.\r\n * We take care of extend variables of geometry's children here if geometry.path is Path or Loop.\r\n */\r\n private dispatchCurveChainWithDistanceIndex(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\r\n if (!this._geometryB || !(this._geometryB instanceof CurveChainWithDistanceIndex))\r\n return;\r\n if (geomA instanceof CurveChainWithDistanceIndex) {\r\n assert(false, \"call handleCurveChainWithDistanceIndex(geomA) instead\");\r\n }\r\n const index0 = this._results.length;\r\n const geomB = this._geometryB; // save\r\n this.resetGeometry(geomB.path);\r\n this.dispatchCurveCollection(geomA, geomAHandler);\r\n this.resetGeometry(geomB); // restore\r\n this._results = CurveChainWithDistanceIndex.convertChildDetailToChainDetail(\r\n this._results, index0, undefined, geomB, true,\r\n );\r\n }\r\n /**\r\n * Invoke `child.dispatchToGeometryHandler(this)` for each child in the array returned by the query `g.children`.\r\n * We take care of extend variables of geometry's children here if geometry is Path or Loop.\r\n */\r\n public override handleChildren(g: GeometryQuery): any {\r\n const children = g.children;\r\n const extendA0 = this._extendA0; // save\r\n const extendA1 = this._extendA1; // save\r\n if (children)\r\n for (let i = 0; i < children.length; i++) {\r\n if (g instanceof Path && children.length > 1) {\r\n if (i === 0)\r\n this._extendA1 = false; // first child can only extend from start\r\n else if (i === children.length - 1)\r\n this._extendA0 = false; // last child can only extend from end\r\n else\r\n this._extendA0 = this._extendA1 = false; // middle children cannot extend\r\n } else if (g instanceof Loop) {\r\n this._extendA0 = this._extendA1 = false; // Loops cannot extend\r\n }\r\n children[i].dispatchToGeometryHandler(this);\r\n this._extendA0 = extendA0; // restore\r\n this._extendA1 = extendA1; // restore\r\n }\r\n }\r\n /** Double dispatch handler for strongly typed segment. */\r\n public override handleLineSegment3d(segmentA: LineSegment3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n const segmentB = this._geometryB;\r\n this.dispatchSegmentSegment(\r\n segmentA, this._extendA0, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA1,\r\n segmentB, this._extendB0, segmentB.point0Ref, 0.0, segmentB.point1Ref, 1.0, this._extendB1,\r\n false,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeSegmentLineString(\r\n segmentA, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchSegmentArc(\r\n segmentA, this._extendA0, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA1,\r\n this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n segmentA, this._extendA0, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA1,\r\n this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(segmentA, this.handleLineSegment3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(segmentA, this.handleLineSegment3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** double dispatch handler for strongly typed linestring. */\r\n public override handleLineString3d(lsA: LineString3d): any {\r\n if (this._geometryB instanceof LineString3d) {\r\n const lsB = this._geometryB;\r\n this.computeLineStringLineString(lsA, lsB, false);\r\n } else if (this._geometryB instanceof LineSegment3d) {\r\n this.computeSegmentLineString(\r\n this._geometryB, this._extendB0, this._extendB1, lsA, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.computeArcLineString(\r\n this._geometryB, this._extendB0, this._extendB1, lsA, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchLineStringBSplineCurve(\r\n lsA, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(lsA, this.handleLineString3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(lsA, this.handleLineString3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed arc. */\r\n public override handleArc3d(arc0: Arc3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentArc(\r\n this._geometryB, this._extendB0, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB1,\r\n arc0, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeArcLineString(\r\n arc0, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcArc(\r\n arc0, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchArcBsplineCurve3d(\r\n arc0, this._extendA0, this._extendA1, this._geometryB, this._extendB0, this._extendB1, false,\r\n );\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(arc0, this.handleArc3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(arc0, this.handleArc3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed bspline curve. */\r\n public override handleBSplineCurve3d(curve: BSplineCurve3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n this._geometryB, this._extendB0, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB1,\r\n curve, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(\r\n this._geometryB, this._extendB0, this._extendB1, curve, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(\r\n this._geometryB, this._extendB0, this._extendB1, curve, this._extendA0, this._extendA1, true,\r\n\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3dBase) {\r\n this.dispatchBSplineCurve3dBSplineCurve3d(curve, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(curve, this.handleBSplineCurve3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(curve, this.handleBSplineCurve3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed CurveChainWithDistanceIndex. */\r\n public override handleCurveChainWithDistanceIndex(chain: CurveChainWithDistanceIndex): any {\r\n super.handleCurveChainWithDistanceIndex(chain);\r\n // if _geometryB is also a CurveChainWithDistanceIndex, it will already have been converted by dispatchCurveChainWithDistanceIndex\r\n this._results = CurveChainWithDistanceIndex.convertChildDetailToChainDetail(this._results, 0, chain, undefined, true);\r\n }\r\n /** Double dispatch handler for strongly typed homogeneous bspline curve. */\r\n public override handleBSplineCurve3dH(_curve: BSplineCurve3dH): any {\r\n /*\r\n // NEEDS WORK -- make \"dispatch\" methods tolerant of both 3d and 3dH\r\n // \"easy\" if both present BezierCurve3dH span loaders\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n this._geometryB, this._extendB0, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB1,\r\n curve, this._extendA0, this.extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(\r\n this._geometryB, this._extendB0, this._extendB1, curve, this._extendA0, this._extendA1, true,\r\n );\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(\r\n this._geometryB, this._extendB0, this._extendB1, curve, this._extendA0, this._extendA1, true,\r\n );\r\n }\r\n */\r\n return undefined;\r\n }\r\n}\r\n"]}
|
|
@@ -38,7 +38,7 @@ var JointMode;
|
|
|
38
38
|
* @internal
|
|
39
39
|
*/
|
|
40
40
|
class Joint {
|
|
41
|
-
// capture references to all data
|
|
41
|
+
// capture references to all data members
|
|
42
42
|
constructor(curve0, curve1, swingPoint) {
|
|
43
43
|
this.curve0 = curve0;
|
|
44
44
|
this.curve1 = curve1;
|
|
@@ -175,9 +175,10 @@ class Joint {
|
|
|
175
175
|
}
|
|
176
176
|
/**
|
|
177
177
|
* Visit joints on a chain.
|
|
178
|
-
* *
|
|
179
|
-
* @param start first (and, for cyclic chain, final) joint
|
|
178
|
+
* * Terminates if `callback` returns `false`.
|
|
179
|
+
* @param start first (and, for cyclic chain, final) joint.
|
|
180
180
|
* @param callback function to call with each Joint as a single parameter.
|
|
181
|
+
* @param maxTest
|
|
181
182
|
*/
|
|
182
183
|
static visitJointsOnChain(start, callback, maxTest = 100) {
|
|
183
184
|
let joint = start;
|
|
@@ -558,7 +559,7 @@ export class CurveChainWireOffsetContext {
|
|
|
558
559
|
for (const c of curves.children) {
|
|
559
560
|
const c1 = CurveChainWireOffsetContext.createSingleOffsetPrimitiveXY(c, offsetOptions);
|
|
560
561
|
if (c1 === undefined) {
|
|
561
|
-
// bad
|
|
562
|
+
// bad; maybe arc to inside?
|
|
562
563
|
}
|
|
563
564
|
else if (c1 instanceof CurvePrimitive) {
|
|
564
565
|
simpleOffsets.push(c1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolygonOffsetContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurveCurveApproachType, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { JointOptions, OffsetOptions } from \"../OffsetOptions\";\r\nimport { Path } from \"../Path\";\r\nimport { RegionOps } from \"../RegionOps\";\r\n\r\n// cspell:word CCWXY\r\n\r\n/**\r\n * Classification of how the joint is constructed.\r\n * @internal\r\n */\r\nenum JointMode {\r\n Unknown = 0, /** used when joint mode is unknown. */\r\n Cap = 1, /** used to annotate a \"Joint\" at the start/end of a curve without wrap (so there's no \"other\" curve). */\r\n Extend = 2, /** used when offset curves do not intersect and needs expanding to connect. */\r\n Trim = -1, /** used when offset curves intersect and still goes beyond the intersection so need trimming. */\r\n JustGeometry = 3, /** unused */\r\n Gap = 4, /** used when joint construction fails, resulting in a gap in the offset filled by a line segment. */\r\n}\r\n\r\n/**\r\n * Description of geometry around a joint.\r\n * @internal\r\n */\r\nclass Joint {\r\n /** Enumeration of how the joint is constructed */\r\n public flexure: JointMode;\r\n /** Curve before the joint */\r\n public curve0?: CurvePrimitive;\r\n /** Fractional position on curve0 (may be a trim or extension) */\r\n public fraction0?: number;\r\n /** Curve after the joint (may be a trim or extension) */\r\n public curve1?: CurvePrimitive;\r\n /** Fractional position on curve1 */\r\n public fraction1?: number;\r\n /** Curve to be added within the joint */\r\n public jointCurve?: CurvePrimitive;\r\n /** Common point on the original curves */\r\n public swingPoint?: Point3d;\r\n /** Pointer to next joint */\r\n public nextJoint?: Joint;\r\n /** Pointer to previous joint */\r\n public previousJoint?: Joint;\r\n // capture references to all data . . .\r\n public constructor(\r\n curve0: CurvePrimitive | undefined, curve1: CurvePrimitive | undefined, swingPoint: Point3d | undefined,\r\n ) {\r\n this.curve0 = curve0;\r\n this.curve1 = curve1;\r\n this.swingPoint = swingPoint;\r\n this.flexure = JointMode.Unknown;\r\n }\r\n /**\r\n * Try to construct an arc transition from ray0 to ray1 with given center.\r\n */\r\n public static constructArc(ray0: Ray3d, center: Point3d | undefined, ray1: Ray3d): Arc3d | undefined {\r\n if (center !== undefined && Geometry.isSameCoordinate(ray0.origin.distance(center), ray1.origin.distance(center))) {\r\n const angle = ray0.direction.angleToXY(ray1.direction);\r\n const vector0 = Vector3d.createStartEnd(center, ray0.origin);\r\n const vector90 = vector0.rotate90CCWXY();\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0.0, angle.radians));\r\n }\r\n return undefined;\r\n }\r\n /** Extract a json object of {curve0:data, fraction0:data, curve1:data, fraction1:data} */\r\n public shallowExtract(): any {\r\n return { curve0: this.curve0, curve1: this.curve1, fraction0: this.fraction0, fraction1: this.fraction1 };\r\n }\r\n /** Establish the nextJoint and previousJoint links from joint0 to joint1. */\r\n public static link(joint0: Joint, joint1: Joint | undefined) {\r\n joint0.nextJoint = joint1;\r\n if (joint1)\r\n joint1.previousJoint = joint0;\r\n if (joint0.curve1 && joint1 && !joint1.curve0)\r\n joint1.curve0 = joint0.curve1;\r\n else if (!joint0.curve1 && joint1 && joint1.curve0)\r\n joint0.curve1 = joint1.curve0;\r\n }\r\n /**\r\n * * If nextJoint and nextJoint.fraction0 are defined, return them.\r\n * * Otherwise return defaultValue\r\n */\r\n public nextJointFraction0(defaultValue: number): number {\r\n if (this.nextJoint && this.nextJoint.fraction0 !== undefined)\r\n return this.nextJoint.fraction0;\r\n return defaultValue;\r\n }\r\n private static addStrokes(destination: LineString3d, curve?: CurvePrimitive) {\r\n if (curve) {\r\n curve.emitStrokes(destination);\r\n }\r\n }\r\n private static addPoint(destination: LineString3d, point: Point3d) {\r\n if (destination.packedPoints.length > 0) {\r\n const pointA = destination.endPoint();\r\n if (!pointA.isAlmostEqual(point))\r\n destination.packedPoints.push(point);\r\n }\r\n }\r\n /** Append stroke points along the offset curve defined by the Joint chain to the destination line string. */\r\n public static collectStrokesFromChain(start: Joint, destination: LineString3d, maxTest: number = 100) {\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.addStrokes(destination, joint.jointCurve);\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n if (curve1) {\r\n if (!joint.jointCurve) {\r\n this.addPoint(destination, curve1.startPoint());\r\n }\r\n }\r\n this.addStrokes(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest,\r\n );\r\n }\r\n private static collectPrimitive(destination: CurvePrimitive[], primitive?: CurvePrimitive) {\r\n if (primitive) {\r\n if (destination.length > 0) {\r\n const pointA = destination[destination.length - 1].endPoint();\r\n const pointB = primitive.startPoint();\r\n if (!pointA.isAlmostEqual(pointB)) {\r\n destination.push(LineSegment3d.create(pointA, pointB));\r\n }\r\n }\r\n destination.push(primitive);\r\n }\r\n }\r\n private static adjustJointToPrimitives(joint: Joint) {\r\n const ls = joint.jointCurve;\r\n if (ls instanceof LineString3d) {\r\n if (joint.curve0) {\r\n const curvePoint = joint.curve0.endPoint();\r\n const jointPoint0 = ls.startPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint0))\r\n ls.packedPoints.setAtCheckedPointIndex(0, curvePoint);\r\n }\r\n if (joint.curve1) {\r\n const curvePoint = joint.curve1.startPoint();\r\n const jointPoint1 = ls.endPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint1))\r\n ls.packedPoints.setAtCheckedPointIndex(ls.packedPoints.length - 1, curvePoint);\r\n }\r\n }\r\n }\r\n /** Append CurvePrimitives along the offset curve defined by the Joint chain to the destination array. */\r\n public static collectCurvesFromChain(start: Joint | undefined, destination: CurvePrimitive[], maxTest: number = 100) {\r\n if (start === undefined)\r\n return;\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.adjustJointToPrimitives(joint);\r\n this.collectPrimitive(destination, joint.jointCurve);\r\n\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n this.collectPrimitive(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest,\r\n );\r\n }\r\n /**\r\n * Execute `joint.annotateJointMode()` at all joints on the chain to set some of the joints' attributes,\r\n * such as whether to extend both curves to intersection or to fill the gap between curves.\r\n */\r\n public static annotateChain(start: Joint | undefined, options: JointOptions, maxTest: number = 100) {\r\n if (start)\r\n Joint.visitJointsOnChain(start, (joint: Joint) => { joint.annotateJointMode(options); return true; }, maxTest);\r\n }\r\n /**\r\n * Visit joints on a chain.\r\n * * terminate on `false` return from `callback`\r\n * @param start first (and, for cyclic chain, final) joint\r\n * @param callback function to call with each Joint as a single parameter.\r\n */\r\n public static visitJointsOnChain(start: Joint, callback: (joint: Joint) => boolean, maxTest: number = 100): boolean {\r\n let joint: Joint | undefined = start;\r\n if (joint) {\r\n let numTest = 0;\r\n while (joint !== undefined) {\r\n if (numTest++ >= maxTest + 5) // allow extra things to happen\r\n return true;\r\n if (!callback(joint))\r\n return false;\r\n joint = joint.nextJoint;\r\n if (joint === start)\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n /** NOTE: no assumption on type of curve0, curve1 */\r\n private annotateExtension(options: JointOptions) {\r\n if (this.curve0 && this.curve1) {\r\n const ray0 = this.curve0.fractionToPointAndDerivative(1.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n ray0.direction.z = ray1.direction.z = 0.0; // xy-offset\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n if (intersection.detailA.fraction >= 0.0 && intersection.detailB.fraction <= 0.0) {\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Extend;\r\n const theta = ray0.getDirectionRef().angleToXY(ray1.getDirectionRef()); // angle between the 2 ray lines\r\n if (options.needArc(theta)) {\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc) {\r\n this.jointCurve = arc;\r\n return;\r\n }\r\n }\r\n const numChamferPoints = options.numChamferPoints(theta); // how many interior points in the linestring\r\n if (numChamferPoints <= 1) { // create sharp corner\r\n this.jointCurve = LineString3d.create(ray0.origin, intersection.detailA.point, ray1.origin);\r\n return;\r\n }\r\n if (numChamferPoints > 1) { // create chamfer corner (a line string)\r\n const radians0 = theta.radians;\r\n const numHalfStep = 2.0 * numChamferPoints;\r\n const halfStepRadians = radians0 / numHalfStep;\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc !== undefined) {\r\n const radialFraction = 1 / Math.cos(halfStepRadians);\r\n const jointCurve = LineString3d.create();\r\n this.jointCurve = jointCurve;\r\n jointCurve.addPoint(ray0.origin); // possibly extend segment or line string\r\n\r\n for (let i = 0; i < numChamferPoints; i++) {\r\n const arcFraction = (1 + 2 * i) / numHalfStep;\r\n jointCurve.addPoint(arc.fractionAndRadialFractionToPoint(arcFraction, radialFraction));\r\n }\r\n jointCurve.addPoint(ray1.origin); // possibly extend segment or line string.\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n // if there is no intersection between the 2 ray lines, fill the gap by a line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n /** Select the index at which summed fraction difference is smallest */\r\n private selectIntersectionIndexByFraction(\r\n fractionA: number, fractionB: number, intersections: CurveLocationDetailPair[],\r\n ): number {\r\n let index = -1;\r\n let aMin = Number.MAX_VALUE;\r\n for (let i = 0; i < intersections.length; i++) {\r\n const a = Math.abs(intersections[i].detailA.fraction - fractionA)\r\n + Math.abs(intersections[i].detailB.fraction - fractionB);\r\n if (a < aMin) {\r\n aMin = a;\r\n index = i;\r\n }\r\n }\r\n return index;\r\n }\r\n /**\r\n * Examine the adjacent geometry to set some of joint attributes:\r\n * * set JointMode: one of Cap, Extend, or Trim\r\n * * set fraction0 and fraction1 of intersection of curve0 and curve1\r\n * * set joint curve\r\n * * this REFERENCES curve0, curve1, fraction0, fraction1\r\n * * this does not reference nextJoint and previousJoint\r\n */\r\n public annotateJointMode(options: JointOptions): void {\r\n if (!this.curve0 && this.curve1) { // joint at the start of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction1 = 0.0;\r\n } else if (this.curve0 && !this.curve1) { // joint at the end of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction0 = 1.0;\r\n } else if (this.curve0 && this.curve1) { // joints at the middle of the chain\r\n if (this.curve0.endPoint().isAlmostEqualXY(this.curve1.startPoint())) { // joint between colinear xy-segments\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Trim;\r\n } else if (this.curve0 instanceof LineSegment3d && this.curve1 instanceof LineSegment3d) { // pair of lines\r\n const ray0 = this.curve0.fractionToPointAndDerivative(0.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n ray0.direction.z = ray1.direction.z = 0.0; // xy-offset\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection || intersection.approachType === CurveCurveApproachType.PerpendicularChord) {\r\n this.fraction0 = intersection.detailA.fraction;\r\n this.fraction1 = intersection.detailB.fraction;\r\n if (this.fraction0 >= 1.0 && this.fraction1 <= 0.0) { // need to extend\r\n this.annotateExtension(options);\r\n } else if (this.fraction0 < 1.0 && this.fraction1 > 0.0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n } else if (this.fraction0 > 1.0 && this.fraction1 > 1.0) { // need to fill gap with a single line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n } else { // generic pair of curves\r\n const intersections = CurveCurve.intersectionXYPairs(this.curve0, false, this.curve1, false);\r\n const intersectionIndex = this.selectIntersectionIndexByFraction(1.0, 0.0, intersections);\r\n if (intersectionIndex >= 0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n this.fraction0 = intersections[intersectionIndex].detailA.fraction;\r\n this.fraction1 = intersections[intersectionIndex].detailB.fraction;\r\n } else { // need to extend\r\n this.annotateExtension(options);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * * Examine the primitive trim fractions between each pair of joints.\r\n * * If trim fractions indicate the primitive must disappear, replace the joint pair by a new joint pointing at\r\n * surrounding primitives\r\n * @param start\r\n */\r\n public static removeDegeneratePrimitives(\r\n start: Joint, options: JointOptions, maxTest: number,\r\n ): { newStart: Joint, numJointRemoved: number } {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\"\\nENTER removeDegenerates\");\r\n */\r\n let jointA: Joint | undefined = start;\r\n let numRemoved = 0;\r\n const maxRemove = 1;\r\n let numTest = 0;\r\n if (jointA) {\r\n while (jointA !== undefined && numTest++ < maxTest) {\r\n const jointB = jointA.nextJoint;\r\n if (jointA\r\n && jointB\r\n && jointA.previousJoint\r\n && jointB.nextJoint\r\n && jointA.fraction1 !== undefined\r\n && jointB.fraction0 !== undefined\r\n ) {\r\n const f0 = jointA.fraction1;\r\n const f1 = jointB.fraction0;\r\n const g0 = jointB.fraction1;\r\n const g1 = jointB.nextJoint.fraction0;\r\n // f0 and f1 are fractions on the single primitive between these joints.\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\"joint candidate\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointA.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointB.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(\"FRACTIONS \", { fA1: f0, fB0: f1 });\r\n }\r\n */\r\n const eliminateF = f0 >= f1 || f0 > 1.0;\r\n const eliminateG = (g0 !== undefined && g0 > 1.0) || (g0 !== undefined && g1 !== undefined && g0 >= g1);\r\n if (eliminateF && eliminateG) {\r\n const jointC = jointB.nextJoint;\r\n const newJoint: Joint = new Joint(jointA.curve0, jointC.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointC.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n if (newJoint.nextJoint)\r\n newJoint.nextJoint.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW DOUBLE CUT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n } else if (eliminateF) {\r\n const newJoint: Joint = new Joint(jointA.curve0, jointB.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointB.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n newJoint.nextJoint!.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW JOINT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n numRemoved++;\r\n if (jointA === start)\r\n start = newJoint;\r\n jointA = newJoint;\r\n if (numRemoved >= maxRemove) {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\" EXIT removeDegenerates at maxRemove\\n\");\r\n */\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n }\r\n }\r\n jointA = jointA.nextJoint;\r\n if (jointA === start)\r\n break;\r\n }\r\n }\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire xy-offset.\r\n * @internal\r\n */\r\nexport class PolygonWireOffsetContext {\r\n /** Construct a context. */\r\n public constructor() { }\r\n private static _unitAlong = Vector3d.create();\r\n private static _unitPerp = Vector3d.create();\r\n private static _offsetA = Point3d.create();\r\n private static _offsetB = Point3d.create();\r\n // Construct a single offset from base points\r\n private static createOffsetSegment(\r\n basePointA: Point3d, basePointB: Point3d, distance: number,\r\n ): CurvePrimitive | undefined {\r\n Vector3d.createStartEnd(basePointA, basePointB, this._unitAlong);\r\n this._unitAlong.z = 0.0; // xy-offset\r\n if (this._unitAlong.normalizeInPlace()) {\r\n this._unitAlong.rotate90CCWXY(this._unitPerp);\r\n const segment = LineSegment3d.create(\r\n basePointA.plusScaled(this._unitPerp, distance, this._offsetA),\r\n basePointB.plusScaled(this._unitPerp, distance, this._offsetB),\r\n );\r\n CurveChainWireOffsetContext.applyBasePoints(segment, basePointA.clone(), basePointB.clone());\r\n return segment;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct a wire (not area) that is offset from given polyline or polygon.\r\n * * For best results, points should be in a horizontal plane because z-coordinates are ignored.\r\n * * This is a simple wire offset (in the form of a line string), not an area.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * See [[JointOptions]] class doc for offset construction rules.\r\n * @param points a single loop or path\r\n * @param wrap true to offset the wraparound joint. Assumes first = last point.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or JointOptions\r\n * object.\r\n */\r\n public constructPolygonWireXYOffset(\r\n points: Point3d[], wrap: boolean, leftOffsetDistanceOrOptions: number | JointOptions,\r\n ): CurveChain | undefined {\r\n if (wrap && !points[0].isAlmostEqual(points[points.length - 1]))\r\n wrap = false; // no wrap possible for polylines\r\n // create raw offset segments as a linked list of Joints, starting with joint0\r\n const options = JointOptions.create(leftOffsetDistanceOrOptions);\r\n const numPoints = points.length;\r\n let fragment0: CurvePrimitive | undefined;\r\n let joint0, previousJoint: Joint | undefined;\r\n for (let i = 0; i + 1 < numPoints; ++i) {\r\n if (!previousJoint) { // start the linked list at the first nontrivial xy-segment\r\n if (fragment0 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance))\r\n previousJoint = joint0 = new Joint(undefined, fragment0, points[i]);\r\n } else {\r\n const fragment1 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance);\r\n if (fragment1) { // append the next nontrivial xy-segment\r\n const newJoint = new Joint(fragment0, fragment1, points[i]);\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n }\r\n if (!fragment0 || !previousJoint || !joint0)\r\n return undefined; // no edge with positive xy-length\r\n const lastJoint = wrap ? joint0 : new Joint(fragment0, undefined, points[numPoints - 1]);\r\n Joint.link(previousJoint, lastJoint);\r\n Joint.annotateChain(joint0, options, numPoints);\r\n // make limited passes through the Joint chain until no self-intersections are removed\r\n for (let pass = 0; pass++ < 5;) {\r\n const state = Joint.removeDegeneratePrimitives(joint0, options, numPoints);\r\n joint0 = state.newStart;\r\n if (state.numJointRemoved === 0)\r\n break;\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" POST REMOVE DEGENERATES \" + state.numJointRemoved);\r\n Joint.visitJointsOnChain(joint0, (joint: Joint) => { GeometryCoreTestIO.consoleLog(prettyPrint(joint.shallowExtract())); return true; });\r\n }\r\n */\r\n }\r\n const chain = LineString3d.create();\r\n Joint.collectStrokesFromChain(joint0, chain, numPoints); // compute offset corners (by extension/trim)\r\n const n = chain.packedPoints.length;\r\n if (n > 1) {\r\n if (chain.packedPoints.front()!.isAlmostEqual(chain.packedPoints.back()!))\r\n return Loop.create(chain);\r\n else\r\n return Path.create(chain);\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire xy-offset from a Path or Loop of CurvePrimitives\r\n * @internal\r\n */\r\nexport class CurveChainWireOffsetContext {\r\n /** construct a context. */\r\n public constructor() { }\r\n /**\r\n * Annotate a CurvePrimitive with properties `baseCurveStart` and `baseCurveEnd`.\r\n * @param cp curve primitive to annotate\r\n * @param startPoint optional start point\r\n * @param endPoint optional end point\r\n * @return the input CurvePrimitive with annotations\r\n */\r\n public static applyBasePoints(\r\n cp: CurvePrimitive | undefined, startPoint: Point3d | undefined, endPoint: Point3d | undefined,\r\n ): CurvePrimitive | undefined {\r\n if (cp !== undefined) {\r\n if (startPoint !== undefined)\r\n (cp as any).baseCurveStart = startPoint;\r\n if (endPoint !== undefined)\r\n (cp as any).baseCurveEnd = endPoint;\r\n }\r\n return cp;\r\n }\r\n /**\r\n * Create the offset of a single curve primitive as viewed in the xy-plane (ignoring z).\r\n * * Each primitive may be labeled (as an `any` object) with start or end point of base curve:\r\n * * `(primitive as any).baseCurveStart: Point3d`\r\n * * `(primitive as any).baseCurveEnd: Point3d`\r\n * @param curve primitive to offset\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object\r\n */\r\n public static createSingleOffsetPrimitiveXY(\r\n curve: CurvePrimitive, offsetDistanceOrOptions: number | OffsetOptions,\r\n ): CurvePrimitive | CurvePrimitive[] | undefined {\r\n const offset = curve.constructOffsetXY(offsetDistanceOrOptions);\r\n if (offset === undefined)\r\n return undefined;\r\n // decorate each offset with its base curve's endpoints\r\n if (Array.isArray(offset)) {\r\n const basePrims = curve.collectCurvePrimitives(undefined, true, true);\r\n if (basePrims.length !== offset.length)\r\n return undefined; // unexpected aggregate curve type!\r\n for (let i = 0; i < basePrims.length; ++i)\r\n this.applyBasePoints(offset[i], basePrims[i].startPoint(), basePrims[i].endPoint());\r\n return offset;\r\n }\r\n return this.applyBasePoints(offset, curve.startPoint(), curve.endPoint());\r\n }\r\n /**\r\n * Construct curves that are offset from a Path or Loop as viewed in xy-plane (ignoring z).\r\n * * The construction will remove \"some\" local effects of features smaller than the offset distance, but will\r\n * not detect self intersection among widely separated edges.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/Offset\r\n * @param curves base curves.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object.\r\n */\r\n public static constructCurveXYOffset(\r\n curves: Path | Loop, offsetDistanceOrOptions: number | JointOptions | OffsetOptions,\r\n ): CurveCollection | undefined {\r\n const wrap: boolean = curves instanceof Loop;\r\n const offsetOptions = OffsetOptions.create(offsetDistanceOrOptions);\r\n const simpleOffsets: CurvePrimitive[] = [];\r\n /** traverse primitives (children of curves) and create simple offsets of each primitive as an array */\r\n for (const c of curves.children) {\r\n const c1 = CurveChainWireOffsetContext.createSingleOffsetPrimitiveXY(c, offsetOptions);\r\n if (c1 === undefined) {\r\n // bad .. maybe arc to inside?\r\n } else if (c1 instanceof CurvePrimitive) {\r\n simpleOffsets.push(c1);\r\n } else if (Array.isArray(c1)) {\r\n for (const c2 of c1) {\r\n if (c2 instanceof CurvePrimitive)\r\n simpleOffsets.push(c2);\r\n }\r\n }\r\n }\r\n /** create joints between array elements to make offsets as a linked list (joint0) */\r\n let fragment0;\r\n let newJoint;\r\n let previousJoint;\r\n let joint0;\r\n for (const fragment1 of simpleOffsets) {\r\n if (fragment1) {\r\n newJoint = new Joint(fragment0, fragment1, fragment1.fractionToPoint(0.0));\r\n if (newJoint !== undefined)\r\n if (joint0 === undefined)\r\n joint0 = newJoint;\r\n if (previousJoint)\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n if (joint0 && previousJoint && curves instanceof Loop)\r\n Joint.link(previousJoint, joint0);\r\n /** annotateChain sets some of the joints attributes (including how to extend curves or fill the gap between curves) */\r\n const numOffset = simpleOffsets.length;\r\n Joint.annotateChain(joint0, offsetOptions.jointOptions, numOffset);\r\n /** turn the Joint linked list into a CurveCollection. trimming is done in collectCurvesFromChain */\r\n const outputCurves: CurvePrimitive[] = [];\r\n Joint.collectCurvesFromChain(joint0, outputCurves, numOffset);\r\n return RegionOps.createLoopPathOrBagOfCurves(outputCurves, wrap, true);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"PolygonOffsetContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurveCurveApproachType, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { JointOptions, OffsetOptions } from \"../OffsetOptions\";\r\nimport { Path } from \"../Path\";\r\nimport { RegionOps } from \"../RegionOps\";\r\n\r\n// cspell:word CCWXY\r\n\r\n/**\r\n * Classification of how the joint is constructed.\r\n * @internal\r\n */\r\nenum JointMode {\r\n Unknown = 0, /** used when joint mode is unknown. */\r\n Cap = 1, /** used to annotate a \"Joint\" at the start/end of a curve without wrap (so there's no \"other\" curve). */\r\n Extend = 2, /** used when offset curves do not intersect and needs expanding to connect. */\r\n Trim = -1, /** used when offset curves intersect and still goes beyond the intersection so need trimming. */\r\n JustGeometry = 3, /** unused */\r\n Gap = 4, /** used when joint construction fails, resulting in a gap in the offset filled by a line segment. */\r\n}\r\n\r\n/**\r\n * Description of geometry around a joint.\r\n * @internal\r\n */\r\nclass Joint {\r\n /** Enumeration of how the joint is constructed. */\r\n public flexure: JointMode;\r\n /** Curve before the joint. */\r\n public curve0?: CurvePrimitive;\r\n /** Fractional position on curve0 (may be a trim or extension). */\r\n public fraction0?: number;\r\n /** Curve after the joint (may be a trim or extension). */\r\n public curve1?: CurvePrimitive;\r\n /** Fractional position on curve1. */\r\n public fraction1?: number;\r\n /** Curve to be added within the joint. */\r\n public jointCurve?: CurvePrimitive;\r\n /** Common point on the original curves. */\r\n public swingPoint?: Point3d;\r\n /** Pointer to next joint. */\r\n public nextJoint?: Joint;\r\n /** Pointer to previous joint. */\r\n public previousJoint?: Joint;\r\n // capture references to all data members\r\n public constructor(\r\n curve0: CurvePrimitive | undefined, curve1: CurvePrimitive | undefined, swingPoint: Point3d | undefined,\r\n ) {\r\n this.curve0 = curve0;\r\n this.curve1 = curve1;\r\n this.swingPoint = swingPoint;\r\n this.flexure = JointMode.Unknown;\r\n }\r\n /**\r\n * Try to construct an arc transition from ray0 to ray1 with given center.\r\n */\r\n public static constructArc(ray0: Ray3d, center: Point3d | undefined, ray1: Ray3d): Arc3d | undefined {\r\n if (center !== undefined && Geometry.isSameCoordinate(ray0.origin.distance(center), ray1.origin.distance(center))) {\r\n const angle = ray0.direction.angleToXY(ray1.direction);\r\n const vector0 = Vector3d.createStartEnd(center, ray0.origin);\r\n const vector90 = vector0.rotate90CCWXY();\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0.0, angle.radians));\r\n }\r\n return undefined;\r\n }\r\n /** Extract a json object of {curve0:data, fraction0:data, curve1:data, fraction1:data} */\r\n public shallowExtract(): any {\r\n return { curve0: this.curve0, curve1: this.curve1, fraction0: this.fraction0, fraction1: this.fraction1 };\r\n }\r\n /** Establish the nextJoint and previousJoint links from joint0 to joint1. */\r\n public static link(joint0: Joint, joint1: Joint | undefined) {\r\n joint0.nextJoint = joint1;\r\n if (joint1)\r\n joint1.previousJoint = joint0;\r\n if (joint0.curve1 && joint1 && !joint1.curve0)\r\n joint1.curve0 = joint0.curve1;\r\n else if (!joint0.curve1 && joint1 && joint1.curve0)\r\n joint0.curve1 = joint1.curve0;\r\n }\r\n /**\r\n * * If nextJoint and nextJoint.fraction0 are defined, return them.\r\n * * Otherwise return defaultValue\r\n */\r\n public nextJointFraction0(defaultValue: number): number {\r\n if (this.nextJoint && this.nextJoint.fraction0 !== undefined)\r\n return this.nextJoint.fraction0;\r\n return defaultValue;\r\n }\r\n private static addStrokes(destination: LineString3d, curve?: CurvePrimitive) {\r\n if (curve) {\r\n curve.emitStrokes(destination);\r\n }\r\n }\r\n private static addPoint(destination: LineString3d, point: Point3d) {\r\n if (destination.packedPoints.length > 0) {\r\n const pointA = destination.endPoint();\r\n if (!pointA.isAlmostEqual(point))\r\n destination.packedPoints.push(point);\r\n }\r\n }\r\n /** Append stroke points along the offset curve defined by the Joint chain to the destination line string. */\r\n public static collectStrokesFromChain(start: Joint, destination: LineString3d, maxTest: number = 100) {\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.addStrokes(destination, joint.jointCurve);\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n if (curve1) {\r\n if (!joint.jointCurve) {\r\n this.addPoint(destination, curve1.startPoint());\r\n }\r\n }\r\n this.addStrokes(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest,\r\n );\r\n }\r\n private static collectPrimitive(destination: CurvePrimitive[], primitive?: CurvePrimitive) {\r\n if (primitive) {\r\n if (destination.length > 0) {\r\n const pointA = destination[destination.length - 1].endPoint();\r\n const pointB = primitive.startPoint();\r\n if (!pointA.isAlmostEqual(pointB)) {\r\n destination.push(LineSegment3d.create(pointA, pointB));\r\n }\r\n }\r\n destination.push(primitive);\r\n }\r\n }\r\n private static adjustJointToPrimitives(joint: Joint) {\r\n const ls = joint.jointCurve;\r\n if (ls instanceof LineString3d) {\r\n if (joint.curve0) {\r\n const curvePoint = joint.curve0.endPoint();\r\n const jointPoint0 = ls.startPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint0))\r\n ls.packedPoints.setAtCheckedPointIndex(0, curvePoint);\r\n }\r\n if (joint.curve1) {\r\n const curvePoint = joint.curve1.startPoint();\r\n const jointPoint1 = ls.endPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint1))\r\n ls.packedPoints.setAtCheckedPointIndex(ls.packedPoints.length - 1, curvePoint);\r\n }\r\n }\r\n }\r\n /** Append CurvePrimitives along the offset curve defined by the Joint chain to the destination array. */\r\n public static collectCurvesFromChain(start: Joint | undefined, destination: CurvePrimitive[], maxTest: number = 100) {\r\n if (start === undefined)\r\n return;\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.adjustJointToPrimitives(joint);\r\n this.collectPrimitive(destination, joint.jointCurve);\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n this.collectPrimitive(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest,\r\n );\r\n }\r\n /**\r\n * Execute `joint.annotateJointMode()` at all joints on the chain to set some of the joints' attributes,\r\n * such as whether to extend both curves to intersection or to fill the gap between curves.\r\n */\r\n public static annotateChain(start: Joint | undefined, options: JointOptions, maxTest: number = 100) {\r\n if (start)\r\n Joint.visitJointsOnChain(start, (joint: Joint) => { joint.annotateJointMode(options); return true; }, maxTest);\r\n }\r\n /**\r\n * Visit joints on a chain.\r\n * * Terminates if `callback` returns `false`.\r\n * @param start first (and, for cyclic chain, final) joint.\r\n * @param callback function to call with each Joint as a single parameter.\r\n * @param maxTest\r\n */\r\n public static visitJointsOnChain(start: Joint, callback: (joint: Joint) => boolean, maxTest: number = 100): boolean {\r\n let joint: Joint | undefined = start;\r\n if (joint) {\r\n let numTest = 0;\r\n while (joint !== undefined) {\r\n if (numTest++ >= maxTest + 5) // allow extra things to happen\r\n return true;\r\n if (!callback(joint))\r\n return false;\r\n joint = joint.nextJoint;\r\n if (joint === start)\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n /** NOTE: no assumption on type of curve0, curve1 */\r\n private annotateExtension(options: JointOptions) {\r\n if (this.curve0 && this.curve1) {\r\n const ray0 = this.curve0.fractionToPointAndDerivative(1.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n ray0.direction.z = ray1.direction.z = 0.0; // xy-offset\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n if (intersection.detailA.fraction >= 0.0 && intersection.detailB.fraction <= 0.0) {\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Extend;\r\n const theta = ray0.getDirectionRef().angleToXY(ray1.getDirectionRef()); // angle between the 2 ray lines\r\n if (options.needArc(theta)) {\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc) {\r\n this.jointCurve = arc;\r\n return;\r\n }\r\n }\r\n const numChamferPoints = options.numChamferPoints(theta); // how many interior points in the linestring\r\n if (numChamferPoints <= 1) { // create sharp corner\r\n this.jointCurve = LineString3d.create(ray0.origin, intersection.detailA.point, ray1.origin);\r\n return;\r\n }\r\n if (numChamferPoints > 1) { // create chamfer corner (a line string)\r\n const radians0 = theta.radians;\r\n const numHalfStep = 2.0 * numChamferPoints;\r\n const halfStepRadians = radians0 / numHalfStep;\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc !== undefined) {\r\n const radialFraction = 1 / Math.cos(halfStepRadians);\r\n const jointCurve = LineString3d.create();\r\n this.jointCurve = jointCurve;\r\n jointCurve.addPoint(ray0.origin); // possibly extend segment or line string\r\n\r\n for (let i = 0; i < numChamferPoints; i++) {\r\n const arcFraction = (1 + 2 * i) / numHalfStep;\r\n jointCurve.addPoint(arc.fractionAndRadialFractionToPoint(arcFraction, radialFraction));\r\n }\r\n jointCurve.addPoint(ray1.origin); // possibly extend segment or line string.\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n // if there is no intersection between the 2 ray lines, fill the gap by a line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n /** Select the index at which summed fraction difference is smallest */\r\n private selectIntersectionIndexByFraction(\r\n fractionA: number, fractionB: number, intersections: CurveLocationDetailPair[],\r\n ): number {\r\n let index = -1;\r\n let aMin = Number.MAX_VALUE;\r\n for (let i = 0; i < intersections.length; i++) {\r\n const a = Math.abs(intersections[i].detailA.fraction - fractionA)\r\n + Math.abs(intersections[i].detailB.fraction - fractionB);\r\n if (a < aMin) {\r\n aMin = a;\r\n index = i;\r\n }\r\n }\r\n return index;\r\n }\r\n /**\r\n * Examine the adjacent geometry to set some of joint attributes:\r\n * * set JointMode: one of Cap, Extend, or Trim\r\n * * set fraction0 and fraction1 of intersection of curve0 and curve1\r\n * * set joint curve\r\n * * this REFERENCES curve0, curve1, fraction0, fraction1\r\n * * this does not reference nextJoint and previousJoint\r\n */\r\n public annotateJointMode(options: JointOptions): void {\r\n if (!this.curve0 && this.curve1) { // joint at the start of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction1 = 0.0;\r\n } else if (this.curve0 && !this.curve1) { // joint at the end of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction0 = 1.0;\r\n } else if (this.curve0 && this.curve1) { // joints at the middle of the chain\r\n if (this.curve0.endPoint().isAlmostEqualXY(this.curve1.startPoint())) { // joint between colinear xy-segments\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Trim;\r\n } else if (this.curve0 instanceof LineSegment3d && this.curve1 instanceof LineSegment3d) { // pair of lines\r\n const ray0 = this.curve0.fractionToPointAndDerivative(0.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n ray0.direction.z = ray1.direction.z = 0.0; // xy-offset\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection || intersection.approachType === CurveCurveApproachType.PerpendicularChord) {\r\n this.fraction0 = intersection.detailA.fraction;\r\n this.fraction1 = intersection.detailB.fraction;\r\n if (this.fraction0 >= 1.0 && this.fraction1 <= 0.0) { // need to extend\r\n this.annotateExtension(options);\r\n } else if (this.fraction0 < 1.0 && this.fraction1 > 0.0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n } else if (this.fraction0 > 1.0 && this.fraction1 > 1.0) { // need to fill gap with a single line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n } else { // generic pair of curves\r\n const intersections = CurveCurve.intersectionXYPairs(this.curve0, false, this.curve1, false);\r\n const intersectionIndex = this.selectIntersectionIndexByFraction(1.0, 0.0, intersections);\r\n if (intersectionIndex >= 0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n this.fraction0 = intersections[intersectionIndex].detailA.fraction;\r\n this.fraction1 = intersections[intersectionIndex].detailB.fraction;\r\n } else { // need to extend\r\n this.annotateExtension(options);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * * Examine the primitive trim fractions between each pair of joints.\r\n * * If trim fractions indicate the primitive must disappear, replace the joint pair by a new joint pointing at\r\n * surrounding primitives\r\n * @param start\r\n */\r\n public static removeDegeneratePrimitives(\r\n start: Joint, options: JointOptions, maxTest: number,\r\n ): { newStart: Joint, numJointRemoved: number } {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\"\\nENTER removeDegenerates\");\r\n */\r\n let jointA: Joint | undefined = start;\r\n let numRemoved = 0;\r\n const maxRemove = 1;\r\n let numTest = 0;\r\n if (jointA) {\r\n while (jointA !== undefined && numTest++ < maxTest) {\r\n const jointB = jointA.nextJoint;\r\n if (jointA\r\n && jointB\r\n && jointA.previousJoint\r\n && jointB.nextJoint\r\n && jointA.fraction1 !== undefined\r\n && jointB.fraction0 !== undefined\r\n ) {\r\n const f0 = jointA.fraction1;\r\n const f1 = jointB.fraction0;\r\n const g0 = jointB.fraction1;\r\n const g1 = jointB.nextJoint.fraction0;\r\n // f0 and f1 are fractions on the single primitive between these joints.\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\"joint candidate\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointA.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointB.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(\"FRACTIONS \", { fA1: f0, fB0: f1 });\r\n }\r\n */\r\n const eliminateF = f0 >= f1 || f0 > 1.0;\r\n const eliminateG = (g0 !== undefined && g0 > 1.0) || (g0 !== undefined && g1 !== undefined && g0 >= g1);\r\n if (eliminateF && eliminateG) {\r\n const jointC = jointB.nextJoint;\r\n const newJoint: Joint = new Joint(jointA.curve0, jointC.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointC.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n if (newJoint.nextJoint)\r\n newJoint.nextJoint.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW DOUBLE CUT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n } else if (eliminateF) {\r\n const newJoint: Joint = new Joint(jointA.curve0, jointB.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointB.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n newJoint.nextJoint!.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW JOINT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n numRemoved++;\r\n if (jointA === start)\r\n start = newJoint;\r\n jointA = newJoint;\r\n if (numRemoved >= maxRemove) {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\" EXIT removeDegenerates at maxRemove\\n\");\r\n */\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n }\r\n }\r\n jointA = jointA.nextJoint;\r\n if (jointA === start)\r\n break;\r\n }\r\n }\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire xy-offset.\r\n * @internal\r\n */\r\nexport class PolygonWireOffsetContext {\r\n /** Construct a context. */\r\n public constructor() { }\r\n private static _unitAlong = Vector3d.create();\r\n private static _unitPerp = Vector3d.create();\r\n private static _offsetA = Point3d.create();\r\n private static _offsetB = Point3d.create();\r\n // Construct a single offset from base points\r\n private static createOffsetSegment(\r\n basePointA: Point3d, basePointB: Point3d, distance: number,\r\n ): CurvePrimitive | undefined {\r\n Vector3d.createStartEnd(basePointA, basePointB, this._unitAlong);\r\n this._unitAlong.z = 0.0; // xy-offset\r\n if (this._unitAlong.normalizeInPlace()) {\r\n this._unitAlong.rotate90CCWXY(this._unitPerp);\r\n const segment = LineSegment3d.create(\r\n basePointA.plusScaled(this._unitPerp, distance, this._offsetA),\r\n basePointB.plusScaled(this._unitPerp, distance, this._offsetB),\r\n );\r\n CurveChainWireOffsetContext.applyBasePoints(segment, basePointA.clone(), basePointB.clone());\r\n return segment;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct a wire (not area) that is offset from given polyline or polygon.\r\n * * For best results, points should be in a horizontal plane because z-coordinates are ignored.\r\n * * This is a simple wire offset (in the form of a line string), not an area.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * See [[JointOptions]] class doc for offset construction rules.\r\n * @param points a single loop or path\r\n * @param wrap true to offset the wraparound joint. Assumes first = last point.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or JointOptions\r\n * object.\r\n */\r\n public constructPolygonWireXYOffset(\r\n points: Point3d[], wrap: boolean, leftOffsetDistanceOrOptions: number | JointOptions,\r\n ): CurveChain | undefined {\r\n if (wrap && !points[0].isAlmostEqual(points[points.length - 1]))\r\n wrap = false; // no wrap possible for polylines\r\n // create raw offset segments as a linked list of Joints, starting with joint0\r\n const options = JointOptions.create(leftOffsetDistanceOrOptions);\r\n const numPoints = points.length;\r\n let fragment0: CurvePrimitive | undefined;\r\n let joint0, previousJoint: Joint | undefined;\r\n for (let i = 0; i + 1 < numPoints; ++i) {\r\n if (!previousJoint) { // start the linked list at the first nontrivial xy-segment\r\n if (fragment0 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance))\r\n previousJoint = joint0 = new Joint(undefined, fragment0, points[i]);\r\n } else {\r\n const fragment1 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance);\r\n if (fragment1) { // append the next nontrivial xy-segment\r\n const newJoint = new Joint(fragment0, fragment1, points[i]);\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n }\r\n if (!fragment0 || !previousJoint || !joint0)\r\n return undefined; // no edge with positive xy-length\r\n const lastJoint = wrap ? joint0 : new Joint(fragment0, undefined, points[numPoints - 1]);\r\n Joint.link(previousJoint, lastJoint);\r\n Joint.annotateChain(joint0, options, numPoints);\r\n // make limited passes through the Joint chain until no self-intersections are removed\r\n for (let pass = 0; pass++ < 5;) {\r\n const state = Joint.removeDegeneratePrimitives(joint0, options, numPoints);\r\n joint0 = state.newStart;\r\n if (state.numJointRemoved === 0)\r\n break;\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" POST REMOVE DEGENERATES \" + state.numJointRemoved);\r\n Joint.visitJointsOnChain(joint0, (joint: Joint) => { GeometryCoreTestIO.consoleLog(prettyPrint(joint.shallowExtract())); return true; });\r\n }\r\n */\r\n }\r\n const chain = LineString3d.create();\r\n Joint.collectStrokesFromChain(joint0, chain, numPoints); // compute offset corners (by extension/trim)\r\n const n = chain.packedPoints.length;\r\n if (n > 1) {\r\n if (chain.packedPoints.front()!.isAlmostEqual(chain.packedPoints.back()!))\r\n return Loop.create(chain);\r\n else\r\n return Path.create(chain);\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire xy-offset from a Path or Loop of CurvePrimitives\r\n * @internal\r\n */\r\nexport class CurveChainWireOffsetContext {\r\n /** construct a context. */\r\n public constructor() { }\r\n /**\r\n * Annotate a CurvePrimitive with properties `baseCurveStart` and `baseCurveEnd`.\r\n * @param cp curve primitive to annotate\r\n * @param startPoint optional start point\r\n * @param endPoint optional end point\r\n * @return the input CurvePrimitive with annotations\r\n */\r\n public static applyBasePoints(\r\n cp: CurvePrimitive | undefined, startPoint: Point3d | undefined, endPoint: Point3d | undefined,\r\n ): CurvePrimitive | undefined {\r\n if (cp !== undefined) {\r\n if (startPoint !== undefined)\r\n (cp as any).baseCurveStart = startPoint;\r\n if (endPoint !== undefined)\r\n (cp as any).baseCurveEnd = endPoint;\r\n }\r\n return cp;\r\n }\r\n /**\r\n * Create the offset of a single curve primitive as viewed in the xy-plane (ignoring z).\r\n * * Each primitive may be labeled (as an `any` object) with start or end point of base curve:\r\n * * `(primitive as any).baseCurveStart: Point3d`\r\n * * `(primitive as any).baseCurveEnd: Point3d`\r\n * @param curve primitive to offset\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object\r\n */\r\n public static createSingleOffsetPrimitiveXY(\r\n curve: CurvePrimitive, offsetDistanceOrOptions: number | OffsetOptions,\r\n ): CurvePrimitive | CurvePrimitive[] | undefined {\r\n const offset = curve.constructOffsetXY(offsetDistanceOrOptions);\r\n if (offset === undefined)\r\n return undefined;\r\n // decorate each offset with its base curve's endpoints\r\n if (Array.isArray(offset)) {\r\n const basePrims = curve.collectCurvePrimitives(undefined, true, true);\r\n if (basePrims.length !== offset.length)\r\n return undefined; // unexpected aggregate curve type!\r\n for (let i = 0; i < basePrims.length; ++i)\r\n this.applyBasePoints(offset[i], basePrims[i].startPoint(), basePrims[i].endPoint());\r\n return offset;\r\n }\r\n return this.applyBasePoints(offset, curve.startPoint(), curve.endPoint());\r\n }\r\n /**\r\n * Construct curves that are offset from a Path or Loop as viewed in xy-plane (ignoring z).\r\n * * The construction will remove \"some\" local effects of features smaller than the offset distance, but will\r\n * not detect self intersection among widely separated edges.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/Offset\r\n * @param curves base curves.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object.\r\n */\r\n public static constructCurveXYOffset(\r\n curves: Path | Loop, offsetDistanceOrOptions: number | JointOptions | OffsetOptions,\r\n ): CurveCollection | undefined {\r\n const wrap: boolean = curves instanceof Loop;\r\n const offsetOptions = OffsetOptions.create(offsetDistanceOrOptions);\r\n const simpleOffsets: CurvePrimitive[] = [];\r\n /** traverse primitives (children of curves) and create simple offsets of each primitive as an array */\r\n for (const c of curves.children) {\r\n const c1 = CurveChainWireOffsetContext.createSingleOffsetPrimitiveXY(c, offsetOptions);\r\n if (c1 === undefined) {\r\n // bad; maybe arc to inside?\r\n } else if (c1 instanceof CurvePrimitive) {\r\n simpleOffsets.push(c1);\r\n } else if (Array.isArray(c1)) {\r\n for (const c2 of c1) {\r\n if (c2 instanceof CurvePrimitive)\r\n simpleOffsets.push(c2);\r\n }\r\n }\r\n }\r\n /** create joints between array elements to make offsets as a linked list (joint0) */\r\n let fragment0;\r\n let newJoint;\r\n let previousJoint;\r\n let joint0;\r\n for (const fragment1 of simpleOffsets) {\r\n if (fragment1) {\r\n newJoint = new Joint(fragment0, fragment1, fragment1.fractionToPoint(0.0));\r\n if (newJoint !== undefined)\r\n if (joint0 === undefined)\r\n joint0 = newJoint;\r\n if (previousJoint)\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n if (joint0 && previousJoint && curves instanceof Loop)\r\n Joint.link(previousJoint, joint0);\r\n /** annotateChain sets some of the joints attributes (including how to extend curves or fill the gap between curves) */\r\n const numOffset = simpleOffsets.length;\r\n Joint.annotateChain(joint0, offsetOptions.jointOptions, numOffset);\r\n /** turn the Joint linked list into a CurveCollection. trimming is done in collectCurvesFromChain */\r\n const outputCurves: CurvePrimitive[] = [];\r\n Joint.collectCurvesFromChain(joint0, outputCurves, numOffset);\r\n return RegionOps.createLoopPathOrBagOfCurves(outputCurves, wrap, true);\r\n }\r\n}\r\n"]}
|