@itwin/core-geometry 4.2.0-dev.30 → 4.2.0-dev.32

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 (232) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/lib/cjs/Geometry.d.ts +4 -4
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +2 -2
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/clipping/ClipUtils.d.ts +12 -6
  7. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  8. package/lib/cjs/clipping/ClipUtils.js +13 -7
  9. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  10. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +93 -91
  11. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  12. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +171 -152
  13. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  14. package/lib/cjs/curve/CurveCollection.d.ts +17 -4
  15. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  16. package/lib/cjs/curve/CurveCollection.js +18 -1
  17. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  18. package/lib/cjs/curve/CurveLocationDetail.d.ts +2 -2
  19. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  20. package/lib/cjs/curve/CurvePrimitive.d.ts +1 -2
  21. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  22. package/lib/cjs/curve/CurvePrimitive.js +2 -2
  23. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  24. package/lib/cjs/curve/ParityRegion.d.ts +2 -2
  25. package/lib/cjs/curve/ParityRegion.d.ts.map +1 -1
  26. package/lib/cjs/curve/ParityRegion.js +2 -2
  27. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  28. package/lib/cjs/curve/RegionOps.d.ts +38 -3
  29. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  30. package/lib/cjs/curve/RegionOps.js +136 -2
  31. package/lib/cjs/curve/RegionOps.js.map +1 -1
  32. package/lib/cjs/curve/StrokeOptions.d.ts +20 -11
  33. package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
  34. package/lib/cjs/curve/StrokeOptions.js +22 -11
  35. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  36. package/lib/cjs/curve/UnionRegion.d.ts +2 -2
  37. package/lib/cjs/curve/UnionRegion.d.ts.map +1 -1
  38. package/lib/cjs/curve/UnionRegion.js +2 -2
  39. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  40. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
  41. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  42. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +2 -2
  43. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  44. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +20 -12
  45. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  46. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +63 -14
  47. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  48. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.d.ts +2 -2
  49. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.d.ts.map +1 -1
  50. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js +9 -5
  51. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  52. package/lib/cjs/geometry3d/GeometryHandler.d.ts +15 -26
  53. package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
  54. package/lib/cjs/geometry3d/GeometryHandler.js +23 -32
  55. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  56. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  57. package/lib/cjs/geometry3d/Matrix3d.js +3 -6
  58. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  59. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  60. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  61. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  62. package/lib/cjs/geometry3d/PolygonOps.d.ts +1 -1
  63. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  64. package/lib/cjs/geometry3d/PolygonOps.js +2 -3
  65. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  66. package/lib/cjs/geometry3d/Range.d.ts +1 -1
  67. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  68. package/lib/cjs/geometry3d/Range.js +1 -1
  69. package/lib/cjs/geometry3d/Range.js.map +1 -1
  70. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  71. package/lib/cjs/geometry3d/Transform.js +4 -6
  72. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  73. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  74. package/lib/cjs/geometry4d/Matrix4d.js +4 -2
  75. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  76. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  77. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +17 -5
  78. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  79. package/lib/cjs/polyface/PolyfaceBuilder.js +48 -15
  80. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  81. package/lib/cjs/polyface/PolyfaceClip.d.ts +16 -7
  82. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  83. package/lib/cjs/polyface/PolyfaceClip.js +38 -7
  84. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  85. package/lib/cjs/polyface/PolyfaceData.d.ts +5 -39
  86. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  87. package/lib/cjs/polyface/PolyfaceData.js +7 -41
  88. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  89. package/lib/cjs/polyface/PolyfaceQuery.d.ts +10 -8
  90. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  91. package/lib/cjs/polyface/PolyfaceQuery.js +64 -18
  92. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  93. package/lib/cjs/serialization/GeometrySamples.d.ts +6 -0
  94. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  95. package/lib/cjs/serialization/GeometrySamples.js +68 -2
  96. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  97. package/lib/cjs/solid/SweepContour.d.ts +34 -25
  98. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  99. package/lib/cjs/solid/SweepContour.js +84 -100
  100. package/lib/cjs/solid/SweepContour.js.map +1 -1
  101. package/lib/cjs/topology/Graph.d.ts +29 -11
  102. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  103. package/lib/cjs/topology/Graph.js +45 -26
  104. package/lib/cjs/topology/Graph.js.map +1 -1
  105. package/lib/cjs/topology/HalfEdgeMarkSet.d.ts +2 -2
  106. package/lib/cjs/topology/HalfEdgeMarkSet.d.ts.map +1 -1
  107. package/lib/cjs/topology/HalfEdgeMarkSet.js +4 -4
  108. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  109. package/lib/cjs/topology/Merging.d.ts +3 -0
  110. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  111. package/lib/cjs/topology/Merging.js +19 -5
  112. package/lib/cjs/topology/Merging.js.map +1 -1
  113. package/lib/cjs/topology/Triangulation.d.ts +15 -7
  114. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  115. package/lib/cjs/topology/Triangulation.js +89 -47
  116. package/lib/cjs/topology/Triangulation.js.map +1 -1
  117. package/lib/esm/Geometry.d.ts +4 -4
  118. package/lib/esm/Geometry.d.ts.map +1 -1
  119. package/lib/esm/Geometry.js +2 -2
  120. package/lib/esm/Geometry.js.map +1 -1
  121. package/lib/esm/clipping/ClipUtils.d.ts +12 -6
  122. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  123. package/lib/esm/clipping/ClipUtils.js +13 -7
  124. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  125. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +93 -91
  126. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  127. package/lib/esm/curve/CurveChainWithDistanceIndex.js +171 -152
  128. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  129. package/lib/esm/curve/CurveCollection.d.ts +17 -4
  130. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  131. package/lib/esm/curve/CurveCollection.js +18 -1
  132. package/lib/esm/curve/CurveCollection.js.map +1 -1
  133. package/lib/esm/curve/CurveLocationDetail.d.ts +2 -2
  134. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  135. package/lib/esm/curve/CurvePrimitive.d.ts +1 -2
  136. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  137. package/lib/esm/curve/CurvePrimitive.js +2 -2
  138. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  139. package/lib/esm/curve/ParityRegion.d.ts +2 -2
  140. package/lib/esm/curve/ParityRegion.d.ts.map +1 -1
  141. package/lib/esm/curve/ParityRegion.js +2 -2
  142. package/lib/esm/curve/ParityRegion.js.map +1 -1
  143. package/lib/esm/curve/RegionOps.d.ts +38 -3
  144. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  145. package/lib/esm/curve/RegionOps.js +137 -3
  146. package/lib/esm/curve/RegionOps.js.map +1 -1
  147. package/lib/esm/curve/StrokeOptions.d.ts +20 -11
  148. package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
  149. package/lib/esm/curve/StrokeOptions.js +22 -11
  150. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  151. package/lib/esm/curve/UnionRegion.d.ts +2 -2
  152. package/lib/esm/curve/UnionRegion.d.ts.map +1 -1
  153. package/lib/esm/curve/UnionRegion.js +2 -2
  154. package/lib/esm/curve/UnionRegion.js.map +1 -1
  155. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
  156. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  157. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +2 -2
  158. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  159. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +20 -12
  160. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  161. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +63 -14
  162. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  163. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.d.ts +2 -2
  164. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.d.ts.map +1 -1
  165. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js +9 -5
  166. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  167. package/lib/esm/geometry3d/GeometryHandler.d.ts +15 -26
  168. package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
  169. package/lib/esm/geometry3d/GeometryHandler.js +23 -32
  170. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  171. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  172. package/lib/esm/geometry3d/Matrix3d.js +3 -6
  173. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  174. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  175. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  176. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  177. package/lib/esm/geometry3d/PolygonOps.d.ts +1 -1
  178. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  179. package/lib/esm/geometry3d/PolygonOps.js +2 -3
  180. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  181. package/lib/esm/geometry3d/Range.d.ts +1 -1
  182. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  183. package/lib/esm/geometry3d/Range.js +1 -1
  184. package/lib/esm/geometry3d/Range.js.map +1 -1
  185. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  186. package/lib/esm/geometry3d/Transform.js +4 -6
  187. package/lib/esm/geometry3d/Transform.js.map +1 -1
  188. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  189. package/lib/esm/geometry4d/Matrix4d.js +4 -2
  190. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  191. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  192. package/lib/esm/polyface/PolyfaceBuilder.d.ts +17 -5
  193. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  194. package/lib/esm/polyface/PolyfaceBuilder.js +48 -15
  195. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  196. package/lib/esm/polyface/PolyfaceClip.d.ts +16 -7
  197. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  198. package/lib/esm/polyface/PolyfaceClip.js +38 -7
  199. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  200. package/lib/esm/polyface/PolyfaceData.d.ts +5 -39
  201. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  202. package/lib/esm/polyface/PolyfaceData.js +7 -41
  203. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  204. package/lib/esm/polyface/PolyfaceQuery.d.ts +10 -8
  205. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  206. package/lib/esm/polyface/PolyfaceQuery.js +64 -18
  207. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  208. package/lib/esm/serialization/GeometrySamples.d.ts +6 -0
  209. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  210. package/lib/esm/serialization/GeometrySamples.js +68 -2
  211. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  212. package/lib/esm/solid/SweepContour.d.ts +34 -25
  213. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  214. package/lib/esm/solid/SweepContour.js +84 -100
  215. package/lib/esm/solid/SweepContour.js.map +1 -1
  216. package/lib/esm/topology/Graph.d.ts +29 -11
  217. package/lib/esm/topology/Graph.d.ts.map +1 -1
  218. package/lib/esm/topology/Graph.js +45 -26
  219. package/lib/esm/topology/Graph.js.map +1 -1
  220. package/lib/esm/topology/HalfEdgeMarkSet.d.ts +2 -2
  221. package/lib/esm/topology/HalfEdgeMarkSet.d.ts.map +1 -1
  222. package/lib/esm/topology/HalfEdgeMarkSet.js +2 -2
  223. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  224. package/lib/esm/topology/Merging.d.ts +3 -0
  225. package/lib/esm/topology/Merging.d.ts.map +1 -1
  226. package/lib/esm/topology/Merging.js +19 -5
  227. package/lib/esm/topology/Merging.js.map +1 -1
  228. package/lib/esm/topology/Triangulation.d.ts +15 -7
  229. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  230. package/lib/esm/topology/Triangulation.js +89 -47
  231. package/lib/esm/topology/Triangulation.js.map +1 -1
  232. package/package.json +4 -4
@@ -5,6 +5,7 @@
5
5
  /** @packageDocumentation
6
6
  * @module Curve
7
7
  */
8
+ import { assert } from "@itwin/core-bentley";
8
9
  import { BSplineCurve3d, BSplineCurve3dBase } from "../../bspline/BSplineCurve";
9
10
  import { Geometry } from "../../Geometry";
10
11
  import { RecurseToCurvesGeometryHandler } from "../../geometry3d/GeometryHandler";
@@ -13,6 +14,7 @@ import { Point3d, Vector3d } from "../../geometry3d/Point3dVector3d";
13
14
  import { Range3d } from "../../geometry3d/Range";
14
15
  import { AnalyticRoots, SmallSystem } from "../../numerics/Polynomials";
15
16
  import { Arc3d } from "../Arc3d";
17
+ import { CurveChainWithDistanceIndex } from "../CurveChainWithDistanceIndex";
16
18
  import { CurveCollection } from "../CurveCollection";
17
19
  import { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from "../CurveLocationDetail";
18
20
  import { LineSegment3d } from "../LineSegment3d";
@@ -45,9 +47,6 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
45
47
  }
46
48
  }
47
49
  }
48
- reinitialize() {
49
- this._results = [];
50
- }
51
50
  /**
52
51
  * Constructor.
53
52
  * @param geometryB second curve for intersection. Saved for reference by specific handler methods.
@@ -56,7 +55,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
56
55
  super();
57
56
  this.setGeometryB(geometryB);
58
57
  this._maxDistanceSquared = Geometry.smallMetricDistanceSquared;
59
- this.reinitialize();
58
+ this._results = [];
60
59
  }
61
60
  /** Set the (possibly undefined) max XY distance (z is ignored) to accept. */
62
61
  set maxDistanceToAccept(value) {
@@ -91,7 +90,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
91
90
  grabPairedResults(reinitialize = false) {
92
91
  const result = this._results;
93
92
  if (reinitialize)
94
- this.reinitialize();
93
+ this._results = [];
95
94
  return result;
96
95
  }
97
96
  /** Returns `true` if `detail` has same curve and fraction. */
@@ -123,7 +122,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
123
122
  * @param cpB the second curve
124
123
  * @param fractionB0 start of the second curve
125
124
  * @param fractionB1 end of the second curve
126
- * @param reversed true to have order reversed in final structures
125
+ * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).
127
126
  * @param intervalDetails optional CurveLocationDetailPair
128
127
  */
129
128
  recordPointWithLocalFractions(localFractionA, cpA, fractionA0, fractionA1, localFractionB, cpB, fractionB0, fractionB1, reversed, intervalDetails) {
@@ -189,7 +188,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
189
188
  * @param cpB curveB
190
189
  * @param fractionB0 global start fraction on curveB
191
190
  * @param fractionB1 global end fraction on curveB
192
- * @param reversed whether to reverse the details in the pair
191
+ * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).
193
192
  */
194
193
  capturePairWithLocalFractions(pair, cpA, fractionA0, fractionA1, cpB, fractionB0, fractionB1, reversed) {
195
194
  const globalFractionA = Geometry.interpolate(fractionA0, pair.detailA.fraction, fractionA1);
@@ -210,13 +209,13 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
210
209
  return;
211
210
  }
212
211
  }
213
- if (reversed)
214
- pair.swapDetails();
215
212
  // recompute the points just in case
216
213
  CurveLocationDetail.createCurveEvaluatedFraction(cpA, globalFractionA, pair.detailA);
217
214
  CurveLocationDetail.createCurveEvaluatedFraction(cpB, globalFractionB, pair.detailB);
218
215
  pair.detailA.setIntervalRole(CurveIntervalRole.isolated);
