@itwin/core-geometry 4.2.0-dev.7 → 4.2.0-dev.8
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/clipping/ClipPlane.d.ts +10 -7
- package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js +5 -3
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.d.ts +16 -4
- package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +77 -2
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +3 -2
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +3 -2
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -2
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +2 -2
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.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/CoordinateXYZ.d.ts +15 -15
- package/lib/cjs/curve/CoordinateXYZ.d.ts.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js +15 -15
- package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
- package/lib/cjs/curve/CurveChain.d.ts +4 -2
- package/lib/cjs/curve/CurveChain.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChain.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +1 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts +18 -7
- package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurveCloseApproachXY.js +17 -5
- package/lib/cjs/curve/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.d.ts +2 -2
- package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.js +12 -10
- package/lib/cjs/curve/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/Path.d.ts +1 -1
- package/lib/cjs/curve/Path.d.ts.map +1 -1
- package/lib/cjs/curve/Path.js +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts +29 -25
- package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +42 -29
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.d.ts +10 -7
- package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPlane.js +5 -3
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.d.ts +16 -4
- package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +77 -2
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +3 -2
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +3 -2
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -2
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +2 -2
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.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/CoordinateXYZ.d.ts +15 -15
- package/lib/esm/curve/CoordinateXYZ.d.ts.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js +15 -15
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChain.d.ts +4 -2
- package/lib/esm/curve/CurveChain.d.ts.map +1 -1
- package/lib/esm/curve/CurveChain.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +1 -1
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts +18 -7
- package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurveCloseApproachXY.js +17 -5
- package/lib/esm/curve/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/CurveCurveIntersectXY.d.ts +2 -2
- package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurveIntersectXY.js +12 -10
- package/lib/esm/curve/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/Path.d.ts +1 -1
- package/lib/esm/curve/Path.d.ts.map +1 -1
- package/lib/esm/curve/Path.js +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts +29 -25
- package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +42 -29
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurveCurveIntersectXY.js","sourceRoot":"","sources":["../../../src/curve/CurveCurveIntersectXY.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 { BezierCurve3dH } from \"../bspline/BezierCurve3dH\";\r\nimport { BezierCurveBase } from \"../bspline/BezierCurveBase\";\r\nimport { BSplineCurve3d, BSplineCurve3dBase } from \"../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { CoincidentGeometryQuery } from \"../geometry3d/CoincidentGeometryOps\";\r\nimport { NullGeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { GrowableFloat64Array } from \"../geometry3d/GrowableFloat64Array\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Vector2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { UnivariateBezier } from \"../numerics/BezierPolynomials\";\r\nimport { Newton2dUnboundedWithDerivative, NewtonEvaluatorRRtoRRD } from \"../numerics/Newton\";\r\nimport { AnalyticRoots, SmallSystem, TrigPolynomial } from \"../numerics/Polynomials\";\r\nimport { Arc3d } from \"./Arc3d\";\r\nimport { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from \"./CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { LineSegment3d } from \"./LineSegment3d\";\r\nimport { LineString3d } from \"./LineString3d\";\r\n\r\n// cspell:word XYRR\r\n\r\n/**\r\n * Private class for refining bezier-bezier intersections.\r\n * * The inputs are assumed pre-transformed so that the target condition is to match x and y coordinates.\r\n * @internal\r\n */\r\nexport class BezierBezierIntersectionXYRRToRRD extends NewtonEvaluatorRRtoRRD {\r\n private _curveA: BezierCurveBase;\r\n private _curveB: BezierCurveBase;\r\n constructor(curveA: BezierCurveBase, curveB: BezierCurveBase) {\r\n super();\r\n this._curveA = curveA;\r\n this._curveB = curveB;\r\n this._rayA = Ray3d.createZero();\r\n this._rayB = Ray3d.createZero();\r\n\r\n }\r\n private _rayA: Ray3d;\r\n private _rayB: Ray3d;\r\n public evaluate(fractionA: number, fractionB: number): boolean {\r\n this._curveA.fractionToPointAndDerivative(fractionA, this._rayA);\r\n this._curveB.fractionToPointAndDerivative(fractionB, this._rayB);\r\n this.currentF.setOriginAndVectorsXYZ(\r\n this._rayB.origin.x - this._rayA.origin.x, this._rayB.origin.y - this._rayA.origin.y, 0.0,\r\n -this._rayA.direction.x, -this._rayA.direction.y, 0.0,\r\n this._rayB.direction.x, this._rayB.direction.y, 0.0);\r\n return true;\r\n }\r\n}\r\n/**\r\n * Data bundle for a pair of arrays of CurveLocationDetail structures such as produced by CurveCurve,IntersectXY and\r\n * CurveCurve.ClosestApproach\r\n * @public\r\n */\r\nexport class CurveLocationDetailArrayPair {\r\n /** first array of details ... */\r\n public dataA: CurveLocationDetail[];\r\n /** second array of details ... */\r\n public dataB: CurveLocationDetail[];\r\n public constructor() {\r\n this.dataA = [];\r\n this.dataB = [];\r\n }\r\n}\r\n/**\r\n * Handler class for XY intersections between _geometryB and another geometry.\r\n * * **NOTE:** GeometryQuery input (_geometryB) should really be AnyCurve.\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 CurveCurveIntersectXY extends NullGeometryHandler {\r\n private _extendA: boolean;\r\n private _geometryB: GeometryQuery | undefined;\r\n private _extendB: boolean;\r\n private _results!: CurveLocationDetailPair[];\r\n private _worldToLocalPerspective: Matrix4d | undefined;\r\n private _worldToLocalAffine: Transform | undefined;\r\n private _coincidentGeometryContext: CoincidentGeometryQuery;\r\n\r\n private static _workVector2dA = Vector2d.create();\r\n private static _workPointA0H = Point4d.create();\r\n private static _workPointA1H = Point4d.create();\r\n private static _workPointB0H = Point4d.create();\r\n private static _workPointB1H = Point4d.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 private static _workPointA0 = Point3d.create();\r\n private static _workPointA1 = Point3d.create();\r\n private static _workPointB0 = Point3d.create();\r\n private static _workPointB1 = Point3d.create();\r\n private _xyzwA0?: Point4d;\r\n private _xyzwA1?: Point4d;\r\n private _xyzwPlane?: Point4d;\r\n private _xyzwB?: Point4d;\r\n\r\n private reinitialize() {\r\n this._results = [];\r\n }\r\n /**\r\n * @param worldToLocal optional transform (possibly perspective) to project to xy plane for intersection.\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 * @param tolerance optional distance tolerance for coincidence\r\n */\r\n public constructor(\r\n worldToLocal: Matrix4d | undefined,\r\n extendA: boolean,\r\n geometryB: GeometryQuery | undefined,\r\n extendB: boolean,\r\n tolerance: number = Geometry.smallMetricDistance,\r\n ) {\r\n super();\r\n this._extendA = extendA;\r\n this._geometryB = geometryB;\r\n this._extendB = extendB;\r\n this._worldToLocalPerspective = undefined;\r\n this._worldToLocalAffine = undefined;\r\n if (worldToLocal !== undefined && !worldToLocal.isIdentity()) {\r\n this._worldToLocalAffine = worldToLocal.asTransform;\r\n if (!this._worldToLocalAffine)\r\n this._worldToLocalPerspective = worldToLocal.clone();\r\n }\r\n this._coincidentGeometryContext = CoincidentGeometryQuery.create(tolerance);\r\n this.reinitialize();\r\n }\r\n /** Reset the geometry and flags, leaving all other parts unchanged (and preserving accumulated intersections) */\r\n public resetGeometry(extendA: boolean, geometryB: GeometryQuery, extendB: boolean): void {\r\n this._extendA = extendA;\r\n this._geometryB = geometryB;\r\n this._extendB = extendB;\r\n }\r\n private acceptFraction(extend0: boolean, fraction: number, extend1: boolean, fractionTol: number = 1.0e-12): boolean {\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 * Test the fraction by strict parameter, but allow toleranced distance test at ends.\r\n * @param tolerance optional distance tolerance to check proximity to start/end point\r\n */\r\n private acceptFractionOnLine(\r\n extend0: boolean,\r\n fraction: number,\r\n extend1: boolean,\r\n pointA: Point3d,\r\n pointB: Point3d,\r\n tolerance: number = Geometry.smallMetricDistance,\r\n ) {\r\n if (!extend0 && fraction < 0) {\r\n return Geometry.isDistanceWithinTol(fraction * pointA.distanceXY(pointB), tolerance);\r\n } else if (!extend1 && fraction > 1.0)\r\n return Geometry.isDistanceWithinTol((fraction - 1.0) * pointA.distanceXY(pointB), tolerance);\r\n return true;\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.reinitialize();\r\n return result;\r\n }\r\n private sameCurveAndFraction(cp: CurvePrimitive, fraction: number, detail: CurveLocationDetail): boolean {\r\n return cp === detail.curve && Geometry.isAlmostEqualNumber(fraction, detail.fraction);\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 recordPointWithLocalFractions(\r\n localFractionA: number,\r\n cpA: CurvePrimitive,\r\n fractionA0: number,\r\n fractionA1: number,\r\n localFractionB: number, // Computed intersection fraction\r\n cpB: CurvePrimitive,\r\n fractionB0: number,\r\n fractionB1: number,\r\n reversed: boolean,\r\n intervalDetails?: undefined | CurveLocationDetailPair,\r\n ) {\r\n let globalFractionA, globalFractionB;\r\n let globalFractionA1, globalFractionB1;\r\n const isInterval = intervalDetails !== undefined &&\r\n intervalDetails.detailA.hasFraction1 && intervalDetails.detailB.hasFraction1;\r\n if (isInterval) {\r\n globalFractionA = Geometry.interpolate(fractionA0, intervalDetails.detailA.fraction, fractionA1);\r\n globalFractionB = Geometry.interpolate(fractionB0, intervalDetails.detailB.fraction, fractionB1);\r\n globalFractionA1 = Geometry.interpolate(fractionA0, intervalDetails.detailA.fraction1!, fractionA1);\r\n globalFractionB1 = Geometry.interpolate(fractionB0, intervalDetails.detailB.fraction1!, fractionB1);\r\n } else {\r\n globalFractionA = globalFractionA1 = Geometry.interpolate(fractionA0, localFractionA, fractionA1);\r\n globalFractionB = globalFractionB1 = Geometry.interpolate(fractionB0, localFractionB, fractionB1);\r\n }\r\n // ignore duplicate of most recent point . ..\r\n const numPrevious = this._results.length;\r\n if (numPrevious > 0 && !isInterval) {\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 (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailB) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailA))\r\n return;\r\n } else {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailA) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailB))\r\n return;\r\n }\r\n }\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(cpA,\r\n globalFractionA, cpA.fractionToPoint(globalFractionA));\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(cpB,\r\n globalFractionB, cpB.fractionToPoint(globalFractionB));\r\n if (isInterval) {\r\n detailA.captureFraction1Point1(globalFractionA1, cpA.fractionToPoint(globalFractionA1));\r\n detailB.captureFraction1Point1(globalFractionB1, cpB.fractionToPoint(globalFractionB1));\r\n } else {\r\n detailA.setIntervalRole(CurveIntervalRole.isolated);\r\n detailB.setIntervalRole(CurveIntervalRole.isolated);\r\n }\r\n if (reversed) {\r\n this._results.push(new CurveLocationDetailPair(detailB, detailA));\r\n } else {\r\n this._results.push(new CurveLocationDetailPair(detailA, detailB));\r\n }\r\n }\r\n /**\r\n * Emit recordPoint for multiple pairs (on full curve!)\r\n * @param cpA first curve primitive (possibly different from curve in detailA, but fraction compatible)\r\n * @param cpB second curve primitive (possibly different from curve in detailA, but fraction compatible)\r\n * @param pairs array of pairs\r\n * @param reversed true to have order reversed in final structures.\r\n */\r\n public recordPairs(\r\n cpA: CurvePrimitive, cpB: CurvePrimitive, pairs: CurveLocationDetailPair[] | undefined, reversed: boolean,\r\n ): void {\r\n if (pairs !== undefined) {\r\n for (const p of pairs) {\r\n this.recordPointWithLocalFractions(p.detailA.fraction, cpA, 0, 1,\r\n p.detailB.fraction, cpB, 0, 1, reversed, p);\r\n }\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 = CurveCurveIntersectXY._workVector2dA;\r\n // Problem: Normal practice is to do the (quick, simple) transverse intersection first\r\n // But the transverse intersector notion of coincidence is based on the determinant ratios, which are hard\r\n // to relate to physical tolerance.\r\n // So do the overlap first. This should do a quick exit in non-coincident case.\r\n const overlap = this._coincidentGeometryContext.coincidentSegmentRangeXY(pointA0, pointA1, pointB0, pointB1);\r\n if (overlap) {\r\n this.recordPointWithLocalFractions(\r\n overlap.detailA.fraction, cpA, fractionA0, fractionA1,\r\n overlap.detailB.fraction, cpB, fractionB0, fractionB1, reversed, overlap);\r\n } else if (SmallSystem.lineSegment3dXYTransverseIntersectionUnbounded(\r\n pointA0, pointA1,\r\n pointB0, pointB1, uv)) {\r\n if (this.acceptFractionOnLine(extendA0, uv.x, extendA1, pointA0, pointA1, this._coincidentGeometryContext.tolerance)\r\n && this.acceptFractionOnLine(extendB0, uv.y, extendB1, pointB0, pointB1, this._coincidentGeometryContext.tolerance)) {\r\n this.recordPointWithLocalFractions(uv.x, cpA, fractionA0, fractionA1, uv.y, cpB, fractionB0, fractionB1, reversed);\r\n }\r\n }\r\n }\r\n // intersection of PROJECTED homogeneous segments ... assumes caller knows the _worldToLocal is present\r\n private computeSegmentSegment3DH(\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 hA0 = CurveCurveIntersectXY._workPointA0H;\r\n const hA1 = CurveCurveIntersectXY._workPointA1H;\r\n const hB0 = CurveCurveIntersectXY._workPointB0H;\r\n const hB1 = CurveCurveIntersectXY._workPointB1H;\r\n this._worldToLocalPerspective!.multiplyPoint3d(pointA0, 1, hA0);\r\n this._worldToLocalPerspective!.multiplyPoint3d(pointA1, 1, hA1);\r\n this._worldToLocalPerspective!.multiplyPoint3d(pointB0, 1, hB0);\r\n this._worldToLocalPerspective!.multiplyPoint3d(pointB1, 1, hB1);\r\n const fractionAB = SmallSystem.lineSegment3dHXYTransverseIntersectionUnbounded(hA0, hA1, hB0, hB1);\r\n if (fractionAB !== undefined) {\r\n const fractionA = fractionAB.x;\r\n const fractionB = fractionAB.y;\r\n if (this.acceptFraction(extendA0, fractionA, extendA1) && this.acceptFraction(extendB0, fractionB, extendB1)) {\r\n // final fraction acceptance uses original world points, with perspective-aware fractions\r\n this.recordPointWithLocalFractions(fractionA, cpA, fractionA0, fractionA1,\r\n fractionB, cpB, fractionB0, fractionB1, reversed);\r\n }\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 if (this._worldToLocalAffine) {\r\n // non-perspective projection\r\n CurveCurveIntersectXY.setTransformedWorkPoints(this._worldToLocalAffine, pointA0, pointA1, pointB0, pointB1);\r\n this.computeSegmentSegment3D(\r\n cpA, extendA0, CurveCurveIntersectXY._workPointA0, fractionA0, CurveCurveIntersectXY._workPointA1, fractionA1, extendA1,\r\n cpB, extendB0, CurveCurveIntersectXY._workPointB0, fractionB0, CurveCurveIntersectXY._workPointB1, fractionB1, extendB1,\r\n reversed,\r\n );\r\n } else if (this._worldToLocalPerspective) {\r\n this.computeSegmentSegment3DH(\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 } else {\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 // Caller accesses data from a linestring or segment and passes it here.\r\n // (The line segment in question might be (a) a full line segment or (b) a fragment within a linestring. The fraction and extend parameters\r\n // 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 // Arc: X = C + cU + sV\r\n // Line: contains points A0,A1\r\n // Arc point colinear with line if det (A0, A1, X) = 0\r\n // with homogeneous xyw points and vectors.\r\n // With equational X: det (A0, A1, C) + c det (A0, A1,U) + s det (A0, A1, V) = 0.\r\n // solve for theta.\r\n // evaluate points.\r\n // project back to line.\r\n if (this._worldToLocalPerspective) {\r\n const data = arc.toTransformedPoint4d(this._worldToLocalPerspective);\r\n const pointA0H = this._worldToLocalPerspective.multiplyPoint3d(pointA0, 1);\r\n const pointA1H = this._worldToLocalPerspective.multiplyPoint3d(pointA1, 1);\r\n const alpha = Geometry.tripleProductPoint4dXYW(pointA0H, pointA1H, data.center);\r\n const beta = Geometry.tripleProductPoint4dXYW(pointA0H, pointA1H, data.vector0);\r\n const gamma = Geometry.tripleProductPoint4dXYW(pointA0H, pointA1H, data.vector90);\r\n const cosines = new GrowableFloat64Array(2);\r\n const sines = new GrowableFloat64Array(2);\r\n const radians = new GrowableFloat64Array(2);\r\n const numRoots = AnalyticRoots.appendImplicitLineUnitCircleIntersections(alpha, beta, gamma, cosines, sines, radians);\r\n for (let i = 0; i < numRoots; i++) {\r\n const arcPoint = data.center.plus2Scaled(\r\n data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i),\r\n );\r\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians.atUncheckedIndex(i));\r\n const lineFraction = SmallSystem.lineSegment3dHXYClosestPointUnbounded(pointA0H, pointA1H, arcPoint);\r\n if (lineFraction !== undefined && this.acceptFraction(extendA0, lineFraction, extendA1) &&\r\n this.acceptFraction(extendB0, arcFraction, extendB1)) {\r\n this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1,\r\n arcFraction, arc, 0, 1, reversed);\r\n }\r\n }\r\n } else {\r\n const data = arc.toTransformedVectors(this._worldToLocalAffine);\r\n let pointA0Local = pointA0;\r\n let pointA1Local = pointA1;\r\n if (this._worldToLocalAffine) {\r\n pointA0Local = this._worldToLocalAffine.multiplyPoint3d(pointA0);\r\n pointA1Local = this._worldToLocalAffine.multiplyPoint3d(pointA1);\r\n }\r\n const alpha = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.center, 1);\r\n const beta = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector0, 0);\r\n const gamma = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector90, 0);\r\n const cosines = new GrowableFloat64Array(2);\r\n const sines = new GrowableFloat64Array(2);\r\n const radians = new GrowableFloat64Array(2);\r\n const numRoots = AnalyticRoots.appendImplicitLineUnitCircleIntersections(\r\n alpha, beta, gamma, cosines, sines, radians,\r\n );\r\n const lineFractionTol = 1.0e-10;\r\n const arcFractionTol = 1.0e-7;\r\n for (let i = 0; i < numRoots; i++) {\r\n const arcPoint = data.center.plus2Scaled(\r\n data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i),\r\n );\r\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians.atUncheckedIndex(i));\r\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);\r\n if (lineFraction !== undefined && this.acceptFraction(extendA0, lineFraction, extendA1, lineFractionTol)\r\n && this.acceptFraction(extendB0, arcFraction, extendB1, arcFractionTol)) {\r\n this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1,\r\n arcFraction, arc, 0, 1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n // Caller accesses data from two arcs.\r\n // each matrix has [U V C] in (x,y,w) form from projection.\r\n // invert the projection matrix matrixA.\r\n // apply the inverse to matrixB. Then arc b is an ellipse in the circular space of A\r\n private dispatchArcArcThisOrder(\r\n cpA: Arc3d,\r\n matrixA: Matrix3d, // homogeneous xyw projection !!!\r\n extendA: boolean,\r\n cpB: Arc3d,\r\n matrixB: Matrix3d, // homogeneous xyw projection !!!\r\n extendB: boolean,\r\n reversed: boolean,\r\n ): void {\r\n const inverseA = matrixA.inverse();\r\n if (inverseA) {\r\n const localB = inverseA.multiplyMatrixMatrix(matrixB); // localB->localA transform\r\n const ellipseRadians: number[] = [];\r\n const circleRadians: number[] = [];\r\n TrigPolynomial.solveUnitCircleHomogeneousEllipseIntersection(\r\n localB.coffs[2], localB.coffs[5], localB.coffs[8], // center xyw\r\n localB.coffs[0], localB.coffs[3], localB.coffs[6], // vector0 xyw\r\n localB.coffs[1], localB.coffs[4], localB.coffs[7], // vector90 xyw\r\n ellipseRadians, circleRadians);\r\n for (let i = 0; i < ellipseRadians.length; i++) {\r\n const fractionA = cpA.sweep.radiansToSignedPeriodicFraction(circleRadians[i]);\r\n const fractionB = cpB.sweep.radiansToSignedPeriodicFraction(ellipseRadians[i]);\r\n // hm .. do we really need to check the fractions? We know they are internal to the beziers\r\n if (this.acceptFraction(extendA, fractionA, extendA) && this.acceptFraction(extendB, fractionB, extendB)) {\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, extendA: boolean, cpB: Arc3d, extendB: boolean, reversed: boolean,\r\n ): void {\r\n // Arc: X = C + cU + sV\r\n // Line: contains points A0,A1\r\n // Arc point colinear with line if det (A0, A1, X) = 0\r\n // with homogeneous xyw points and vectors.\r\n // With equational X: det (A0, A1, C) + c det (A0, A1,U) + s det (A0, A1, V) = 0.\r\n // solve for theta.\r\n // evaluate points.\r\n // project back to line.\r\n let matrixA: Matrix3d;\r\n let matrixB: Matrix3d;\r\n if (this._worldToLocalPerspective) {\r\n const dataA = cpA.toTransformedPoint4d(this._worldToLocalPerspective);\r\n const dataB = cpB.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 matrixB = Matrix3d.createColumnsXYW(\r\n dataB.vector0, dataB.vector0.w, dataB.vector90, dataA.vector90.w, dataB.center, dataB.center.w,\r\n );\r\n } else {\r\n const dataA = cpA.toTransformedVectors(this._worldToLocalAffine);\r\n const dataB = cpB.toTransformedVectors(this._worldToLocalAffine);\r\n matrixA = Matrix3d.createColumnsXYW(dataA.vector0, 0, dataA.vector90, 0, dataA.center, 1);\r\n matrixB = Matrix3d.createColumnsXYW(dataB.vector0, 0, dataB.vector90, 0, dataB.center, 1);\r\n }\r\n const conditionA = matrixA.conditionNumber();\r\n const conditionB = matrixB.conditionNumber();\r\n if (conditionA > conditionB)\r\n this.dispatchArcArcThisOrder(cpA, matrixA, extendA, cpB, matrixB, extendB, reversed);\r\n else\r\n this.dispatchArcArcThisOrder(cpB, matrixB, extendB, cpA, matrixA, extendA, !reversed);\r\n // overlap handling .. perspective is not handled . . .\r\n if (!this._coincidentGeometryContext) {\r\n // do nothing\r\n } else if (this._worldToLocalPerspective) {\r\n // do nothing\r\n } else if (this._worldToLocalAffine) {\r\n // do nothing\r\n } else {\r\n const pairs = this._coincidentGeometryContext.coincidentArcIntersectionXY(cpA, cpB, true);\r\n if (pairs !== undefined)\r\n this.recordPairs(cpA, cpB, pairs, reversed);\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 cpA: Arc3d, extendA: boolean, cpB: BSplineCurve3d, extendB: boolean, reversed: boolean,\r\n ): void {\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.radiansToSignedPeriodicFraction(Math.atan2(s, c));\r\n if (this.acceptFraction(extendA, arcFraction, extendA) &&\r\n this.acceptFraction(extendB, fractionB, extendB)) {\r\n this.recordPointWithLocalFractions(arcFraction, cpA, 0, 1,\r\n fractionB, cpB, 0, 1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\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 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 ): void {\r\n if (!this._xyzwA0) this._xyzwA0 = Point4d.create();\r\n if (!this._xyzwA1) this._xyzwA1 = Point4d.create();\r\n if (!this._xyzwPlane) this._xyzwPlane = Point4d.create();\r\n if (!this._xyzwB) this._xyzwB = Point4d.create();\r\n /*\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.radiansToSignedPeriodicFraction(Math.atan2(s, c));\r\n if (this.acceptFraction(extendA, arcFraction, extendA) && this.acceptFraction(extendB, fractionB, extendB)) {\r\n this.recordPointWithLocalFractions(arcFraction, cpA, 0, 1,\r\n 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;\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 let bezierBFraction = r;\r\n bezierB.fractionToPoint4d(bezierBFraction, this._xyzwB);\r\n const segmentAFraction = SmallSystem.lineSegment3dHXYClosestPointUnbounded(\r\n this._xyzwA0, this._xyzwA1, this._xyzwB,\r\n );\r\n if (segmentAFraction && Geometry.isIn01WithTolerance(segmentAFraction, intervalTolerance)) {\r\n let bezierAFraction = Geometry.interpolate(f0, segmentAFraction, f1);\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(bcurveAFraction, bcurveA, 0, 1,\r\n bcurveBFraction, bcurveB, 0, 1, reversed);\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 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 * 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 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 // 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 extendB: boolean,\r\n reversed: boolean,\r\n ): void {\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 &&\r\n this.acceptFraction(extendA0, lineFraction, extendA1) &&\r\n this.acceptFraction(extendB, fractionB, extendB)) {\r\n this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1,\r\n fractionB, bcurve, 0, 1, reversed);\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, extendA: boolean, curveB: BSplineCurve3d, extendB: boolean, reversed: boolean,\r\n ): any {\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 = CurveCurveIntersectXY._workPointA0;\r\n const pointA1 = CurveCurveIntersectXY._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 && extendA, pointA0, fA0, pointA1, fA1, (iA + 1) === numA && extendA,\r\n curveB, extendB, reversed);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Detail computation for segment intersecting linestring. */\r\n public computeSegmentLineString(\r\n lsA: LineSegment3d, extendA: boolean, lsB: LineString3d, extendB: boolean, reversed: boolean,\r\n ): any {\r\n const pointA0 = lsA.point0Ref;\r\n const pointA1 = lsA.point1Ref;\r\n const pointB0 = CurveCurveIntersectXY._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXY._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, extendA, pointA0, 0.0, pointA1, 1.0, extendA,\r\n lsB, ib === 1 && extendB, pointB0, fB0, pointB1, fB1, (ib + 1) === numB && extendB,\r\n reversed);\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, extendA: boolean, lsB: LineString3d, extendB: boolean, reversed: boolean,\r\n ): any {\r\n const pointB0 = CurveCurveIntersectXY._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXY._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 && extendB, pointB0, fB0, pointB1, fB1,\r\n (ib + 1) === numB && extendB, arcA, extendA, extendA, !reversed,\r\n );\r\n }\r\n }\r\n return undefined;\r\n }\r\n private static setTransformedWorkPoints(\r\n transform: Transform, pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d,\r\n ): void {\r\n transform.multiplyPoint3d(pointA0, this._workPointA0);\r\n transform.multiplyPoint3d(pointA1, this._workPointA1);\r\n transform.multiplyPoint3d(pointB0, this._workPointB0);\r\n transform.multiplyPoint3d(pointB1, this._workPointB1);\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._extendA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA,\r\n segmentB, this._extendB, segmentB.point0Ref, 0.0, segmentB.point1Ref, 1.0, this._extendB,\r\n false,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeSegmentLineString(segmentA, this._extendA, this._geometryB, this._extendB, false);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchSegmentArc(\r\n segmentA, this._extendA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA,\r\n this._geometryB, this._extendB, this._extendB, false,\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n segmentA, this._extendA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA,\r\n this._geometryB, this._extendB, false,\r\n );\r\n }\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 const pointA0 = CurveCurveIntersectXY._workPointAA0;\r\n const pointA1 = CurveCurveIntersectXY._workPointAA1;\r\n const pointB0 = CurveCurveIntersectXY._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXY._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 const extendA = this._extendA;\r\n const extendB = this._extendB;\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 && extendA, pointA0, fA0, pointA1, fA1, (ia + 1) === numA && extendA,\r\n lsB, ib === 1 && extendB, pointB0, fB0, pointB1, fB1, (ib + 1) === numB && extendB,\r\n false,\r\n );\r\n }\r\n }\r\n }\r\n } else if (this._geometryB instanceof LineSegment3d) {\r\n this.computeSegmentLineString(this._geometryB, this._extendB, lsA, this._extendA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.computeArcLineString(this._geometryB, this._extendB, lsA, this._extendA, true);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchLineStringBSplineCurve(lsA, this._extendA, this._geometryB, this._extendB, false);\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._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref,\r\n 1.0, this._extendB, arc0, this._extendA, this._extendA, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeArcLineString(arc0, this._extendA, this._geometryB, this._extendB, false);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcArc(arc0, this._extendA, this._geometryB, this._extendB, false);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchArcBsplineCurve3d(arc0, this._extendA, this._geometryB, this._extendB, false);\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._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref,\r\n 1.0, this._extendB, curve, this._extendA, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(this._geometryB, this._extendB, curve, this._extendA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(this._geometryB, this._extendB, curve, this._extendA, true);\r\n } else if (this._geometryB instanceof BSplineCurve3dBase) {\r\n this.dispatchBSplineCurve3dBSplineCurve3d(curve, this._geometryB, false);\r\n }\r\n return undefined;\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._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB,\r\n curve, this._extendA, true);\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(this._geometryB, this._extendB, curve, this._extendA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(this._geometryB, this._extendB, curve, this._extendA, true);\r\n }\r\n */\r\n return undefined;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"CurveCurveIntersectXY.js","sourceRoot":"","sources":["../../../src/curve/CurveCurveIntersectXY.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 { BezierCurve3dH } from \"../bspline/BezierCurve3dH\";\r\nimport { BezierCurveBase } from \"../bspline/BezierCurveBase\";\r\nimport { BSplineCurve3d, BSplineCurve3dBase } from \"../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { CoincidentGeometryQuery } from \"../geometry3d/CoincidentGeometryOps\";\r\nimport { NullGeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { GrowableFloat64Array } from \"../geometry3d/GrowableFloat64Array\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Vector2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { UnivariateBezier } from \"../numerics/BezierPolynomials\";\r\nimport { Newton2dUnboundedWithDerivative, NewtonEvaluatorRRtoRRD } from \"../numerics/Newton\";\r\nimport { AnalyticRoots, SmallSystem, TrigPolynomial } from \"../numerics/Polynomials\";\r\nimport { Arc3d } from \"./Arc3d\";\r\nimport { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from \"./CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { LineSegment3d } from \"./LineSegment3d\";\r\nimport { LineString3d } from \"./LineString3d\";\r\n\r\n// cspell:word XYRR\r\n\r\n/**\r\n * Private class for refining bezier-bezier intersections.\r\n * * The inputs are assumed pre-transformed so that the target condition is to match x and y coordinates.\r\n * @internal\r\n */\r\nexport class BezierBezierIntersectionXYRRToRRD extends NewtonEvaluatorRRtoRRD {\r\n private _curveA: BezierCurveBase;\r\n private _curveB: BezierCurveBase;\r\n constructor(curveA: BezierCurveBase, curveB: BezierCurveBase) {\r\n super();\r\n this._curveA = curveA;\r\n this._curveB = curveB;\r\n this._rayA = Ray3d.createZero();\r\n this._rayB = Ray3d.createZero();\r\n\r\n }\r\n private _rayA: Ray3d;\r\n private _rayB: Ray3d;\r\n public evaluate(fractionA: number, fractionB: number): boolean {\r\n this._curveA.fractionToPointAndDerivative(fractionA, this._rayA);\r\n this._curveB.fractionToPointAndDerivative(fractionB, this._rayB);\r\n this.currentF.setOriginAndVectorsXYZ(\r\n this._rayB.origin.x - this._rayA.origin.x, this._rayB.origin.y - this._rayA.origin.y, 0.0,\r\n -this._rayA.direction.x, -this._rayA.direction.y, 0.0,\r\n this._rayB.direction.x, this._rayB.direction.y, 0.0);\r\n return true;\r\n }\r\n}\r\n/**\r\n * Data bundle for a pair of arrays of CurveLocationDetail structures such as produced by CurveCurve,IntersectXY and\r\n * CurveCurve.ClosestApproach\r\n * @public\r\n */\r\nexport class CurveLocationDetailArrayPair {\r\n /** First array of details ... */\r\n public dataA: CurveLocationDetail[];\r\n /** Second array of details ... */\r\n public dataB: CurveLocationDetail[];\r\n public constructor() {\r\n this.dataA = [];\r\n this.dataB = [];\r\n }\r\n}\r\n/**\r\n * Handler class for XY intersections between _geometryB and another geometry.\r\n * * **NOTE:** GeometryQuery input (_geometryB) should really be AnyCurve.\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 CurveCurveIntersectXY extends NullGeometryHandler {\r\n private _extendA: boolean;\r\n private _geometryB: GeometryQuery | undefined;\r\n private _extendB: boolean;\r\n private _results!: CurveLocationDetailPair[];\r\n private _worldToLocalPerspective: Matrix4d | undefined;\r\n private _worldToLocalAffine: Transform | undefined;\r\n private _coincidentGeometryContext: CoincidentGeometryQuery;\r\n\r\n private static _workVector2dA = Vector2d.create();\r\n private static _workPointA0H = Point4d.create();\r\n private static _workPointA1H = Point4d.create();\r\n private static _workPointB0H = Point4d.create();\r\n private static _workPointB1H = Point4d.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 private static _workPointA0 = Point3d.create();\r\n private static _workPointA1 = Point3d.create();\r\n private static _workPointB0 = Point3d.create();\r\n private static _workPointB1 = Point3d.create();\r\n private _xyzwA0?: Point4d;\r\n private _xyzwA1?: Point4d;\r\n private _xyzwPlane?: Point4d;\r\n private _xyzwB?: Point4d;\r\n\r\n private reinitialize() {\r\n this._results = [];\r\n }\r\n /**\r\n * @param worldToLocal optional transform (possibly perspective) to project to xy plane for intersection.\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 * @param tolerance optional distance tolerance for coincidence\r\n */\r\n public constructor(\r\n worldToLocal: Matrix4d | undefined,\r\n extendA: boolean,\r\n geometryB: GeometryQuery | undefined,\r\n extendB: boolean,\r\n tolerance: number = Geometry.smallMetricDistance,\r\n ) {\r\n super();\r\n this._extendA = extendA;\r\n this._geometryB = geometryB;\r\n this._extendB = extendB;\r\n this._worldToLocalPerspective = undefined;\r\n this._worldToLocalAffine = undefined;\r\n if (worldToLocal !== undefined && !worldToLocal.isIdentity()) {\r\n this._worldToLocalAffine = worldToLocal.asTransform;\r\n if (!this._worldToLocalAffine)\r\n this._worldToLocalPerspective = worldToLocal.clone();\r\n }\r\n this._coincidentGeometryContext = CoincidentGeometryQuery.create(tolerance);\r\n this.reinitialize();\r\n }\r\n /** Reset the geometry and flags, leaving all other parts unchanged (and preserving accumulated intersections) */\r\n public resetGeometry(extendA: boolean, geometryB: GeometryQuery, extendB: boolean): void {\r\n this._extendA = extendA;\r\n this._geometryB = geometryB;\r\n this._extendB = extendB;\r\n }\r\n private acceptFraction(extend0: boolean, fraction: number, extend1: boolean, fractionTol: number = 1.0e-12): boolean {\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 * Test the fraction by strict parameter, but allow toleranced distance test at ends.\r\n * @param tolerance optional distance tolerance to check proximity to start/end point\r\n */\r\n private acceptFractionOnLine(\r\n extend0: boolean,\r\n fraction: number,\r\n extend1: boolean,\r\n pointA: Point3d,\r\n pointB: Point3d,\r\n tolerance: number = Geometry.smallMetricDistance,\r\n ): boolean {\r\n if (!extend0 && fraction < 0) {\r\n return Geometry.isDistanceWithinTol(fraction * pointA.distanceXY(pointB), tolerance);\r\n } else if (!extend1 && fraction > 1.0)\r\n return Geometry.isDistanceWithinTol((fraction - 1.0) * pointA.distanceXY(pointB), tolerance);\r\n return true;\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.reinitialize();\r\n return result;\r\n }\r\n private sameCurveAndFraction(cp: CurvePrimitive, fraction: number, detail: CurveLocationDetail): boolean {\r\n return cp === detail.curve && Geometry.isAlmostEqualNumber(fraction, detail.fraction);\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 recordPointWithLocalFractions(\r\n localFractionA: number,\r\n cpA: CurvePrimitive,\r\n fractionA0: number,\r\n fractionA1: number,\r\n localFractionB: number, // Computed intersection fraction\r\n cpB: CurvePrimitive,\r\n fractionB0: number,\r\n fractionB1: number,\r\n reversed: boolean,\r\n intervalDetails?: undefined | CurveLocationDetailPair,\r\n ): void {\r\n let globalFractionA, globalFractionB;\r\n let globalFractionA1, globalFractionB1;\r\n const isInterval = intervalDetails !== undefined &&\r\n intervalDetails.detailA.hasFraction1 &&\r\n intervalDetails.detailB.hasFraction1;\r\n if (isInterval) {\r\n globalFractionA = Geometry.interpolate(fractionA0, intervalDetails.detailA.fraction, fractionA1);\r\n globalFractionB = Geometry.interpolate(fractionB0, intervalDetails.detailB.fraction, fractionB1);\r\n globalFractionA1 = Geometry.interpolate(fractionA0, intervalDetails.detailA.fraction1!, fractionA1);\r\n globalFractionB1 = Geometry.interpolate(fractionB0, intervalDetails.detailB.fraction1!, fractionB1);\r\n } else {\r\n globalFractionA = globalFractionA1 = Geometry.interpolate(fractionA0, localFractionA, fractionA1);\r\n globalFractionB = globalFractionB1 = Geometry.interpolate(fractionB0, localFractionB, fractionB1);\r\n }\r\n // ignore duplicate of most recent point . ..\r\n const numPrevious = this._results.length;\r\n if (numPrevious > 0 && !isInterval) {\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 (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailB) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailA))\r\n return;\r\n } else {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailA) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailB))\r\n return;\r\n }\r\n }\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(\r\n cpA, globalFractionA, cpA.fractionToPoint(globalFractionA),\r\n );\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(\r\n cpB, globalFractionB, cpB.fractionToPoint(globalFractionB),\r\n );\r\n if (isInterval) {\r\n detailA.captureFraction1Point1(globalFractionA1, cpA.fractionToPoint(globalFractionA1));\r\n detailB.captureFraction1Point1(globalFractionB1, cpB.fractionToPoint(globalFractionB1));\r\n } else {\r\n detailA.setIntervalRole(CurveIntervalRole.isolated);\r\n detailB.setIntervalRole(CurveIntervalRole.isolated);\r\n }\r\n if (reversed) {\r\n this._results.push(new CurveLocationDetailPair(detailB, detailA));\r\n } else {\r\n this._results.push(new CurveLocationDetailPair(detailA, detailB));\r\n }\r\n }\r\n /**\r\n * Emit recordPoint for multiple pairs (on full curve!)\r\n * @param cpA first curve primitive (possibly different from curve in detailA, but fraction compatible)\r\n * @param cpB second curve primitive (possibly different from curve in detailA, but fraction compatible)\r\n * @param pairs array of pairs\r\n * @param reversed true to have order reversed in final structures.\r\n */\r\n public recordPairs(\r\n cpA: CurvePrimitive, cpB: CurvePrimitive, pairs: CurveLocationDetailPair[] | undefined, reversed: boolean,\r\n ): void {\r\n if (pairs !== undefined) {\r\n for (const p of pairs) {\r\n this.recordPointWithLocalFractions(p.detailA.fraction, cpA, 0, 1,\r\n p.detailB.fraction, cpB, 0, 1, reversed, p);\r\n }\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 = CurveCurveIntersectXY._workVector2dA;\r\n // Problem: Normal practice is to do the (quick, simple) transverse intersection first\r\n // But the transverse intersector notion of coincidence is based on the determinant ratios, which are hard\r\n // to relate to physical tolerance.\r\n // So do the overlap first. This should do a quick exit in non-coincident case.\r\n const overlap = this._coincidentGeometryContext.coincidentSegmentRangeXY(pointA0, pointA1, pointB0, pointB1);\r\n if (overlap) {\r\n this.recordPointWithLocalFractions(\r\n overlap.detailA.fraction, cpA, fractionA0, fractionA1,\r\n overlap.detailB.fraction, cpB, fractionB0, fractionB1, reversed, overlap);\r\n } else if (SmallSystem.lineSegment3dXYTransverseIntersectionUnbounded(\r\n pointA0, pointA1,\r\n pointB0, pointB1, uv)) {\r\n if (this.acceptFractionOnLine(extendA0, uv.x, extendA1, pointA0, pointA1, this._coincidentGeometryContext.tolerance) &&\r\n this.acceptFractionOnLine(extendB0, uv.y, extendB1, pointB0, pointB1, this._coincidentGeometryContext.tolerance)) {\r\n this.recordPointWithLocalFractions(uv.x, cpA, fractionA0, fractionA1, uv.y, cpB, fractionB0, fractionB1, reversed);\r\n }\r\n }\r\n }\r\n // intersection of PROJECTED homogeneous segments ... assumes caller knows the _worldToLocal is present\r\n private computeSegmentSegment3DH(\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 hA0 = CurveCurveIntersectXY._workPointA0H;\r\n const hA1 = CurveCurveIntersectXY._workPointA1H;\r\n const hB0 = CurveCurveIntersectXY._workPointB0H;\r\n const hB1 = CurveCurveIntersectXY._workPointB1H;\r\n this._worldToLocalPerspective!.multiplyPoint3d(pointA0, 1, hA0);\r\n this._worldToLocalPerspective!.multiplyPoint3d(pointA1, 1, hA1);\r\n this._worldToLocalPerspective!.multiplyPoint3d(pointB0, 1, hB0);\r\n this._worldToLocalPerspective!.multiplyPoint3d(pointB1, 1, hB1);\r\n const fractionAB = SmallSystem.lineSegment3dHXYTransverseIntersectionUnbounded(hA0, hA1, hB0, hB1);\r\n if (fractionAB !== undefined) {\r\n const fractionA = fractionAB.x;\r\n const fractionB = fractionAB.y;\r\n if (this.acceptFraction(extendA0, fractionA, extendA1) && this.acceptFraction(extendB0, fractionB, extendB1)) {\r\n // final fraction acceptance uses original world points, with perspective-aware fractions\r\n this.recordPointWithLocalFractions(fractionA, cpA, fractionA0, fractionA1,\r\n fractionB, cpB, fractionB0, fractionB1, reversed);\r\n }\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 if (this._worldToLocalAffine) {\r\n // non-perspective projection\r\n CurveCurveIntersectXY.setTransformedWorkPoints(this._worldToLocalAffine, pointA0, pointA1, pointB0, pointB1);\r\n this.computeSegmentSegment3D(\r\n cpA, extendA0, CurveCurveIntersectXY._workPointA0,\r\n fractionA0, CurveCurveIntersectXY._workPointA1, fractionA1, extendA1,\r\n cpB, extendB0, CurveCurveIntersectXY._workPointB0,\r\n fractionB0, CurveCurveIntersectXY._workPointB1, fractionB1, extendB1,\r\n reversed,\r\n );\r\n } else if (this._worldToLocalPerspective) {\r\n this.computeSegmentSegment3DH(\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 } else {\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 // Caller accesses data from a linestring or segment and passes it 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 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 // Arc: X = C + cU + sV\r\n // Line: contains points A0,A1\r\n // Arc point colinear with line if det (A0, A1, X) = 0\r\n // with homogeneous xyw points and vectors.\r\n // With equational X: det (A0, A1, C) + c det (A0, A1,U) + s det (A0, A1, V) = 0.\r\n // solve for theta.\r\n // evaluate points.\r\n // project back to line.\r\n if (this._worldToLocalPerspective) {\r\n const data = arc.toTransformedPoint4d(this._worldToLocalPerspective);\r\n const pointA0H = this._worldToLocalPerspective.multiplyPoint3d(pointA0, 1);\r\n const pointA1H = this._worldToLocalPerspective.multiplyPoint3d(pointA1, 1);\r\n const alpha = Geometry.tripleProductPoint4dXYW(pointA0H, pointA1H, data.center);\r\n const beta = Geometry.tripleProductPoint4dXYW(pointA0H, pointA1H, data.vector0);\r\n const gamma = Geometry.tripleProductPoint4dXYW(pointA0H, pointA1H, data.vector90);\r\n const cosines = new GrowableFloat64Array(2);\r\n const sines = new GrowableFloat64Array(2);\r\n const radians = new GrowableFloat64Array(2);\r\n const numRoots = AnalyticRoots.appendImplicitLineUnitCircleIntersections(\r\n alpha, beta, gamma, cosines, sines, radians,\r\n );\r\n for (let i = 0; i < numRoots; i++) {\r\n const arcPoint = data.center.plus2Scaled(\r\n data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i),\r\n );\r\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians.atUncheckedIndex(i));\r\n const lineFraction = SmallSystem.lineSegment3dHXYClosestPointUnbounded(pointA0H, pointA1H, arcPoint);\r\n if (lineFraction !== undefined &&\r\n this.acceptFraction(extendA0, lineFraction, extendA1) &&\r\n this.acceptFraction(extendB0, arcFraction, extendB1)) {\r\n this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1,\r\n arcFraction, arc, 0, 1, reversed);\r\n }\r\n }\r\n } else {\r\n const data = arc.toTransformedVectors(this._worldToLocalAffine);\r\n let pointA0Local = pointA0;\r\n let pointA1Local = pointA1;\r\n if (this._worldToLocalAffine) {\r\n pointA0Local = this._worldToLocalAffine.multiplyPoint3d(pointA0);\r\n pointA1Local = this._worldToLocalAffine.multiplyPoint3d(pointA1);\r\n }\r\n const alpha = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.center, 1);\r\n const beta = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector0, 0);\r\n const gamma = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector90, 0);\r\n const cosines = new GrowableFloat64Array(2);\r\n const sines = new GrowableFloat64Array(2);\r\n const radians = new GrowableFloat64Array(2);\r\n const numRoots = AnalyticRoots.appendImplicitLineUnitCircleIntersections(\r\n alpha, beta, gamma, cosines, sines, radians,\r\n );\r\n const lineFractionTol = 1.0e-10;\r\n const arcFractionTol = 1.0e-7;\r\n for (let i = 0; i < numRoots; i++) {\r\n const arcPoint = data.center.plus2Scaled(\r\n data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i),\r\n );\r\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians.atUncheckedIndex(i));\r\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);\r\n if (lineFraction !== undefined &&\r\n this.acceptFraction(extendA0, lineFraction, extendA1, lineFractionTol) &&\r\n this.acceptFraction(extendB0, arcFraction, extendB1, arcFractionTol)) {\r\n this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1,\r\n arcFraction, arc, 0, 1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n // Caller accesses data from two arcs.\r\n // each matrix has [U V C] in (x,y,w) form from projection.\r\n // invert the projection matrix matrixA.\r\n // apply the inverse to matrixB. Then arc b is an ellipse in the circular space of A\r\n private dispatchArcArcThisOrder(\r\n cpA: Arc3d,\r\n matrixA: Matrix3d, // homogeneous xyw projection !!!\r\n extendA: boolean,\r\n cpB: Arc3d,\r\n matrixB: Matrix3d, // homogeneous xyw projection !!!\r\n extendB: boolean,\r\n reversed: boolean,\r\n ): void {\r\n const inverseA = matrixA.inverse();\r\n if (inverseA) {\r\n const localB = inverseA.multiplyMatrixMatrix(matrixB); // localB->localA transform\r\n const ellipseRadians: number[] = [];\r\n const circleRadians: number[] = [];\r\n TrigPolynomial.solveUnitCircleHomogeneousEllipseIntersection(\r\n localB.coffs[2], localB.coffs[5], localB.coffs[8], // center xyw\r\n localB.coffs[0], localB.coffs[3], localB.coffs[6], // vector0 xyw\r\n localB.coffs[1], localB.coffs[4], localB.coffs[7], // vector90 xyw\r\n ellipseRadians, circleRadians);\r\n for (let i = 0; i < ellipseRadians.length; i++) {\r\n const fractionA = cpA.sweep.radiansToSignedPeriodicFraction(circleRadians[i]);\r\n const fractionB = cpB.sweep.radiansToSignedPeriodicFraction(ellipseRadians[i]);\r\n // hm .. do we really need to check the fractions? We know they are internal to the beziers\r\n if (this.acceptFraction(extendA, fractionA, extendA) && this.acceptFraction(extendB, fractionB, extendB)) {\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, extendA: boolean, cpB: Arc3d, extendB: boolean, reversed: boolean,\r\n ): void {\r\n // Arc: X = C + cU + sV\r\n // Line: contains points A0,A1\r\n // Arc point colinear with line if det (A0, A1, X) = 0\r\n // with homogeneous xyw points and vectors.\r\n // With equational X: det (A0, A1, C) + c det (A0, A1,U) + s det (A0, A1, V) = 0.\r\n // solve for theta.\r\n // evaluate points.\r\n // project back to line.\r\n let matrixA: Matrix3d;\r\n let matrixB: Matrix3d;\r\n if (this._worldToLocalPerspective) {\r\n const dataA = cpA.toTransformedPoint4d(this._worldToLocalPerspective);\r\n const dataB = cpB.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 matrixB = Matrix3d.createColumnsXYW(\r\n dataB.vector0, dataB.vector0.w, dataB.vector90, dataA.vector90.w, dataB.center, dataB.center.w,\r\n );\r\n } else {\r\n const dataA = cpA.toTransformedVectors(this._worldToLocalAffine);\r\n const dataB = cpB.toTransformedVectors(this._worldToLocalAffine);\r\n matrixA = Matrix3d.createColumnsXYW(dataA.vector0, 0, dataA.vector90, 0, dataA.center, 1);\r\n matrixB = Matrix3d.createColumnsXYW(dataB.vector0, 0, dataB.vector90, 0, dataB.center, 1);\r\n }\r\n const conditionA = matrixA.conditionNumber();\r\n const conditionB = matrixB.conditionNumber();\r\n if (conditionA > conditionB)\r\n this.dispatchArcArcThisOrder(cpA, matrixA, extendA, cpB, matrixB, extendB, reversed);\r\n else\r\n this.dispatchArcArcThisOrder(cpB, matrixB, extendB, cpA, matrixA, extendA, !reversed);\r\n // overlap handling .. perspective is not handled . . .\r\n if (!this._coincidentGeometryContext) {\r\n // do nothing\r\n } else if (this._worldToLocalPerspective) {\r\n // do nothing\r\n } else if (this._worldToLocalAffine) {\r\n // do nothing\r\n } else {\r\n const pairs = this._coincidentGeometryContext.coincidentArcIntersectionXY(cpA, cpB, true);\r\n if (pairs !== undefined)\r\n this.recordPairs(cpA, cpB, pairs, reversed);\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 cpA: Arc3d, extendA: boolean, cpB: BSplineCurve3d, extendB: boolean, reversed: boolean,\r\n ): void {\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.radiansToSignedPeriodicFraction(Math.atan2(s, c));\r\n if (this.acceptFraction(extendA, arcFraction, extendA) &&\r\n this.acceptFraction(extendB, fractionB, extendB)) {\r\n this.recordPointWithLocalFractions(arcFraction, cpA, 0, 1,\r\n fractionB, cpB, 0, 1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\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 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 ): void {\r\n if (!this._xyzwA0) this._xyzwA0 = Point4d.create();\r\n if (!this._xyzwA1) this._xyzwA1 = Point4d.create();\r\n if (!this._xyzwPlane) this._xyzwPlane = Point4d.create();\r\n if (!this._xyzwB) this._xyzwB = Point4d.create();\r\n /*\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.radiansToSignedPeriodicFraction(Math.atan2(s, c));\r\n if (this.acceptFraction(extendA, arcFraction, extendA) && this.acceptFraction(extendB, fractionB, extendB)) {\r\n this.recordPointWithLocalFractions(arcFraction, cpA, 0, 1,\r\n 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;\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 let bezierBFraction = r;\r\n bezierB.fractionToPoint4d(bezierBFraction, this._xyzwB);\r\n const segmentAFraction = SmallSystem.lineSegment3dHXYClosestPointUnbounded(\r\n this._xyzwA0, this._xyzwA1, this._xyzwB,\r\n );\r\n if (segmentAFraction && Geometry.isIn01WithTolerance(segmentAFraction, intervalTolerance)) {\r\n let bezierAFraction = Geometry.interpolate(f0, segmentAFraction, f1);\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(bcurveAFraction, bcurveA, 0, 1,\r\n bcurveBFraction, bcurveB, 0, 1, reversed);\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 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 * 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 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 // 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 extendB: boolean,\r\n reversed: boolean,\r\n ): void {\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(extendB, fractionB, extendB)) {\r\n this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1,\r\n fractionB, bcurve, 0, 1, reversed);\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, extendA: boolean, curveB: BSplineCurve3d, extendB: boolean, reversed: boolean,\r\n ): any {\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 = CurveCurveIntersectXY._workPointA0;\r\n const pointA1 = CurveCurveIntersectXY._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 && extendA, pointA0, fA0, pointA1, fA1, (iA + 1) === numA && extendA,\r\n curveB, extendB, reversed);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Detail computation for segment intersecting linestring. */\r\n public computeSegmentLineString(\r\n lsA: LineSegment3d, extendA: boolean, lsB: LineString3d, extendB: boolean, reversed: boolean,\r\n ): any {\r\n const pointA0 = lsA.point0Ref;\r\n const pointA1 = lsA.point1Ref;\r\n const pointB0 = CurveCurveIntersectXY._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXY._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, extendA, pointA0, 0.0, pointA1, 1.0, extendA,\r\n lsB, ib === 1 && extendB, pointB0, fB0, pointB1, fB1, (ib + 1) === numB && extendB,\r\n reversed);\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, extendA: boolean, lsB: LineString3d, extendB: boolean, reversed: boolean,\r\n ): any {\r\n const pointB0 = CurveCurveIntersectXY._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXY._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 && extendB, pointB0, fB0, pointB1, fB1,\r\n (ib + 1) === numB && extendB, arcA, extendA, extendA, !reversed,\r\n );\r\n }\r\n }\r\n return undefined;\r\n }\r\n private static setTransformedWorkPoints(\r\n transform: Transform, pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d,\r\n ): void {\r\n transform.multiplyPoint3d(pointA0, this._workPointA0);\r\n transform.multiplyPoint3d(pointA1, this._workPointA1);\r\n transform.multiplyPoint3d(pointB0, this._workPointB0);\r\n transform.multiplyPoint3d(pointB1, this._workPointB1);\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._extendA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA,\r\n segmentB, this._extendB, segmentB.point0Ref, 0.0, segmentB.point1Ref, 1.0, this._extendB,\r\n false,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeSegmentLineString(segmentA, this._extendA, this._geometryB, this._extendB, false);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchSegmentArc(\r\n segmentA, this._extendA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA,\r\n this._geometryB, this._extendB, this._extendB, false,\r\n );\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n segmentA, this._extendA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._extendA,\r\n this._geometryB, this._extendB, false,\r\n );\r\n }\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 const pointA0 = CurveCurveIntersectXY._workPointAA0;\r\n const pointA1 = CurveCurveIntersectXY._workPointAA1;\r\n const pointB0 = CurveCurveIntersectXY._workPointBB0;\r\n const pointB1 = CurveCurveIntersectXY._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 const extendA = this._extendA;\r\n const extendB = this._extendB;\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 && extendA, pointA0, fA0, pointA1, fA1, (ia + 1) === numA && extendA,\r\n lsB, ib === 1 && extendB, pointB0, fB0, pointB1, fB1, (ib + 1) === numB && extendB,\r\n false,\r\n );\r\n }\r\n }\r\n }\r\n } else if (this._geometryB instanceof LineSegment3d) {\r\n this.computeSegmentLineString(this._geometryB, this._extendB, lsA, this._extendA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.computeArcLineString(this._geometryB, this._extendB, lsA, this._extendA, true);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchLineStringBSplineCurve(lsA, this._extendA, this._geometryB, this._extendB, false);\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._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref,\r\n 1.0, this._extendB, arc0, this._extendA, this._extendA, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeArcLineString(arc0, this._extendA, this._geometryB, this._extendB, false);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcArc(arc0, this._extendA, this._geometryB, this._extendB, false);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchArcBsplineCurve3d(arc0, this._extendA, this._geometryB, this._extendB, false);\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._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref,\r\n 1.0, this._extendB, curve, this._extendA, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(this._geometryB, this._extendB, curve, this._extendA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(this._geometryB, this._extendB, curve, this._extendA, true);\r\n } else if (this._geometryB instanceof BSplineCurve3dBase) {\r\n this.dispatchBSplineCurve3dBSplineCurve3d(curve, this._geometryB, false);\r\n }\r\n return undefined;\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._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB,\r\n curve, this._extendA, true);\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(this._geometryB, this._extendB, curve, this._extendA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(this._geometryB, this._extendB, curve, this._extendA, true);\r\n }\r\n */\r\n return undefined;\r\n }\r\n}\r\n"]}
|
package/lib/esm/curve/Path.d.ts
CHANGED
|
@@ -36,7 +36,7 @@ export declare class Path extends CurveChain {
|
|
|
36
36
|
static createArray(curves: CurvePrimitive[]): Path;
|
|
37
37
|
/** Return a deep copy, with leaf-level curve primitives stroked. */
|
|
38
38
|
cloneStroked(options?: StrokeOptions): Path;
|
|
39
|
-
/** Return the boundary type (1) of a corresponding
|
|
39
|
+
/** Return the boundary type (1) of a corresponding MicroStation CurveVector */
|
|
40
40
|
dgnBoundaryType(): number;
|
|
41
41
|
/** Clone as a new `Path` with no primitives */
|
|
42
42
|
cloneEmptyPeer(): Path;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/curve/Path.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,IAAK,SAAQ,UAAU;IAClC,wCAAwC;IACxC,SAAgB,mBAAmB,UAAU;IAC7C,+CAA+C;IACxC,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAGzD,2DAA2D;IACpD,wBAAwB,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,GAAE,MAAW,GAAG,IAAI;IAGrG,+BAA+B;;IAI/B;;;;OAIG;WACW,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,cAAc,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI;IAWxE;;;OAGG;WACW,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAOzD,oEAAoE;IAC7D,YAAY,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAMlD
|
|
1
|
+
{"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/curve/Path.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,IAAK,SAAQ,UAAU;IAClC,wCAAwC;IACxC,SAAgB,mBAAmB,UAAU;IAC7C,+CAA+C;IACxC,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAGzD,2DAA2D;IACpD,wBAAwB,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,GAAE,MAAW,GAAG,IAAI;IAGrG,+BAA+B;;IAI/B;;;;OAIG;WACW,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,cAAc,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI;IAWxE;;;OAGG;WACW,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAOzD,oEAAoE;IAC7D,YAAY,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAMlD,+EAA+E;IACxE,eAAe,IAAI,MAAM;IAGhC,+CAA+C;IACxC,cAAc,IAAI,IAAI;IAG7B,sEAAsE;IAC/D,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;CAGhE"}
|
package/lib/esm/curve/Path.js
CHANGED
|
@@ -61,7 +61,7 @@ export class Path extends CurveChain {
|
|
|
61
61
|
curve.emitStrokes(strokes, options);
|
|
62
62
|
return Path.create(strokes);
|
|
63
63
|
}
|
|
64
|
-
/** Return the boundary type (1) of a corresponding
|
|
64
|
+
/** Return the boundary type (1) of a corresponding MicroStation CurveVector */
|
|
65
65
|
dgnBoundaryType() {
|
|
66
66
|
return 1;
|
|
67
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Path.js","sourceRoot":"","sources":["../../../src/curve/Path.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;;;GAKG;AACH,MAAM,OAAO,IAAK,SAAQ,UAAU;IAGlC,+CAA+C;IACxC,mBAAmB,CAAC,KAAoB;QAC7C,OAAO,KAAK,YAAY,IAAI,CAAC;IAC/B,CAAC;IACD,2DAA2D;IACpD,wBAAwB,CAAC,SAAkC,EAAE,gBAAwB,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC;IACD,+BAA+B;IAC/B;QACE,KAAK,EAAE,CAAC;QAZV,wCAAwC;QACxB,wBAAmB,GAAG,MAAM,CAAC;IAY7C,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,MAAM,CAAC,GAAG,MAAyC;QAC/D,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,IAAI,KAAK,YAAY,cAAc;gBACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE;gBAChF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aAClD;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,MAAwB;QAChD,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC7B;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,oEAAoE;IAC7D,YAAY,CAAC,OAAuB;QACzC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAC/B,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD
|
|
1
|
+
{"version":3,"file":"Path.js","sourceRoot":"","sources":["../../../src/curve/Path.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;;;GAKG;AACH,MAAM,OAAO,IAAK,SAAQ,UAAU;IAGlC,+CAA+C;IACxC,mBAAmB,CAAC,KAAoB;QAC7C,OAAO,KAAK,YAAY,IAAI,CAAC;IAC/B,CAAC;IACD,2DAA2D;IACpD,wBAAwB,CAAC,SAAkC,EAAE,gBAAwB,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC;IACD,+BAA+B;IAC/B;QACE,KAAK,EAAE,CAAC;QAZV,wCAAwC;QACxB,wBAAmB,GAAG,MAAM,CAAC;IAY7C,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,MAAM,CAAC,GAAG,MAAyC;QAC/D,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,IAAI,KAAK,YAAY,cAAc;gBACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE;gBAChF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aAClD;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,MAAwB;QAChD,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC7B;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,oEAAoE;IAC7D,YAAY,CAAC,OAAuB;QACzC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAC/B,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,+EAA+E;IACxE,eAAe;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,+CAA+C;IACxC,cAAc;QACnB,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,sEAAsE;IAC/D,yBAAyB,CAAC,OAAwB;QACvD,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACF","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 { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { CurveChain } from \"./CurveCollection\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { RecursiveCurveProcessor } from \"./CurveProcessor\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * * A `Path` object is a collection of curves that join head-to-tail to form a path.\r\n * * A `Path` object does not bound a planar region. Use `Loop` to indicate region bounding.\r\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\r\n * @public\r\n */\r\nexport class Path extends CurveChain {\r\n /** String name for schema properties */\r\n public readonly curveCollectionType = \"path\";\r\n /** Test if `other` is an instance of `Path` */\r\n public isSameGeometryClass(other: GeometryQuery): boolean {\r\n return other instanceof Path;\r\n }\r\n /** Invoke `processor.announcePath(this, indexInParent)` */\r\n public announceToCurveProcessor(processor: RecursiveCurveProcessor, indexInParent: number = -1): void {\r\n return processor.announcePath(this, indexInParent);\r\n }\r\n /** Construct an empty path. */\r\n public constructor() {\r\n super();\r\n }\r\n /**\r\n * Create a path from a variable length list of curve primitives\r\n * * CurvePrimitive params are captured.\r\n * @param curves variable length list of individual curve primitives or point arrays.\r\n */\r\n public static create(...curves: Array<CurvePrimitive | Point3d[]>): Path {\r\n const result = new Path();\r\n for (const curve of curves) {\r\n if (curve instanceof CurvePrimitive)\r\n result.children.push(curve);\r\n else if (Array.isArray(curve) && curve.length > 0 && curve[0] instanceof Point3d) {\r\n result.children.push(LineString3d.create(curve));\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a path from a an array of curve primitives.\r\n * @param curves array of individual curve primitives.\r\n */\r\n public static createArray(curves: CurvePrimitive[]): Path {\r\n const result = new Path();\r\n for (const curve of curves) {\r\n result.children.push(curve);\r\n }\r\n return result;\r\n }\r\n /** Return a deep copy, with leaf-level curve primitives stroked. */\r\n public cloneStroked(options?: StrokeOptions): Path {\r\n const strokes = LineString3d.create();\r\n for (const curve of this.children)\r\n curve.emitStrokes(strokes, options);\r\n return Path.create(strokes);\r\n }\r\n /** Return the boundary type (1) of a corresponding MicroStation CurveVector */\r\n public dgnBoundaryType(): number {\r\n return 1;\r\n }\r\n /** Clone as a new `Path` with no primitives */\r\n public cloneEmptyPeer(): Path {\r\n return new Path();\r\n }\r\n /** Second step of double dispatch: call `handler.handlePath(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handlePath(this);\r\n }\r\n}\r\n"]}
|
|
@@ -64,7 +64,7 @@ export class UnionRegion extends CurveCollection {
|
|
|
64
64
|
* * Returns false if the `AnyCurve` child is not a region type.
|
|
65
65
|
*/
|
|
66
66
|
tryAddChild(child) {
|
|
67
|
-
if (child && child instanceof ParityRegion || child instanceof Loop) {
|
|
67
|
+
if (child && (child instanceof ParityRegion || child instanceof Loop)) {
|
|
68
68
|
this._children.push(child);
|
|
69
69
|
return true;
|
|
70
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnionRegion.js","sourceRoot":"","sources":["../../../src/curve/UnionRegion.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;;;;GAMG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;IAG9C,yCAAyC;IAClC,mBAAmB,CAAC,KAAoB;QAC7C,OAAO,KAAK,YAAY,WAAW,CAAC;IACtC,CAAC;IAGD,kCAAkC;IAClC,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,iDAAiD;IACjD;QACE,KAAK,EAAE,CAAC;QAdV,wCAAwC;QACxB,wBAAmB,GAAG,aAAa,CAAC;QAclD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,wDAAwD;IACjD,MAAM,CAAC,MAAM,CAAC,GAAG,IAAgC;QACtD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE;YACxB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC3B;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,+EAA+E;IACxE,eAAe;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,2FAA2F;IACpF,wBAAwB,CAAC,SAAkC,EAAE,gBAAwB,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IACD,uDAAuD;IAChD,YAAY,CAAC,OAAuB;QACzC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC;QACV,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,YAAY;gBACd,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACrC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,qCAAqC;IAC9B,cAAc;QACnB,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;IACD;;;OAGG;IACI,WAAW,CAAC,KAAe;QAChC,IAAI,KAAK,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,YAAY,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"UnionRegion.js","sourceRoot":"","sources":["../../../src/curve/UnionRegion.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;;;;GAMG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;IAG9C,yCAAyC;IAClC,mBAAmB,CAAC,KAAoB;QAC7C,OAAO,KAAK,YAAY,WAAW,CAAC;IACtC,CAAC;IAGD,kCAAkC;IAClC,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,iDAAiD;IACjD;QACE,KAAK,EAAE,CAAC;QAdV,wCAAwC;QACxB,wBAAmB,GAAG,aAAa,CAAC;QAclD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,wDAAwD;IACjD,MAAM,CAAC,MAAM,CAAC,GAAG,IAAgC;QACtD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE;YACxB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC3B;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,+EAA+E;IACxE,eAAe;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,2FAA2F;IACpF,wBAAwB,CAAC,SAAkC,EAAE,gBAAwB,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IACD,uDAAuD;IAChD,YAAY,CAAC,OAAuB;QACzC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC;QACV,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,YAAY;gBACd,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACrC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,qCAAqC;IAC9B,cAAc;QACnB,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;IACD;;;OAGG;IACI,WAAW,CAAC,KAAe;QAChC,IAAI,KAAK,IAAI,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,YAAY,IAAI,CAAC,EAAE;YACrE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,0CAA0C;IACnC,QAAQ,CAAC,CAAS;QACvB,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;YAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,8EAA8E;IACvE,yBAAyB,CAAC,OAAwB;QACvD,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF","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\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { AnyCurve } from \"./CurveChain\";\r\nimport { CurveCollection } from \"./CurveCollection\";\r\nimport { RecursiveCurveProcessor } from \"./CurveProcessor\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { Loop } from \"./Loop\";\r\nimport { ParityRegion } from \"./ParityRegion\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * * A `UnionRegion` is a collection of other planar region types -- `Loop` and `ParityRegion`.\r\n * * The composite is the union of the contained regions.\r\n * * A point is \"in\" the composite if it is \"in\" one or more of the contained regions.\r\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\r\n * @public\r\n */\r\nexport class UnionRegion extends CurveCollection {\r\n /** String name for schema properties */\r\n public readonly curveCollectionType = \"unionRegion\";\r\n /** Test if `other` is a `UnionRegion` */\r\n public isSameGeometryClass(other: GeometryQuery): boolean {\r\n return other instanceof UnionRegion;\r\n }\r\n /** Collection of Loop and ParityRegion children. */\r\n protected _children: Array<ParityRegion | Loop>;\r\n /** Return the array of regions */\r\n public override get children(): Array<ParityRegion | Loop> {\r\n return this._children;\r\n }\r\n /** Constructor -- initialize with no children */\r\n public constructor() {\r\n super();\r\n this._children = [];\r\n }\r\n /** Create a `UnionRegion` with given region children */\r\n public static create(...data: Array<ParityRegion | Loop>): UnionRegion {\r\n const result = new UnionRegion();\r\n for (const child of data) {\r\n result.tryAddChild(child);\r\n }\r\n return result;\r\n }\r\n /** Return the boundary type (5) of a corresponding MicroStation CurveVector */\r\n public dgnBoundaryType(): number {\r\n return 5;\r\n }\r\n /** Dispatch to more strongly typed `processor.announceUnionRegion(this, indexInParent)` */\r\n public announceToCurveProcessor(processor: RecursiveCurveProcessor, indexInParent: number = -1): void {\r\n return processor.announceUnionRegion(this, indexInParent);\r\n }\r\n /** Return structural clone with stroked primitives. */\r\n public cloneStroked(options?: StrokeOptions): UnionRegion {\r\n const clone = new UnionRegion();\r\n let child;\r\n for (child of this._children) {\r\n const childStrokes = child.cloneStroked(options);\r\n if (childStrokes)\r\n clone.children.push(childStrokes);\r\n }\r\n return clone;\r\n }\r\n /** Return new empty `UnionRegion` */\r\n public cloneEmptyPeer(): UnionRegion {\r\n return new UnionRegion();\r\n }\r\n /**\r\n * Try to add a child.\r\n * * Returns false if the `AnyCurve` child is not a region type.\r\n */\r\n public tryAddChild(child: AnyCurve): boolean {\r\n if (child && (child instanceof ParityRegion || child instanceof Loop)) {\r\n this._children.push(child);\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** Return a child identified by index. */\r\n public getChild(i: number): Loop | ParityRegion | undefined {\r\n if (i < this._children.length)\r\n return this._children[i];\r\n return undefined;\r\n }\r\n /** Second step of double dispatch: call `handler.handleUnionRegion(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleUnionRegion(this);\r\n }\r\n}\r\n"]}
|
|
@@ -9,10 +9,10 @@ import { Transform } from "./Transform";
|
|
|
9
9
|
* * create the FrameBuilder and make calls to announcePoint and announceVector.
|
|
10
10
|
* * the frame will be fully determined by an origin and two vectors.
|
|
11
11
|
* * the first call to announcePoint will set the origin.
|
|
12
|
-
* *
|
|
13
|
-
* *
|
|
12
|
+
* * additional calls to announcePoint will produce announceVector call with the vector from the origin.
|
|
13
|
+
* * after each announcement, call getValidatedFrame(false)
|
|
14
14
|
* * getValidatedFrame will succeed when it has two independent vectors.
|
|
15
|
-
* *
|
|
15
|
+
* * To build a left handed frame,
|
|
16
16
|
* * an origin and 3 independent vectors are required.
|
|
17
17
|
* * announce as above, but query with getValidatedFrame (true).
|
|
18
18
|
* * this will use the third vector to select right or left handed frame.
|
|
@@ -24,11 +24,11 @@ export declare class FrameBuilder {
|
|
|
24
24
|
private _vector1;
|
|
25
25
|
private _vector2;
|
|
26
26
|
private areStronglyIndependentVectors;
|
|
27
|
-
/**
|
|
27
|
+
/** Clear all accumulated point and vector data */
|
|
28
28
|
clear(): void;
|
|
29
29
|
constructor();
|
|
30
|
-
/**
|
|
31
|
-
*
|
|
30
|
+
/**
|
|
31
|
+
* Try to assemble the data into a non-singular transform.
|
|
32
32
|
* * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.
|
|
33
33
|
* * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.
|
|
34
34
|
*/
|
|
@@ -37,43 +37,47 @@ export declare class FrameBuilder {
|
|
|
37
37
|
applyDefaultUpVector(vector?: Vector3d): void;
|
|
38
38
|
/** Ask if there is a defined origin for the evolving frame */
|
|
39
39
|
get hasOrigin(): boolean;
|
|
40
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.
|
|
41
42
|
*/
|
|
42
43
|
savedVectorCount(): number;
|
|
43
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.
|
|
46
|
+
*/
|
|
44
47
|
announcePoint(point: Point3d): number;
|
|
45
|
-
/**
|
|
48
|
+
/** Announce a new vector. */
|
|
46
49
|
announceVector(vector: Vector3d): number;
|
|
47
|
-
/**
|
|
48
|
-
*
|
|
50
|
+
/**
|
|
51
|
+
* Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient
|
|
52
|
+
* for a coordinate system.
|
|
49
53
|
*/
|
|
50
54
|
announce(data: any): void;
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
* *
|
|
54
|
-
* *
|
|
55
|
-
* *
|
|
55
|
+
/**
|
|
56
|
+
* Create a localToWorld frame for the given data.
|
|
57
|
+
* * origin is at first point.
|
|
58
|
+
* * x axis in direction of first nonzero vector present or implied by the input.
|
|
59
|
+
* * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.
|
|
56
60
|
*/
|
|
57
61
|
static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined;
|
|
58
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* Create a transform containing points or vectors in the given data.
|
|
59
64
|
* * The xy columns of the transform contain the first points or vectors of the data.
|
|
60
65
|
* * The z column is perpendicular to that xy plane.
|
|
61
|
-
* * The calculation favors the first points found.
|
|
66
|
+
* * The calculation favors the first points found. It does not try to get a "best" plane.
|
|
62
67
|
*/
|
|
63
68
|
static createRightHandedLocalToWorld(...params: any[]): Transform | undefined;
|
|
64
69
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* point most distant from that line.
|
|
70
|
+
* Try to create a frame whose xy plane is through points.
|
|
71
|
+
* * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
|
|
72
|
+
* direction is toward the point most distant from that line.
|
|
69
73
|
* @param points array of points
|
|
70
74
|
*/
|
|
71
75
|
static createFrameToDistantPoints(points: Point3d[]): Transform | undefined;
|
|
72
76
|
/**
|
|
73
|
-
*
|
|
77
|
+
* Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
|
|
74
78
|
*
|
|
75
|
-
* *
|
|
76
|
-
* point most distant from that line.
|
|
79
|
+
* * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
|
|
80
|
+
* direction is toward the point most distant from that line.
|
|
77
81
|
* @param points array of points
|
|
78
82
|
*/
|
|
79
83
|
static createFrameWithCCWPolygon(points: Point3d[]): Transform | undefined;
|