@itwin/core-geometry 3.0.0-dev.136 → 3.0.0-dev.141

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.
Files changed (57) hide show
  1. package/lib/cjs/bspline/BSplineCurveOps.d.ts +7 -0
  2. package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
  3. package/lib/cjs/bspline/BSplineCurveOps.js +21 -6
  4. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  5. package/lib/cjs/bspline/BezierCurve3dH.js +1 -1
  6. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  7. package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
  8. package/lib/cjs/bspline/InterpolationCurve3d.js +12 -5
  9. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  10. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +1 -1
  11. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  12. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +2 -3
  13. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  14. package/lib/cjs/curve/CurvePrimitive.js +2 -0
  15. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  16. package/lib/cjs/curve/spiral/DirectSpiral3d.js +2 -2
  17. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  18. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  19. package/lib/cjs/geometry3d/FrameBuilder.js +12 -0
  20. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  21. package/lib/cjs/geometry3d/Transform.d.ts +5 -0
  22. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  23. package/lib/cjs/geometry3d/Transform.js +7 -0
  24. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  25. package/lib/cjs/serialization/GeometrySamples.d.ts +7 -0
  26. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  27. package/lib/cjs/serialization/GeometrySamples.js +34 -0
  28. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  29. package/lib/esm/bspline/BSplineCurveOps.d.ts +7 -0
  30. package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
  31. package/lib/esm/bspline/BSplineCurveOps.js +21 -6
  32. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  33. package/lib/esm/bspline/BezierCurve3dH.js +1 -1
  34. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  35. package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
  36. package/lib/esm/bspline/InterpolationCurve3d.js +12 -5
  37. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  38. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +1 -1
  39. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  40. package/lib/esm/curve/CurveChainWithDistanceIndex.js +2 -3
  41. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  42. package/lib/esm/curve/CurvePrimitive.js +2 -0
  43. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  44. package/lib/esm/curve/spiral/DirectSpiral3d.js +2 -2
  45. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  46. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  47. package/lib/esm/geometry3d/FrameBuilder.js +12 -0
  48. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  49. package/lib/esm/geometry3d/Transform.d.ts +5 -0
  50. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  51. package/lib/esm/geometry3d/Transform.js +7 -0
  52. package/lib/esm/geometry3d/Transform.js.map +1 -1
  53. package/lib/esm/serialization/GeometrySamples.d.ts +7 -0
  54. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  55. package/lib/esm/serialization/GeometrySamples.js +34 -0
  56. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  57. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"InterpolationCurve3d.d.ts","sourceRoot":"","sources":["../../../src/bspline/InterpolationCurve3d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InterpolationCurve3d.d.ts","sourceRoot":"","sources":["../../../src/bspline/InterpolationCurve3d.ts"],"names":[],"mappings":"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"}
@@ -155,8 +155,13 @@ class InterpolationCurve3dOptions {
155
155
  if (dataA.knots === undefined && dataB.knots === undefined)
156
156
  return true;
157
157
  /* alas .. need to allow tricky mismatch of end replication */
158
- const knotsA = BSplineCurveOps_1.BSplineCurveOps.C2CubicFit.convertCubicKnotVectorToFitParams(dataA.knots, dataA.fitPoints.length, false);
159
- const knotsB = BSplineCurveOps_1.BSplineCurveOps.C2CubicFit.convertCubicKnotVectorToFitParams(dataB.knots, dataB.fitPoints.length, false);
158
+ let knotsA = dataA.knots, knotsB = dataB.knots;
159
+ if (dataA.knots === undefined) // construct undefined knots to compare against defined knots
160
+ knotsA = BSplineCurveOps_1.BSplineCurveOps.C2CubicFit.constructFitParametersFromPoints(dataA.fitPoints, dataA.isChordLenKnots, dataA.closed);
161
+ else if (dataB.knots === undefined)
162
+ knotsB = BSplineCurveOps_1.BSplineCurveOps.C2CubicFit.constructFitParametersFromPoints(dataB.fitPoints, dataB.isChordLenKnots, dataB.closed);
163
+ knotsA = BSplineCurveOps_1.BSplineCurveOps.C2CubicFit.convertCubicKnotVectorToFitParams(knotsA, dataA.fitPoints.length, false);
164
+ knotsB = BSplineCurveOps_1.BSplineCurveOps.C2CubicFit.convertCubicKnotVectorToFitParams(knotsB, dataB.fitPoints.length, false);
160
165
  return Geometry_1.Geometry.almostEqualNumberArrays(knotsA, knotsB, (a, b) => Geometry_1.Geometry.isAlmostEqualNumber(a, b));
161
166
  }
162
167
  }