219
216
  pair.detailB.setIntervalRole(CurveIntervalRole.isolated);
217
+ if (reversed)
218
+ pair.swapDetails();
220
219
  this._results.push(pair);
221
220
  }
222
221
  /**
@@ -224,7 +223,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
224
223
  * @param cpA first curve primitive (possibly different from curve in detailA, but fraction compatible)
225
224
  * @param cpB second curve primitive (possibly different from curve in detailA, but fraction compatible)
226
225
  * @param pairs array of pairs
227
- * @param reversed true to have order reversed in final structures.
226
+ * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).
228
227
  */
229
228
  recordPairs(cpA, cpB, pairs, reversed) {
230
229
  if (pairs !== undefined) {
@@ -237,7 +236,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
237
236
  * Record fully assembled (but possibly reversed) detail pair.
238
237
  * @param detailA first detail
239
238
  * @param detailB second detail
240
- * @param reversed true to have order reversed in final structures.
239
+ * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).
241
240
  */
242
241
  captureDetailPair(detailA, detailB, reversed) {
243
242
  if (detailA && detailB) {
@@ -266,7 +265,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
266
265
  }
267
266
  /**
268
267
  * Return fractions of close approach within maxDistance between two line segments (a0,a1) and (b0,b1).
269
- * * Math details can be found at docs/learning/geometry/CurveCurve.md
268
+ * * Math details can be found at core/geometry/internaldocs/Curve.md
270
269
  * @param a0 start point of line a
271
270
  * @param a1 end point of line a
272
271
  * @param b0 start point of line b
@@ -339,7 +338,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
339
338
  * @param fB0 fraction0 on curveB
340
339
  * @param fB1 fraction0 on curveB
341
340
  * @param testProjectionOnB whether to record projections of the given curveA points onto curveB
342
- * @param reversed true to have order reversed in final structures.
341
+ * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).
343
342
  */
344
343
  testAndRecordFractionalPairApproach(cpA, fA0, fA1, testProjectionOnA, cpB, fB0, fB1, testProjectionOnB, reversed) {
345
344
  const pointA0 = cpA.fractionToPoint(fA0);
@@ -403,7 +402,7 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
403
402
  * @param pointA1 end point of the segment
404
403
  * @param fractionA1 fraction of the end of the segment
405
404
  * @param arc the arc
406
- * @param reversed true to have order reversed in final structures
405
+ * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).
407
406
  */
408
407
  dispatchSegmentArc(cpA, pointA0, fractionA0, pointA1, fractionA1, arc, reversed) {
409
408
  // 1) intersection between arc and segment
@@ -592,6 +591,39 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
592
591
  }
593
592
  this._geometryB = geomB; // restore
594
593
  }
594
+ /**
595
+ * Given a parent chain, convert the corresponding child details so that they refer to the chain's global parameterization.
596
+ * * It is assumed that `this._results[i].detailA.curve` is a child of chainA, and similarly for detailB/chainB.
597
+ * @param chainA convert each detailA to the global parameterization of chainA
598
+ * @param chainB convert each detailB to the global parameterization of chainB
599
+ */
600
+ convertChildDetailToChainDetail(chainA, chainB) {
601
+ for (const childDetailPair of this._results) {
602
+ if (chainA) {
603
+ const chainDetail = chainA.computeChainDetail(childDetailPair.detailA);
604
+ if (chainDetail)
605
+ childDetailPair.detailA = chainDetail;
606
+ }
607
+ if (chainB) {
608
+ const chainDetail = chainB.computeChainDetail(childDetailPair.detailB);
609
+ if (chainDetail)
610
+ childDetailPair.detailB = chainDetail;
611
+ }
612
+ }
613
+ }
614
+ /** Low level dispatch to geomA given a CurveChainWithDistanceIndex in geometryB. */
615
+ dispatchCurveChainWithDistanceIndex(geomA, geomAHandler) {
616
+ if (!this._geometryB || !(this._geometryB instanceof CurveChainWithDistanceIndex))
617
+ return;
618
+ const geomB = this._geometryB; // save
619
+ for (const child of geomB.path.children) {
620
+ this.resetGeometry(child);
621
+ geomAHandler(geomA);
622
+ }
623
+ this.resetGeometry(geomB); // restore
624
+ assert(!(geomA instanceof CurveChainWithDistanceIndex));
625
+ this.convertChildDetailToChainDetail(undefined, geomB);
626
+ }
595
627
  /** Double dispatch handler for strongly typed segment. */
596
628
  handleLineSegment3d(segmentA) {
597
629
  if (this._geometryB instanceof LineSegment3d) {
@@ -610,6 +642,9 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
610
642
  else if (this._geometryB instanceof CurveCollection) {
611
643
  this.dispatchCurveCollection(segmentA, this.handleLineSegment3d.bind(this));
612
644
  }
645
+ else if (this._geometryB instanceof CurveChainWithDistanceIndex) {
646
+ this.dispatchCurveChainWithDistanceIndex(segmentA, this.handleLineSegment3d.bind(this));
647
+ }
613
648
  return undefined;
614
649
  }
615
650
  /**
@@ -706,6 +741,9 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
706
741
  else if (this._geometryB instanceof CurveCollection) {
707
742
  this.dispatchCurveCollection(lsA, this.handleLineString3d.bind(this));
708
743
  }
744
+ else if (this._geometryB instanceof CurveChainWithDistanceIndex) {
745
+ this.dispatchCurveChainWithDistanceIndex(lsA, this.handleLineString3d.bind(this));
746
+ }
709
747
  return undefined;
710
748
  }
711
749
  /** Double dispatch handler for strongly typed arc. */
@@ -725,6 +763,9 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
725
763
  else if (this._geometryB instanceof CurveCollection) {
726
764
  this.dispatchCurveCollection(arc0, this.handleArc3d.bind(this));
727
765
  }
766
+ else if (this._geometryB instanceof CurveChainWithDistanceIndex) {
767
+ this.dispatchCurveChainWithDistanceIndex(arc0, this.handleArc3d.bind(this));
768
+ }
728
769
  return undefined;
729
770
  }
730
771
  /** Double dispatch handler for strongly typed bspline curve. */
@@ -744,8 +785,16 @@ class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
744
785
  else if (this._geometryB instanceof CurveCollection) {
745
786
  this.dispatchCurveCollection(curve, this.handleBSplineCurve3d.bind(this));
746
787
  }
788
+ else if (this._geometryB instanceof CurveChainWithDistanceIndex) {
789
+ this.dispatchCurveChainWithDistanceIndex(curve, this.handleBSplineCurve3d.bind(this));
790
+ }
747
791
  return undefined;
748
792
  }
793
+ /** Double dispatch handler for strongly typed CurveChainWithDistanceIndex. */
794
+ handleCurveChainWithDistanceIndex(chain) {
795
+ super.handleCurveChainWithDistanceIndex(chain);
796
+ this.convertChildDetailToChainDetail(chain, this._geometryB instanceof CurveChainWithDistanceIndex ? this._geometryB : undefined);
797
+ }
749
798
  /** Double dispatch handler for strongly typed homogeneous bspline curve .. */
750
799
  handleBSplineCurve3dH(_curve) {
751
800
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"CurveCurveCloseApproachXY.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveCloseApproachXY.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 { BSplineCurve3d, BSplineCurve3dBase } from \"../../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../../bspline/BSplineCurve3dH\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { GrowableFloat64Array } from \"../../geometry3d/GrowableFloat64Array\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../../geometry3d/Range\";\r\nimport { AnalyticRoots, SmallSystem } from \"../../numerics/Polynomials\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { AnyCurve } from \"../CurveTypes\";\r\nimport { CurveCollection } from \"../CurveCollection\";\r\nimport { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\n\r\n// cspell:word XYRR\r\n\r\n/**\r\n * Handler class for XY close approach between _geometryB and another geometry.\r\n * * Approach means the XY distance (z is ignored) between _geometryB and another geometry.\r\n * * Closest approach is a measure of the proximity of one curve to another. It's the length of the shortest line\r\n * segment perpendicular to both curves; if the curves intersect, the closest approach is zero. In the context of\r\n * this class, z-coordinates are ignored, so the closest approach is as seen in the top view. If you have coplanar\r\n * input curves and want to find closest approach in their plane, rotate them first into a plane parallel to the\r\n * xy-plane, then afterward, rotate the results back as required.\r\n * * Close approach can also be from a curve endpoint perpendicular to another curve or from a curve endpoint to\r\n * another curve endpoint.\r\n * * Instances are initialized and called from CurveCurve.\r\n * * geometryB is saved for later reference.\r\n * @internal\r\n */\r\nexport class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {\r\n private _geometryB: AnyCurve | undefined;\r\n private _circularArcB: Arc3d | undefined;\r\n private _circularRadiusB: number | undefined;\r\n private setGeometryB(geometryB: AnyCurve | undefined) {\r\n this._geometryB = geometryB;\r\n this._circularArcB = undefined;\r\n this._circularRadiusB = undefined;\r\n if (geometryB instanceof Arc3d) {\r\n const r = geometryB.circularRadiusXY();\r\n if (r !== undefined) {\r\n this._circularRadiusB = r;\r\n this._circularArcB = geometryB;\r\n }\r\n }\r\n }\r\n /**\r\n * Maximum XY distance (z is ignored). Approach larger than this is not interesting.\r\n * This is caller defined and can be undefined.\r\n */\r\n private _maxDistanceToAccept: number | undefined;\r\n /** Squared max distance. This is private, and is forced to at least small metric distance squared. */\r\n private _maxDistanceSquared: number;\r\n /**\r\n * Start and end points of line segments that meet closest approach criteria, i.e., they are perpendicular to\r\n * both curves and their length is smaller than _maxDistanceToAccept.\r\n */\r\n private _results!: CurveLocationDetailPair[];\r\n\r\n private static _workPointAA0 = Point3d.create();\r\n private static _workPointAA1 = Point3d.create();\r\n private static _workPointBB0 = Point3d.create();\r\n private static _workPointBB1 = Point3d.create();\r\n private static _workPointB = Point3d.create();\r\n\r\n private reinitialize() {\r\n this._results = [];\r\n }\r\n /**\r\n * Constructor.\r\n * @param geometryB second curve for intersection. Saved for reference by specific handler methods.\r\n */\r\n public constructor(geometryB: AnyCurve | undefined) {\r\n super();\r\n this.setGeometryB(geometryB);\r\n this._maxDistanceSquared = Geometry.smallMetricDistanceSquared;\r\n this.reinitialize();\r\n }\r\n /** Set the (possibly undefined) max XY distance (z is ignored) to accept. */\r\n public set maxDistanceToAccept(value: number | undefined) {\r\n this._maxDistanceToAccept = value;\r\n if (this._maxDistanceToAccept !== undefined && this._maxDistanceToAccept > 0)\r\n this._maxDistanceSquared = this._maxDistanceToAccept * this._maxDistanceToAccept;\r\n }\r\n /** Access the (possibly undefined) max XY distance (z is ignored) to accept. */\r\n public get maxDistanceToAccept(): number | undefined {\r\n return this._maxDistanceToAccept;\r\n }\r\n /** Ask if the maxDistanceToAccept value is defined and positive */\r\n public get isMaxDistanceSet(): boolean {\r\n return this._maxDistanceToAccept !== undefined && this._maxDistanceToAccept > 0;\r\n }\r\n /** Reset the geometry and flags, leaving all other parts unchanged (and preserving accumulated intersections) */\r\n public resetGeometry(geometryB: AnyCurve) {\r\n this.setGeometryB(geometryB);\r\n }\r\n /** returns true if `fraction` is in [0,1] within tolerance */\r\n private acceptFraction(fraction: number, fractionTol: number = 1.0e-12) {\r\n if (fraction < -fractionTol)\r\n return false;\r\n if (fraction > 1.0 + fractionTol)\r\n return false;\r\n return true;\r\n }\r\n /**\r\n * Return the results structure for the intersection calculation, structured as an array of CurveLocationDetailPair.\r\n * @param reinitialize if true, a new results structure is created for use by later calls.\r\n */\r\n public grabPairedResults(reinitialize: boolean = false): CurveLocationDetailPair[] {\r\n const result = this._results;\r\n if (reinitialize)\r\n this.reinitialize();\r\n return result;\r\n }\r\n /** Returns `true` if `detail` has same curve and fraction. */\r\n private sameCurveAndFraction(cp: CurvePrimitive, fraction: number, detail: CurveLocationDetail): boolean {\r\n return cp === detail.curve && Geometry.isAlmostEqualNumber(fraction, detail.fraction);\r\n }\r\n /**\r\n * If distance between pointA and pointB is less than maxDistance, record CurveLocationDetailPair which is\r\n * the approach from pointA to pointB.\r\n */\r\n private testAndRecordPointPairApproach(\r\n cpA: CurvePrimitive, fA: number, pointA: Point3d, cpB: CurvePrimitive, fB: number, pointB: Point3d, reversed: boolean,\r\n ): void {\r\n const d2 = pointA.distanceSquaredXY(pointB);\r\n if (d2 < this._maxDistanceSquared) {\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(cpA, fA, pointA);\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(cpB, fB, pointB);\r\n const pair = CurveLocationDetailPair.createCapture(detailA, detailB);\r\n if (reversed)\r\n pair.swapDetails();\r\n this._results.push(pair);\r\n }\r\n }\r\n /**\r\n * Create a close approach pair if XY distance is within maxDistance.\r\n * @param localFractionA a fraction on first curve\r\n * @param cpA the first curve\r\n * @param fractionA0 start of the first curve\r\n * @param fractionA1 end of the first curve\r\n * @param localFractionB a fraction on second curve\r\n * @param cpB the second curve\r\n * @param fractionB0 start of the second curve\r\n * @param fractionB1 end of the second curve\r\n * @param reversed true to have order reversed in final structures\r\n * @param intervalDetails optional CurveLocationDetailPair\r\n */\r\n private recordPointWithLocalFractions(\r\n localFractionA: number,\r\n cpA: CurvePrimitive,\r\n fractionA0: number,\r\n fractionA1: number,\r\n localFractionB: number,\r\n cpB: CurvePrimitive,\r\n fractionB0: number,\r\n fractionB1: number,\r\n reversed: boolean,\r\n intervalDetails?: undefined | CurveLocationDetailPair,\r\n ): void {\r\n let globalFractionA, globalFractionB;\r\n let globalFractionA1, globalFractionB1;\r\n const isInterval = intervalDetails !== undefined &&\r\n intervalDetails.detailA.hasFraction1 &&\r\n intervalDetails.detailB.hasFraction1;\r\n if (isInterval) {\r\n globalFractionA = Geometry.interpolate(fractionA0, intervalDetails.detailA.fraction, fractionA1);\r\n globalFractionB = Geometry.interpolate(fractionB0, intervalDetails.detailB.fraction, fractionB1);\r\n globalFractionA1 = Geometry.interpolate(fractionA0, intervalDetails.detailA.fraction1!, fractionA1);\r\n globalFractionB1 = Geometry.interpolate(fractionB0, intervalDetails.detailB.fraction1!, fractionB1);\r\n } else {\r\n globalFractionA = globalFractionA1 = Geometry.interpolate(fractionA0, localFractionA, fractionA1);\r\n globalFractionB = globalFractionB1 = Geometry.interpolate(fractionB0, localFractionB, fractionB1);\r\n }\r\n // ignore duplicate of most recent approach\r\n const numPrevious = this._results.length;\r\n if (numPrevious > 0 && !isInterval) {\r\n const oldDetailA = this._results[numPrevious - 1].detailA;\r\n const oldDetailB = this._results[numPrevious - 1].detailB;\r\n if (reversed) {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailB) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailA))\r\n return;\r\n } else {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailA) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailB))\r\n return;\r\n }\r\n }\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(\r\n cpA, globalFractionA, cpA.fractionToPoint(globalFractionA),\r\n );\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(\r\n cpB, globalFractionB, cpB.fractionToPoint(globalFractionB),\r\n );\r\n if (isInterval) {\r\n detailA.captureFraction1Point1(globalFractionA1, cpA.fractionToPoint(globalFractionA1));\r\n detailB.captureFraction1Point1(globalFractionB1, cpB.fractionToPoint(globalFractionB1));\r\n } else {\r\n const d2 = detailA.point.distanceSquaredXY(detailB.point);\r\n if (d2 > this._maxDistanceSquared)\r\n return;\r\n detailA.setIntervalRole(CurveIntervalRole.isolated);\r\n detailB.setIntervalRole(CurveIntervalRole.isolated);\r\n }\r\n if (reversed) {\r\n this._results.push(new CurveLocationDetailPair(detailB, detailA));\r\n } else {\r\n this._results.push(new CurveLocationDetailPair(detailA, detailB));\r\n }\r\n }\r\n /**\r\n * Capture a close approach pair that has point and local fraction but not curve.\r\n * * Record the pair, each detail modified with global fraction and input curve.\r\n * * Pair is neither modified nor recorded if it would be a duplicate of the last recorded pair.\r\n * @param pair details computed with local fractions\r\n * @param cpA curveA\r\n * @param fractionA0 global start fraction on curveA\r\n * @param fractionA1 global end fraction on curveA\r\n * @param cpB curveB\r\n * @param fractionB0 global start fraction on curveB\r\n * @param fractionB1 global end fraction on curveB\r\n * @param reversed whether to reverse the details in the pair\r\n */\r\n private capturePairWithLocalFractions(\r\n pair: CurveLocationDetailPair,\r\n cpA: CurvePrimitive,\r\n fractionA0: number,\r\n fractionA1: number,\r\n cpB: CurvePrimitive,\r\n fractionB0: number,\r\n fractionB1: number,\r\n reversed: boolean,\r\n ) {\r\n const globalFractionA = Geometry.interpolate(fractionA0, pair.detailA.fraction, fractionA1);\r\n const globalFractionB = Geometry.interpolate(fractionB0, pair.detailB.fraction, fractionB1);\r\n // ignore duplicate of most recent pair\r\n const numPrevious = this._results.length;\r\n if (numPrevious > 0) {\r\n const oldDetailA = this._results[numPrevious - 1].detailA;\r\n const oldDetailB = this._results[numPrevious - 1].detailB;\r\n if (reversed) {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailB) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailA))\r\n return;\r\n } else {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailA) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailB))\r\n return;\r\n }\r\n }\r\n if (reversed)\r\n pair.swapDetails();\r\n // recompute the points just in case\r\n CurveLocationDetail.createCurveEvaluatedFraction(cpA, globalFractionA, pair.detailA);\r\n CurveLocationDetail.createCurveEvaluatedFraction(cpB, globalFractionB, pair.detailB);\r\n pair.detailA.setIntervalRole(CurveIntervalRole.isolated);\r\n pair.detailB.setIntervalRole(CurveIntervalRole.isolated);\r\n this._results.push(pair);\r\n }\r\n /**\r\n * Emit recordPoint for multiple pairs (on full curve) if within maxDistance.\r\n * @param cpA first curve primitive (possibly different from curve in detailA, but fraction compatible)\r\n * @param cpB second curve primitive (possibly different from curve in detailA, but fraction compatible)\r\n * @param pairs array of pairs\r\n * @param reversed true to have order reversed in final structures.\r\n */\r\n public recordPairs(\r\n cpA: CurvePrimitive, cpB: CurvePrimitive, pairs: CurveLocationDetailPair[] | undefined, reversed: boolean,\r\n ): void {\r\n if (pairs !== undefined) {\r\n for (const p of pairs) {\r\n this.recordPointWithLocalFractions(\r\n p.detailA.fraction, cpA, 0, 1, p.detailB.fraction, cpB, 0, 1, reversed, p,\r\n );\r\n }\r\n }\r\n }\r\n /**\r\n * Record fully assembled (but possibly reversed) detail pair.\r\n * @param detailA first detail\r\n * @param detailB second detail\r\n * @param reversed true to have order reversed in final structures.\r\n */\r\n public captureDetailPair(\r\n detailA: CurveLocationDetail | undefined, detailB: CurveLocationDetail | undefined, reversed: boolean,\r\n ): void {\r\n if (detailA && detailB) {\r\n if (reversed) {\r\n this._results.push(CurveLocationDetailPair.createCapture(detailB, detailA));\r\n } else {\r\n this._results.push(CurveLocationDetailPair.createCapture(detailA, detailB));\r\n }\r\n }\r\n }\r\n private static updatePointToSegmentDistance(\r\n fractionA: number,\r\n pointA: Point3d,\r\n pointB0: Point3d,\r\n pointB1: Point3d,\r\n fractionB: number,\r\n maxDistanceSquared: number,\r\n closestApproach: CurveLocationDetailPair, // modified on return\r\n ): boolean {\r\n let updated = false;\r\n if (fractionB < 0)\r\n fractionB = 0;\r\n else if (fractionB > 1)\r\n fractionB = 1;\r\n this._workPointB = pointB0.interpolate(fractionB, pointB1, this._workPointB);\r\n const distanceSquared = this._workPointB.distanceSquaredXY(pointA);\r\n if (distanceSquared <= Math.min(maxDistanceSquared, closestApproach.detailA.a)) {\r\n closestApproach.detailA.setFP(fractionA, pointA, undefined, distanceSquared);\r\n closestApproach.detailB.setFP(fractionB, this._workPointB, undefined, distanceSquared);\r\n updated = true;\r\n }\r\n return updated;\r\n }\r\n /**\r\n * Return fractions of close approach within maxDistance between two line segments (a0,a1) and (b0,b1).\r\n * * Math details can be found at docs/learning/geometry/CurveCurve.md\r\n * @param a0 start point of line a\r\n * @param a1 end point of line a\r\n * @param b0 start point of line b\r\n * @param b1 end point of line b\r\n * @param maxDistanceSquared maximum distance squared (assumed to be positive)\r\n * @returns the fractional (not xy) coordinates in result.x and result.y. result.x is fraction on line a.\r\n * result.y is fraction on line b.\r\n */\r\n private static segmentSegmentBoundedApproach(\r\n a0: Point3d,\r\n a1: Point3d,\r\n b0: Point3d,\r\n b1: Point3d,\r\n maxDistanceSquared: number,\r\n ): CurveLocationDetailPair | undefined {\r\n const ux = a1.x - a0.x;\r\n const uy = a1.y - a0.y;\r\n const vx = b1.x - b0.x;\r\n const vy = b1.y - b0.y;\r\n const e00x = b0.x - a0.x;\r\n const e00y = b0.y - a0.y;\r\n const e01x = b1.x - a0.x;\r\n const e01y = b1.y - a0.y;\r\n const e10x = b0.x - a1.x;\r\n const e10y = b0.y - a1.y;\r\n const hab0 = Geometry.crossProductXYXY(ux, uy, e00x, e00y);\r\n const hab1 = Geometry.crossProductXYXY(ux, uy, e01x, e01y);\r\n const hba0 = -Geometry.crossProductXYXY(vx, vy, e00x, e00y);\r\n const hba1 = -Geometry.crossProductXYXY(vx, vy, e10x, e10y);\r\n if (hab0 * hab1 < 0.0 && hba0 * hba1 < 0.0) { // true intersection, strictly within both segments\r\n const fractionA = -hba0 / (hba1 - hba0);\r\n const fractionB = -hab0 / (hab1 - hab0);\r\n return CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveFractionPoint(undefined, fractionA, a0.interpolate(fractionA, a1)),\r\n CurveLocationDetail.createCurveFractionPoint(undefined, fractionB, b0.interpolate(fractionB, b1)),\r\n );\r\n }\r\n // there's no intersection, so find the closest approach within maxDistance from an endpoint\r\n const closestApproach = new CurveLocationDetailPair();\r\n closestApproach.detailA.a = 2 * maxDistanceSquared; // init to an approach that's too far away\r\n let reversed = false;\r\n const uu = Geometry.hypotenuseSquaredXY(ux, uy);\r\n if (hab0 * hab0 <= maxDistanceSquared * uu) { // test distance of b0 to u\r\n const fractionA = Geometry.dotProductXYXY(ux, uy, e00x, e00y) / uu;\r\n if (this.updatePointToSegmentDistance(0, b0, a0, a1, fractionA, maxDistanceSquared, closestApproach))\r\n reversed = true;\r\n }\r\n if (hab1 * hab1 <= maxDistanceSquared * uu) { // test distance of b1 to u\r\n const fractionA = Geometry.dotProductXYXY(ux, uy, e01x, e01y) / uu;\r\n if (this.updatePointToSegmentDistance(1, b1, a0, a1, fractionA, maxDistanceSquared, closestApproach))\r\n reversed = true;\r\n }\r\n const vv = Geometry.hypotenuseSquaredXY(vx, vy);\r\n if (hba0 * hba0 <= maxDistanceSquared * vv) { // test distance of a0 to v\r\n const fractionB = -Geometry.dotProductXYXY(vx, vy, e00x, e00y) / vv;\r\n if (this.updatePointToSegmentDistance(0, a0, b0, b1, fractionB, maxDistanceSquared, closestApproach))\r\n reversed = false;\r\n }\r\n if (hba1 * hba1 <= maxDistanceSquared * vv) { // test distance of a1 to v\r\n const fractionB = -Geometry.dotProductXYXY(vx, vy, e10x, e10y) / vv;\r\n if (this.updatePointToSegmentDistance(1, a1, b0, b1, fractionB, maxDistanceSquared, closestApproach))\r\n reversed = false;\r\n }\r\n if (closestApproach.detailA.a > maxDistanceSquared)\r\n return undefined;\r\n if (reversed)\r\n closestApproach.swapDetails();\r\n return closestApproach;\r\n }\r\n /**\r\n * Check different combination of fractions on curveA and curveB. If distance between points at 2 fractions\r\n * is less than maxDistance, record CurveLocationDetailPair which is the approach between the 2 points.\r\n * Optionally, record close approaches of one curve's points if they fall between the other curve's points.\r\n * @param cpA curveA\r\n * @param fA0 fraction0 on curveA\r\n * @param fA1 fraction1 on curveA\r\n * @param testProjectionOnA whether to record projections of the given curveB points onto curveA\r\n * @param cpB curveB\r\n * @param fB0 fraction0 on curveB\r\n * @param fB1 fraction0 on curveB\r\n * @param testProjectionOnB whether to record projections of the given curveA points onto curveB\r\n * @param reversed true to have order reversed in final structures.\r\n */\r\n private testAndRecordFractionalPairApproach(\r\n cpA: CurvePrimitive,\r\n fA0: number,\r\n fA1: number,\r\n testProjectionOnA: boolean,\r\n cpB: CurvePrimitive,\r\n fB0: number,\r\n fB1: number,\r\n testProjectionOnB: boolean,\r\n reversed: boolean,\r\n ): void {\r\n const pointA0 = cpA.fractionToPoint(fA0);\r\n const pointA1 = cpA.fractionToPoint(fA1);\r\n const pointB0 = cpB.fractionToPoint(fB0);\r\n const pointB1 = cpB.fractionToPoint(fB1);\r\n this.testAndRecordPointPairApproach(cpA, fA0, pointA0, cpB, fB0, pointB0, reversed);\r\n this.testAndRecordPointPairApproach(cpA, fA1, pointA1, cpB, fB0, pointB0, reversed);\r\n this.testAndRecordPointPairApproach(cpA, fA0, pointA0, cpB, fB1, pointB1, reversed);\r\n this.testAndRecordPointPairApproach(cpA, fA1, pointA1, cpB, fB1, pointB1, reversed);\r\n if (testProjectionOnB) {\r\n this.testAndRecordProjection(cpA, fA0, pointA0, cpB, fB0, fB1, reversed);\r\n this.testAndRecordProjection(cpA, fA1, pointA1, cpB, fB0, fB1, reversed);\r\n }\r\n if (testProjectionOnA) {\r\n this.testAndRecordProjection(cpB, fB0, pointB0, cpA, fA0, fA1, !reversed);\r\n this.testAndRecordProjection(cpB, fB1, pointB1, cpA, fA0, fA1, !reversed);\r\n }\r\n }\r\n /** Find the closest approach between pointA and cpB. Add the approach if it's within fB0 and fB1. */\r\n private testAndRecordProjection(\r\n cpA: CurvePrimitive, fA: number, pointA: Point3d, cpB: CurvePrimitive, fB0: number, fB1: number, reversed: boolean,\r\n ) {\r\n // NO NO NO -- this is 3D closest point --- need 2d !!\r\n const detail = cpB.closestPoint(pointA, false);\r\n if (detail) {\r\n const fB = Geometry.restrictToInterval(detail.fraction, fB0, fB1);\r\n if (fB === detail.fraction) { // if fraction is within fB0 and fB1\r\n this.testAndRecordPointPairApproach(cpA, fA, pointA, cpB, detail.fraction, detail.point, reversed);\r\n }\r\n }\r\n }\r\n /**\r\n * Compute intersection of two line segments.\r\n * Filter by extension rules.\r\n * Record with fraction mapping.\r\n * * The fraction mappings allow portions of a linestring to be passed here.\r\n */\r\n private computeSegmentSegment3D(\r\n cpA: CurvePrimitive,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n cpB: CurvePrimitive,\r\n pointB0: Point3d,\r\n fractionB0: number,\r\n pointB1: Point3d,\r\n fractionB1: number,\r\n reversed: boolean,\r\n ): void {\r\n // compute a pair with fractions local to segments\r\n const approach = CurveCurveCloseApproachXY.segmentSegmentBoundedApproach(\r\n pointA0, pointA1, pointB0, pointB1, this._maxDistanceSquared,\r\n );\r\n // adjust the pair to refer to input curves and global fractions, then record it if new\r\n if (approach) {\r\n approach.detailA.setCurve(cpA);\r\n approach.detailB.setCurve(cpB);\r\n this.capturePairWithLocalFractions(approach, cpA, fractionA0, fractionA1, cpB, fractionB0, fractionB1, reversed);\r\n }\r\n }\r\n /** Low level dispatch of segment with segment. */\r\n private dispatchSegmentSegment(\r\n cpA: CurvePrimitive,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n cpB: CurvePrimitive,\r\n pointB0: Point3d,\r\n fractionB0: number,\r\n pointB1: Point3d,\r\n fractionB1: number,\r\n reversed: boolean,\r\n ): void {\r\n this.computeSegmentSegment3D(\r\n cpA, pointA0, fractionA0, pointA1, fractionA1,\r\n cpB, pointB0, fractionB0, pointB1, fractionB1,\r\n reversed,\r\n );\r\n }\r\n /**\r\n * Low level dispatch of segment with arc.\r\n * Find close approaches within maxDistance between a line segments (pointA0, pointA1) and an arc.\r\n * To consider:\r\n * 1) intersection between arc and segment.\r\n * 2) arc endpoints to segment endpoints or arc endpoints projection to the segment.\r\n * 3) line parallel to arc tangent.\r\n * @param cpA curve A (line segment or line string)\r\n * @param pointA0 start point of the segment\r\n * @param fractionA0 fraction of the start of the segment\r\n * @param pointA1 end point of the segment\r\n * @param fractionA1 fraction of the end of the segment\r\n * @param arc the arc\r\n * @param reversed true to have order reversed in final structures\r\n */\r\n private dispatchSegmentArc(\r\n cpA: CurvePrimitive,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n arc: Arc3d,\r\n reversed: boolean,\r\n ): void {\r\n // 1) intersection between arc and segment\r\n // Suppose:\r\n // Arc: X = C + cU + sV where c = cos(theta) and s = sin(theta)\r\n // Line: contains points A0 and A1\r\n // The arc intersects the line at point X if det(A0, A1, X) = 0 with homogeneous xyw points and vectors.\r\n // With equational X: det(A0, A1, C) + c*det(A0, A1, U) + s*det(A0, A1, V) = 0.\r\n // solve for theta.\r\n // evaluate points.\r\n // project back to line.\r\n let intersectionFound = false;\r\n const data = arc.toTransformedVectors();\r\n const pointA0Local = pointA0;\r\n const pointA1Local = pointA1;\r\n const alpha = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.center, 1); // det(A0, A1, C)\r\n const beta = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector0, 0); // det(A0, A1, U)\r\n const gamma = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector90, 0); // det(A0, A1, V)\r\n const cosines = new GrowableFloat64Array(2);\r\n const sines = new GrowableFloat64Array(2);\r\n const radians = new GrowableFloat64Array(2);\r\n const numRoots = AnalyticRoots.appendImplicitLineUnitCircleIntersections( // solve the equation\r\n alpha, beta, gamma, cosines, sines, radians,\r\n );\r\n for (let i = 0; i < numRoots; i++) {\r\n const arcPoint = data.center.plus2Scaled(\r\n data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i),\r\n );\r\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians.atUncheckedIndex(i));\r\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);\r\n // only add if the point is within the start and end fractions of both line segment and arc\r\n if (lineFraction !== undefined && this.acceptFraction(lineFraction) && this.acceptFraction(arcFraction)) {\r\n this.recordPointWithLocalFractions(\r\n lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed,\r\n );\r\n intersectionFound = true;\r\n }\r\n }\r\n if (intersectionFound)\r\n return;\r\n // 2) endpoints to endpoints or endpoints projection to the other curve\r\n this.testAndRecordFractionalPairApproach(cpA, fractionA0, fractionA1, true, arc, 0, 1, false, reversed);\r\n // 3) line parallel to arc tangent.\r\n // If line does not intersect the arc, then the closest (and/or the furthest) point on arc to the line is a\r\n // point where the tangent line on arc at that point is parallel to the line.\r\n const dotUT = data.vector0.crossProductStartEndXY(pointA0, pointA1);\r\n const dotVT = data.vector90.crossProductStartEndXY(pointA0, pointA1);\r\n const parallelRadians = Math.atan2(dotVT, dotUT);\r\n for (const radians1 of [parallelRadians, parallelRadians + Math.PI]) {\r\n const arcPoint = data.center.plus2Scaled(data.vector0, Math.cos(radians1), data.vector90, Math.sin(radians1));\r\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians1);\r\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);\r\n // only add if the point is within the start and end fractions of both line segment and arc\r\n if (lineFraction !== undefined && this.acceptFraction(lineFraction) && this.acceptFraction(arcFraction)) {\r\n this.recordPointWithLocalFractions(\r\n lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n }\r\n /** Low level dispatch of circular arc with circular arc. radiusA must be larger than or equal to radiusB. */\r\n private dispatchCircularCircularOrdered(\r\n cpA: Arc3d, radiusA: number, cpB: Arc3d, radiusB: number, reversed: boolean,\r\n ): void {\r\n const c = cpA.center.distance(cpB.center);\r\n const e = this._maxDistanceToAccept !== undefined ? this._maxDistanceToAccept : Geometry.smallMetricDistance;\r\n if (c > radiusA + radiusB + e) // distance between circles is more than max distance\r\n return;\r\n // TODO: 1) intersection between arcs\r\n // 2) endpoints to endpoints\r\n this.testAndRecordFractionalPairApproach(cpA, 0, 1, false, cpB, 0, 1, false, reversed);\r\n // 3) line from one arc to another (perpendicular to arc tangents along center-center line)\r\n if (!Geometry.isSmallMetricDistance(c)) {\r\n const vectorAB = Vector3d.createStartEnd(cpA.center, cpB.center);\r\n vectorAB.scaleInPlace(1.0 / c);\r\n for (const rA of [-radiusA, radiusA]) {\r\n for (const rB of [-radiusB, radiusB]) {\r\n const tangentDistance = c - rA + rB;\r\n if (tangentDistance < e) {\r\n const detailA = this.resolveDirectionToArcXYFraction(cpA, vectorAB, rA);\r\n if (detailA) {\r\n const detailB = this.resolveDirectionToArcXYFraction(cpB, vectorAB, rB);\r\n if (detailB)\r\n this.captureDetailPair(detailA, detailB, reversed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** Find the fractional point (if any) on the circular `arc` in the direction of `radialVector`. */\r\n private resolveDirectionToArcXYFraction(\r\n arc: Arc3d, radialVector: Vector3d, scale: number,\r\n ): CurveLocationDetail | undefined {\r\n // The scale ultimately only affects the direction --- easiest way to use it is two multiplies.\r\n const c = scale * arc.matrixRef.columnDotXYZ(0, radialVector.x, radialVector.y, 0);\r\n const s = scale * arc.matrixRef.columnDotXYZ(1, radialVector.x, radialVector.y, 0);\r\n const radians = Math.atan2(s, c);\r\n const fraction = arc.sweep.radiansToPositivePeriodicFraction(radians, 0);\r\n if (fraction < 1.0)\r\n return CurveLocationDetail.createCurveEvaluatedFraction(arc, fraction);\r\n return undefined;\r\n }\r\n /** Low level dispatch of arc with arc. Only circular arcs are supported. */\r\n private dispatchArcArc(cpA: Arc3d, cpB: Arc3d, reversed: boolean): void {\r\n const rangeA = cpA.range();\r\n const rangeB = cpB.range();\r\n rangeA.expandInPlace(this._maxDistanceToAccept!);\r\n if (!rangeB.intersectsRangeXY(rangeA))\r\n return;\r\n if (this._circularArcB) {\r\n const radiusB = this._circularRadiusB!;\r\n const radiusA = cpA.circularRadiusXY();\r\n if (radiusA !== undefined) {\r\n if (radiusA >= radiusB)\r\n this.dispatchCircularCircularOrdered(cpA, radiusA, cpB, radiusB, reversed);\r\n else\r\n this.dispatchCircularCircularOrdered(cpB, radiusB, cpA, radiusA, !reversed);\r\n return;\r\n }\r\n }\r\n }\r\n /** Low level dispatch of arc with (beziers of) a bspline curve */\r\n private dispatchArcBsplineCurve3d(cpA: Arc3d, cpB: BSplineCurve3d, reversed: boolean): void {\r\n const ls = LineString3d.create();\r\n cpB.emitStrokes(ls);\r\n this.computeArcLineString(cpA, ls, reversed);\r\n }\r\n /** Low level dispatch of (beziers of) a bspline curve with (beziers of) a bspline curve */\r\n private dispatchBSplineCurve3dBSplineCurve3d(\r\n bcurveA: BSplineCurve3dBase, bcurveB: BSplineCurve3dBase, reversed: boolean,\r\n ): void {\r\n const lsA = LineString3d.create();\r\n bcurveA.emitStrokes(lsA);\r\n const lsB = LineString3d.create();\r\n bcurveB.emitStrokes(lsB);\r\n this.computeLineStringLineString(lsA, lsB, reversed);\r\n }\r\n /** Low level dispatch of linestring with (beziers of) a bspline curve */\r\n public dispatchLineStringBSplineCurve(lsA: LineString3d, curveB: BSplineCurve3d, reversed: boolean): any {\r\n const lsB = LineString3d.create();\r\n curveB.emitStrokes(lsB);\r\n this.computeLineStringLineString(lsA, lsB, reversed);\r\n }\r\n /** Low level dispatch of segment with (beziers of) a bspline curve */\r\n public dispatchSegmentBsplineCurve(segA: LineSegment3d, curveB: BSplineCurve3d, reversed: boolean): any {\r\n const lsB = LineString3d.create();\r\n curveB.emitStrokes(lsB);\r\n this.computeSegmentLineString(segA, lsB, reversed);\r\n }\r\n /** Detail computation for segment approaching linestring. */\r\n public computeSegmentLineString(segA: LineSegment3d, lsB: LineString3d, reversed: boolean): void {\r\n const numB = lsB.numPoints();\r\n const deltaFracB = Geometry.safeDivideFraction(1, numB - 1, 0);\r\n const pointA0 = segA.point0Ref;\r\n const pointA1 = segA.point1Ref;\r\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\r\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\r\n for (let i = 0; i < numB - 1; ++i) {\r\n const fB0 = i * deltaFracB; // global linestring fractions\r\n const fB1 = (i + 1 === numB - 1) ? 1.0 : (i + 1) * deltaFracB; // make sure we nail the end fraction\r\n lsB.packedPoints.getPoint3dAtUncheckedPointIndex(i, pointB0);\r\n lsB.packedPoints.getPoint3dAtUncheckedPointIndex(i + 1, pointB1);\r\n this.dispatchSegmentSegment(segA, pointA0, 0.0, pointA1, 1.0, lsB, pointB0, fB0, pointB1, fB1, reversed);\r\n }\r\n }\r\n /** Detail computation for arc approaching linestring. */\r\n public computeArcLineString(arcA: Arc3d, lsB: LineString3d, reversed: boolean): any {\r\n const rangeA = arcA.range();\r\n const rangeB = lsB.range();\r\n rangeA.expandInPlace(this._maxDistanceToAccept!);\r\n if (!rangeB.intersectsRangeXY(rangeA))\r\n return;\r\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\r\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\r\n const numB = lsB.numPoints();\r\n if (numB > 1) {\r\n const dfB = 1.0 / (numB - 1);\r\n let fB0;\r\n let fB1;\r\n fB0 = 0.0;\r\n lsB.pointAt(0, pointB0);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\r\n lsB.pointAt(ib, pointB1);\r\n fB1 = ib * dfB;\r\n this.dispatchSegmentArc(lsB, pointB0, fB0, pointB1, fB1, arcA, !reversed);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Low level dispatch of curve collection. */\r\n private dispatchCurveCollection(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\r\n const geomB = this._geometryB; // save\r\n if (!geomB || !geomB.children || !(geomB instanceof CurveCollection))\r\n return;\r\n for (const child of geomB.children as AnyCurve[]) {\r\n this.resetGeometry(child);\r\n geomAHandler(geomA);\r\n }\r\n this._geometryB = geomB; // restore\r\n }\r\n /** Double dispatch handler for strongly typed segment. */\r\n public override handleLineSegment3d(segmentA: LineSegment3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n const segmentB = this._geometryB;\r\n this.dispatchSegmentSegment(\r\n segmentA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0,\r\n segmentB, segmentB.point0Ref, 0.0, segmentB.point1Ref, 1.0,\r\n false,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeSegmentLineString(segmentA, this._geometryB, false);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchSegmentArc(segmentA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._geometryB, false);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchSegmentBsplineCurve(segmentA, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(segmentA, this.handleLineSegment3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Set bits for comparison to range xy\r\n * * bit 0x01 => x smaller than range.low.x\r\n * * bit 0x02 => x larger than range.high.x\r\n * * bit 0x04 => y smaller than range.low.y\r\n * * bit 0x08 => y larger than range.high.y\r\n * * If we divide XY plane into 9 areas using the range, the function returns 0 for points\r\n * inside the range. Below is other binary numbers returned by the function for all 9 areas:\r\n * 1001 | 1000 | 1010\r\n * ------------------\r\n * 1 | 0 | 10\r\n * ------------------\r\n * 101 | 100 | 110\r\n * @param xy point to test\r\n * @param range range for comparison\r\n */\r\n private classifyBitsPointRangeXY(x: number, y: number, range: Range3d): number {\r\n let result = 0;\r\n if (x < range.low.x)\r\n result = 0x01;\r\n else if (x > range.high.x)\r\n result = 0x02;\r\n // note the OR operation\r\n if (y < range.low.y)\r\n result |= 0x04;\r\n else if (y > range.high.y)\r\n result |= 0x08;\r\n return result;\r\n }\r\n /** Low level dispatch of line string with line string. */\r\n private computeLineStringLineString(lsA: LineString3d, lsB: LineString3d, reversed: boolean): void {\r\n const rangeA = lsA.range();\r\n const rangeB = lsB.range();\r\n rangeA.expandInPlace(this._maxDistanceToAccept!);\r\n if (!rangeB.intersectsRangeXY(rangeA))\r\n return;\r\n let bitB0: number;\r\n let bitB1: number;\r\n const rangeA1 = Range3d.createNull();\r\n const pointA0 = CurveCurveCloseApproachXY._workPointAA0;\r\n const pointA1 = CurveCurveCloseApproachXY._workPointAA1;\r\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\r\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\r\n const numA = lsA.numPoints();\r\n const numB = lsB.numPoints();\r\n if (numA > 1 && numB > 1) {\r\n const dfA = 1.0 / (numA - 1);\r\n const dfB = 1.0 / (numB - 1);\r\n let fA0 = 0.0;\r\n let fA1, fB0, fB1;\r\n lsA.pointAt(0, pointA0);\r\n for (let ia = 1; ia < numA; ia++, pointA0.setFrom(pointA1), fA0 = fA1) {\r\n fA1 = ia * dfA;\r\n fB0 = 0.0;\r\n lsA.pointAt(ia, pointA1);\r\n // rangeA1 is around line segment [A0,A1] expanded by max distance\r\n rangeA1.setNull();\r\n rangeA1.extendPoint(pointA0);\r\n rangeA1.extendPoint(pointA1);\r\n rangeA1.expandInPlace(this._maxDistanceToAccept!);\r\n if (rangeA1.intersectsRangeXY(rangeB)) {\r\n lsB.pointAt(0, pointB0);\r\n bitB0 = this.classifyBitsPointRangeXY(pointB0.x, pointB0.y, rangeA1);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1, bitB0 = bitB1) {\r\n lsB.pointAt(ib, pointB1);\r\n bitB1 = this.classifyBitsPointRangeXY(pointB1.x, pointB1.y, rangeA1);\r\n fB1 = ib * dfB;\r\n // DO NOT study the segment in detail if both bitB bits are on for any of the 4 planes\r\n // (i.e., no intersection between rangeA1 and the range around line segment [B0,B1])\r\n if ((bitB0 & bitB1) === 0)\r\n this.dispatchSegmentSegment(lsA, pointA0, fA0, pointA1, fA1, lsB, pointB0, fB0, pointB1, fB1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** Double dispatch handler for strongly typed linestring. */\r\n public override handleLineString3d(lsA: LineString3d): any {\r\n if (this._geometryB instanceof LineString3d) {\r\n const lsB = this._geometryB;\r\n this.computeLineStringLineString(lsA, lsB, false);\r\n } else if (this._geometryB instanceof LineSegment3d) {\r\n this.computeSegmentLineString(this._geometryB, lsA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.computeArcLineString(this._geometryB, lsA, true);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchLineStringBSplineCurve(lsA, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(lsA, this.handleLineString3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed arc. */\r\n public override handleArc3d(arc0: Arc3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentArc(\r\n this._geometryB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, arc0, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeArcLineString(arc0, this._geometryB, false);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcArc(arc0, this._geometryB, false);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchArcBsplineCurve3d(arc0, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(arc0, this.handleArc3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed bspline curve. */\r\n public override handleBSplineCurve3d(curve: BSplineCurve3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentBsplineCurve(this._geometryB, curve, true);\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(this._geometryB, curve, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(this._geometryB, curve, true);\r\n } else if (this._geometryB instanceof BSplineCurve3dBase) {\r\n this.dispatchBSplineCurve3dBSplineCurve3d(curve, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(curve, this.handleBSplineCurve3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed homogeneous bspline curve .. */\r\n public override handleBSplineCurve3dH(_curve: BSplineCurve3dH): any {\r\n /*\r\n //NEEDS WORK -- make \"dispatch\" methods tolerant of both 3d and 3dH.\r\n // \"easy\" if both present BezierCurve3dH span loaders\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n this._geometryB, this._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB,\r\n curve, this._extendA, true);\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(this._geometryB, this._extendB, curve, this._extendA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(this._geometryB, this._extendB, curve, this._extendA, true);\r\n }\r\n */\r\n return undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"CurveCurveCloseApproachXY.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveCloseApproachXY.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { BSplineCurve3d, BSplineCurve3dBase } from \"../../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../../bspline/BSplineCurve3dH\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { GrowableFloat64Array } from \"../../geometry3d/GrowableFloat64Array\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../../geometry3d/Range\";\r\nimport { AnalyticRoots, SmallSystem } from \"../../numerics/Polynomials\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveChainWithDistanceIndex } from \"../CurveChainWithDistanceIndex\";\r\nimport { CurveCollection } from \"../CurveCollection\";\r\nimport { CurveIntervalRole, CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { AnyCurve } from \"../CurveTypes\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\n\r\n// cspell:word XYRR\r\n\r\n/**\r\n * Handler class for XY close approach between _geometryB and another geometry.\r\n * * Approach means the XY distance (z is ignored) between _geometryB and another geometry.\r\n * * Closest approach is a measure of the proximity of one curve to another. It's the length of the shortest line\r\n * segment perpendicular to both curves; if the curves intersect, the closest approach is zero. In the context of\r\n * this class, z-coordinates are ignored, so the closest approach is as seen in the top view. If you have coplanar\r\n * input curves and want to find closest approach in their plane, rotate them first into a plane parallel to the\r\n * xy-plane, then afterward, rotate the results back as required.\r\n * * Close approach can also be from a curve endpoint perpendicular to another curve or from a curve endpoint to\r\n * another curve endpoint.\r\n * * Instances are initialized and called from CurveCurve.\r\n * * geometryB is saved for later reference.\r\n * @internal\r\n */\r\nexport class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {\r\n private _geometryB: AnyCurve | undefined;\r\n private _circularArcB: Arc3d | undefined;\r\n private _circularRadiusB: number | undefined;\r\n private setGeometryB(geometryB: AnyCurve | undefined) {\r\n this._geometryB = geometryB;\r\n this._circularArcB = undefined;\r\n this._circularRadiusB = undefined;\r\n if (geometryB instanceof Arc3d) {\r\n const r = geometryB.circularRadiusXY();\r\n if (r !== undefined) {\r\n this._circularRadiusB = r;\r\n this._circularArcB = geometryB;\r\n }\r\n }\r\n }\r\n /**\r\n * Maximum XY distance (z is ignored). Approach larger than this is not interesting.\r\n * This is caller defined and can be undefined.\r\n */\r\n private _maxDistanceToAccept: number | undefined;\r\n /** Squared max distance. This is private, and is forced to at least small metric distance squared. */\r\n private _maxDistanceSquared: number;\r\n /**\r\n * Start and end points of line segments that meet closest approach criteria, i.e., they are perpendicular to\r\n * both curves and their length is smaller than _maxDistanceToAccept.\r\n */\r\n private _results: CurveLocationDetailPair[];\r\n\r\n private static _workPointAA0 = Point3d.create();\r\n private static _workPointAA1 = Point3d.create();\r\n private static _workPointBB0 = Point3d.create();\r\n private static _workPointBB1 = Point3d.create();\r\n private static _workPointB = Point3d.create();\r\n\r\n /**\r\n * Constructor.\r\n * @param geometryB second curve for intersection. Saved for reference by specific handler methods.\r\n */\r\n public constructor(geometryB: AnyCurve | undefined) {\r\n super();\r\n this.setGeometryB(geometryB);\r\n this._maxDistanceSquared = Geometry.smallMetricDistanceSquared;\r\n this._results = [];\r\n }\r\n /** Set the (possibly undefined) max XY distance (z is ignored) to accept. */\r\n public set maxDistanceToAccept(value: number | undefined) {\r\n this._maxDistanceToAccept = value;\r\n if (this._maxDistanceToAccept !== undefined && this._maxDistanceToAccept > 0)\r\n this._maxDistanceSquared = this._maxDistanceToAccept * this._maxDistanceToAccept;\r\n }\r\n /** Access the (possibly undefined) max XY distance (z is ignored) to accept. */\r\n public get maxDistanceToAccept(): number | undefined {\r\n return this._maxDistanceToAccept;\r\n }\r\n /** Ask if the maxDistanceToAccept value is defined and positive */\r\n public get isMaxDistanceSet(): boolean {\r\n return this._maxDistanceToAccept !== undefined && this._maxDistanceToAccept > 0;\r\n }\r\n /** Reset the geometry and flags, leaving all other parts unchanged (and preserving accumulated intersections) */\r\n public resetGeometry(geometryB: AnyCurve) {\r\n this.setGeometryB(geometryB);\r\n }\r\n /** returns true if `fraction` is in [0,1] within tolerance */\r\n private acceptFraction(fraction: number, fractionTol: number = 1.0e-12) {\r\n if (fraction < -fractionTol)\r\n return false;\r\n if (fraction > 1.0 + fractionTol)\r\n return false;\r\n return true;\r\n }\r\n /**\r\n * Return the results structure for the intersection calculation, structured as an array of CurveLocationDetailPair.\r\n * @param reinitialize if true, a new results structure is created for use by later calls.\r\n */\r\n public grabPairedResults(reinitialize: boolean = false): CurveLocationDetailPair[] {\r\n const result = this._results;\r\n if (reinitialize)\r\n this._results = [];\r\n return result;\r\n }\r\n /** Returns `true` if `detail` has same curve and fraction. */\r\n private sameCurveAndFraction(cp: CurvePrimitive, fraction: number, detail: CurveLocationDetail): boolean {\r\n return cp === detail.curve && Geometry.isAlmostEqualNumber(fraction, detail.fraction);\r\n }\r\n /**\r\n * If distance between pointA and pointB is less than maxDistance, record CurveLocationDetailPair which is\r\n * the approach from pointA to pointB.\r\n */\r\n private testAndRecordPointPairApproach(\r\n cpA: CurvePrimitive, fA: number, pointA: Point3d, cpB: CurvePrimitive, fB: number, pointB: Point3d, reversed: boolean,\r\n ): void {\r\n const d2 = pointA.distanceSquaredXY(pointB);\r\n if (d2 < this._maxDistanceSquared) {\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(cpA, fA, pointA);\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(cpB, fB, pointB);\r\n const pair = CurveLocationDetailPair.createCapture(detailA, detailB);\r\n if (reversed)\r\n pair.swapDetails();\r\n this._results.push(pair);\r\n }\r\n }\r\n /**\r\n * Create a close approach pair if XY distance is within maxDistance.\r\n * @param localFractionA a fraction on first curve\r\n * @param cpA the first curve\r\n * @param fractionA0 start of the first curve\r\n * @param fractionA1 end of the first curve\r\n * @param localFractionB a fraction on second curve\r\n * @param cpB the second curve\r\n * @param fractionB0 start of the second curve\r\n * @param fractionB1 end of the second curve\r\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\r\n * @param intervalDetails optional CurveLocationDetailPair\r\n */\r\n private recordPointWithLocalFractions(\r\n localFractionA: number,\r\n cpA: CurvePrimitive,\r\n fractionA0: number,\r\n fractionA1: number,\r\n localFractionB: number,\r\n cpB: CurvePrimitive,\r\n fractionB0: number,\r\n fractionB1: number,\r\n reversed: boolean,\r\n intervalDetails?: undefined | CurveLocationDetailPair,\r\n ): void {\r\n let globalFractionA, globalFractionB;\r\n let globalFractionA1, globalFractionB1;\r\n const isInterval = intervalDetails !== undefined &&\r\n intervalDetails.detailA.hasFraction1 &&\r\n intervalDetails.detailB.hasFraction1;\r\n if (isInterval) {\r\n globalFractionA = Geometry.interpolate(fractionA0, intervalDetails.detailA.fraction, fractionA1);\r\n globalFractionB = Geometry.interpolate(fractionB0, intervalDetails.detailB.fraction, fractionB1);\r\n globalFractionA1 = Geometry.interpolate(fractionA0, intervalDetails.detailA.fraction1!, fractionA1);\r\n globalFractionB1 = Geometry.interpolate(fractionB0, intervalDetails.detailB.fraction1!, fractionB1);\r\n } else {\r\n globalFractionA = globalFractionA1 = Geometry.interpolate(fractionA0, localFractionA, fractionA1);\r\n globalFractionB = globalFractionB1 = Geometry.interpolate(fractionB0, localFractionB, fractionB1);\r\n }\r\n // ignore duplicate of most recent approach\r\n const numPrevious = this._results.length;\r\n if (numPrevious > 0 && !isInterval) {\r\n const oldDetailA = this._results[numPrevious - 1].detailA;\r\n const oldDetailB = this._results[numPrevious - 1].detailB;\r\n if (reversed) {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailB) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailA))\r\n return;\r\n } else {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailA) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailB))\r\n return;\r\n }\r\n }\r\n const detailA = CurveLocationDetail.createCurveFractionPoint(\r\n cpA, globalFractionA, cpA.fractionToPoint(globalFractionA),\r\n );\r\n const detailB = CurveLocationDetail.createCurveFractionPoint(\r\n cpB, globalFractionB, cpB.fractionToPoint(globalFractionB),\r\n );\r\n if (isInterval) {\r\n detailA.captureFraction1Point1(globalFractionA1, cpA.fractionToPoint(globalFractionA1));\r\n detailB.captureFraction1Point1(globalFractionB1, cpB.fractionToPoint(globalFractionB1));\r\n } else {\r\n const d2 = detailA.point.distanceSquaredXY(detailB.point);\r\n if (d2 > this._maxDistanceSquared)\r\n return;\r\n detailA.setIntervalRole(CurveIntervalRole.isolated);\r\n detailB.setIntervalRole(CurveIntervalRole.isolated);\r\n }\r\n if (reversed) {\r\n this._results.push(new CurveLocationDetailPair(detailB, detailA));\r\n } else {\r\n this._results.push(new CurveLocationDetailPair(detailA, detailB));\r\n }\r\n }\r\n /**\r\n * Capture a close approach pair that has point and local fraction but not curve.\r\n * * Record the pair, each detail modified with global fraction and input curve.\r\n * * Pair is neither modified nor recorded if it would be a duplicate of the last recorded pair.\r\n * @param pair details computed with local fractions\r\n * @param cpA curveA\r\n * @param fractionA0 global start fraction on curveA\r\n * @param fractionA1 global end fraction on curveA\r\n * @param cpB curveB\r\n * @param fractionB0 global start fraction on curveB\r\n * @param fractionB1 global end fraction on curveB\r\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\r\n */\r\n private capturePairWithLocalFractions(\r\n pair: CurveLocationDetailPair,\r\n cpA: CurvePrimitive,\r\n fractionA0: number,\r\n fractionA1: number,\r\n cpB: CurvePrimitive,\r\n fractionB0: number,\r\n fractionB1: number,\r\n reversed: boolean,\r\n ) {\r\n const globalFractionA = Geometry.interpolate(fractionA0, pair.detailA.fraction, fractionA1);\r\n const globalFractionB = Geometry.interpolate(fractionB0, pair.detailB.fraction, fractionB1);\r\n // ignore duplicate of most recent pair\r\n const numPrevious = this._results.length;\r\n if (numPrevious > 0) {\r\n const oldDetailA = this._results[numPrevious - 1].detailA;\r\n const oldDetailB = this._results[numPrevious - 1].detailB;\r\n if (reversed) {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailB) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailA))\r\n return;\r\n } else {\r\n if (this.sameCurveAndFraction(cpA, globalFractionA, oldDetailA) &&\r\n this.sameCurveAndFraction(cpB, globalFractionB, oldDetailB))\r\n return;\r\n }\r\n }\r\n // recompute the points just in case\r\n CurveLocationDetail.createCurveEvaluatedFraction(cpA, globalFractionA, pair.detailA);\r\n CurveLocationDetail.createCurveEvaluatedFraction(cpB, globalFractionB, pair.detailB);\r\n pair.detailA.setIntervalRole(CurveIntervalRole.isolated);\r\n pair.detailB.setIntervalRole(CurveIntervalRole.isolated);\r\n if (reversed)\r\n pair.swapDetails();\r\n this._results.push(pair);\r\n }\r\n /**\r\n * Emit recordPoint for multiple pairs (on full curve) if within maxDistance.\r\n * @param cpA first curve primitive (possibly different from curve in detailA, but fraction compatible)\r\n * @param cpB second curve primitive (possibly different from curve in detailA, but fraction compatible)\r\n * @param pairs array of pairs\r\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\r\n */\r\n public recordPairs(\r\n cpA: CurvePrimitive, cpB: CurvePrimitive, pairs: CurveLocationDetailPair[] | undefined, reversed: boolean,\r\n ): void {\r\n if (pairs !== undefined) {\r\n for (const p of pairs) {\r\n this.recordPointWithLocalFractions(\r\n p.detailA.fraction, cpA, 0, 1, p.detailB.fraction, cpB, 0, 1, reversed, p,\r\n );\r\n }\r\n }\r\n }\r\n /**\r\n * Record fully assembled (but possibly reversed) detail pair.\r\n * @param detailA first detail\r\n * @param detailB second detail\r\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\r\n */\r\n public captureDetailPair(\r\n detailA: CurveLocationDetail | undefined, detailB: CurveLocationDetail | undefined, reversed: boolean,\r\n ): void {\r\n if (detailA && detailB) {\r\n if (reversed) {\r\n this._results.push(CurveLocationDetailPair.createCapture(detailB, detailA));\r\n } else {\r\n this._results.push(CurveLocationDetailPair.createCapture(detailA, detailB));\r\n }\r\n }\r\n }\r\n private static updatePointToSegmentDistance(\r\n fractionA: number,\r\n pointA: Point3d,\r\n pointB0: Point3d,\r\n pointB1: Point3d,\r\n fractionB: number,\r\n maxDistanceSquared: number,\r\n closestApproach: CurveLocationDetailPair, // modified on return\r\n ): boolean {\r\n let updated = false;\r\n if (fractionB < 0)\r\n fractionB = 0;\r\n else if (fractionB > 1)\r\n fractionB = 1;\r\n this._workPointB = pointB0.interpolate(fractionB, pointB1, this._workPointB);\r\n const distanceSquared = this._workPointB.distanceSquaredXY(pointA);\r\n if (distanceSquared <= Math.min(maxDistanceSquared, closestApproach.detailA.a)) {\r\n closestApproach.detailA.setFP(fractionA, pointA, undefined, distanceSquared);\r\n closestApproach.detailB.setFP(fractionB, this._workPointB, undefined, distanceSquared);\r\n updated = true;\r\n }\r\n return updated;\r\n }\r\n /**\r\n * Return fractions of close approach within maxDistance between two line segments (a0,a1) and (b0,b1).\r\n * * Math details can be found at core/geometry/internaldocs/Curve.md\r\n * @param a0 start point of line a\r\n * @param a1 end point of line a\r\n * @param b0 start point of line b\r\n * @param b1 end point of line b\r\n * @param maxDistanceSquared maximum distance squared (assumed to be positive)\r\n * @returns the fractional (not xy) coordinates in result.x and result.y. result.x is fraction on line a.\r\n * result.y is fraction on line b.\r\n */\r\n private static segmentSegmentBoundedApproach(\r\n a0: Point3d,\r\n a1: Point3d,\r\n b0: Point3d,\r\n b1: Point3d,\r\n maxDistanceSquared: number,\r\n ): CurveLocationDetailPair | undefined {\r\n const ux = a1.x - a0.x;\r\n const uy = a1.y - a0.y;\r\n const vx = b1.x - b0.x;\r\n const vy = b1.y - b0.y;\r\n const e00x = b0.x - a0.x;\r\n const e00y = b0.y - a0.y;\r\n const e01x = b1.x - a0.x;\r\n const e01y = b1.y - a0.y;\r\n const e10x = b0.x - a1.x;\r\n const e10y = b0.y - a1.y;\r\n const hab0 = Geometry.crossProductXYXY(ux, uy, e00x, e00y);\r\n const hab1 = Geometry.crossProductXYXY(ux, uy, e01x, e01y);\r\n const hba0 = -Geometry.crossProductXYXY(vx, vy, e00x, e00y);\r\n const hba1 = -Geometry.crossProductXYXY(vx, vy, e10x, e10y);\r\n if (hab0 * hab1 < 0.0 && hba0 * hba1 < 0.0) { // true intersection, strictly within both segments\r\n const fractionA = -hba0 / (hba1 - hba0);\r\n const fractionB = -hab0 / (hab1 - hab0);\r\n return CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveFractionPoint(undefined, fractionA, a0.interpolate(fractionA, a1)),\r\n CurveLocationDetail.createCurveFractionPoint(undefined, fractionB, b0.interpolate(fractionB, b1)),\r\n );\r\n }\r\n // there's no intersection, so find the closest approach within maxDistance from an endpoint\r\n const closestApproach = new CurveLocationDetailPair();\r\n closestApproach.detailA.a = 2 * maxDistanceSquared; // init to an approach that's too far away\r\n let reversed = false;\r\n const uu = Geometry.hypotenuseSquaredXY(ux, uy);\r\n if (hab0 * hab0 <= maxDistanceSquared * uu) { // test distance of b0 to u\r\n const fractionA = Geometry.dotProductXYXY(ux, uy, e00x, e00y) / uu;\r\n if (this.updatePointToSegmentDistance(0, b0, a0, a1, fractionA, maxDistanceSquared, closestApproach))\r\n reversed = true;\r\n }\r\n if (hab1 * hab1 <= maxDistanceSquared * uu) { // test distance of b1 to u\r\n const fractionA = Geometry.dotProductXYXY(ux, uy, e01x, e01y) / uu;\r\n if (this.updatePointToSegmentDistance(1, b1, a0, a1, fractionA, maxDistanceSquared, closestApproach))\r\n reversed = true;\r\n }\r\n const vv = Geometry.hypotenuseSquaredXY(vx, vy);\r\n if (hba0 * hba0 <= maxDistanceSquared * vv) { // test distance of a0 to v\r\n const fractionB = -Geometry.dotProductXYXY(vx, vy, e00x, e00y) / vv;\r\n if (this.updatePointToSegmentDistance(0, a0, b0, b1, fractionB, maxDistanceSquared, closestApproach))\r\n reversed = false;\r\n }\r\n if (hba1 * hba1 <= maxDistanceSquared * vv) { // test distance of a1 to v\r\n const fractionB = -Geometry.dotProductXYXY(vx, vy, e10x, e10y) / vv;\r\n if (this.updatePointToSegmentDistance(1, a1, b0, b1, fractionB, maxDistanceSquared, closestApproach))\r\n reversed = false;\r\n }\r\n if (closestApproach.detailA.a > maxDistanceSquared)\r\n return undefined;\r\n if (reversed)\r\n closestApproach.swapDetails();\r\n return closestApproach;\r\n }\r\n /**\r\n * Check different combination of fractions on curveA and curveB. If distance between points at 2 fractions\r\n * is less than maxDistance, record CurveLocationDetailPair which is the approach between the 2 points.\r\n * Optionally, record close approaches of one curve's points if they fall between the other curve's points.\r\n * @param cpA curveA\r\n * @param fA0 fraction0 on curveA\r\n * @param fA1 fraction1 on curveA\r\n * @param testProjectionOnA whether to record projections of the given curveB points onto curveA\r\n * @param cpB curveB\r\n * @param fB0 fraction0 on curveB\r\n * @param fB1 fraction0 on curveB\r\n * @param testProjectionOnB whether to record projections of the given curveA points onto curveB\r\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\r\n */\r\n private testAndRecordFractionalPairApproach(\r\n cpA: CurvePrimitive,\r\n fA0: number,\r\n fA1: number,\r\n testProjectionOnA: boolean,\r\n cpB: CurvePrimitive,\r\n fB0: number,\r\n fB1: number,\r\n testProjectionOnB: boolean,\r\n reversed: boolean,\r\n ): void {\r\n const pointA0 = cpA.fractionToPoint(fA0);\r\n const pointA1 = cpA.fractionToPoint(fA1);\r\n const pointB0 = cpB.fractionToPoint(fB0);\r\n const pointB1 = cpB.fractionToPoint(fB1);\r\n this.testAndRecordPointPairApproach(cpA, fA0, pointA0, cpB, fB0, pointB0, reversed);\r\n this.testAndRecordPointPairApproach(cpA, fA1, pointA1, cpB, fB0, pointB0, reversed);\r\n this.testAndRecordPointPairApproach(cpA, fA0, pointA0, cpB, fB1, pointB1, reversed);\r\n this.testAndRecordPointPairApproach(cpA, fA1, pointA1, cpB, fB1, pointB1, reversed);\r\n if (testProjectionOnB) {\r\n this.testAndRecordProjection(cpA, fA0, pointA0, cpB, fB0, fB1, reversed);\r\n this.testAndRecordProjection(cpA, fA1, pointA1, cpB, fB0, fB1, reversed);\r\n }\r\n if (testProjectionOnA) {\r\n this.testAndRecordProjection(cpB, fB0, pointB0, cpA, fA0, fA1, !reversed);\r\n this.testAndRecordProjection(cpB, fB1, pointB1, cpA, fA0, fA1, !reversed);\r\n }\r\n }\r\n /** Find the closest approach between pointA and cpB. Add the approach if it's within fB0 and fB1. */\r\n private testAndRecordProjection(\r\n cpA: CurvePrimitive, fA: number, pointA: Point3d, cpB: CurvePrimitive, fB0: number, fB1: number, reversed: boolean,\r\n ) {\r\n // NO NO NO -- this is 3D closest point --- need 2d !!\r\n const detail = cpB.closestPoint(pointA, false);\r\n if (detail) {\r\n const fB = Geometry.restrictToInterval(detail.fraction, fB0, fB1);\r\n if (fB === detail.fraction) { // if fraction is within fB0 and fB1\r\n this.testAndRecordPointPairApproach(cpA, fA, pointA, cpB, detail.fraction, detail.point, reversed);\r\n }\r\n }\r\n }\r\n /**\r\n * Compute intersection of two line segments.\r\n * Filter by extension rules.\r\n * Record with fraction mapping.\r\n * * The fraction mappings allow portions of a linestring to be passed here.\r\n */\r\n private computeSegmentSegment3D(\r\n cpA: CurvePrimitive,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n cpB: CurvePrimitive,\r\n pointB0: Point3d,\r\n fractionB0: number,\r\n pointB1: Point3d,\r\n fractionB1: number,\r\n reversed: boolean,\r\n ): void {\r\n // compute a pair with fractions local to segments\r\n const approach = CurveCurveCloseApproachXY.segmentSegmentBoundedApproach(\r\n pointA0, pointA1, pointB0, pointB1, this._maxDistanceSquared,\r\n );\r\n // adjust the pair to refer to input curves and global fractions, then record it if new\r\n if (approach) {\r\n approach.detailA.setCurve(cpA);\r\n approach.detailB.setCurve(cpB);\r\n this.capturePairWithLocalFractions(approach, cpA, fractionA0, fractionA1, cpB, fractionB0, fractionB1, reversed);\r\n }\r\n }\r\n /** Low level dispatch of segment with segment. */\r\n private dispatchSegmentSegment(\r\n cpA: CurvePrimitive,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n cpB: CurvePrimitive,\r\n pointB0: Point3d,\r\n fractionB0: number,\r\n pointB1: Point3d,\r\n fractionB1: number,\r\n reversed: boolean,\r\n ): void {\r\n this.computeSegmentSegment3D(\r\n cpA, pointA0, fractionA0, pointA1, fractionA1,\r\n cpB, pointB0, fractionB0, pointB1, fractionB1,\r\n reversed,\r\n );\r\n }\r\n /**\r\n * Low level dispatch of segment with arc.\r\n * Find close approaches within maxDistance between a line segments (pointA0, pointA1) and an arc.\r\n * To consider:\r\n * 1) intersection between arc and segment.\r\n * 2) arc endpoints to segment endpoints or arc endpoints projection to the segment.\r\n * 3) line parallel to arc tangent.\r\n * @param cpA curve A (line segment or line string)\r\n * @param pointA0 start point of the segment\r\n * @param fractionA0 fraction of the start of the segment\r\n * @param pointA1 end point of the segment\r\n * @param fractionA1 fraction of the end of the segment\r\n * @param arc the arc\r\n * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).\r\n */\r\n private dispatchSegmentArc(\r\n cpA: CurvePrimitive,\r\n pointA0: Point3d,\r\n fractionA0: number,\r\n pointA1: Point3d,\r\n fractionA1: number,\r\n arc: Arc3d,\r\n reversed: boolean,\r\n ): void {\r\n // 1) intersection between arc and segment\r\n // Suppose:\r\n // Arc: X = C + cU + sV where c = cos(theta) and s = sin(theta)\r\n // Line: contains points A0 and A1\r\n // The arc intersects the line at point X if det(A0, A1, X) = 0 with homogeneous xyw points and vectors.\r\n // With equational X: det(A0, A1, C) + c*det(A0, A1, U) + s*det(A0, A1, V) = 0.\r\n // solve for theta.\r\n // evaluate points.\r\n // project back to line.\r\n let intersectionFound = false;\r\n const data = arc.toTransformedVectors();\r\n const pointA0Local = pointA0;\r\n const pointA1Local = pointA1;\r\n const alpha = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.center, 1); // det(A0, A1, C)\r\n const beta = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector0, 0); // det(A0, A1, U)\r\n const gamma = Geometry.tripleProductXYW(pointA0Local, 1, pointA1Local, 1, data.vector90, 0); // det(A0, A1, V)\r\n const cosines = new GrowableFloat64Array(2);\r\n const sines = new GrowableFloat64Array(2);\r\n const radians = new GrowableFloat64Array(2);\r\n const numRoots = AnalyticRoots.appendImplicitLineUnitCircleIntersections( // solve the equation\r\n alpha, beta, gamma, cosines, sines, radians,\r\n );\r\n for (let i = 0; i < numRoots; i++) {\r\n const arcPoint = data.center.plus2Scaled(\r\n data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i),\r\n );\r\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians.atUncheckedIndex(i));\r\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);\r\n // only add if the point is within the start and end fractions of both line segment and arc\r\n if (lineFraction !== undefined && this.acceptFraction(lineFraction) && this.acceptFraction(arcFraction)) {\r\n this.recordPointWithLocalFractions(\r\n lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed,\r\n );\r\n intersectionFound = true;\r\n }\r\n }\r\n if (intersectionFound)\r\n return;\r\n // 2) endpoints to endpoints or endpoints projection to the other curve\r\n this.testAndRecordFractionalPairApproach(cpA, fractionA0, fractionA1, true, arc, 0, 1, false, reversed);\r\n // 3) line parallel to arc tangent.\r\n // If line does not intersect the arc, then the closest (and/or the furthest) point on arc to the line is a\r\n // point where the tangent line on arc at that point is parallel to the line.\r\n const dotUT = data.vector0.crossProductStartEndXY(pointA0, pointA1);\r\n const dotVT = data.vector90.crossProductStartEndXY(pointA0, pointA1);\r\n const parallelRadians = Math.atan2(dotVT, dotUT);\r\n for (const radians1 of [parallelRadians, parallelRadians + Math.PI]) {\r\n const arcPoint = data.center.plus2Scaled(data.vector0, Math.cos(radians1), data.vector90, Math.sin(radians1));\r\n const arcFraction = data.sweep.radiansToSignedPeriodicFraction(radians1);\r\n const lineFraction = SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);\r\n // only add if the point is within the start and end fractions of both line segment and arc\r\n if (lineFraction !== undefined && this.acceptFraction(lineFraction) && this.acceptFraction(arcFraction)) {\r\n this.recordPointWithLocalFractions(\r\n lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed,\r\n );\r\n }\r\n }\r\n }\r\n /** Low level dispatch of circular arc with circular arc. radiusA must be larger than or equal to radiusB. */\r\n private dispatchCircularCircularOrdered(\r\n cpA: Arc3d, radiusA: number, cpB: Arc3d, radiusB: number, reversed: boolean,\r\n ): void {\r\n const c = cpA.center.distance(cpB.center);\r\n const e = this._maxDistanceToAccept !== undefined ? this._maxDistanceToAccept : Geometry.smallMetricDistance;\r\n if (c > radiusA + radiusB + e) // distance between circles is more than max distance\r\n return;\r\n // TODO: 1) intersection between arcs\r\n // 2) endpoints to endpoints\r\n this.testAndRecordFractionalPairApproach(cpA, 0, 1, false, cpB, 0, 1, false, reversed);\r\n // 3) line from one arc to another (perpendicular to arc tangents along center-center line)\r\n if (!Geometry.isSmallMetricDistance(c)) {\r\n const vectorAB = Vector3d.createStartEnd(cpA.center, cpB.center);\r\n vectorAB.scaleInPlace(1.0 / c);\r\n for (const rA of [-radiusA, radiusA]) {\r\n for (const rB of [-radiusB, radiusB]) {\r\n const tangentDistance = c - rA + rB;\r\n if (tangentDistance < e) {\r\n const detailA = this.resolveDirectionToArcXYFraction(cpA, vectorAB, rA);\r\n if (detailA) {\r\n const detailB = this.resolveDirectionToArcXYFraction(cpB, vectorAB, rB);\r\n if (detailB)\r\n this.captureDetailPair(detailA, detailB, reversed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** Find the fractional point (if any) on the circular `arc` in the direction of `radialVector`. */\r\n private resolveDirectionToArcXYFraction(\r\n arc: Arc3d, radialVector: Vector3d, scale: number,\r\n ): CurveLocationDetail | undefined {\r\n // The scale ultimately only affects the direction --- easiest way to use it is two multiplies.\r\n const c = scale * arc.matrixRef.columnDotXYZ(0, radialVector.x, radialVector.y, 0);\r\n const s = scale * arc.matrixRef.columnDotXYZ(1, radialVector.x, radialVector.y, 0);\r\n const radians = Math.atan2(s, c);\r\n const fraction = arc.sweep.radiansToPositivePeriodicFraction(radians, 0);\r\n if (fraction < 1.0)\r\n return CurveLocationDetail.createCurveEvaluatedFraction(arc, fraction);\r\n return undefined;\r\n }\r\n /** Low level dispatch of arc with arc. Only circular arcs are supported. */\r\n private dispatchArcArc(cpA: Arc3d, cpB: Arc3d, reversed: boolean): void {\r\n const rangeA = cpA.range();\r\n const rangeB = cpB.range();\r\n rangeA.expandInPlace(this._maxDistanceToAccept!);\r\n if (!rangeB.intersectsRangeXY(rangeA))\r\n return;\r\n if (this._circularArcB) {\r\n const radiusB = this._circularRadiusB!;\r\n const radiusA = cpA.circularRadiusXY();\r\n if (radiusA !== undefined) {\r\n if (radiusA >= radiusB)\r\n this.dispatchCircularCircularOrdered(cpA, radiusA, cpB, radiusB, reversed);\r\n else\r\n this.dispatchCircularCircularOrdered(cpB, radiusB, cpA, radiusA, !reversed);\r\n return;\r\n }\r\n }\r\n }\r\n /** Low level dispatch of arc with (beziers of) a bspline curve */\r\n private dispatchArcBsplineCurve3d(cpA: Arc3d, cpB: BSplineCurve3d, reversed: boolean): void {\r\n const ls = LineString3d.create();\r\n cpB.emitStrokes(ls);\r\n this.computeArcLineString(cpA, ls, reversed);\r\n }\r\n /** Low level dispatch of (beziers of) a bspline curve with (beziers of) a bspline curve */\r\n private dispatchBSplineCurve3dBSplineCurve3d(\r\n bcurveA: BSplineCurve3dBase, bcurveB: BSplineCurve3dBase, reversed: boolean,\r\n ): void {\r\n const lsA = LineString3d.create();\r\n bcurveA.emitStrokes(lsA);\r\n const lsB = LineString3d.create();\r\n bcurveB.emitStrokes(lsB);\r\n this.computeLineStringLineString(lsA, lsB, reversed);\r\n }\r\n /** Low level dispatch of linestring with (beziers of) a bspline curve */\r\n public dispatchLineStringBSplineCurve(lsA: LineString3d, curveB: BSplineCurve3d, reversed: boolean): any {\r\n const lsB = LineString3d.create();\r\n curveB.emitStrokes(lsB);\r\n this.computeLineStringLineString(lsA, lsB, reversed);\r\n }\r\n /** Low level dispatch of segment with (beziers of) a bspline curve */\r\n public dispatchSegmentBsplineCurve(segA: LineSegment3d, curveB: BSplineCurve3d, reversed: boolean): any {\r\n const lsB = LineString3d.create();\r\n curveB.emitStrokes(lsB);\r\n this.computeSegmentLineString(segA, lsB, reversed);\r\n }\r\n /** Detail computation for segment approaching linestring. */\r\n public computeSegmentLineString(segA: LineSegment3d, lsB: LineString3d, reversed: boolean): void {\r\n const numB = lsB.numPoints();\r\n const deltaFracB = Geometry.safeDivideFraction(1, numB - 1, 0);\r\n const pointA0 = segA.point0Ref;\r\n const pointA1 = segA.point1Ref;\r\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\r\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\r\n for (let i = 0; i < numB - 1; ++i) {\r\n const fB0 = i * deltaFracB; // global linestring fractions\r\n const fB1 = (i + 1 === numB - 1) ? 1.0 : (i + 1) * deltaFracB; // make sure we nail the end fraction\r\n lsB.packedPoints.getPoint3dAtUncheckedPointIndex(i, pointB0);\r\n lsB.packedPoints.getPoint3dAtUncheckedPointIndex(i + 1, pointB1);\r\n this.dispatchSegmentSegment(segA, pointA0, 0.0, pointA1, 1.0, lsB, pointB0, fB0, pointB1, fB1, reversed);\r\n }\r\n }\r\n /** Detail computation for arc approaching linestring. */\r\n public computeArcLineString(arcA: Arc3d, lsB: LineString3d, reversed: boolean): any {\r\n const rangeA = arcA.range();\r\n const rangeB = lsB.range();\r\n rangeA.expandInPlace(this._maxDistanceToAccept!);\r\n if (!rangeB.intersectsRangeXY(rangeA))\r\n return;\r\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\r\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\r\n const numB = lsB.numPoints();\r\n if (numB > 1) {\r\n const dfB = 1.0 / (numB - 1);\r\n let fB0;\r\n let fB1;\r\n fB0 = 0.0;\r\n lsB.pointAt(0, pointB0);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1) {\r\n lsB.pointAt(ib, pointB1);\r\n fB1 = ib * dfB;\r\n this.dispatchSegmentArc(lsB, pointB0, fB0, pointB1, fB1, arcA, !reversed);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Low level dispatch of curve collection. */\r\n private dispatchCurveCollection(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\r\n const geomB = this._geometryB; // save\r\n if (!geomB || !geomB.children || !(geomB instanceof CurveCollection))\r\n return;\r\n for (const child of geomB.children as AnyCurve[]) {\r\n this.resetGeometry(child);\r\n geomAHandler(geomA);\r\n }\r\n this._geometryB = geomB; // restore\r\n }\r\n /**\r\n * Given a parent chain, convert the corresponding child details so that they refer to the chain's global parameterization.\r\n * * It is assumed that `this._results[i].detailA.curve` is a child of chainA, and similarly for detailB/chainB.\r\n * @param chainA convert each detailA to the global parameterization of chainA\r\n * @param chainB convert each detailB to the global parameterization of chainB\r\n */\r\n private convertChildDetailToChainDetail(chainA?: CurveChainWithDistanceIndex, chainB?: CurveChainWithDistanceIndex): void {\r\n for (const childDetailPair of this._results) {\r\n if (chainA) {\r\n const chainDetail = chainA.computeChainDetail(childDetailPair.detailA);\r\n if (chainDetail)\r\n childDetailPair.detailA = chainDetail;\r\n }\r\n if (chainB) {\r\n const chainDetail = chainB.computeChainDetail(childDetailPair.detailB);\r\n if (chainDetail)\r\n childDetailPair.detailB = chainDetail;\r\n }\r\n }\r\n }\r\n /** Low level dispatch to geomA given a CurveChainWithDistanceIndex in geometryB. */\r\n private dispatchCurveChainWithDistanceIndex(geomA: AnyCurve, geomAHandler: (geomA: any) => any): void {\r\n if (!this._geometryB || !(this._geometryB instanceof CurveChainWithDistanceIndex))\r\n return;\r\n const geomB = this._geometryB; // save\r\n for (const child of geomB.path.children) {\r\n this.resetGeometry(child);\r\n geomAHandler(geomA);\r\n }\r\n this.resetGeometry(geomB); // restore\r\n assert(!(geomA instanceof CurveChainWithDistanceIndex));\r\n this.convertChildDetailToChainDetail(undefined, geomB);\r\n }\r\n /** Double dispatch handler for strongly typed segment. */\r\n public override handleLineSegment3d(segmentA: LineSegment3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n const segmentB = this._geometryB;\r\n this.dispatchSegmentSegment(\r\n segmentA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0,\r\n segmentB, segmentB.point0Ref, 0.0, segmentB.point1Ref, 1.0,\r\n false,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeSegmentLineString(segmentA, this._geometryB, false);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchSegmentArc(segmentA, segmentA.point0Ref, 0.0, segmentA.point1Ref, 1.0, this._geometryB, false);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchSegmentBsplineCurve(segmentA, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(segmentA, this.handleLineSegment3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(segmentA, this.handleLineSegment3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Set bits for comparison to range xy\r\n * * bit 0x01 => x smaller than range.low.x\r\n * * bit 0x02 => x larger than range.high.x\r\n * * bit 0x04 => y smaller than range.low.y\r\n * * bit 0x08 => y larger than range.high.y\r\n * * If we divide XY plane into 9 areas using the range, the function returns 0 for points\r\n * inside the range. Below is other binary numbers returned by the function for all 9 areas:\r\n * 1001 | 1000 | 1010\r\n * ------------------\r\n * 1 | 0 | 10\r\n * ------------------\r\n * 101 | 100 | 110\r\n * @param xy point to test\r\n * @param range range for comparison\r\n */\r\n private classifyBitsPointRangeXY(x: number, y: number, range: Range3d): number {\r\n let result = 0;\r\n if (x < range.low.x)\r\n result = 0x01;\r\n else if (x > range.high.x)\r\n result = 0x02;\r\n // note the OR operation\r\n if (y < range.low.y)\r\n result |= 0x04;\r\n else if (y > range.high.y)\r\n result |= 0x08;\r\n return result;\r\n }\r\n /** Low level dispatch of line string with line string. */\r\n private computeLineStringLineString(lsA: LineString3d, lsB: LineString3d, reversed: boolean): void {\r\n const rangeA = lsA.range();\r\n const rangeB = lsB.range();\r\n rangeA.expandInPlace(this._maxDistanceToAccept!);\r\n if (!rangeB.intersectsRangeXY(rangeA))\r\n return;\r\n let bitB0: number;\r\n let bitB1: number;\r\n const rangeA1 = Range3d.createNull();\r\n const pointA0 = CurveCurveCloseApproachXY._workPointAA0;\r\n const pointA1 = CurveCurveCloseApproachXY._workPointAA1;\r\n const pointB0 = CurveCurveCloseApproachXY._workPointBB0;\r\n const pointB1 = CurveCurveCloseApproachXY._workPointBB1;\r\n const numA = lsA.numPoints();\r\n const numB = lsB.numPoints();\r\n if (numA > 1 && numB > 1) {\r\n const dfA = 1.0 / (numA - 1);\r\n const dfB = 1.0 / (numB - 1);\r\n let fA0 = 0.0;\r\n let fA1, fB0, fB1;\r\n lsA.pointAt(0, pointA0);\r\n for (let ia = 1; ia < numA; ia++, pointA0.setFrom(pointA1), fA0 = fA1) {\r\n fA1 = ia * dfA;\r\n fB0 = 0.0;\r\n lsA.pointAt(ia, pointA1);\r\n // rangeA1 is around line segment [A0,A1] expanded by max distance\r\n rangeA1.setNull();\r\n rangeA1.extendPoint(pointA0);\r\n rangeA1.extendPoint(pointA1);\r\n rangeA1.expandInPlace(this._maxDistanceToAccept!);\r\n if (rangeA1.intersectsRangeXY(rangeB)) {\r\n lsB.pointAt(0, pointB0);\r\n bitB0 = this.classifyBitsPointRangeXY(pointB0.x, pointB0.y, rangeA1);\r\n for (let ib = 1; ib < numB; ib++, pointB0.setFrom(pointB1), fB0 = fB1, bitB0 = bitB1) {\r\n lsB.pointAt(ib, pointB1);\r\n bitB1 = this.classifyBitsPointRangeXY(pointB1.x, pointB1.y, rangeA1);\r\n fB1 = ib * dfB;\r\n // DO NOT study the segment in detail if both bitB bits are on for any of the 4 planes\r\n // (i.e., no intersection between rangeA1 and the range around line segment [B0,B1])\r\n if ((bitB0 & bitB1) === 0)\r\n this.dispatchSegmentSegment(lsA, pointA0, fA0, pointA1, fA1, lsB, pointB0, fB0, pointB1, fB1, reversed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** Double dispatch handler for strongly typed linestring. */\r\n public override handleLineString3d(lsA: LineString3d): any {\r\n if (this._geometryB instanceof LineString3d) {\r\n const lsB = this._geometryB;\r\n this.computeLineStringLineString(lsA, lsB, false);\r\n } else if (this._geometryB instanceof LineSegment3d) {\r\n this.computeSegmentLineString(this._geometryB, lsA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.computeArcLineString(this._geometryB, lsA, true);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchLineStringBSplineCurve(lsA, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(lsA, this.handleLineString3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(lsA, this.handleLineString3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed arc. */\r\n public override handleArc3d(arc0: Arc3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentArc(\r\n this._geometryB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, arc0, true,\r\n );\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.computeArcLineString(arc0, this._geometryB, false);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcArc(arc0, this._geometryB, false);\r\n } else if (this._geometryB instanceof BSplineCurve3d) {\r\n this.dispatchArcBsplineCurve3d(arc0, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(arc0, this.handleArc3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(arc0, this.handleArc3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed bspline curve. */\r\n public override handleBSplineCurve3d(curve: BSplineCurve3d): any {\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentBsplineCurve(this._geometryB, curve, true);\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(this._geometryB, curve, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(this._geometryB, curve, true);\r\n } else if (this._geometryB instanceof BSplineCurve3dBase) {\r\n this.dispatchBSplineCurve3dBSplineCurve3d(curve, this._geometryB, false);\r\n } else if (this._geometryB instanceof CurveCollection) {\r\n this.dispatchCurveCollection(curve, this.handleBSplineCurve3d.bind(this));\r\n } else if (this._geometryB instanceof CurveChainWithDistanceIndex) {\r\n this.dispatchCurveChainWithDistanceIndex(curve, this.handleBSplineCurve3d.bind(this));\r\n }\r\n return undefined;\r\n }\r\n /** Double dispatch handler for strongly typed CurveChainWithDistanceIndex. */\r\n public override handleCurveChainWithDistanceIndex(chain: CurveChainWithDistanceIndex): any {\r\n super.handleCurveChainWithDistanceIndex(chain);\r\n this.convertChildDetailToChainDetail(chain, this._geometryB instanceof CurveChainWithDistanceIndex ? this._geometryB : undefined);\r\n }\r\n /** Double dispatch handler for strongly typed homogeneous bspline curve .. */\r\n public override handleBSplineCurve3dH(_curve: BSplineCurve3dH): any {\r\n /*\r\n //NEEDS WORK -- make \"dispatch\" methods tolerant of both 3d and 3dH.\r\n // \"easy\" if both present BezierCurve3dH span loaders\r\n if (this._geometryB instanceof LineSegment3d) {\r\n this.dispatchSegmentBsplineCurve(\r\n this._geometryB, this._extendB, this._geometryB.point0Ref, 0.0, this._geometryB.point1Ref, 1.0, this._extendB,\r\n curve, this._extendA, true);\r\n } else if (this._geometryB instanceof LineString3d) {\r\n this.dispatchLineStringBSplineCurve(this._geometryB, this._extendB, curve, this._extendA, true);\r\n } else if (this._geometryB instanceof Arc3d) {\r\n this.dispatchArcBsplineCurve3d(this._geometryB, this._extendB, curve, this._extendA, true);\r\n }\r\n */\r\n return undefined;\r\n }\r\n}\r\n"]}
@@ -1,10 +1,10 @@
1
1
  /** @packageDocumentation
2
2
  * @module Curve
3
3
  */