@@ -167,8 +172,7 @@ class InterpolationCurve3dOptions {
167
172
  this.fitPoints.reverse();
168
173
  if (this.knots)
169
174
  this.knots.reverse();
170
- // Swap pointers to tangents.
171
- // NEEDS WORK: Do the vector coordinates need to be negated?
175
+ // Swap pointers to tangents. They don't need to be negated because they point into the curve.
172
176
  const oldStart = this._startTangent;
173
177
  this._startTangent = this.endTangent;
174
178
  this._endTangent = oldStart;
@@ -250,7 +254,10 @@ class InterpolationCurve3d extends ProxyCurve_1.ProxyCurve {
250
254
  const proxyOk = this._proxyCurve.tryTransformInPlace(transform);
251
255
  if (proxyOk) {
252
256
  transform.multiplyPoint3dArrayInPlace(this._options.fitPoints);
253
- // START HERE: transform start/endTangent
257
+ if (this._options.startTangent)
258
+ transform.multiplyVectorInPlace(this._options.startTangent);
259
+ if (this._options.endTangent)
260
+ transform.multiplyVectorInPlace(this._options.endTangent);
254
261
  }
255
262
  return proxyOk;
256
263
  }
@@ -1 +1 @@
1
- {"version":3,"file":"InterpolationCurve3d.js","sourceRoot":"","sources":["../../../src/bspline/InterpolationCurve3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Bspline\r\n */\r\n\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { ProxyCurve } from \"../curve/ProxyCurve\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { BSplineCurveOps } from \"../bspline/BSplineCurveOps\";\r\nimport { BSplineCurve3d } from \"./BSplineCurve\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { XYZProps } from \"../geometry3d/XYZProps\";\r\n\r\n/**\r\n * fitPoints and end condition data for [[InterpolationCurve3d]]\r\n * * This is a \"json compatible\" version of [[InterpolationCurve3dOptions]]\r\n * @public\r\n */\r\nexport interface InterpolationCurve3dProps {\r\n /** order of the computed bspline (one more than degree) */\r\n order?: number;\r\n /** true if the B-spline construction should be periodic */\r\n closed?: boolean;\r\n /** if closed and no knots, compute chord length knots (1) or uniform knots (0). Chord length knots give best fit. */\r\n isChordLenKnots?: number;\r\n /** if !closed but first and last fitPoints are equal, pivot computed start/end tangent(s) so that they are colinear (1) or leave them be (0). */\r\n isColinearTangents?: number;\r\n /** if !closed and start/endTangent is given, set its magnitude to the first/last fit point chord length (1) or to the magnitude of the Bessel tangent (0). Bessel gives best fit. */\r\n isChordLenTangents?: number;\r\n /** if !closed and start/endTangent is absent, compute it using the natural end condition (1) or Bessel (0). Bessel gives best fit. */\r\n isNaturalTangents?: number;\r\n /** optional start tangent, pointing into curve. Magnitude is ignored. */\r\n startTangent?: XYZProps;\r\n /** optional end tangent, pointing into curve. Magnitude is ignored. */\r\n endTangent?: XYZProps;\r\n /** points that the curve must pass through */\r\n fitPoints: XYZProps[];\r\n /** parameters for curve fitting, one per fit point */\r\n knots?: number[];\r\n}\r\n\r\n/**\r\n * fitPoints and end condition data for [[InterpolationCurve3d]]\r\n * * This is a \"typed object\" version of the serializer-friendly [[InterpolationCurve3dProps]]\r\n * * Typical use cases rarely require all parameters, so the constructor does not itemize them as parameters.\r\n * @public\r\n */\r\nexport class InterpolationCurve3dOptions {\r\n /**\r\n * Constructor.\r\n * @param fitPoints points to CAPTURE\r\n * @param knots array to CAPTURE\r\n */\r\n public constructor(fitPoints?: Point3d[], knots?: number[]) {\r\n this._fitPoints = fitPoints ? fitPoints : [];\r\n this._knots = knots;\r\n }\r\n\r\n private _order?: number;\r\n private _closed?: boolean;\r\n private _isChordLenKnots?: number;\r\n private _isColinearTangents?: number;\r\n private _isChordLenTangents?: number;\r\n private _isNaturalTangents?: number;\r\n private _startTangent?: Vector3d;\r\n private _endTangent?: Vector3d;\r\n private _fitPoints: Point3d[];\r\n private _knots?: number[];\r\n\r\n /** `order` as property */\r\n public get order(): number { return Geometry.resolveNumber(this._order, 4); }\r\n public set order(val: number) { this._order = val; }\r\n /** `closed` as property */\r\n public get closed(): boolean { return Geometry.resolveValue(this._closed, false); }\r\n public set closed(val: boolean) { this._closed = val; }\r\n /** `isChordLenKnots` as property */\r\n public get isChordLenKnots(): number { return Geometry.resolveNumber(this._isChordLenKnots, 0); }\r\n public set isChordLenKnots(val: number) { this._isChordLenKnots = val; }\r\n /** `isColinearTangents` as property */\r\n public get isColinearTangents(): number { return Geometry.resolveNumber(this._isColinearTangents, 0); }\r\n public set isColinearTangents(val: number) { this._isColinearTangents = val; }\r\n /** `isChordLenTangents` as property */\r\n public get isChordLenTangents(): number { return Geometry.resolveNumber(this._isChordLenTangents, 0); }\r\n public set isChordLenTangents(val: number) { this._isChordLenTangents = val; }\r\n /** `isNaturalTangents` as property */\r\n public get isNaturalTangents(): number { return Geometry.resolveNumber(this._isNaturalTangents, 0); }\r\n public set isNaturalTangents(val: number) { this._isNaturalTangents = val; }\r\n /** access POSSIBLY UNDEFINED start tangent. Setter CAPTURES. */\r\n public get startTangent(): Vector3d | undefined { return this._startTangent; }\r\n public set startTangent(val: Vector3d | undefined) { this._startTangent = val; }\r\n /** access POSSIBLY UNDEFINED end tangent. Setter CAPTURES. */\r\n public get endTangent(): Vector3d | undefined { return this._endTangent; }\r\n public set endTangent(val: Vector3d | undefined) { this._endTangent = val; }\r\n /** access POINTER TO fit points. Setter CAPTURES. */\r\n public get fitPoints(): Point3d[] { return this._fitPoints; }\r\n public set fitPoints(val: Point3d[]) { this._fitPoints = val; }\r\n /** access POSSIBLY UNDEFINED knots array. Setter CAPTURES. */\r\n public get knots(): number[] | undefined { return this._knots; }\r\n public set knots(val: number[] | undefined) { this._knots = val; }\r\n\r\n /** One step setup of properties not named in constructor.\r\n * * CAPTURE pointers to tangents.\r\n * * OPTIONALLY downgrade \"0\" values to undefined.\r\n */\r\n public captureOptionalProps(\r\n order: number | undefined,\r\n closed: boolean | undefined,\r\n isChordLenKnots: number | undefined,\r\n isColinearTangents: number | undefined,\r\n isChordLenTangent: number | undefined,\r\n isNaturalTangents: number | undefined,\r\n startTangent: Vector3d | undefined,\r\n endTangent: Vector3d | undefined\r\n ) {\r\n this._order = Geometry.resolveToUndefined(order, 0);\r\n this._closed = Geometry.resolveToUndefined(closed, false);\r\n this._isChordLenKnots = Geometry.resolveToUndefined(isChordLenKnots, 0);\r\n this._isColinearTangents = Geometry.resolveToUndefined(isColinearTangents, 0);\r\n this._isChordLenTangents = Geometry.resolveToUndefined(isChordLenTangent, 0);\r\n this._isNaturalTangents = Geometry.resolveToUndefined(isNaturalTangents, 0);\r\n this._startTangent = startTangent;\r\n this._endTangent = endTangent;\r\n\r\n }\r\n /** Clone with strongly typed members reduced to simple json, with \"undefined\" members omitted */\r\n public cloneAsInterpolationCurve3dProps(): InterpolationCurve3dProps {\r\n const props: InterpolationCurve3dProps = {\r\n fitPoints: Point3dArray.cloneDeepJSONNumberArrays(this.fitPoints),\r\n knots: this._knots?.slice(),\r\n };\r\n if (this._order !== undefined)\r\n props.order = this._order;\r\n if (this._closed !== undefined)\r\n props.closed = this._closed;\r\n if (this._isChordLenKnots !== undefined)\r\n props.isChordLenKnots = this._isChordLenKnots;\r\n if (this._isColinearTangents !== undefined)\r\n props.isColinearTangents = this._isColinearTangents;\r\n if (this._isChordLenTangents !== undefined)\r\n props.isChordLenTangents = this._isChordLenTangents;\r\n if (this._isNaturalTangents !== undefined)\r\n props.isNaturalTangents = this._isNaturalTangents;\r\n if (this._startTangent !== undefined)\r\n props.startTangent = this._startTangent?.toArray();\r\n if (this._endTangent !== undefined)\r\n props.endTangent = this._endTangent?.toArray();\r\n return props;\r\n }\r\n /** Clone with strongly typed members reduced to simple json. */\r\n public clone(): InterpolationCurve3dOptions {\r\n const clone = new InterpolationCurve3dOptions(Point3dArray.clonePoint3dArray(this.fitPoints), this.knots?.slice());\r\n clone._order = this.order;\r\n clone._closed = this.closed;\r\n clone._isChordLenKnots = this.isChordLenKnots;\r\n clone._isColinearTangents = this.isColinearTangents;\r\n clone._isChordLenTangents = this.isChordLenTangents;\r\n clone._isNaturalTangents = this.isNaturalTangents;\r\n clone._startTangent = this._startTangent?.clone();\r\n clone._endTangent = this._endTangent?.clone();\r\n return clone;\r\n }\r\n\r\n /** Clone with strongly typed members reduced to simple json. */\r\n public static create(source: InterpolationCurve3dProps): InterpolationCurve3dOptions {\r\n const result = new InterpolationCurve3dOptions(Point3dArray.clonePoint3dArray(source.fitPoints), source.knots?.slice());\r\n result._order = source.order;\r\n result._closed = source.closed;\r\n result._isChordLenKnots = source.isChordLenKnots;\r\n result._isColinearTangents = source.isColinearTangents;\r\n result._isChordLenTangents = source.isChordLenTangents;\r\n result._isNaturalTangents = source.isNaturalTangents;\r\n result._startTangent = source.startTangent ? Vector3d.fromJSON(source.startTangent) : undefined;\r\n result._endTangent = source.endTangent ? Vector3d.fromJSON(source.endTangent) : undefined;\r\n return result;\r\n }\r\n // ugh.\r\n // vector equality test with awkward rule that 000 matches undefined.\r\n private static areAlmostEqualAllow000AsUndefined(a: Vector3d | undefined, b: Vector3d | undefined): boolean {\r\n if (a !== undefined && a.maxAbs() === 0)\r\n a = undefined;\r\n if (b !== undefined && b.maxAbs() === 0)\r\n b = undefined;\r\n if (a !== undefined && b !== undefined)\r\n return a.isAlmostEqual(b);\r\n return a === undefined && b === undefined;\r\n }\r\n public static areAlmostEqual(dataA: InterpolationCurve3dOptions | undefined, dataB: InterpolationCurve3dOptions | undefined): boolean {\r\n if (dataA === undefined && dataB === undefined)\r\n return true;\r\n if (dataA !== undefined && dataB !== undefined) {\r\n if (Geometry.areEqualAllowUndefined(dataA.order, dataB.order)\r\n && Geometry.areEqualAllowUndefined(dataA.closed, dataB.closed)\r\n && Geometry.areEqualAllowUndefined(dataA.isChordLenKnots, dataB.isChordLenKnots)\r\n && Geometry.areEqualAllowUndefined(dataA.isColinearTangents, dataB.isColinearTangents)\r\n && Geometry.areEqualAllowUndefined(dataA.isNaturalTangents, dataB.isNaturalTangents)\r\n && this.areAlmostEqualAllow000AsUndefined(dataA.startTangent, dataB.startTangent)\r\n && this.areAlmostEqualAllow000AsUndefined(dataA.endTangent, dataB.endTangent)\r\n && Geometry.almostEqualArrays(dataA.fitPoints, dataB.fitPoints, (a: Point3d, b: Point3d) => a.isAlmostEqual(b))) {\r\n if (Geometry.almostEqualNumberArrays(dataA.knots, dataB.knots, (a: number, b: number) => a === b))\r\n return true;\r\n if (dataA.knots === undefined && dataB.knots === undefined)\r\n return true;\r\n /* alas .. need to allow tricky mismatch of end replication */\r\n const knotsA = BSplineCurveOps.C2CubicFit.convertCubicKnotVectorToFitParams(dataA.knots, dataA.fitPoints.length, false);\r\n const knotsB = BSplineCurveOps.C2CubicFit.convertCubicKnotVectorToFitParams(dataB.knots, dataB.fitPoints.length, false);\r\n return Geometry.almostEqualNumberArrays(knotsA, knotsB, (a: number, b: number) => Geometry.isAlmostEqualNumber(a, b));\r\n }\r\n }\r\n return false;\r\n }\r\n /** reverse the order or sense of all start-to-end related properties. */\r\n public reverseInPlace() {\r\n this.fitPoints.reverse();\r\n if (this.knots)\r\n this.knots.reverse();\r\n // Swap pointers to tangents.\r\n // NEEDS WORK: Do the vector coordinates need to be negated?\r\n const oldStart = this._startTangent;\r\n this._startTangent = this.endTangent;\r\n this._endTangent = oldStart;\r\n }\r\n}\r\n\r\n/**\r\n * Interpolating curve.\r\n * * Derive from [[ProxyCurve]]\r\n * * Use a [[BSplineCurve3d]] as the proxy\r\n * *\r\n * @public\r\n */\r\nexport class InterpolationCurve3d extends ProxyCurve {\r\n public readonly curvePrimitiveType = \"interpolationCurve\";\r\n private _options: InterpolationCurve3dOptions;\r\n /**\r\n * CAPTURE properties and proxy curve.\r\n */\r\n private constructor(properties: InterpolationCurve3dOptions, proxyCurve: CurvePrimitive) {\r\n super(proxyCurve);\r\n this._options = properties;\r\n }\r\n public override dispatchToGeometryHandler(handler: GeometryHandler) {\r\n return handler.handleInterpolationCurve3d(this);\r\n }\r\n /**\r\n * Create an [[InterpolationCurve3d]] based on points, knots, and other properties in the [[InterpolationCurve3dProps]] or [[InterpolationCurve3dOptions]].\r\n * * This saves a COPY OF the options or props.\r\n * * Use createCapture () if the options or props can be used without copy\r\n */\r\n public static create(options: InterpolationCurve3dOptions | InterpolationCurve3dProps): InterpolationCurve3d | undefined {\r\n let optionsCopy;\r\n if (options instanceof InterpolationCurve3dOptions) {\r\n optionsCopy = options.clone();\r\n } else {\r\n optionsCopy = InterpolationCurve3dOptions.create(options);\r\n }\r\n return InterpolationCurve3d.createCapture(optionsCopy);\r\n }\r\n /** Create an [[InterpolationCurve3d]]\r\n * * The options object is captured into the new curve object (not copied)\r\n */\r\n public static createCapture(options: InterpolationCurve3dOptions): InterpolationCurve3d | undefined {\r\n const proxyCurve = BSplineCurve3d.createFromInterpolationCurve3dOptions(options);\r\n if (proxyCurve)\r\n return new InterpolationCurve3d(options, proxyCurve);\r\n return undefined;\r\n }\r\n /** Return a (copy of) the defining points, packed as a Float64Array */\r\n public copyFitPointsFloat64Array(): Float64Array {\r\n return Point3dArray.cloneXYZPropsAsFloat64Array(this._options.fitPoints);\r\n }\r\n\r\n /**\r\n * Return json key-value pairs for for this [[InterpolationCurve3d]].\r\n * @returns\r\n */\r\n public toJSON(): any {\r\n return this._options.cloneAsInterpolationCurve3dProps();\r\n }\r\n /** Clone the [[InterpolationCurve3dProps]] object in this [[InterpolationCurve3d]] */\r\n public cloneProps(): InterpolationCurve3dProps {\r\n return this._options.cloneAsInterpolationCurve3dProps();\r\n }\r\n\r\n /** return the options pointer */\r\n public get options(): InterpolationCurve3dOptions { return this._options; }\r\n\r\n /**\r\n * Reverse the curve direction.\r\n * * This updates both the defining properties and the proxy bspline.\r\n */\r\n public reverseInPlace(): void {\r\n this._proxyCurve.reverseInPlace();\r\n this._options.reverseInPlace();\r\n }\r\n /**\r\n * Transform this [[InterpolationCurve3d]] and its defining data in place\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n const proxyOk = this._proxyCurve.tryTransformInPlace(transform);\r\n if (proxyOk) {\r\n transform.multiplyPoint3dArrayInPlace(this._options.fitPoints);\r\n // START HERE: transform start/endTangent\r\n }\r\n return proxyOk;\r\n }\r\n /**\r\n * Return a transformed clone.\r\n */\r\n public cloneTransformed(transform: Transform): GeometryQuery | undefined {\r\n const myClone = this.clone();\r\n if (myClone && myClone?.tryTransformInPlace(transform))\r\n return myClone;\r\n return undefined;\r\n }\r\n /**\r\n * Return a clone.\r\n */\r\n public clone(): GeometryQuery | undefined {\r\n const proxyClone = this._proxyCurve.clone();\r\n if (proxyClone) {\r\n return new InterpolationCurve3d(this._options.clone(), proxyClone as CurvePrimitive);\r\n }\r\n return undefined;\r\n }\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof InterpolationCurve3d) {\r\n return InterpolationCurve3dOptions.areAlmostEqual(this._options, other._options);\r\n }\r\n return false;\r\n }\r\n /** Test if `other` is also an [[InterpolationCurve3d]] */\r\n public isSameGeometryClass(other: GeometryQuery): boolean { return other instanceof InterpolationCurve3d; }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"InterpolationCurve3d.js","sourceRoot":"","sources":["../../../src/bspline/InterpolationCurve3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Bspline\r\n */\r\n\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { ProxyCurve } from \"../curve/ProxyCurve\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { BSplineCurveOps } from \"../bspline/BSplineCurveOps\";\r\nimport { BSplineCurve3d } from \"./BSplineCurve\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { XYZProps } from \"../geometry3d/XYZProps\";\r\n\r\n/**\r\n * fitPoints and end condition data for [[InterpolationCurve3d]]\r\n * * This is a \"json compatible\" version of [[InterpolationCurve3dOptions]]\r\n * @public\r\n */\r\nexport interface InterpolationCurve3dProps {\r\n /** order of the computed bspline (one more than degree) */\r\n order?: number;\r\n /** true if the B-spline construction should be periodic */\r\n closed?: boolean;\r\n /** if closed and no knots, compute chord length knots (1) or uniform knots (0). Chord length knots give best fit. */\r\n isChordLenKnots?: number;\r\n /** if !closed but first and last fitPoints are equal, pivot computed start/end tangent(s) so that they are colinear (1) or leave them be (0). */\r\n isColinearTangents?: number;\r\n /** if !closed and start/endTangent is given, set its magnitude to the first/last fit point chord length (1) or to the magnitude of the Bessel tangent (0). Bessel gives best fit. */\r\n isChordLenTangents?: number;\r\n /** if !closed and start/endTangent is absent, compute it using the natural end condition (1) or Bessel (0). Bessel gives best fit. */\r\n isNaturalTangents?: number;\r\n /** optional start tangent, pointing into curve. Magnitude is ignored. */\r\n startTangent?: XYZProps;\r\n /** optional end tangent, pointing into curve. Magnitude is ignored. */\r\n endTangent?: XYZProps;\r\n /** points that the curve must pass through */\r\n fitPoints: XYZProps[];\r\n /** parameters for curve fitting, one per fit point */\r\n knots?: number[];\r\n}\r\n\r\n/**\r\n * fitPoints and end condition data for [[InterpolationCurve3d]]\r\n * * This is a \"typed object\" version of the serializer-friendly [[InterpolationCurve3dProps]]\r\n * * Typical use cases rarely require all parameters, so the constructor does not itemize them as parameters.\r\n * @public\r\n */\r\nexport class InterpolationCurve3dOptions {\r\n /**\r\n * Constructor.\r\n * @param fitPoints points to CAPTURE\r\n * @param knots array to CAPTURE\r\n */\r\n public constructor(fitPoints?: Point3d[], knots?: number[]) {\r\n this._fitPoints = fitPoints ? fitPoints : [];\r\n this._knots = knots;\r\n }\r\n\r\n private _order?: number;\r\n private _closed?: boolean;\r\n private _isChordLenKnots?: number;\r\n private _isColinearTangents?: number;\r\n private _isChordLenTangents?: number;\r\n private _isNaturalTangents?: number;\r\n private _startTangent?: Vector3d;\r\n private _endTangent?: Vector3d;\r\n private _fitPoints: Point3d[];\r\n private _knots?: number[];\r\n\r\n /** `order` as property */\r\n public get order(): number { return Geometry.resolveNumber(this._order, 4); }\r\n public set order(val: number) { this._order = val; }\r\n /** `closed` as property */\r\n public get closed(): boolean { return Geometry.resolveValue(this._closed, false); }\r\n public set closed(val: boolean) { this._closed = val; }\r\n /** `isChordLenKnots` as property */\r\n public get isChordLenKnots(): number { return Geometry.resolveNumber(this._isChordLenKnots, 0); }\r\n public set isChordLenKnots(val: number) { this._isChordLenKnots = val; }\r\n /** `isColinearTangents` as property */\r\n public get isColinearTangents(): number { return Geometry.resolveNumber(this._isColinearTangents, 0); }\r\n public set isColinearTangents(val: number) { this._isColinearTangents = val; }\r\n /** `isChordLenTangents` as property */\r\n public get isChordLenTangents(): number { return Geometry.resolveNumber(this._isChordLenTangents, 0); }\r\n public set isChordLenTangents(val: number) { this._isChordLenTangents = val; }\r\n /** `isNaturalTangents` as property */\r\n public get isNaturalTangents(): number { return Geometry.resolveNumber(this._isNaturalTangents, 0); }\r\n public set isNaturalTangents(val: number) { this._isNaturalTangents = val; }\r\n /** access POSSIBLY UNDEFINED start tangent. Setter CAPTURES. */\r\n public get startTangent(): Vector3d | undefined { return this._startTangent; }\r\n public set startTangent(val: Vector3d | undefined) { this._startTangent = val; }\r\n /** access POSSIBLY UNDEFINED end tangent. Setter CAPTURES. */\r\n public get endTangent(): Vector3d | undefined { return this._endTangent; }\r\n public set endTangent(val: Vector3d | undefined) { this._endTangent = val; }\r\n /** access POINTER TO fit points. Setter CAPTURES. */\r\n public get fitPoints(): Point3d[] { return this._fitPoints; }\r\n public set fitPoints(val: Point3d[]) { this._fitPoints = val; }\r\n /** access POSSIBLY UNDEFINED knots array. Setter CAPTURES. */\r\n public get knots(): number[] | undefined { return this._knots; }\r\n public set knots(val: number[] | undefined) { this._knots = val; }\r\n\r\n /** One step setup of properties not named in constructor.\r\n * * CAPTURE pointers to tangents.\r\n * * OPTIONALLY downgrade \"0\" values to undefined.\r\n */\r\n public captureOptionalProps(\r\n order: number | undefined,\r\n closed: boolean | undefined,\r\n isChordLenKnots: number | undefined,\r\n isColinearTangents: number | undefined,\r\n isChordLenTangent: number | undefined,\r\n isNaturalTangents: number | undefined,\r\n startTangent: Vector3d | undefined,\r\n endTangent: Vector3d | undefined\r\n ) {\r\n this._order = Geometry.resolveToUndefined(order, 0);\r\n this._closed = Geometry.resolveToUndefined(closed, false);\r\n this._isChordLenKnots = Geometry.resolveToUndefined(isChordLenKnots, 0);\r\n this._isColinearTangents = Geometry.resolveToUndefined(isColinearTangents, 0);\r\n this._isChordLenTangents = Geometry.resolveToUndefined(isChordLenTangent, 0);\r\n this._isNaturalTangents = Geometry.resolveToUndefined(isNaturalTangents, 0);\r\n this._startTangent = startTangent;\r\n this._endTangent = endTangent;\r\n\r\n }\r\n /** Clone with strongly typed members reduced to simple json, with \"undefined\" members omitted */\r\n public cloneAsInterpolationCurve3dProps(): InterpolationCurve3dProps {\r\n const props: InterpolationCurve3dProps = {\r\n fitPoints: Point3dArray.cloneDeepJSONNumberArrays(this.fitPoints),\r\n knots: this._knots?.slice(),\r\n };\r\n if (this._order !== undefined)\r\n props.order = this._order;\r\n if (this._closed !== undefined)\r\n props.closed = this._closed;\r\n if (this._isChordLenKnots !== undefined)\r\n props.isChordLenKnots = this._isChordLenKnots;\r\n if (this._isColinearTangents !== undefined)\r\n props.isColinearTangents = this._isColinearTangents;\r\n if (this._isChordLenTangents !== undefined)\r\n props.isChordLenTangents = this._isChordLenTangents;\r\n if (this._isNaturalTangents !== undefined)\r\n props.isNaturalTangents = this._isNaturalTangents;\r\n if (this._startTangent !== undefined)\r\n props.startTangent = this._startTangent?.toArray();\r\n if (this._endTangent !== undefined)\r\n props.endTangent = this._endTangent?.toArray();\r\n return props;\r\n }\r\n /** Clone with strongly typed members reduced to simple json. */\r\n public clone(): InterpolationCurve3dOptions {\r\n const clone = new InterpolationCurve3dOptions(Point3dArray.clonePoint3dArray(this.fitPoints), this.knots?.slice());\r\n clone._order = this.order;\r\n clone._closed = this.closed;\r\n clone._isChordLenKnots = this.isChordLenKnots;\r\n clone._isColinearTangents = this.isColinearTangents;\r\n clone._isChordLenTangents = this.isChordLenTangents;\r\n clone._isNaturalTangents = this.isNaturalTangents;\r\n clone._startTangent = this._startTangent?.clone();\r\n clone._endTangent = this._endTangent?.clone();\r\n return clone;\r\n }\r\n\r\n /** Clone with strongly typed members reduced to simple json. */\r\n public static create(source: InterpolationCurve3dProps): InterpolationCurve3dOptions {\r\n const result = new InterpolationCurve3dOptions(Point3dArray.clonePoint3dArray(source.fitPoints), source.knots?.slice());\r\n result._order = source.order;\r\n result._closed = source.closed;\r\n result._isChordLenKnots = source.isChordLenKnots;\r\n result._isColinearTangents = source.isColinearTangents;\r\n result._isChordLenTangents = source.isChordLenTangents;\r\n result._isNaturalTangents = source.isNaturalTangents;\r\n result._startTangent = source.startTangent ? Vector3d.fromJSON(source.startTangent) : undefined;\r\n result._endTangent = source.endTangent ? Vector3d.fromJSON(source.endTangent) : undefined;\r\n return result;\r\n }\r\n // ugh.\r\n // vector equality test with awkward rule that 000 matches undefined.\r\n private static areAlmostEqualAllow000AsUndefined(a: Vector3d | undefined, b: Vector3d | undefined): boolean {\r\n if (a !== undefined && a.maxAbs() === 0)\r\n a = undefined;\r\n if (b !== undefined && b.maxAbs() === 0)\r\n b = undefined;\r\n if (a !== undefined && b !== undefined)\r\n return a.isAlmostEqual(b);\r\n return a === undefined && b === undefined;\r\n }\r\n public static areAlmostEqual(dataA: InterpolationCurve3dOptions | undefined, dataB: InterpolationCurve3dOptions | undefined): boolean {\r\n if (dataA === undefined && dataB === undefined)\r\n return true;\r\n if (dataA !== undefined && dataB !== undefined) {\r\n if (Geometry.areEqualAllowUndefined(dataA.order, dataB.order)\r\n && Geometry.areEqualAllowUndefined(dataA.closed, dataB.closed)\r\n && Geometry.areEqualAllowUndefined(dataA.isChordLenKnots, dataB.isChordLenKnots)\r\n && Geometry.areEqualAllowUndefined(dataA.isColinearTangents, dataB.isColinearTangents)\r\n && Geometry.areEqualAllowUndefined(dataA.isNaturalTangents, dataB.isNaturalTangents)\r\n && this.areAlmostEqualAllow000AsUndefined(dataA.startTangent, dataB.startTangent)\r\n && this.areAlmostEqualAllow000AsUndefined(dataA.endTangent, dataB.endTangent)\r\n && Geometry.almostEqualArrays(dataA.fitPoints, dataB.fitPoints, (a: Point3d, b: Point3d) => a.isAlmostEqual(b))) {\r\n if (Geometry.almostEqualNumberArrays(dataA.knots, dataB.knots, (a: number, b: number) => a === b))\r\n return true;\r\n if (dataA.knots === undefined && dataB.knots === undefined)\r\n return true;\r\n /* alas .. need to allow tricky mismatch of end replication */\r\n let knotsA = dataA.knots, knotsB = dataB.knots;\r\n if (dataA.knots === undefined) // construct undefined knots to compare against defined knots\r\n knotsA = BSplineCurveOps.C2CubicFit.constructFitParametersFromPoints(dataA.fitPoints, dataA.isChordLenKnots, dataA.closed);\r\n else if (dataB.knots === undefined)\r\n knotsB = BSplineCurveOps.C2CubicFit.constructFitParametersFromPoints(dataB.fitPoints, dataB.isChordLenKnots, dataB.closed);\r\n knotsA = BSplineCurveOps.C2CubicFit.convertCubicKnotVectorToFitParams(knotsA, dataA.fitPoints.length, false);\r\n knotsB = BSplineCurveOps.C2CubicFit.convertCubicKnotVectorToFitParams(knotsB, dataB.fitPoints.length, false);\r\n return Geometry.almostEqualNumberArrays(knotsA, knotsB, (a: number, b: number) => Geometry.isAlmostEqualNumber(a, b));\r\n }\r\n }\r\n return false;\r\n }\r\n /** reverse the order or sense of all start-to-end related properties. */\r\n public reverseInPlace() {\r\n this.fitPoints.reverse();\r\n if (this.knots)\r\n this.knots.reverse();\r\n // Swap pointers to tangents. They don't need to be negated because they point into the curve.\r\n const oldStart = this._startTangent;\r\n this._startTangent = this.endTangent;\r\n this._endTangent = oldStart;\r\n }\r\n}\r\n\r\n/**\r\n * Interpolating curve.\r\n * * Derive from [[ProxyCurve]]\r\n * * Use a [[BSplineCurve3d]] as the proxy\r\n * *\r\n * @public\r\n */\r\nexport class InterpolationCurve3d extends ProxyCurve {\r\n public readonly curvePrimitiveType = \"interpolationCurve\";\r\n private _options: InterpolationCurve3dOptions;\r\n /**\r\n * CAPTURE properties and proxy curve.\r\n */\r\n private constructor(properties: InterpolationCurve3dOptions, proxyCurve: CurvePrimitive) {\r\n super(proxyCurve);\r\n this._options = properties;\r\n }\r\n public override dispatchToGeometryHandler(handler: GeometryHandler) {\r\n return handler.handleInterpolationCurve3d(this);\r\n }\r\n /**\r\n * Create an [[InterpolationCurve3d]] based on points, knots, and other properties in the [[InterpolationCurve3dProps]] or [[InterpolationCurve3dOptions]].\r\n * * This saves a COPY OF the options or props.\r\n * * Use createCapture () if the options or props can be used without copy\r\n */\r\n public static create(options: InterpolationCurve3dOptions | InterpolationCurve3dProps): InterpolationCurve3d | undefined {\r\n let optionsCopy;\r\n if (options instanceof InterpolationCurve3dOptions) {\r\n optionsCopy = options.clone();\r\n } else {\r\n optionsCopy = InterpolationCurve3dOptions.create(options);\r\n }\r\n return InterpolationCurve3d.createCapture(optionsCopy);\r\n }\r\n /** Create an [[InterpolationCurve3d]]\r\n * * The options object is captured into the new curve object (not copied)\r\n */\r\n public static createCapture(options: InterpolationCurve3dOptions): InterpolationCurve3d | undefined {\r\n const proxyCurve = BSplineCurve3d.createFromInterpolationCurve3dOptions(options);\r\n if (proxyCurve)\r\n return new InterpolationCurve3d(options, proxyCurve);\r\n return undefined;\r\n }\r\n /** Return a (copy of) the defining points, packed as a Float64Array */\r\n public copyFitPointsFloat64Array(): Float64Array {\r\n return Point3dArray.cloneXYZPropsAsFloat64Array(this._options.fitPoints);\r\n }\r\n\r\n /**\r\n * Return json key-value pairs for for this [[InterpolationCurve3d]].\r\n * @returns\r\n */\r\n public toJSON(): any {\r\n return this._options.cloneAsInterpolationCurve3dProps();\r\n }\r\n /** Clone the [[InterpolationCurve3dProps]] object in this [[InterpolationCurve3d]] */\r\n public cloneProps(): InterpolationCurve3dProps {\r\n return this._options.cloneAsInterpolationCurve3dProps();\r\n }\r\n\r\n /** return the options pointer */\r\n public get options(): InterpolationCurve3dOptions { return this._options; }\r\n\r\n /**\r\n * Reverse the curve direction.\r\n * * This updates both the defining properties and the proxy bspline.\r\n */\r\n public reverseInPlace(): void {\r\n this._proxyCurve.reverseInPlace();\r\n this._options.reverseInPlace();\r\n }\r\n /**\r\n * Transform this [[InterpolationCurve3d]] and its defining data in place\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n const proxyOk = this._proxyCurve.tryTransformInPlace(transform);\r\n if (proxyOk) {\r\n transform.multiplyPoint3dArrayInPlace(this._options.fitPoints);\r\n if (this._options.startTangent)\r\n transform.multiplyVectorInPlace(this._options.startTangent);\r\n if (this._options.endTangent)\r\n transform.multiplyVectorInPlace(this._options.endTangent);\r\n }\r\n return proxyOk;\r\n }\r\n /**\r\n * Return a transformed clone.\r\n */\r\n public cloneTransformed(transform: Transform): GeometryQuery | undefined {\r\n const myClone = this.clone();\r\n if (myClone && myClone?.tryTransformInPlace(transform))\r\n return myClone;\r\n return undefined;\r\n }\r\n /**\r\n * Return a clone.\r\n */\r\n public clone(): GeometryQuery | undefined {\r\n const proxyClone = this._proxyCurve.clone();\r\n if (proxyClone) {\r\n return new InterpolationCurve3d(this._options.clone(), proxyClone as CurvePrimitive);\r\n }\r\n return undefined;\r\n }\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof InterpolationCurve3d) {\r\n return InterpolationCurve3dOptions.areAlmostEqual(this._options, other._options);\r\n }\r\n return false;\r\n }\r\n /** Test if `other` is also an [[InterpolationCurve3d]] */\r\n public isSameGeometryClass(other: GeometryQuery): boolean { return other instanceof InterpolationCurve3d; }\r\n\r\n}\r\n"]}
@@ -226,7 +226,7 @@ export declare class CurveChainWithDistanceIndex extends CurvePrimitive {
226
226
  * (via a handler) determines a CurveLocation detail among the children.
227
227
  * * The returned detail directly identifies fractional position along the CurveChainWithDistanceIndex, and has pointer to an additional detail for the child curve.
228
228
  * @param spacePoint point in space
229
- * @param extend true to extend the curve (NOT USED)
229
+ * @param extend true to extend the curve
230
230
  * @returns Returns a CurveLocationDetail structure that holds the details of the close point.
231
231
  */
232
232
  closestPoint(spacePoint: Point3d, extend: VariantCurveExtendParameter): CurveLocationDetail | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"CurveChainWithDistanceIndex.d.ts","sourceRoot":"","sources":["../../../src/curve/CurveChainWithDistanceIndex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CurveChainWithDistanceIndex.d.ts","sourceRoot":"","sources":["../../../src/curve/CurveChainWithDistanceIndex.ts"],"names":[],"mappings":"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"}
@@ -113,7 +113,7 @@ class DistanceIndexConstructionContext {
113
113
  }
114
114
  else {
115
115
  let f1;
116
- for (let i = 1, f0 = 0.0; i <= numStrokes; i++, f0 = f1) {
116
+ for (let i = 1, f0 = fraction0; i <= numStrokes; i++, f0 = f1) {
117
117
  f1 = Geometry_1.Geometry.interpolate(fraction0, i / numStrokes, fraction1);
118
118
  d0 = this._accumulatedDistance;
119
119
  this._accumulatedDistance += (Math.abs(f1 - f0) * point0.distance(point1));
@@ -478,11 +478,10 @@ class CurveChainWithDistanceIndex extends CurvePrimitive_1.CurvePrimitive {
478
478
  * (via a handler) determines a CurveLocation detail among the children.
479
479
  * * The returned detail directly identifies fractional position along the CurveChainWithDistanceIndex, and has pointer to an additional detail for the child curve.
480
480
  * @param spacePoint point in space
481
- * @param extend true to extend the curve (NOT USED)
481
+ * @param extend true to extend the curve
482
482
  * @returns Returns a CurveLocationDetail structure that holds the details of the close point.
483
483
  */
484
484
  closestPoint(spacePoint, extend) {
485
- // umm... to "extend", would require selective extension of first, last
486
485
  let childDetail;
487
486
  let aMin = Number.MAX_VALUE;
488
487
  const numChildren = this.path.children.length;
@@ -1 +1 @@
1
- {"version":3,"file":"CurveChainWithDistanceIndex.js","sourceRoot":"","sources":["../../../src/curve/CurveChainWithDistanceIndex.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 { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { StrokeCountMap } from \"../curve/Query/StrokeCountMap\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { CurveChain } from \"./CurveCollection\";\r\nimport { CurveExtendMode, CurveExtendOptions, VariantCurveExtendParameter } from \"./CurveExtendMode\";\r\nimport { CurveLocationDetail } from \"./CurveLocationDetail\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * * Annotation of an interval of a curve.\r\n * * The interval is marked with two pairs of numbers:\r\n * * * fraction0, fraction1 = fraction parameters along the child curve\r\n * * * distance0,distance1 = distances within containing CurveChainWithDistanceIndex\r\n * @public\r\n */\r\nexport class PathFragment {\r\n /** distance along parent to this fragment start */\r\n public chainDistance0: number;\r\n /** distance along parent to this fragment end */\r\n public chainDistance1: number;\r\n /** Fractional position of this fragment start within its curve primitive. */\r\n public childFraction0: number;\r\n /** Fractional position of this fragment end within its curve primitive.. */\r\n public childFraction1: number;\r\n /** Curve primitive of this fragment */\r\n public childCurve: CurvePrimitive;\r\n /** Create a fragment with complete fraction, distance and child data. */\r\n public constructor(childFraction0: number, childFraction1: number, distance0: number, distance1: number, childCurve: CurvePrimitive) {\r\n this.childFraction0 = childFraction0;\r\n this.childFraction1 = childFraction1;\r\n this.chainDistance0 = distance0;\r\n this.chainDistance1 = distance1;\r\n this.childCurve = childCurve;\r\n }\r\n /**\r\n * Return true if the distance is within the distance limits of this fragment.\r\n * @param distance\r\n */\r\n public containsChainDistance(distance: number): boolean {\r\n return distance >= this.chainDistance0 && distance <= this.chainDistance1;\r\n }\r\n\r\n /**\r\n * Return true if this fragment addresses `curve` and brackets `fraction`\r\n * @param distance\r\n */\r\n public containsChildCurveAndChildFraction(curve: CurvePrimitive, fraction: number): boolean {\r\n return this.childCurve === curve && fraction >= this.childFraction0 && fraction <= this.childFraction1;\r\n }\r\n\r\n /** Convert distance to local fraction, and apply that to interpolate between the stored curve fractions.\r\n * Note that proportional calculation does NOT account for nonuniform parameterization in the child curve.\r\n */\r\n public chainDistanceToInterpolatedChildFraction(distance: number): number {\r\n return Geometry.inverseInterpolate(\r\n this.childFraction0, this.chainDistance0,\r\n this.childFraction1, this.chainDistance1,\r\n distance, this.childFraction0)!; // the interval \"must\" have nonzero length, division should be safe . ..\r\n }\r\n /** Convert chainDistance to true chidFraction, using detailed moveSignedDistanceFromFraction\r\n */\r\n public chainDistanceToAccurateChildFraction(chainDistance: number): number {\r\n // The fragments are really expected to do good mappings in their distance range ...\r\n const childDetail = this.childCurve.moveSignedDistanceFromFraction(\r\n this.childFraction0, chainDistance - this.chainDistance0, false);\r\n return childDetail.fraction;\r\n }\r\n /** Return the scale factor to map childCurve fraction derivatives to chain fraction derivatives\r\n * @param globalDistance total length of the global curve.\r\n */\r\n public fractionScaleFactor(globalDistance: number): number {\r\n return globalDistance * (this.childFraction1 - this.childFraction0) / (this.chainDistance1 - this.chainDistance0);\r\n }\r\n /** Reverse the fraction and distance data.\r\n * * each child fraction `f` is replaced by `1-f`\r\n * * each `chainDistance` is replaced by `totalDistance-chainDistance`\r\n */\r\n public reverseFractionsAndDistances(totalDistance: number) {\r\n const f0 = this.childFraction0;\r\n const f1 = this.childFraction1;\r\n const d0 = this.chainDistance0;\r\n const d1 = this.chainDistance1;\r\n this.childFraction0 = 1.0 - f1;\r\n this.childFraction1 = 1.0 - f0;\r\n this.chainDistance0 = totalDistance - d1;\r\n this.chainDistance1 = totalDistance - d0;\r\n }\r\n /**\r\n * convert a fractional position on the childCurve to distance in the chain space.\r\n * * Return value is SIGNED -- will be negative when fraction < this.childFraction0.\r\n * @param fraction fraction along the curve within this fragment\r\n */\r\n public childFractionTChainDistance(fraction: number): number {\r\n let d = this.childCurve.curveLengthBetweenFractions(this.childFraction0, fraction);\r\n if (fraction < this.childFraction0)\r\n d = -d;\r\n return this.chainDistance0 + d;\r\n }\r\n}\r\n/** Non-instantiable class to build a distance index for a path. */\r\nclass DistanceIndexConstructionContext implements IStrokeHandler {\r\n private _fragments: PathFragment[];\r\n private _accumulatedDistance: number;\r\n private constructor() {\r\n this._accumulatedDistance = 0;\r\n this._fragments = [];\r\n }\r\n // ignore curve announcements -- they are repeated in stroke announcements\r\n public startParentCurvePrimitive(_cp: CurvePrimitive) { }\r\n public startCurvePrimitive(_cp: CurvePrimitive) { }\r\n public endParentCurvePrimitive(_cp: CurvePrimitive) { }\r\n public endCurvePrimitive(_cp: CurvePrimitive) { }\r\n // um .. we need to see curves? how to reject?\r\n public announcePointTangent(_xyz: Point3d, _fraction: number, _tangent: Vector3d) { }\r\n /** Announce numPoints interpolated between point0 and point1, with associated fractions */\r\n public announceSegmentInterval(\r\n cp: CurvePrimitive,\r\n point0: Point3d,\r\n point1: Point3d,\r\n numStrokes: number,\r\n fraction0: number,\r\n fraction1: number): void {\r\n let d0 = this._accumulatedDistance;\r\n if (numStrokes <= 1) {\r\n this._accumulatedDistance += point0.distance(point1);\r\n this._fragments.push(new PathFragment(fraction0, fraction1, d0, this._accumulatedDistance, cp));\r\n } else {\r\n let f1;\r\n for (let i = 1, f0 = 0.0; i <= numStrokes; i++, f0 = f1) {\r\n f1 = Geometry.interpolate(fraction0, i / numStrokes, fraction1);\r\n d0 = this._accumulatedDistance;\r\n this._accumulatedDistance += (Math.abs(f1 - f0) * point0.distance(point1));\r\n this._fragments.push(new PathFragment(f0, f1, d0, this._accumulatedDistance, cp));\r\n }\r\n }\r\n }\r\n public announceIntervalForUniformStepStrokes(\r\n cp: CurvePrimitive,\r\n numStrokes: number,\r\n fraction0: number,\r\n fraction1: number): void {\r\n let f1, d, d0;\r\n for (let i = 1, f0 = fraction0; i <= numStrokes; i++, f0 = f1) {\r\n f1 = Geometry.interpolate(fraction0, i / numStrokes, fraction1);\r\n d = cp.curveLengthBetweenFractions(f0, f1);\r\n d0 = this._accumulatedDistance;\r\n this._accumulatedDistance += d;\r\n this._fragments.push(new PathFragment(f0, f1, d0, this._accumulatedDistance, cp));\r\n }\r\n }\r\n public needPrimaryGeometryForStrokes?(): boolean { return true;}\r\n public static createPathFragmentIndex(path: CurveChain, options?: StrokeOptions): PathFragment[] {\r\n const handler = new DistanceIndexConstructionContext();\r\n for (const curve of path.children) {\r\n curve.emitStrokableParts(handler, options);\r\n }\r\n const fragments = handler._fragments;\r\n return fragments;\r\n }\r\n}\r\n/**\r\n * `CurveChainWithDistanceIndex` is a CurvePrimitive whose fractional parameterization is proportional to true\r\n * distance along a CurveChain.\r\n * * The curve chain can be any type derived from CurveChain.\r\n * * * i.e. either a `Path` or a `Loop`\r\n * @public\r\n */\r\nexport class CurveChainWithDistanceIndex extends CurvePrimitive {\r\n /** String name for schema properties */\r\n public readonly curvePrimitiveType = \"curveChainWithDistanceIndex\";\r\n\r\n private _path: CurveChain;\r\n private _fragments: PathFragment[];\r\n private _totalLength: number; // matches final fragment distance1.\r\n /** Test if other is a `CurveChainWithDistanceIndex` */\r\n public isSameGeometryClass(other: GeometryQuery): boolean { return other instanceof CurveChainWithDistanceIndex; }\r\n // final assembly of CurveChainWithDistanceIndex -- caller must create valid fragment index.\r\n private constructor(path: CurveChain, fragments: PathFragment[]) {\r\n super();\r\n this._path = path;\r\n this._fragments = fragments;\r\n this._totalLength = fragments[fragments.length - 1].chainDistance1;\r\n }\r\n /**\r\n * Create a clone, transformed and with its own distance index.\r\n * @param transform transform to apply in the clone.\r\n */\r\n public cloneTransformed(transform: Transform): CurvePrimitive | undefined {\r\n const c = this._path.clone();\r\n if (c !== undefined && c instanceof CurveChain && c.tryTransformInPlace(transform))\r\n return CurveChainWithDistanceIndex.createCapture(c);\r\n return undefined;\r\n }\r\n /** Reference to the contained path.\r\n * * Do not modify the path. The distance index will be wrong.\r\n */\r\n public get path(): CurveChain { return this._path; }\r\n\r\n /** Return a deep clone */\r\n public clone(): CurvePrimitive | undefined {\r\n const c = this._path.clone();\r\n if (c !== undefined && c instanceof CurveChain)\r\n return CurveChainWithDistanceIndex.createCapture(c);\r\n return undefined;\r\n }\r\n /** Ask if the curve is within tolerance of a plane.\r\n * @returns Returns true if the curve is completely within tolerance of the plane.\r\n */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n for (const c of this._path.children) {\r\n if (!c.isInPlane(plane))\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** return the start point of the primitive. The default implementation returns fractionToPoint (0.0) */\r\n public override startPoint(result?: Point3d): Point3d {\r\n const c = this._path.cyclicCurvePrimitive(0);\r\n if (c)\r\n return c.startPoint(result);\r\n return Point3d.createZero(result);\r\n }\r\n /** Return the end point of the primitive. The default implementation returns fractionToPoint(1.0) */\r\n public override endPoint(result?: Point3d): Point3d {\r\n const c = this._path.cyclicCurvePrimitive(-1);\r\n if (c)\r\n return c.endPoint(result);\r\n return Point3d.createZero(result);\r\n }\r\n /** Add strokes to caller-supplied linestring */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\r\n for (const c of this._path.children) {\r\n c.emitStrokes(dest, options);\r\n }\r\n }\r\n /** Ask the curve to announce points and simple subcurve fragments for stroking.\r\n * See IStrokeHandler for description of the sequence of the method calls.\r\n */\r\n public emitStrokableParts(dest: IStrokeHandler, options?: StrokeOptions): void {\r\n for (const c of this._path.children) {\r\n c.emitStrokableParts(dest, options);\r\n }\r\n }\r\n /**\r\n * return the stroke count required for given options.\r\n * @param options StrokeOptions that determine count\r\n */\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n let numStroke = 0;\r\n for (const c of this._path.children) {\r\n numStroke += c.computeStrokeCountForOptions(options);\r\n }\r\n return numStroke;\r\n }\r\n /**\r\n * Return an array containing only the curve primitives.\r\n * * This DEFAULT simply pushes `this` to the collectorArray.\r\n * * CurvePrimitiveWithDistanceIndex optionally collects its members.\r\n * @param collectorArray array to receive primitives (pushed -- the array is not cleared)\r\n * @param smallestPossiblePrimitives if false, CurvePrimitiveWithDistanceIndex returns only itself. If true, it recurses to its (otherwise hidden) children.\r\n */\r\n public override collectCurvePrimitivesGo(collectorArray: CurvePrimitive[], smallestPossiblePrimitives: boolean) {\r\n if (smallestPossiblePrimitives) {\r\n for (const c of this._path.children) {\r\n c.collectCurvePrimitivesGo(collectorArray, smallestPossiblePrimitives);\r\n }\r\n } else {\r\n collectorArray.push(this);\r\n }\r\n }\r\n\r\n /**\r\n * construct StrokeCountMap for each child, accumulating data to stroke count map for this primitive.\r\n * @param options StrokeOptions that determine count\r\n * @param parentStrokeMap evolving parent map.\r\n */\r\n public override computeAndAttachRecursiveStrokeCounts(options?: StrokeOptions, parentStrokeMap?: StrokeCountMap) {\r\n const myMap = StrokeCountMap.createWithCurvePrimitiveAndOptionalParent(this, parentStrokeMap);\r\n for (const c of this._path.children) {\r\n c.computeAndAttachRecursiveStrokeCounts(options, myMap);\r\n }\r\n CurvePrimitive.installStrokeCountMap(this, myMap, parentStrokeMap);\r\n }\r\n /** Second step of double dispatch: call `this._path.dispatchToGeometryHandler (handler)`\r\n * * Note that this exposes the children individually to the handler.\r\n */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return this._path.dispatchToGeometryHandler(handler);\r\n }\r\n /** Extend (increase) `rangeToExtend` as needed to include these curves (optionally transformed)\r\n */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n this._path.extendRange(rangeToExtend, transform);\r\n }\r\n /**\r\n *\r\n * * Curve length is always positive.\r\n * @returns Returns a (high accuracy) length of the curve between fractional positions\r\n * @returns Returns the length of the curve.\r\n */\r\n public override curveLengthBetweenFractions(fraction0: number, fraction1: number): number {\r\n return Math.abs(fraction1 - fraction0) * this._totalLength;\r\n }\r\n /**\r\n * Capture (not clone) a path into a new `CurveChainWithDistanceIndex`\r\n * @param primitives primitive array to be CAPTURED (not cloned)\r\n */\r\n public static createCapture(path: CurveChain, options?: StrokeOptions): CurveChainWithDistanceIndex | undefined {\r\n if (path.children.length === 0)\r\n return undefined;\r\n const fragments = DistanceIndexConstructionContext.createPathFragmentIndex(path, options);\r\n const result = new CurveChainWithDistanceIndex(path, fragments);\r\n return result;\r\n }\r\n\r\n /**\r\n * Resolve a fraction of the CurveChain to a PathFragment\r\n * @param distance\r\n * @param allowExtrapolation\r\n */\r\n protected chainDistanceToFragment(distance: number, allowExtrapolation: boolean = false): PathFragment | undefined {\r\n const numFragments = this._fragments.length;\r\n const fragments = this._fragments;\r\n if (numFragments > 0) {\r\n if (distance < 0.0)\r\n return allowExtrapolation ? fragments[0] : undefined;\r\n if (distance >= this._totalLength)\r\n return allowExtrapolation ? fragments[numFragments - 1] : undefined;\r\n // humbug, linear search\r\n for (const fragment of fragments) {\r\n if (fragment.containsChainDistance(distance)) return fragment;\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Convert distance along the chain to fraction along the chain.\r\n * @param distance distance along the chain\r\n */\r\n public chainDistanceToChainFraction(distance: number): number { return distance / this._totalLength; }\r\n /**\r\n * Resolve a fraction within a specific curve to a fragment.\r\n * @param curve\r\n * @param fraction\r\n */\r\n protected curveAndChildFractionToFragment(curve: CurvePrimitive, fraction: number): PathFragment | undefined {\r\n const numFragments = this._fragments.length;\r\n const fragments = this._fragments;\r\n if (numFragments > 0) {\r\n // humbug, linear search\r\n for (const fragment of fragments) {\r\n if (fragment.containsChildCurveAndChildFraction(curve, fraction)) return fragment;\r\n }\r\n if (fraction <= 0)\r\n return fragments[0];\r\n if (fraction > 1.0)\r\n return fragments[numFragments - 1];\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the total length of curves.\r\n */\r\n public override curveLength(): number {\r\n return this._totalLength;\r\n }\r\n /**\r\n * Returns the total length of the path.\r\n * * This is exact (and simple property lookup) because the true lengths were summed at construction time.\r\n */\r\n public quickLength(): number {\r\n return this._totalLength;\r\n }\r\n\r\n /**\r\n * Return the point (x,y,z) on the curve at fractional position along the chain.\r\n * @param fraction fractional position along the geometry.\r\n * @returns Returns a point on the curve.\r\n */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\r\n const chainDistance = fraction * this._totalLength;\r\n const fragment = this.chainDistanceToFragment(chainDistance, true);\r\n if (fragment) {\r\n const childFraction = fragment.chainDistanceToAccurateChildFraction(chainDistance);\r\n return fragment.childCurve.fractionToPoint(childFraction, result);\r\n }\r\n // no fragment found. Use _fragments[0]\r\n // fragment = this.chainDistanceToFragment(chainDistance, true);\r\n return this._fragments[0].childCurve.fractionToPoint(0.0, result);\r\n }\r\n\r\n /** Return the point (x,y,z) and derivative on the curve at fractional position.\r\n *\r\n * * Note that this derivative is \"derivative of xyz with respect to fraction.\"\r\n * * this derivative shows the speed of the \"fractional point\" moving along the curve.\r\n * * this is not generally a unit vector. use fractionToPointAndUnitTangent for a unit vector.\r\n * @param fraction fractional position along the geometry.\r\n * @returns Returns a ray whose origin is the curve point and direction is the derivative with respect to the fraction.\r\n */\r\n public fractionToPointAndDerivative(fraction: number, result?: Ray3d): Ray3d {\r\n const distanceAlongPath = fraction * this._totalLength;\r\n const fragment = this.chainDistanceToFragment(distanceAlongPath, true)!;\r\n const curveFraction = fragment.chainDistanceToAccurateChildFraction(distanceAlongPath);\r\n result = fragment.childCurve.fractionToPointAndDerivative(curveFraction, result);\r\n const a = this._totalLength / result.direction.magnitude();\r\n result.direction.scaleInPlace(a);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a ray whose origin is the curve point and direction is the unit tangent.\r\n * @param fraction fractional position on the curve\r\n * @param result optional receiver for the result.\r\n * Returns a ray whose origin is the curve point and direction is the unit tangent.\r\n */\r\n public override fractionToPointAndUnitTangent(fraction: number, result?: Ray3d): Ray3d {\r\n const distanceAlongPath = fraction * this._totalLength;\r\n const fragment = this.chainDistanceToFragment(distanceAlongPath, true)!;\r\n const curveFraction = fragment.chainDistanceToAccurateChildFraction(distanceAlongPath);\r\n result = fragment.childCurve.fractionToPointAndDerivative(curveFraction, result);\r\n result.direction.normalizeInPlace();\r\n return result;\r\n }\r\n /** Return a plane with\r\n *\r\n * * origin at fractional position along the curve\r\n * * vectorU is the first derivative, i.e. tangent vector with length equal to the rate of change with respect to the fraction.\r\n * * vectorV is the second derivative, i.e.derivative of vectorU.\r\n */\r\n public fractionToPointAnd2Derivatives(fraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors | undefined {\r\n const totalLength = this._totalLength;\r\n const distanceAlongPath = fraction * totalLength;\r\n const fragment = this.chainDistanceToFragment(distanceAlongPath, true)!;\r\n const curveFraction = fragment.chainDistanceToAccurateChildFraction(distanceAlongPath);\r\n result = fragment.childCurve.fractionToPointAnd2Derivatives(curveFraction, result);\r\n if (!result)\r\n return undefined;\r\n const dotUU = result.vectorU.magnitudeSquared();\r\n const magU = Math.sqrt(dotUU);\r\n const dotUV = result.vectorU.dotProduct(result.vectorV);\r\n const duds = 1.0 / magU;\r\n const a = duds * duds;\r\n Vector3d.createAdd2Scaled(result.vectorV, a, result.vectorU, -a * dotUV / dotUU, result.vectorV); // IN PLACE update to vectorV.\r\n result.vectorU.scale(duds);\r\n // scale for 0..1 parameterization ....\r\n result.vectorU.scaleInPlace(totalLength);\r\n result.vectorV.scaleInPlace(totalLength * totalLength);\r\n return result;\r\n }\r\n /** Attempt to transform in place.\r\n * * Warning: If any child fails, this object becomes invalid. But that should never happen.\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n let numFail = 0;\r\n for (const c of this._path.children) {\r\n if (!c.tryTransformInPlace(transform))\r\n numFail++;\r\n }\r\n return numFail === 0;\r\n }\r\n /** Reverse the curve's data so that its fractional stroking moves in the opposite direction. */\r\n public reverseInPlace(): void {\r\n this._path.reverseChildrenInPlace();\r\n const totalLength = this._totalLength;\r\n for (const fragment of this._fragments)\r\n fragment.reverseFractionsAndDistances(totalLength);\r\n for (let i = 0, j = this._fragments.length - 1; i < j; i++, j--) {\r\n const fragment = this._fragments[i];\r\n this._fragments[i] = this._fragments[j];\r\n this._fragments[j] = fragment;\r\n }\r\n }\r\n /**\r\n * Test for equality conditions:\r\n * * Mismatched totalLength is a quick exit condition\r\n * * If totalLength matches, recurse to the path for matching primitives.\r\n * @param other\r\n */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof CurveChainWithDistanceIndex) {\r\n return Geometry.isSameCoordinate(this._totalLength, other._totalLength)\r\n && this._path.isAlmostEqual(other._path);\r\n }\r\n return false;\r\n }\r\n\r\n /** Implement moveSignedDistanceFromFraction.\r\n * * See `CurvePrimitive` for parameter details.\r\n * * The returned location directly identifies fractional position along the CurveChainWithDistanceIndex, and has pointer to an additional detail for the child curve.\r\n */\r\n public override moveSignedDistanceFromFraction(startFraction: number, signedDistance: number, allowExtension: boolean, result?: CurveLocationDetail): CurveLocationDetail {\r\n const distanceA = startFraction * this._totalLength;\r\n const distanceB = distanceA + signedDistance;\r\n const fragmentB = this.chainDistanceToFragment(distanceB, true)!;\r\n const childDetail = fragmentB.childCurve.moveSignedDistanceFromFraction(fragmentB.childFraction0, distanceB - fragmentB.chainDistance0, allowExtension, result);\r\n const endFraction = startFraction + (signedDistance / this._totalLength);\r\n const chainDetail = CurveLocationDetail.createConditionalMoveSignedDistance(allowExtension, this, startFraction, endFraction, signedDistance, result);\r\n chainDetail.childDetail = childDetail;\r\n return chainDetail;\r\n }\r\n\r\n /** Search for the curve point that is closest to the spacePoint.\r\n * * The CurveChainWithDistanceIndex invokes the base class CurvePrimitive method, which\r\n * (via a handler) determines a CurveLocation detail among the children.\r\n * * The returned detail directly identifies fractional position along the CurveChainWithDistanceIndex, and has pointer to an additional detail for the child curve.\r\n * @param spacePoint point in space\r\n * @param extend true to extend the curve (NOT USED)\r\n * @returns Returns a CurveLocationDetail structure that holds the details of the close point.\r\n */\r\n public override closestPoint(spacePoint: Point3d, extend: VariantCurveExtendParameter): CurveLocationDetail | undefined {\r\n // umm... to \"extend\", would require selective extension of first, last\r\n let childDetail: CurveLocationDetail | undefined;\r\n let aMin = Number.MAX_VALUE;\r\n const numChildren = this.path.children.length;\r\n if (numChildren === 1) {\r\n childDetail = this.path.children[0].closestPoint(spacePoint, extend);\r\n } else {\r\n const extend0 = [CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0), CurveExtendMode.None];\r\n const extend1 = [CurveExtendMode.None, CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1)];\r\n for (let childIndex = 0; childIndex < numChildren; childIndex++) {\r\n const child = this.path.children[childIndex];\r\n const detailA = child.closestPoint(spacePoint, childIndex === 0 ? extend0 : childIndex + 1 === numChildren ? extend1 : false);\r\n if (detailA && detailA.a < aMin) {\r\n aMin = detailA.a;\r\n childDetail = CurveLocationDetail.createCurveFractionPoint(detailA.curve, detailA.fraction, detailA.point, childDetail)!;\r\n childDetail.a = detailA.a;\r\n }\r\n }\r\n\r\n }\r\n if (!childDetail)\r\n return undefined;\r\n const fragment = this.curveAndChildFractionToFragment(childDetail.curve!, childDetail.fraction);\r\n if (fragment) {\r\n const chainDistance = fragment.childFractionTChainDistance(childDetail.fraction);\r\n const chainFraction = this.chainDistanceToChainFraction(chainDistance);\r\n const chainDetail = CurveLocationDetail.createCurveFractionPoint(this, chainFraction, childDetail.point);\r\n chainDetail.childDetail = childDetail;\r\n return chainDetail;\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"CurveChainWithDistanceIndex.js","sourceRoot":"","sources":["../../../src/curve/CurveChainWithDistanceIndex.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 { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { StrokeCountMap } from \"../curve/Query/StrokeCountMap\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { CurveChain } from \"./CurveCollection\";\r\nimport { CurveExtendMode, CurveExtendOptions, VariantCurveExtendParameter } from \"./CurveExtendMode\";\r\nimport { CurveLocationDetail } from \"./CurveLocationDetail\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * * Annotation of an interval of a curve.\r\n * * The interval is marked with two pairs of numbers:\r\n * * * fraction0, fraction1 = fraction parameters along the child curve\r\n * * * distance0,distance1 = distances within containing CurveChainWithDistanceIndex\r\n * @public\r\n */\r\nexport class PathFragment {\r\n /** distance along parent to this fragment start */\r\n public chainDistance0: number;\r\n /** distance along parent to this fragment end */\r\n public chainDistance1: number;\r\n /** Fractional position of this fragment start within its curve primitive. */\r\n public childFraction0: number;\r\n /** Fractional position of this fragment end within its curve primitive.. */\r\n public childFraction1: number;\r\n /** Curve primitive of this fragment */\r\n public childCurve: CurvePrimitive;\r\n /** Create a fragment with complete fraction, distance and child data. */\r\n public constructor(childFraction0: number, childFraction1: number, distance0: number, distance1: number, childCurve: CurvePrimitive) {\r\n this.childFraction0 = childFraction0;\r\n this.childFraction1 = childFraction1;\r\n this.chainDistance0 = distance0;\r\n this.chainDistance1 = distance1;\r\n this.childCurve = childCurve;\r\n }\r\n /**\r\n * Return true if the distance is within the distance limits of this fragment.\r\n * @param distance\r\n */\r\n public containsChainDistance(distance: number): boolean {\r\n return distance >= this.chainDistance0 && distance <= this.chainDistance1;\r\n }\r\n\r\n /**\r\n * Return true if this fragment addresses `curve` and brackets `fraction`\r\n * @param distance\r\n */\r\n public containsChildCurveAndChildFraction(curve: CurvePrimitive, fraction: number): boolean {\r\n return this.childCurve === curve && fraction >= this.childFraction0 && fraction <= this.childFraction1;\r\n }\r\n\r\n /** Convert distance to local fraction, and apply that to interpolate between the stored curve fractions.\r\n * Note that proportional calculation does NOT account for nonuniform parameterization in the child curve.\r\n */\r\n public chainDistanceToInterpolatedChildFraction(distance: number): number {\r\n return Geometry.inverseInterpolate(\r\n this.childFraction0, this.chainDistance0,\r\n this.childFraction1, this.chainDistance1,\r\n distance, this.childFraction0)!; // the interval \"must\" have nonzero length, division should be safe . ..\r\n }\r\n /** Convert chainDistance to true chidFraction, using detailed moveSignedDistanceFromFraction\r\n */\r\n public chainDistanceToAccurateChildFraction(chainDistance: number): number {\r\n // The fragments are really expected to do good mappings in their distance range ...\r\n const childDetail = this.childCurve.moveSignedDistanceFromFraction(\r\n this.childFraction0, chainDistance - this.chainDistance0, false);\r\n return childDetail.fraction;\r\n }\r\n /** Return the scale factor to map childCurve fraction derivatives to chain fraction derivatives\r\n * @param globalDistance total length of the global curve.\r\n */\r\n public fractionScaleFactor(globalDistance: number): number {\r\n return globalDistance * (this.childFraction1 - this.childFraction0) / (this.chainDistance1 - this.chainDistance0);\r\n }\r\n /** Reverse the fraction and distance data.\r\n * * each child fraction `f` is replaced by `1-f`\r\n * * each `chainDistance` is replaced by `totalDistance-chainDistance`\r\n */\r\n public reverseFractionsAndDistances(totalDistance: number) {\r\n const f0 = this.childFraction0;\r\n const f1 = this.childFraction1;\r\n const d0 = this.chainDistance0;\r\n const d1 = this.chainDistance1;\r\n this.childFraction0 = 1.0 - f1;\r\n this.childFraction1 = 1.0 - f0;\r\n this.chainDistance0 = totalDistance - d1;\r\n this.chainDistance1 = totalDistance - d0;\r\n }\r\n /**\r\n * convert a fractional position on the childCurve to distance in the chain space.\r\n * * Return value is SIGNED -- will be negative when fraction < this.childFraction0.\r\n * @param fraction fraction along the curve within this fragment\r\n */\r\n public childFractionTChainDistance(fraction: number): number {\r\n let d = this.childCurve.curveLengthBetweenFractions(this.childFraction0, fraction);\r\n if (fraction < this.childFraction0)\r\n d = -d;\r\n return this.chainDistance0 + d;\r\n }\r\n}\r\n/** Non-instantiable class to build a distance index for a path. */\r\nclass DistanceIndexConstructionContext implements IStrokeHandler {\r\n private _fragments: PathFragment[];\r\n private _accumulatedDistance: number;\r\n private constructor() {\r\n this._accumulatedDistance = 0;\r\n this._fragments = [];\r\n }\r\n // ignore curve announcements -- they are repeated in stroke announcements\r\n public startParentCurvePrimitive(_cp: CurvePrimitive) { }\r\n public startCurvePrimitive(_cp: CurvePrimitive) { }\r\n public endParentCurvePrimitive(_cp: CurvePrimitive) { }\r\n public endCurvePrimitive(_cp: CurvePrimitive) { }\r\n // um .. we need to see curves? how to reject?\r\n public announcePointTangent(_xyz: Point3d, _fraction: number, _tangent: Vector3d) { }\r\n /** Announce numPoints interpolated between point0 and point1, with associated fractions */\r\n public announceSegmentInterval(\r\n cp: CurvePrimitive,\r\n point0: Point3d,\r\n point1: Point3d,\r\n numStrokes: number,\r\n fraction0: number,\r\n fraction1: number): void {\r\n let d0 = this._accumulatedDistance;\r\n if (numStrokes <= 1) {\r\n this._accumulatedDistance += point0.distance(point1);\r\n this._fragments.push(new PathFragment(fraction0, fraction1, d0, this._accumulatedDistance, cp));\r\n } else {\r\n let f1;\r\n for (let i = 1, f0 = fraction0; i <= numStrokes; i++, f0 = f1) {\r\n f1 = Geometry.interpolate(fraction0, i / numStrokes, fraction1);\r\n d0 = this._accumulatedDistance;\r\n this._accumulatedDistance += (Math.abs(f1 - f0) * point0.distance(point1));\r\n this._fragments.push(new PathFragment(f0, f1, d0, this._accumulatedDistance, cp));\r\n }\r\n }\r\n }\r\n public announceIntervalForUniformStepStrokes(\r\n cp: CurvePrimitive,\r\n numStrokes: number,\r\n fraction0: number,\r\n fraction1: number): void {\r\n let f1, d, d0;\r\n for (let i = 1, f0 = fraction0; i <= numStrokes; i++, f0 = f1) {\r\n f1 = Geometry.interpolate(fraction0, i / numStrokes, fraction1);\r\n d = cp.curveLengthBetweenFractions(f0, f1);\r\n d0 = this._accumulatedDistance;\r\n this._accumulatedDistance += d;\r\n this._fragments.push(new PathFragment(f0, f1, d0, this._accumulatedDistance, cp));\r\n }\r\n }\r\n public needPrimaryGeometryForStrokes?(): boolean { return true;}\r\n public static createPathFragmentIndex(path: CurveChain, options?: StrokeOptions): PathFragment[] {\r\n const handler = new DistanceIndexConstructionContext();\r\n for (const curve of path.children) {\r\n curve.emitStrokableParts(handler, options);\r\n }\r\n const fragments = handler._fragments;\r\n return fragments;\r\n }\r\n}\r\n/**\r\n * `CurveChainWithDistanceIndex` is a CurvePrimitive whose fractional parameterization is proportional to true\r\n * distance along a CurveChain.\r\n * * The curve chain can be any type derived from CurveChain.\r\n * * * i.e. either a `Path` or a `Loop`\r\n * @public\r\n */\r\nexport class CurveChainWithDistanceIndex extends CurvePrimitive {\r\n /** String name for schema properties */\r\n public readonly curvePrimitiveType = \"curveChainWithDistanceIndex\";\r\n\r\n private _path: CurveChain;\r\n private _fragments: PathFragment[];\r\n private _totalLength: number; // matches final fragment distance1.\r\n /** Test if other is a `CurveChainWithDistanceIndex` */\r\n public isSameGeometryClass(other: GeometryQuery): boolean { return other instanceof CurveChainWithDistanceIndex; }\r\n // final assembly of CurveChainWithDistanceIndex -- caller must create valid fragment index.\r\n private constructor(path: CurveChain, fragments: PathFragment[]) {\r\n super();\r\n this._path = path;\r\n this._fragments = fragments;\r\n this._totalLength = fragments[fragments.length - 1].chainDistance1;\r\n }\r\n /**\r\n * Create a clone, transformed and with its own distance index.\r\n * @param transform transform to apply in the clone.\r\n */\r\n public cloneTransformed(transform: Transform): CurvePrimitive | undefined {\r\n const c = this._path.clone();\r\n if (c !== undefined && c instanceof CurveChain && c.tryTransformInPlace(transform))\r\n return CurveChainWithDistanceIndex.createCapture(c);\r\n return undefined;\r\n }\r\n /** Reference to the contained path.\r\n * * Do not modify the path. The distance index will be wrong.\r\n */\r\n public get path(): CurveChain { return this._path; }\r\n\r\n /** Return a deep clone */\r\n public clone(): CurvePrimitive | undefined {\r\n const c = this._path.clone();\r\n if (c !== undefined && c instanceof CurveChain)\r\n return CurveChainWithDistanceIndex.createCapture(c);\r\n return undefined;\r\n }\r\n /** Ask if the curve is within tolerance of a plane.\r\n * @returns Returns true if the curve is completely within tolerance of the plane.\r\n */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n for (const c of this._path.children) {\r\n if (!c.isInPlane(plane))\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** return the start point of the primitive. The default implementation returns fractionToPoint (0.0) */\r\n public override startPoint(result?: Point3d): Point3d {\r\n const c = this._path.cyclicCurvePrimitive(0);\r\n if (c)\r\n return c.startPoint(result);\r\n return Point3d.createZero(result);\r\n }\r\n /** Return the end point of the primitive. The default implementation returns fractionToPoint(1.0) */\r\n public override endPoint(result?: Point3d): Point3d {\r\n const c = this._path.cyclicCurvePrimitive(-1);\r\n if (c)\r\n return c.endPoint(result);\r\n return Point3d.createZero(result);\r\n }\r\n /** Add strokes to caller-supplied linestring */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\r\n for (const c of this._path.children) {\r\n c.emitStrokes(dest, options);\r\n }\r\n }\r\n /** Ask the curve to announce points and simple subcurve fragments for stroking.\r\n * See IStrokeHandler for description of the sequence of the method calls.\r\n */\r\n public emitStrokableParts(dest: IStrokeHandler, options?: StrokeOptions): void {\r\n for (const c of this._path.children) {\r\n c.emitStrokableParts(dest, options);\r\n }\r\n }\r\n /**\r\n * return the stroke count required for given options.\r\n * @param options StrokeOptions that determine count\r\n */\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n let numStroke = 0;\r\n for (const c of this._path.children) {\r\n numStroke += c.computeStrokeCountForOptions(options);\r\n }\r\n return numStroke;\r\n }\r\n /**\r\n * Return an array containing only the curve primitives.\r\n * * This DEFAULT simply pushes `this` to the collectorArray.\r\n * * CurvePrimitiveWithDistanceIndex optionally collects its members.\r\n * @param collectorArray array to receive primitives (pushed -- the array is not cleared)\r\n * @param smallestPossiblePrimitives if false, CurvePrimitiveWithDistanceIndex returns only itself. If true, it recurses to its (otherwise hidden) children.\r\n */\r\n public override collectCurvePrimitivesGo(collectorArray: CurvePrimitive[], smallestPossiblePrimitives: boolean) {\r\n if (smallestPossiblePrimitives) {\r\n for (const c of this._path.children) {\r\n c.collectCurvePrimitivesGo(collectorArray, smallestPossiblePrimitives);\r\n }\r\n } else {\r\n collectorArray.push(this);\r\n }\r\n }\r\n\r\n /**\r\n * construct StrokeCountMap for each child, accumulating data to stroke count map for this primitive.\r\n * @param options StrokeOptions that determine count\r\n * @param parentStrokeMap evolving parent map.\r\n */\r\n public override computeAndAttachRecursiveStrokeCounts(options?: StrokeOptions, parentStrokeMap?: StrokeCountMap) {\r\n const myMap = StrokeCountMap.createWithCurvePrimitiveAndOptionalParent(this, parentStrokeMap);\r\n for (const c of this._path.children) {\r\n c.computeAndAttachRecursiveStrokeCounts(options, myMap);\r\n }\r\n CurvePrimitive.installStrokeCountMap(this, myMap, parentStrokeMap);\r\n }\r\n /** Second step of double dispatch: call `this._path.dispatchToGeometryHandler (handler)`\r\n * * Note that this exposes the children individually to the handler.\r\n */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return this._path.dispatchToGeometryHandler(handler);\r\n }\r\n /** Extend (increase) `rangeToExtend` as needed to include these curves (optionally transformed)\r\n */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n this._path.extendRange(rangeToExtend, transform);\r\n }\r\n /**\r\n *\r\n * * Curve length is always positive.\r\n * @returns Returns a (high accuracy) length of the curve between fractional positions\r\n * @returns Returns the length of the curve.\r\n */\r\n public override curveLengthBetweenFractions(fraction0: number, fraction1: number): number {\r\n return Math.abs(fraction1 - fraction0) * this._totalLength;\r\n }\r\n /**\r\n * Capture (not clone) a path into a new `CurveChainWithDistanceIndex`\r\n * @param primitives primitive array to be CAPTURED (not cloned)\r\n */\r\n public static createCapture(path: CurveChain, options?: StrokeOptions): CurveChainWithDistanceIndex | undefined {\r\n if (path.children.length === 0)\r\n return undefined;\r\n const fragments = DistanceIndexConstructionContext.createPathFragmentIndex(path, options);\r\n const result = new CurveChainWithDistanceIndex(path, fragments);\r\n return result;\r\n }\r\n\r\n /**\r\n * Resolve a fraction of the CurveChain to a PathFragment\r\n * @param distance\r\n * @param allowExtrapolation\r\n */\r\n protected chainDistanceToFragment(distance: number, allowExtrapolation: boolean = false): PathFragment | undefined {\r\n const numFragments = this._fragments.length;\r\n const fragments = this._fragments;\r\n if (numFragments > 0) {\r\n if (distance < 0.0)\r\n return allowExtrapolation ? fragments[0] : undefined;\r\n if (distance >= this._totalLength)\r\n return allowExtrapolation ? fragments[numFragments - 1] : undefined;\r\n // humbug, linear search\r\n for (const fragment of fragments) {\r\n if (fragment.containsChainDistance(distance)) return fragment;\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Convert distance along the chain to fraction along the chain.\r\n * @param distance distance along the chain\r\n */\r\n public chainDistanceToChainFraction(distance: number): number { return distance / this._totalLength; }\r\n /**\r\n * Resolve a fraction within a specific curve to a fragment.\r\n * @param curve\r\n * @param fraction\r\n */\r\n protected curveAndChildFractionToFragment(curve: CurvePrimitive, fraction: number): PathFragment | undefined {\r\n const numFragments = this._fragments.length;\r\n const fragments = this._fragments;\r\n if (numFragments > 0) {\r\n // humbug, linear search\r\n for (const fragment of fragments) {\r\n if (fragment.containsChildCurveAndChildFraction(curve, fraction)) return fragment;\r\n }\r\n if (fraction <= 0)\r\n return fragments[0];\r\n if (fraction > 1.0)\r\n return fragments[numFragments - 1];\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the total length of curves.\r\n */\r\n public override curveLength(): number {\r\n return this._totalLength;\r\n }\r\n /**\r\n * Returns the total length of the path.\r\n * * This is exact (and simple property lookup) because the true lengths were summed at construction time.\r\n */\r\n public quickLength(): number {\r\n return this._totalLength;\r\n }\r\n\r\n /**\r\n * Return the point (x,y,z) on the curve at fractional position along the chain.\r\n * @param fraction fractional position along the geometry.\r\n * @returns Returns a point on the curve.\r\n */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\r\n const chainDistance = fraction * this._totalLength;\r\n const fragment = this.chainDistanceToFragment(chainDistance, true);\r\n if (fragment) {\r\n const childFraction = fragment.chainDistanceToAccurateChildFraction(chainDistance);\r\n return fragment.childCurve.fractionToPoint(childFraction, result);\r\n }\r\n // no fragment found. Use _fragments[0]\r\n // fragment = this.chainDistanceToFragment(chainDistance, true);\r\n return this._fragments[0].childCurve.fractionToPoint(0.0, result);\r\n }\r\n\r\n /** Return the point (x,y,z) and derivative on the curve at fractional position.\r\n *\r\n * * Note that this derivative is \"derivative of xyz with respect to fraction.\"\r\n * * this derivative shows the speed of the \"fractional point\" moving along the curve.\r\n * * this is not generally a unit vector. use fractionToPointAndUnitTangent for a unit vector.\r\n * @param fraction fractional position along the geometry.\r\n * @returns Returns a ray whose origin is the curve point and direction is the derivative with respect to the fraction.\r\n */\r\n public fractionToPointAndDerivative(fraction: number, result?: Ray3d): Ray3d {\r\n const distanceAlongPath = fraction * this._totalLength;\r\n const fragment = this.chainDistanceToFragment(distanceAlongPath, true)!;\r\n const curveFraction = fragment.chainDistanceToAccurateChildFraction(distanceAlongPath);\r\n result = fragment.childCurve.fractionToPointAndDerivative(curveFraction, result);\r\n const a = this._totalLength / result.direction.magnitude();\r\n result.direction.scaleInPlace(a);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a ray whose origin is the curve point and direction is the unit tangent.\r\n * @param fraction fractional position on the curve\r\n * @param result optional receiver for the result.\r\n * Returns a ray whose origin is the curve point and direction is the unit tangent.\r\n */\r\n public override fractionToPointAndUnitTangent(fraction: number, result?: Ray3d): Ray3d {\r\n const distanceAlongPath = fraction * this._totalLength;\r\n const fragment = this.chainDistanceToFragment(distanceAlongPath, true)!;\r\n const curveFraction = fragment.chainDistanceToAccurateChildFraction(distanceAlongPath);\r\n result = fragment.childCurve.fractionToPointAndDerivative(curveFraction, result);\r\n result.direction.normalizeInPlace();\r\n return result;\r\n }\r\n /** Return a plane with\r\n *\r\n * * origin at fractional position along the curve\r\n * * vectorU is the first derivative, i.e. tangent vector with length equal to the rate of change with respect to the fraction.\r\n * * vectorV is the second derivative, i.e.derivative of vectorU.\r\n */\r\n public fractionToPointAnd2Derivatives(fraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors | undefined {\r\n const totalLength = this._totalLength;\r\n const distanceAlongPath = fraction * totalLength;\r\n const fragment = this.chainDistanceToFragment(distanceAlongPath, true)!;\r\n const curveFraction = fragment.chainDistanceToAccurateChildFraction(distanceAlongPath);\r\n result = fragment.childCurve.fractionToPointAnd2Derivatives(curveFraction, result);\r\n if (!result)\r\n return undefined;\r\n const dotUU = result.vectorU.magnitudeSquared();\r\n const magU = Math.sqrt(dotUU);\r\n const dotUV = result.vectorU.dotProduct(result.vectorV);\r\n const duds = 1.0 / magU;\r\n const a = duds * duds;\r\n Vector3d.createAdd2Scaled(result.vectorV, a, result.vectorU, -a * dotUV / dotUU, result.vectorV); // IN PLACE update to vectorV.\r\n result.vectorU.scale(duds);\r\n // scale for 0..1 parameterization ....\r\n result.vectorU.scaleInPlace(totalLength);\r\n result.vectorV.scaleInPlace(totalLength * totalLength);\r\n return result;\r\n }\r\n /** Attempt to transform in place.\r\n * * Warning: If any child fails, this object becomes invalid. But that should never happen.\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n let numFail = 0;\r\n for (const c of this._path.children) {\r\n if (!c.tryTransformInPlace(transform))\r\n numFail++;\r\n }\r\n return numFail === 0;\r\n }\r\n /** Reverse the curve's data so that its fractional stroking moves in the opposite direction. */\r\n public reverseInPlace(): void {\r\n this._path.reverseChildrenInPlace();\r\n const totalLength = this._totalLength;\r\n for (const fragment of this._fragments)\r\n fragment.reverseFractionsAndDistances(totalLength);\r\n for (let i = 0, j = this._fragments.length - 1; i < j; i++, j--) {\r\n const fragment = this._fragments[i];\r\n this._fragments[i] = this._fragments[j];\r\n this._fragments[j] = fragment;\r\n }\r\n }\r\n /**\r\n * Test for equality conditions:\r\n * * Mismatched totalLength is a quick exit condition\r\n * * If totalLength matches, recurse to the path for matching primitives.\r\n * @param other\r\n */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof CurveChainWithDistanceIndex) {\r\n return Geometry.isSameCoordinate(this._totalLength, other._totalLength)\r\n && this._path.isAlmostEqual(other._path);\r\n }\r\n return false;\r\n }\r\n\r\n /** Implement moveSignedDistanceFromFraction.\r\n * * See `CurvePrimitive` for parameter details.\r\n * * The returned location directly identifies fractional position along the CurveChainWithDistanceIndex, and has pointer to an additional detail for the child curve.\r\n */\r\n public override moveSignedDistanceFromFraction(startFraction: number, signedDistance: number, allowExtension: boolean, result?: CurveLocationDetail): CurveLocationDetail {\r\n const distanceA = startFraction * this._totalLength;\r\n const distanceB = distanceA + signedDistance;\r\n const fragmentB = this.chainDistanceToFragment(distanceB, true)!;\r\n const childDetail = fragmentB.childCurve.moveSignedDistanceFromFraction(fragmentB.childFraction0, distanceB - fragmentB.chainDistance0, allowExtension, result);\r\n const endFraction = startFraction + (signedDistance / this._totalLength);\r\n const chainDetail = CurveLocationDetail.createConditionalMoveSignedDistance(allowExtension, this, startFraction, endFraction, signedDistance, result);\r\n chainDetail.childDetail = childDetail;\r\n return chainDetail;\r\n }\r\n\r\n /** Search for the curve point that is closest to the spacePoint.\r\n * * The CurveChainWithDistanceIndex invokes the base class CurvePrimitive method, which\r\n * (via a handler) determines a CurveLocation detail among the children.\r\n * * The returned detail directly identifies fractional position along the CurveChainWithDistanceIndex, and has pointer to an additional detail for the child curve.\r\n * @param spacePoint point in space\r\n * @param extend true to extend the curve\r\n * @returns Returns a CurveLocationDetail structure that holds the details of the close point.\r\n */\r\n public override closestPoint(spacePoint: Point3d, extend: VariantCurveExtendParameter): CurveLocationDetail | undefined {\r\n let childDetail: CurveLocationDetail | undefined;\r\n let aMin = Number.MAX_VALUE;\r\n const numChildren = this.path.children.length;\r\n if (numChildren === 1) {\r\n childDetail = this.path.children[0].closestPoint(spacePoint, extend);\r\n } else {\r\n const extend0 = [CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0), CurveExtendMode.None];\r\n const extend1 = [CurveExtendMode.None, CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1)];\r\n for (let childIndex = 0; childIndex < numChildren; childIndex++) {\r\n const child = this.path.children[childIndex];\r\n const detailA = child.closestPoint(spacePoint, childIndex === 0 ? extend0 : childIndex + 1 === numChildren ? extend1 : false);\r\n if (detailA && detailA.a < aMin) {\r\n aMin = detailA.a;\r\n childDetail = CurveLocationDetail.createCurveFractionPoint(detailA.curve, detailA.fraction, detailA.point, childDetail)!;\r\n childDetail.a = detailA.a;\r\n }\r\n }\r\n\r\n }\r\n if (!childDetail)\r\n return undefined;\r\n const fragment = this.curveAndChildFractionToFragment(childDetail.curve!, childDetail.fraction);\r\n if (fragment) {\r\n const chainDistance = fragment.childFractionTChainDistance(childDetail.fraction);\r\n const chainFraction = this.chainDistanceToChainFraction(chainDistance);\r\n const chainDetail = CurveLocationDetail.createCurveFractionPoint(this, chainFraction, childDetail.point);\r\n chainDetail.childDetail = childDetail;\r\n return chainDetail;\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
@@ -695,6 +695,8 @@ class ClosestPointStrokeHandler extends NewtonRotRStrokeHandler {
695
695
  endCurvePrimitive() { }
696
696
  announceIntervalForUniformStepStrokes(cp, numStrokes, fraction0, fraction1) {
697
697
  this.startCurvePrimitive(cp);
698
+ this.announceSolutionFraction(0.0); // test start point as closest
699
+ this.announceSolutionFraction(1.0); // test end point as closest
698
700
  if (numStrokes < 1)
699
701
  numStrokes = 1;
700
702
  const df = 1.0 / numStrokes;