4
+ import { BSplineCurve3d } from "../../bspline/BSplineCurve";
5
+ import { IStrokeHandler } from "../../geometry3d/GeometryHandler";
4
6
  import { Point3d, Vector3d } from "../../geometry3d/Point3dVector3d";
5
7
  import { CurvePrimitive } from "../CurvePrimitive";
6
- import { IStrokeHandler } from "../../geometry3d/GeometryHandler";
7
- import { BSplineCurve3d } from "../../bspline/BSplineCurve";
8
8
  /**
9
9
  * Context for constructing the xy-offset of a CurvePrimitive by interpolating the xy-offsets of computed strokes.
10
10
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"CurveOffsetXYHandler.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveOffsetXYHandler.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D;;;GAGG;AACF,qBAAa,oBAAqB,YAAW,cAAc;IAC1D,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAA8B;IAGjD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,GAAG,CAAyB;IACpC,OAAO,CAAC,GAAG,CAAyB;IACpC,OAAO,CAAC,GAAG,CAAsB;gBAEd,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM;IAU7D,OAAO,CAAC,eAAe;IAIhB,6BAA6B;IAC7B,yBAAyB,CAAC,GAAG,EAAE,cAAc;IAC7C,mBAAmB,CAAC,GAAG,EAAE,cAAc;IACvC,iBAAiB,CAAC,GAAG,EAAE,cAAc;IACrC,uBAAuB,CAAC,GAAG,EAAE,cAAc;IAC3C,qCAAqC,CAAC,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAOzH,uBAAuB,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAQhJ,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAGrF;;;OAGG;IACI,WAAW,IAAI,cAAc,GAAG,SAAS;CAGjD"}
1
+ {"version":3,"file":"CurveOffsetXYHandler.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveOffsetXYHandler.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAA8B;IAGjD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,GAAG,CAAyB;IACpC,OAAO,CAAC,GAAG,CAAyB;IACpC,OAAO,CAAC,GAAG,CAAsB;gBAEd,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM;IAY7D,OAAO,CAAC,eAAe;IAIhB,6BAA6B;IAG7B,yBAAyB,CAAC,GAAG,EAAE,cAAc;IAC7C,mBAAmB,CAAC,GAAG,EAAE,cAAc;IACvC,iBAAiB,CAAC,GAAG,EAAE,cAAc;IACrC,uBAAuB,CAAC,GAAG,EAAE,cAAc;IAC3C,qCAAqC,CAC1C,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAC3E,IAAI;IAQA,uBAAuB,CAC5B,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAChH,IAAI;IASA,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAGrF;;;OAGG;IACI,WAAW,IAAI,cAAc,GAAG,SAAS;CAGjD"}
@@ -5,11 +5,11 @@
5
5
  /** @packageDocumentation
6
6
  * @module Curve
7
7
  */
8
+ import { BSplineCurveOps } from "../../bspline/BSplineCurveOps";
9
+ import { InterpolationCurve3dOptions } from "../../bspline/InterpolationCurve3d";
8
10
  import { Geometry } from "../../Geometry";
9
11
  import { Point3d, Vector3d } from "../../geometry3d/Point3dVector3d";
10
12
  import { Ray3d } from "../../geometry3d/Ray3d";
11
- import { InterpolationCurve3dOptions } from "../../bspline/InterpolationCurve3d";
12
- import { BSplineCurveOps } from "../../bspline/BSplineCurveOps";
13
13
  /**
14
14
  * Context for constructing the xy-offset of a CurvePrimitive by interpolating the xy-offsets of computed strokes.
15
15
  * @internal
@@ -35,13 +35,16 @@ export class CurveOffsetXYHandler {
35
35
  if (!Geometry.isSmallMetricDistance(tangent.x) || !Geometry.isSmallMetricDistance(tangent.y))
36
36
  this._fitOptions.fitPoints.push(xyz.plusScaled(tangent.unitPerpendicularXY(this._v0), this._offsetDistance));
37
37
  }
38
- needPrimaryGeometryForStrokes() { return true; }
38
+ needPrimaryGeometryForStrokes() {
39
+ return true;
40
+ }
39
41
  startParentCurvePrimitive(_cp) { }
40
42
  startCurvePrimitive(_cp) { }
41
43
  endCurvePrimitive(_cp) { }
42
44
  endParentCurvePrimitive(_cp) { }
43
45
  announceIntervalForUniformStepStrokes(cp, numStrokes, fraction0, fraction1) {
44
- for (let i = 0; i <= numStrokes; ++i) { // announce both start and end; adjacent duplicates will be filtered by c2 cubic fit logic
46
+ // announce both start and end; adjacent duplicates will be filtered by c2 cubic fit logic
47
+ for (let i = 0; i <= numStrokes; ++i) {
45
48
  const fraction = Geometry.interpolate(fraction0, i / numStrokes, fraction1);
46
49
  const ray = cp.fractionToPointAndDerivative(fraction, this._r0);
47
50
  this.pushOffsetPoint(ray.origin, ray.direction);
@@ -50,7 +53,8 @@ export class CurveOffsetXYHandler {
50
53
  announceSegmentInterval(_cp, point0, point1, numStrokes, _fraction0, _fraction1) {
51
54
  if (numStrokes > 0) {
52
55
  const tangent = Vector3d.createStartEnd(point0, point1, this._v1);
53
- for (let i = 0; i <= numStrokes; ++i) { // announce both start and end; adjacent duplicates will be filtered by c2 cubic fit logic
56
+ // announce both start and end; adjacent duplicates will be filtered by c2 cubic fit logic
57
+ for (let i = 0; i <= numStrokes; ++i) {
54
58
  this.pushOffsetPoint(point0.interpolate(i / numStrokes, point1, this._p0), tangent);
55
59
  }
56
60
  }