@itwin/core-geometry 5.0.0-dev.99 → 5.0.0

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 (444) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/lib/cjs/Geometry.d.ts +15 -4
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +17 -3
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/BSpline1dNd.d.ts +1 -1
  7. package/lib/cjs/bspline/BSpline1dNd.js +1 -1
  8. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineSurface.d.ts +4 -3
  10. package/lib/cjs/bspline/BSplineSurface.d.ts.map +1 -1
  11. package/lib/cjs/bspline/BSplineSurface.js +6 -5
  12. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  13. package/lib/cjs/clipping/ClipPlane.d.ts +7 -5
  14. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  15. package/lib/cjs/clipping/ClipPlane.js +9 -5
  16. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  17. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  18. package/lib/cjs/clipping/ClipUtils.js +5 -3
  19. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  20. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  21. package/lib/cjs/clipping/ConvexClipPlaneSet.js +12 -23
  22. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  23. package/lib/cjs/core-geometry.d.ts +1 -0
  24. package/lib/cjs/core-geometry.d.ts.map +1 -1
  25. package/lib/cjs/core-geometry.js +1 -0
  26. package/lib/cjs/core-geometry.js.map +1 -1
  27. package/lib/cjs/curve/Arc3d.d.ts +56 -32
  28. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  29. package/lib/cjs/curve/Arc3d.js +91 -36
  30. package/lib/cjs/curve/Arc3d.js.map +1 -1
  31. package/lib/cjs/curve/CurveCollection.d.ts +2 -0
  32. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  33. package/lib/cjs/curve/CurveCollection.js +14 -0
  34. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  35. package/lib/cjs/curve/CurveExtendMode.d.ts +13 -5
  36. package/lib/cjs/curve/CurveExtendMode.d.ts.map +1 -1
  37. package/lib/cjs/curve/CurveExtendMode.js +19 -15
  38. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  39. package/lib/cjs/curve/CurveLocationDetail.d.ts +1 -1
  40. package/lib/cjs/curve/CurveLocationDetail.js +1 -1
  41. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  42. package/lib/cjs/curve/CurvePrimitive.d.ts +67 -8
  43. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  44. package/lib/cjs/curve/CurvePrimitive.js +59 -6
  45. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  46. package/lib/cjs/curve/CurveTypes.d.ts +1 -1
  47. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  48. package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
  49. package/lib/cjs/curve/LineSegment3d.js +1 -0
  50. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  51. package/lib/cjs/curve/LineString3d.d.ts +8 -7
  52. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  53. package/lib/cjs/curve/LineString3d.js +25 -22
  54. package/lib/cjs/curve/LineString3d.js.map +1 -1
  55. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  56. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +10 -5
  57. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  58. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  59. package/lib/cjs/curve/Query/PlanarSubdivision.js +7 -2
  60. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  61. package/lib/cjs/curve/RegionMomentsXY.d.ts +15 -21
  62. package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
  63. package/lib/cjs/curve/RegionMomentsXY.js +38 -58
  64. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  65. package/lib/cjs/curve/RegionOps.d.ts +70 -38
  66. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  67. package/lib/cjs/curve/RegionOps.js +115 -45
  68. package/lib/cjs/curve/RegionOps.js.map +1 -1
  69. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +12 -13
  70. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  71. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +23 -23
  72. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  73. package/lib/cjs/curve/StrokeOptions.d.ts +1 -1
  74. package/lib/cjs/curve/StrokeOptions.js +1 -1
  75. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  76. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts +71 -0
  77. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -0
  78. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js +181 -0
  79. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -0
  80. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +21 -5
  81. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  82. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +42 -17
  83. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  84. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  85. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +36 -12
  86. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  87. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +5 -3
  88. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +1 -1
  89. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js +5 -3
  90. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  91. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.d.ts +14 -0
  92. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.d.ts.map +1 -0
  93. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js +34 -0
  94. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -0
  95. package/lib/cjs/geometry3d/AngleSweep.d.ts +25 -18
  96. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  97. package/lib/cjs/geometry3d/AngleSweep.js +39 -25
  98. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  99. package/lib/cjs/geometry3d/GeometryHandler.d.ts +15 -16
  100. package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
  101. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  102. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
  103. package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
  104. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  105. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +7 -2
  106. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  107. package/lib/cjs/geometry3d/GrowableXYZArray.js +20 -2
  108. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  109. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +2 -1
  110. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  111. package/lib/cjs/geometry3d/IndexedXYZCollection.js +7 -3
  112. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  113. package/lib/cjs/geometry3d/Matrix3d.d.ts +10 -11
  114. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  115. package/lib/cjs/geometry3d/Matrix3d.js +11 -12
  116. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  117. package/lib/cjs/geometry3d/Plane3d.d.ts +2 -0
  118. package/lib/cjs/geometry3d/Plane3d.d.ts.map +1 -1
  119. package/lib/cjs/geometry3d/Plane3d.js +6 -1
  120. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  121. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  122. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  123. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  124. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  125. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  126. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  127. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  128. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  129. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +4 -4
  130. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  131. package/lib/cjs/geometry3d/Point3dVector3d.js +6 -6
  132. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  133. package/lib/cjs/geometry3d/PointHelpers.d.ts +7 -7
  134. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  135. package/lib/cjs/geometry3d/PointHelpers.js +66 -26
  136. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  137. package/lib/cjs/geometry3d/PolygonOps.d.ts +57 -9
  138. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  139. package/lib/cjs/geometry3d/PolygonOps.js +57 -17
  140. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  141. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  142. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  143. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  144. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  145. package/lib/cjs/geometry3d/PolylineOps.d.ts +5 -4
  146. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  147. package/lib/cjs/geometry3d/PolylineOps.js +5 -4
  148. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  149. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  150. package/lib/cjs/geometry3d/Ray3d.js +11 -23
  151. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  152. package/lib/cjs/geometry3d/Transform.d.ts +21 -2
  153. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  154. package/lib/cjs/geometry3d/Transform.js +32 -13
  155. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  156. package/lib/cjs/geometry4d/Matrix4d.d.ts +7 -7
  157. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  158. package/lib/cjs/geometry4d/Matrix4d.js +9 -9
  159. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  160. package/lib/cjs/geometry4d/MomentData.d.ts +32 -34
  161. package/lib/cjs/geometry4d/MomentData.d.ts.map +1 -1
  162. package/lib/cjs/geometry4d/MomentData.js +56 -57
  163. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  164. package/lib/cjs/geometry4d/Point4d.d.ts +8 -5
  165. package/lib/cjs/geometry4d/Point4d.d.ts.map +1 -1
  166. package/lib/cjs/geometry4d/Point4d.js +27 -16
  167. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  168. package/lib/cjs/polyface/FacetOrientation.d.ts +1 -1
  169. package/lib/cjs/polyface/FacetOrientation.js +2 -2
  170. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  171. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts +55 -40
  172. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  173. package/lib/cjs/polyface/IndexedEdgeMatcher.js +83 -75
  174. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  175. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  176. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  177. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +47 -38
  178. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  179. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  180. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  181. package/lib/cjs/polyface/IndexedPolyfaceWalker.js +47 -32
  182. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  183. package/lib/cjs/polyface/Polyface.d.ts +19 -5
  184. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  185. package/lib/cjs/polyface/Polyface.js +18 -2
  186. package/lib/cjs/polyface/Polyface.js.map +1 -1
  187. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +1 -1
  188. package/lib/cjs/polyface/PolyfaceBuilder.js +3 -3
  189. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  190. package/lib/cjs/polyface/PolyfaceClip.d.ts +19 -18
  191. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  192. package/lib/cjs/polyface/PolyfaceClip.js +39 -42
  193. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  194. package/lib/cjs/polyface/PolyfaceData.d.ts +1 -1
  195. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  196. package/lib/cjs/polyface/PolyfaceData.js +3 -1
  197. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  198. package/lib/cjs/polyface/PolyfaceQuery.d.ts +119 -78
  199. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  200. package/lib/cjs/polyface/PolyfaceQuery.js +315 -231
  201. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  202. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  203. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  204. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +3 -3
  205. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  206. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  207. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  208. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  209. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  210. package/lib/cjs/serialization/GeometrySamples.d.ts +1 -1
  211. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  212. package/lib/cjs/serialization/GeometrySamples.js +1 -1
  213. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  214. package/lib/cjs/serialization/IModelJsonSchema.d.ts +3 -3
  215. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  216. package/lib/cjs/topology/ChainMerge.d.ts +1 -1
  217. package/lib/cjs/topology/ChainMerge.js +1 -1
  218. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  219. package/lib/cjs/topology/Triangulation.d.ts +3 -3
  220. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  221. package/lib/cjs/topology/Triangulation.js +7 -7
  222. package/lib/cjs/topology/Triangulation.js.map +1 -1
  223. package/lib/esm/Geometry.d.ts +15 -4
  224. package/lib/esm/Geometry.d.ts.map +1 -1
  225. package/lib/esm/Geometry.js +17 -3
  226. package/lib/esm/Geometry.js.map +1 -1
  227. package/lib/esm/bspline/BSpline1dNd.d.ts +1 -1
  228. package/lib/esm/bspline/BSpline1dNd.js +1 -1
  229. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  230. package/lib/esm/bspline/BSplineSurface.d.ts +4 -3
  231. package/lib/esm/bspline/BSplineSurface.d.ts.map +1 -1
  232. package/lib/esm/bspline/BSplineSurface.js +6 -5
  233. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  234. package/lib/esm/clipping/ClipPlane.d.ts +7 -5
  235. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  236. package/lib/esm/clipping/ClipPlane.js +9 -5
  237. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  238. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  239. package/lib/esm/clipping/ClipUtils.js +5 -3
  240. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  241. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  242. package/lib/esm/clipping/ConvexClipPlaneSet.js +12 -23
  243. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  244. package/lib/esm/core-geometry.d.ts +1 -0
  245. package/lib/esm/core-geometry.d.ts.map +1 -1
  246. package/lib/esm/core-geometry.js +1 -0
  247. package/lib/esm/core-geometry.js.map +1 -1
  248. package/lib/esm/curve/Arc3d.d.ts +56 -32
  249. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  250. package/lib/esm/curve/Arc3d.js +91 -36
  251. package/lib/esm/curve/Arc3d.js.map +1 -1
  252. package/lib/esm/curve/CurveCollection.d.ts +2 -0
  253. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  254. package/lib/esm/curve/CurveCollection.js +14 -0
  255. package/lib/esm/curve/CurveCollection.js.map +1 -1
  256. package/lib/esm/curve/CurveExtendMode.d.ts +13 -5
  257. package/lib/esm/curve/CurveExtendMode.d.ts.map +1 -1
  258. package/lib/esm/curve/CurveExtendMode.js +19 -15
  259. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  260. package/lib/esm/curve/CurveLocationDetail.d.ts +1 -1
  261. package/lib/esm/curve/CurveLocationDetail.js +1 -1
  262. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  263. package/lib/esm/curve/CurvePrimitive.d.ts +67 -8
  264. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  265. package/lib/esm/curve/CurvePrimitive.js +59 -6
  266. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  267. package/lib/esm/curve/CurveTypes.d.ts +1 -1
  268. package/lib/esm/curve/CurveTypes.js.map +1 -1
  269. package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
  270. package/lib/esm/curve/LineSegment3d.js +1 -0
  271. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  272. package/lib/esm/curve/LineString3d.d.ts +8 -7
  273. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  274. package/lib/esm/curve/LineString3d.js +25 -22
  275. package/lib/esm/curve/LineString3d.js.map +1 -1
  276. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  277. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +10 -5
  278. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  279. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  280. package/lib/esm/curve/Query/PlanarSubdivision.js +7 -2
  281. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  282. package/lib/esm/curve/RegionMomentsXY.d.ts +15 -21
  283. package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
  284. package/lib/esm/curve/RegionMomentsXY.js +38 -58
  285. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  286. package/lib/esm/curve/RegionOps.d.ts +70 -38
  287. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  288. package/lib/esm/curve/RegionOps.js +116 -46
  289. package/lib/esm/curve/RegionOps.js.map +1 -1
  290. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +12 -13
  291. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  292. package/lib/esm/curve/RegionOpsClassificationSweeps.js +23 -23
  293. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  294. package/lib/esm/curve/StrokeOptions.d.ts +1 -1
  295. package/lib/esm/curve/StrokeOptions.js +1 -1
  296. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  297. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts +71 -0
  298. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -0
  299. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js +177 -0
  300. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -0
  301. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +21 -5
  302. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  303. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +42 -17
  304. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  305. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  306. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +36 -12
  307. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  308. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +5 -3
  309. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +1 -1
  310. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js +5 -3
  311. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  312. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.d.ts +14 -0
  313. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.d.ts.map +1 -0
  314. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js +30 -0
  315. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -0
  316. package/lib/esm/geometry3d/AngleSweep.d.ts +25 -18
  317. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  318. package/lib/esm/geometry3d/AngleSweep.js +39 -25
  319. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  320. package/lib/esm/geometry3d/GeometryHandler.d.ts +15 -16
  321. package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
  322. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  323. package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
  324. package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
  325. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  326. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +7 -2
  327. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  328. package/lib/esm/geometry3d/GrowableXYZArray.js +20 -2
  329. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  330. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +2 -1
  331. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  332. package/lib/esm/geometry3d/IndexedXYZCollection.js +7 -3
  333. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  334. package/lib/esm/geometry3d/Matrix3d.d.ts +10 -11
  335. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  336. package/lib/esm/geometry3d/Matrix3d.js +11 -12
  337. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  338. package/lib/esm/geometry3d/Plane3d.d.ts +2 -0
  339. package/lib/esm/geometry3d/Plane3d.d.ts.map +1 -1
  340. package/lib/esm/geometry3d/Plane3d.js +6 -1
  341. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  342. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  343. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  344. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  345. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  346. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  347. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  348. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  349. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  350. package/lib/esm/geometry3d/Point3dVector3d.d.ts +4 -4
  351. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  352. package/lib/esm/geometry3d/Point3dVector3d.js +6 -6
  353. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  354. package/lib/esm/geometry3d/PointHelpers.d.ts +7 -7
  355. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  356. package/lib/esm/geometry3d/PointHelpers.js +66 -26
  357. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  358. package/lib/esm/geometry3d/PolygonOps.d.ts +57 -9
  359. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  360. package/lib/esm/geometry3d/PolygonOps.js +57 -17
  361. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  362. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  363. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  364. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  365. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  366. package/lib/esm/geometry3d/PolylineOps.d.ts +5 -4
  367. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  368. package/lib/esm/geometry3d/PolylineOps.js +5 -4
  369. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  370. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  371. package/lib/esm/geometry3d/Ray3d.js +11 -23
  372. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  373. package/lib/esm/geometry3d/Transform.d.ts +21 -2
  374. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  375. package/lib/esm/geometry3d/Transform.js +32 -13
  376. package/lib/esm/geometry3d/Transform.js.map +1 -1
  377. package/lib/esm/geometry4d/Matrix4d.d.ts +7 -7
  378. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  379. package/lib/esm/geometry4d/Matrix4d.js +9 -9
  380. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  381. package/lib/esm/geometry4d/MomentData.d.ts +32 -34
  382. package/lib/esm/geometry4d/MomentData.d.ts.map +1 -1
  383. package/lib/esm/geometry4d/MomentData.js +56 -57
  384. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  385. package/lib/esm/geometry4d/Point4d.d.ts +8 -5
  386. package/lib/esm/geometry4d/Point4d.d.ts.map +1 -1
  387. package/lib/esm/geometry4d/Point4d.js +27 -16
  388. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  389. package/lib/esm/polyface/FacetOrientation.d.ts +1 -1
  390. package/lib/esm/polyface/FacetOrientation.js +2 -2
  391. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  392. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts +55 -40
  393. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  394. package/lib/esm/polyface/IndexedEdgeMatcher.js +83 -75
  395. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  396. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  397. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  398. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +47 -38
  399. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  400. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  401. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  402. package/lib/esm/polyface/IndexedPolyfaceWalker.js +47 -32
  403. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  404. package/lib/esm/polyface/Polyface.d.ts +19 -5
  405. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  406. package/lib/esm/polyface/Polyface.js +18 -2
  407. package/lib/esm/polyface/Polyface.js.map +1 -1
  408. package/lib/esm/polyface/PolyfaceBuilder.d.ts +1 -1
  409. package/lib/esm/polyface/PolyfaceBuilder.js +3 -3
  410. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  411. package/lib/esm/polyface/PolyfaceClip.d.ts +19 -18
  412. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  413. package/lib/esm/polyface/PolyfaceClip.js +39 -42
  414. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  415. package/lib/esm/polyface/PolyfaceData.d.ts +1 -1
  416. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  417. package/lib/esm/polyface/PolyfaceData.js +3 -1
  418. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  419. package/lib/esm/polyface/PolyfaceQuery.d.ts +119 -78
  420. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  421. package/lib/esm/polyface/PolyfaceQuery.js +316 -232
  422. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  423. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  424. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  425. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +3 -3
  426. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  427. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  428. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  429. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  430. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  431. package/lib/esm/serialization/GeometrySamples.d.ts +1 -1
  432. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  433. package/lib/esm/serialization/GeometrySamples.js +1 -1
  434. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  435. package/lib/esm/serialization/IModelJsonSchema.d.ts +3 -3
  436. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  437. package/lib/esm/topology/ChainMerge.d.ts +1 -1
  438. package/lib/esm/topology/ChainMerge.js +1 -1
  439. package/lib/esm/topology/ChainMerge.js.map +1 -1
  440. package/lib/esm/topology/Triangulation.d.ts +3 -3
  441. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  442. package/lib/esm/topology/Triangulation.js +7 -7
  443. package/lib/esm/topology/Triangulation.js.map +1 -1
  444. package/package.json +3 -3
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Curve
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.AnnounceTangentStrokeHandler = void 0;
11
+ const core_bentley_1 = require("@itwin/core-bentley");
12
+ const Geometry_1 = require("../../Geometry");
13
+ const Point3dVector3d_1 = require("../../geometry3d/Point3dVector3d");
14
+ const Ray3d_1 = require("../../geometry3d/Ray3d");
15
+ const Newton_1 = require("../../numerics/Newton");
16
+ const CurveLocationDetail_1 = require("../CurveLocationDetail");
17
+ const NewtonRtoRStrokeHandler_1 = require("./NewtonRtoRStrokeHandler");
18
+ /**
19
+ * Context for searching for the tangent(s) to a CurvePrimitive.
20
+ * @internal
21
+ */
22
+ class AnnounceTangentStrokeHandler extends NewtonRtoRStrokeHandler_1.NewtonRtoRStrokeHandler {
23
+ _curve;
24
+ _announceTangent;
25
+ _spacePoint;
26
+ _vectorToEye;
27
+ _distanceTol;
28
+ _distanceTolSquared;
29
+ // fraction and function value on one side of an interval that may bracket a root
30
+ _fractionA = 0;
31
+ _functionA = 0;
32
+ // fraction and function value on the other side of an interval that may bracket a root
33
+ _fractionB = 0;
34
+ _functionB = 0;
35
+ _numThisCurve = 0;
36
+ // scratch vars to use within methods
37
+ _fractionMRU;
38
+ _curveMRU;
39
+ _workRay;
40
+ _workDetail;
41
+ _newtonSolver;
42
+ /** Constructor */
43
+ constructor(spacePoint, announceTangent, options) {
44
+ super();
45
+ this._announceTangent = announceTangent;
46
+ this._spacePoint = spacePoint;
47
+ this._vectorToEye = options?.vectorToEye ?? Point3dVector3d_1.Vector3d.unitZ();
48
+ this._distanceTol = options?.distanceTol ?? Geometry_1.Geometry.smallMetricDistance;
49
+ this._distanceTolSquared = this._distanceTol * this._distanceTol;
50
+ this._workRay = Ray3d_1.Ray3d.createZero();
51
+ this.startCurvePrimitive(undefined);
52
+ this._newtonSolver = new Newton_1.Newton1dUnboundedApproximateDerivative(this);
53
+ }
54
+ /** Specified by IStrokeHandler. */
55
+ needPrimaryGeometryForStrokes() {
56
+ return true;
57
+ }
58
+ /** Specified by IStrokeHandler. */
59
+ startCurvePrimitive(curve) {
60
+ this._curve = curve;
61
+ this._fractionA = 0.0;
62
+ this._numThisCurve = 0;
63
+ this._functionA = 0.0;
64
+ }
65
+ /** Specified by IStrokeHandler. */
66
+ endCurvePrimitive() {
67
+ }
68
+ /** Specified by IStrokeHandler. */
69
+ announceIntervalForUniformStepStrokes(cp, numStrokes, fraction0, fraction1) {
70
+ this.startCurvePrimitive(cp);
71
+ if (numStrokes < 1)
72
+ numStrokes = 1;
73
+ const df = 1.0 / numStrokes;
74
+ for (let i = 0; i <= numStrokes; i++) {
75
+ const fraction = Geometry_1.Geometry.interpolate(fraction0, i * df, fraction1);
76
+ cp.fractionToPointAndDerivative(fraction, this._workRay);
77
+ this.announceRay(fraction, this._workRay);
78
+ }
79
+ }
80
+ announceCandidate(cp, fraction, point) {
81
+ if (this._parentCurvePrimitive)
82
+ cp = this._parentCurvePrimitive;
83
+ if (this._curveMRU === cp && Geometry_1.Geometry.isAlmostEqualOptional(this._fractionMRU, fraction, Geometry_1.Geometry.smallFloatingPoint))
84
+ return; // avoid announcing duplicate tangents in succession (e.g., at interior stroke point)
85
+ this._workDetail = CurveLocationDetail_1.CurveLocationDetail.createCurveFractionPoint(cp, fraction, point, this._workDetail);
86
+ this._announceTangent(this._workDetail);
87
+ this._fractionMRU = fraction;
88
+ this._curveMRU = cp;
89
+ }
90
+ /** Specified by IStrokeHandler. */
91
+ announceSegmentInterval(cp, point0, point1, _numStrokes, fraction0, fraction1) {
92
+ let fraction;
93
+ let point;
94
+ const distance0 = this._spacePoint.distanceSquared(point0);
95
+ const distance1 = this._spacePoint.distanceSquared(point1);
96
+ if (distance0 < distance1) {
97
+ fraction = fraction0;
98
+ point = point0;
99
+ }
100
+ else {
101
+ fraction = fraction1;
102
+ point = point1;
103
+ }
104
+ // evaluate at midpoint; the endpoints may be at corners, which have ambiguous tangent
105
+ const value = this.evaluateFunction(undefined, (fraction0 + fraction1) / 2, cp);
106
+ if (value !== undefined && Geometry_1.Geometry.isDistanceWithinTol(value, this._distanceTol))
107
+ this.announceCandidate(cp, fraction, point);
108
+ }
109
+ /**
110
+ * Given a function `f` and (unordered) fractions `a` and `b`, search for and announce a root of `f` in this
111
+ * fractional interval.
112
+ * * This method searches for a root of `f` if and only if the stroke segment defined by `(a, f(a))` and
113
+ * `(b, f(b))` has a root. This is a HEURISTIC: given continuous `f` between `a` and `b`, a root of the stroke
114
+ * segment implies a root of `f`, but not vice-versa. Therefore, if the strokes are not sufficiently dense,
115
+ * this method can miss a root of `f`.
116
+ */
117
+ searchInterval() {
118
+ // directly announce at endpoint if we are extra certain it's a root; Newton can miss it if it has multiplicity > 1
119
+ if (Geometry_1.Geometry.isDistanceWithinTol(this._functionA, this._distanceTolSquared))
120
+ this.announceSolutionFraction(this._fractionA);
121
+ if (Geometry_1.Geometry.isDistanceWithinTol(this._functionB, this._distanceTolSquared))
122
+ this.announceSolutionFraction(this._fractionB);
123
+ if (this._functionA * this._functionB < 0) {
124
+ // by the Intermediate Value Theorem, a root lies between fractionA and fractionB; use Newton to find it.
125
+ const fraction = Geometry_1.Geometry.inverseInterpolate(this._fractionA, this._functionA, this._fractionB, this._functionB);
126
+ if (fraction) {
127
+ this._newtonSolver.setX(fraction);
128
+ if (this._newtonSolver.runIterations())
129
+ this.announceSolutionFraction(this._newtonSolver.getX());
130
+ }
131
+ }
132
+ }
133
+ announceSolutionFraction(fraction) {
134
+ if (this._curve)
135
+ this.announceCandidate(this._curve, fraction, this._curve.fractionToPoint(fraction));
136
+ }
137
+ /**
138
+ * Evaluate the univariate real-valued function for which we are finding roots.
139
+ * * For finding the tangents to curve `X` from point `Q` as seen in a view plane with normal `N`, this
140
+ * function is `f(t) := (Q - X(t)) dot (X'(t) cross N)`. The second vector in the dot product defines a
141
+ * _tangent plane_ at `X(t)`.
142
+ * * Either `pointAndDerivative` must be defined, or both `fraction` and `curve`.
143
+ * @param pointAndDerivative pre-evaluated curve
144
+ * @param fraction fraction at which to evaluate `curve`
145
+ * @param curve curve to evaluate at `fraction`
146
+ * @returns distance of `Q` from the tangent plane at `X(t)`.
147
+ */
148
+ evaluateFunction(pointAndDerivative, fraction, curve) {
149
+ if (pointAndDerivative)
150
+ this._workRay.setFrom(pointAndDerivative);
151
+ else if (fraction !== undefined && curve)
152
+ this._workRay = curve.fractionToPointAndDerivative(fraction, this._workRay);
153
+ else
154
+ return undefined;
155
+ const cross = this._vectorToEye.unitCrossProduct(this._workRay.direction); // normalized so we return true distance
156
+ return cross ? cross.dotProductStartEnd(this._workRay.origin, this._spacePoint) : undefined;
157
+ }
158
+ /** Specified by NewtonRtoRStrokeHandler. */
159
+ evaluate(fraction) {
160
+ const curve = this._parentCurvePrimitive ?? this._curve;
161
+ const value = this.evaluateFunction(undefined, fraction, curve);
162
+ if (value === undefined)
163
+ return false;
164
+ this.currentF = value;
165
+ return true;
166
+ }
167
+ announceRay(fraction, data) {
168
+ this._functionB = this.evaluateFunction(data);
169
+ this._fractionB = fraction;
170
+ if (this._numThisCurve++ > 0) // after the first stroke point, a stroke segment is defined, so we have an interval
171
+ this.searchInterval();
172
+ this._functionA = this._functionB;
173
+ this._fractionA = this._fractionB;
174
+ }
175
+ /** Specified by IStrokeHandler. */
176
+ announcePointTangent(_point, _fraction, _tangent) {
177
+ (0, core_bentley_1.assert)(false, "No callers expected. IStrokeHandler probably didn't need to specify this method.");
178
+ }
179
+ }
180
+ exports.AnnounceTangentStrokeHandler = AnnounceTangentStrokeHandler;
181
+ //# sourceMappingURL=AnnounceTangentStrokeHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnnounceTangentStrokeHandler.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/AnnounceTangentStrokeHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { Geometry } from \"../../Geometry\";\nimport { IStrokeHandler } from \"../../geometry3d/GeometryHandler\";\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\nimport { Newton1dUnboundedApproximateDerivative } from \"../../numerics/Newton\";\nimport { CurveLocationDetail } from \"../CurveLocationDetail\";\nimport { CurvePrimitive, TangentOptions } from \"../CurvePrimitive\";\nimport { NewtonRtoRStrokeHandler } from \"./NewtonRtoRStrokeHandler\";\n\n/**\n * Context for searching for the tangent(s) to a CurvePrimitive.\n * @internal\n */\nexport class AnnounceTangentStrokeHandler extends NewtonRtoRStrokeHandler implements IStrokeHandler {\n private _curve: CurvePrimitive | undefined;\n private _announceTangent: (tangent: CurveLocationDetail) => any;\n private _spacePoint: Point3d;\n private _vectorToEye: Vector3d;\n private _distanceTol: number;\n private _distanceTolSquared: number;\n // fraction and function value on one side of an interval that may bracket a root\n private _fractionA: number = 0;\n private _functionA: number = 0;\n // fraction and function value on the other side of an interval that may bracket a root\n private _fractionB: number = 0;\n private _functionB: number = 0;\n private _numThisCurve: number = 0;\n // scratch vars to use within methods\n private _fractionMRU?: number;\n private _curveMRU?: CurvePrimitive;\n private _workRay: Ray3d;\n private _workDetail?: CurveLocationDetail;\n private _newtonSolver: Newton1dUnboundedApproximateDerivative;\n /** Constructor */\n public constructor(spacePoint: Point3d, announceTangent: (tangent: CurveLocationDetail) => any, options?: TangentOptions) {\n super();\n this._announceTangent = announceTangent;\n this._spacePoint = spacePoint;\n this._vectorToEye = options?.vectorToEye ?? Vector3d.unitZ();\n this._distanceTol = options?.distanceTol ?? Geometry.smallMetricDistance;\n this._distanceTolSquared = this._distanceTol * this._distanceTol;\n this._workRay = Ray3d.createZero();\n this.startCurvePrimitive(undefined);\n this._newtonSolver = new Newton1dUnboundedApproximateDerivative(this);\n }\n /** Specified by IStrokeHandler. */\n public needPrimaryGeometryForStrokes() {\n return true;\n }\n /** Specified by IStrokeHandler. */\n public startCurvePrimitive(curve: CurvePrimitive | undefined) {\n this._curve = curve;\n this._fractionA = 0.0;\n this._numThisCurve = 0;\n this._functionA = 0.0;\n }\n /** Specified by IStrokeHandler. */\n public endCurvePrimitive() {\n }\n /** Specified by IStrokeHandler. */\n public announceIntervalForUniformStepStrokes(\n cp: CurvePrimitive, numStrokes: number, fraction0: number, fraction1: number,\n ): void {\n this.startCurvePrimitive(cp);\n if (numStrokes < 1)\n numStrokes = 1;\n const df = 1.0 / numStrokes;\n for (let i = 0; i <= numStrokes; i++) {\n const fraction = Geometry.interpolate(fraction0, i * df, fraction1);\n cp.fractionToPointAndDerivative(fraction, this._workRay);\n this.announceRay(fraction, this._workRay);\n }\n }\n private announceCandidate(cp: CurvePrimitive, fraction: number, point: Point3d) {\n if (this._parentCurvePrimitive)\n cp = this._parentCurvePrimitive;\n if (this._curveMRU === cp && Geometry.isAlmostEqualOptional(this._fractionMRU, fraction, Geometry.smallFloatingPoint))\n return; // avoid announcing duplicate tangents in succession (e.g., at interior stroke point)\n this._workDetail = CurveLocationDetail.createCurveFractionPoint(cp, fraction, point, this._workDetail);\n this._announceTangent(this._workDetail);\n this._fractionMRU = fraction;\n this._curveMRU = cp;\n }\n /** Specified by IStrokeHandler. */\n public announceSegmentInterval(\n cp: CurvePrimitive, point0: Point3d, point1: Point3d, _numStrokes: number, fraction0: number, fraction1: number,\n ): void {\n let fraction: number;\n let point: Point3d;\n const distance0 = this._spacePoint.distanceSquared(point0);\n const distance1 = this._spacePoint.distanceSquared(point1);\n if (distance0 < distance1) {\n fraction = fraction0;\n point = point0;\n } else {\n fraction = fraction1;\n point = point1;\n }\n // evaluate at midpoint; the endpoints may be at corners, which have ambiguous tangent\n const value = this.evaluateFunction(undefined, (fraction0 + fraction1) / 2, cp);\n if (value !== undefined && Geometry.isDistanceWithinTol(value, this._distanceTol))\n this.announceCandidate(cp, fraction, point);\n }\n /**\n * Given a function `f` and (unordered) fractions `a` and `b`, search for and announce a root of `f` in this\n * fractional interval.\n * * This method searches for a root of `f` if and only if the stroke segment defined by `(a, f(a))` and\n * `(b, f(b))` has a root. This is a HEURISTIC: given continuous `f` between `a` and `b`, a root of the stroke\n * segment implies a root of `f`, but not vice-versa. Therefore, if the strokes are not sufficiently dense,\n * this method can miss a root of `f`.\n */\n private searchInterval() {\n // directly announce at endpoint if we are extra certain it's a root; Newton can miss it if it has multiplicity > 1\n if (Geometry.isDistanceWithinTol(this._functionA, this._distanceTolSquared))\n this.announceSolutionFraction(this._fractionA);\n if (Geometry.isDistanceWithinTol(this._functionB, this._distanceTolSquared))\n this.announceSolutionFraction(this._fractionB);\n if (this._functionA * this._functionB < 0) {\n // by the Intermediate Value Theorem, a root lies between fractionA and fractionB; use Newton to find it.\n const fraction = Geometry.inverseInterpolate(this._fractionA, this._functionA, this._fractionB, this._functionB);\n if (fraction) {\n this._newtonSolver.setX(fraction);\n if (this._newtonSolver.runIterations())\n this.announceSolutionFraction(this._newtonSolver.getX());\n }\n }\n }\n private announceSolutionFraction(fraction: number) {\n if (this._curve)\n this.announceCandidate(this._curve, fraction, this._curve.fractionToPoint(fraction));\n }\n /**\n * Evaluate the univariate real-valued function for which we are finding roots.\n * * For finding the tangents to curve `X` from point `Q` as seen in a view plane with normal `N`, this\n * function is `f(t) := (Q - X(t)) dot (X'(t) cross N)`. The second vector in the dot product defines a\n * _tangent plane_ at `X(t)`.\n * * Either `pointAndDerivative` must be defined, or both `fraction` and `curve`.\n * @param pointAndDerivative pre-evaluated curve\n * @param fraction fraction at which to evaluate `curve`\n * @param curve curve to evaluate at `fraction`\n * @returns distance of `Q` from the tangent plane at `X(t)`.\n */\n private evaluateFunction(pointAndDerivative?: Ray3d, fraction?: number, curve?: CurvePrimitive): number | undefined {\n if (pointAndDerivative)\n this._workRay.setFrom(pointAndDerivative);\n else if (fraction !== undefined && curve)\n this._workRay = curve.fractionToPointAndDerivative(fraction, this._workRay);\n else\n return undefined;\n const cross = this._vectorToEye.unitCrossProduct(this._workRay.direction); // normalized so we return true distance\n return cross ? cross.dotProductStartEnd(this._workRay.origin, this._spacePoint) : undefined;\n }\n /** Specified by NewtonRtoRStrokeHandler. */\n public evaluate(fraction: number): boolean {\n const curve = this._parentCurvePrimitive ?? this._curve;\n const value = this.evaluateFunction(undefined, fraction, curve);\n if (value === undefined)\n return false;\n this.currentF = value;\n return true;\n }\n private announceRay(fraction: number, data: Ray3d): void {\n this._functionB = this.evaluateFunction(data)!;\n this._fractionB = fraction;\n if (this._numThisCurve++ > 0) // after the first stroke point, a stroke segment is defined, so we have an interval\n this.searchInterval();\n this._functionA = this._functionB;\n this._fractionA = this._fractionB;\n }\n /** Specified by IStrokeHandler. */\n public announcePointTangent(_point: Point3d, _fraction: number, _tangent: Vector3d) {\n assert(false, \"No callers expected. IStrokeHandler probably didn't need to specify this method.\");\n }\n}\n"]}
@@ -3,7 +3,6 @@
3
3
  */
4
4
  import { IStrokeHandler } from "../../geometry3d/GeometryHandler";
5
5
  import { Point3d, Vector3d } from "../../geometry3d/Point3dVector3d";
6
- import { Ray3d } from "../../geometry3d/Ray3d";
7
6
  import { VariantCurveExtendParameter } from "../CurveExtendMode";
8
7
  import { CurveLocationDetail } from "../CurveLocationDetail";
9
8
  import { CurvePrimitive } from "../CurvePrimitive";
@@ -19,13 +18,14 @@ export declare class ClosestPointStrokeHandler extends NewtonRtoRStrokeHandler i
19
18
  private _extend;
20
19
  private _fractionA;
21
20
  private _functionA;
22
- private _functionB;
23
21
  private _fractionB;
22
+ private _functionB;
24
23
  private _numThisCurve;
25
24
  private _workPoint;
26
25
  private _workRay;
27
26
  private _newtonSolver;
28
- constructor(spacePoint: Point3d, extend: VariantCurveExtendParameter, result?: CurveLocationDetail);
27
+ /** Constructor */
28
+ constructor(spacePoint: Point3d, extend?: VariantCurveExtendParameter, result?: CurveLocationDetail);
29
29
  claimResult(): CurveLocationDetail | undefined;
30
30
  needPrimaryGeometryForStrokes(): boolean;
31
31
  startCurvePrimitive(curve: CurvePrimitive | undefined): void;
@@ -33,11 +33,27 @@ export declare class ClosestPointStrokeHandler extends NewtonRtoRStrokeHandler i
33
33
  announceIntervalForUniformStepStrokes(cp: CurvePrimitive, numStrokes: number, fraction0: number, fraction1: number): void;
34
34
  private announceCandidate;
35
35
  announceSegmentInterval(cp: CurvePrimitive, point0: Point3d, point1: Point3d, _numStrokes: number, fraction0: number, fraction1: number): void;
36
+ /**
37
+ * Given a function `f` and (unordered) fractions `a` and `b`, search for and announce a root of `f` in this
38
+ * fractional interval.
39
+ * * This method searches for a root of `f` if and only if the stroke segment defined by `(a, f(a))` and
40
+ * `(b, f(b))` has a root. This is a HEURISTIC: given continuous `f` between `a` and `b`, a root of the stroke
41
+ * segment implies a root of `f`, but not vice-versa. Therefore, if the strokes are not sufficiently dense,
42
+ * this method can miss a root of `f`.
43
+ */
36
44
  private searchInterval;
37
- private evaluateB;
38
45
  private announceSolutionFraction;
46
+ /**
47
+ * Evaluate the univariate real-valued function for which we are finding roots.
48
+ * * For finding the closest point to curve X from point Q, this function is `f(t) := Q-X(t) dot X'(t)`.
49
+ * * Either `pointAndDerivative` must be defined, or both `fraction` and `curve`.
50
+ * @param pointAndDerivative pre-evaluated curve
51
+ * @param fraction fraction at which to evaluate `curve`
52
+ * @param curve curve to evaluate at `fraction`
53
+ */
54
+ private evaluateFunction;
39
55
  evaluate(fraction: number): boolean;
40
- announceRay(fraction: number, data: Ray3d): void;
56
+ private announceRay;
41
57
  announcePointTangent(point: Point3d, fraction: number, tangent: Vector3d): void;
42
58
  }
43
59
  //# sourceMappingURL=ClosestPointStrokeHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClosestPointStrokeHandler.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/ClosestPointStrokeHandler.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAsB,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,uBAAwB,YAAW,cAAc;IAC9F,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAa;IAElC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAAyC;gBAE3C,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAWlG,WAAW,IAAI,mBAAmB,GAAG,SAAS;IAa9C,6BAA6B;IAI7B,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS;IAOrD,iBAAiB;IAGjB,qCAAqC,CAAC,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAahI,OAAO,CAAC,iBAAiB;IAUlB,uBAAuB,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAgBrJ,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,wBAAwB;IAKzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAYnC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;IAOhD,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;CAIhF"}
1
+ {"version":3,"file":"ClosestPointStrokeHandler.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/ClosestPointStrokeHandler.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAsB,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,uBAAwB,YAAW,cAAc;IAC9F,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,OAAO,CAA8B;IAE7C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAa;IAElC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAAyC;IAC9D,kBAAkB;gBACC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,2BAA2B,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAUnG,WAAW,IAAI,mBAAmB,GAAG,SAAS;IAY9C,6BAA6B;IAG7B,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS;IAMrD,iBAAiB;IAEjB,qCAAqC,CAC1C,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAC3E,IAAI;IAaP,OAAO,CAAC,iBAAiB;IASlB,uBAAuB,CAC5B,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAC9G,IAAI;IAeP;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,wBAAwB;IAIhC;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IASjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAU1C,OAAO,CAAC,WAAW;IAQZ,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;CAIhF"}
@@ -24,22 +24,25 @@ class ClosestPointStrokeHandler extends NewtonRtoRStrokeHandler_1.NewtonRtoRStro
24
24
  _closestPoint;
25
25
  _spacePoint;
26
26
  _extend;
27
+ // fraction and function value on one side of an interval that may bracket a root
27
28
  _fractionA = 0;
28
29
  _functionA = 0;
29
- _functionB = 0;
30
+ // fraction and function value on the other side of an interval that may bracket a root
30
31
  _fractionB = 0;
32
+ _functionB = 0;
31
33
  _numThisCurve = 0;
32
- // scratch vars for use within methods.
34
+ // scratch vars to use within methods
33
35
  _workPoint;
34
36
  _workRay;
35
37
  _newtonSolver;
38
+ /** Constructor */
36
39
  constructor(spacePoint, extend, result) {
37
40
  super();
38
41
  this._spacePoint = spacePoint;
39
42
  this._workPoint = Point3dVector3d_1.Point3d.create();
40
43
  this._workRay = Ray3d_1.Ray3d.createZero();
41
44
  this._closestPoint = result;
42
- this._extend = extend;
45
+ this._extend = extend ?? false;
43
46
  this.startCurvePrimitive(undefined);
44
47
  this._newtonSolver = new Newton_1.Newton1dUnboundedApproximateDerivative(this);
45
48
  }
@@ -90,7 +93,7 @@ class ClosestPointStrokeHandler extends NewtonRtoRStrokeHandler_1.NewtonRtoRStro
90
93
  }
91
94
  announceSegmentInterval(cp, point0, point1, _numStrokes, fraction0, fraction1) {
92
95
  let localFraction = this._spacePoint.fractionOfProjectionToLine(point0, point1, 0.0);
93
- // only consider extending the segment if the immediate caller says we are at endpoints ...
96
+ // only consider extending the segment if the immediate caller says we are at endpoints
94
97
  if (!this._extend)
95
98
  localFraction = Geometry_1.Geometry.clampToStartEnd(localFraction, 0.0, 1.0);
96
99
  else {
@@ -103,13 +106,22 @@ class ClosestPointStrokeHandler extends NewtonRtoRStrokeHandler_1.NewtonRtoRStro
103
106
  const globalFraction = Geometry_1.Geometry.interpolate(fraction0, localFraction, fraction1);
104
107
  this.announceCandidate(cp, globalFraction, this._workPoint);
105
108
  }
109
+ /**
110
+ * Given a function `f` and (unordered) fractions `a` and `b`, search for and announce a root of `f` in this
111
+ * fractional interval.
112
+ * * This method searches for a root of `f` if and only if the stroke segment defined by `(a, f(a))` and
113
+ * `(b, f(b))` has a root. This is a HEURISTIC: given continuous `f` between `a` and `b`, a root of the stroke
114
+ * segment implies a root of `f`, but not vice-versa. Therefore, if the strokes are not sufficiently dense,
115
+ * this method can miss a root of `f`.
116
+ */
106
117
  searchInterval() {
107
118
  if (this._functionA * this._functionB > 0)
108
- return;
119
+ return; // stroke segment has no root; ASSUME the function has no root either
109
120
  if (this._functionA === 0)
110
121
  this.announceSolutionFraction(this._fractionA);
111
122
  if (this._functionB === 0)
112
123
  this.announceSolutionFraction(this._fractionB);
124
+ // by the Intermediate Value Theorem, a root lies between fractionA and fractionB; use Newton to find it.
113
125
  if (this._functionA * this._functionB < 0) {
114
126
  const fraction = Geometry_1.Geometry.inverseInterpolate(this._fractionA, this._functionA, this._fractionB, this._functionB);
115
127
  if (fraction) {
@@ -119,28 +131,41 @@ class ClosestPointStrokeHandler extends NewtonRtoRStrokeHandler_1.NewtonRtoRStro
119
131
  }
120
132
  }
121
133
  }
122
- evaluateB(fractionB, dataB) {
123
- this._functionB = dataB.dotProductToPoint(this._spacePoint);
124
- this._fractionB = fractionB;
125
- }
126
134
  announceSolutionFraction(fraction) {
127
135
  if (this._curve)
128
136
  this.announceCandidate(this._curve, fraction, this._curve.fractionToPoint(fraction));
129
137
  }
138
+ /**
139
+ * Evaluate the univariate real-valued function for which we are finding roots.
140
+ * * For finding the closest point to curve X from point Q, this function is `f(t) := Q-X(t) dot X'(t)`.
141
+ * * Either `pointAndDerivative` must be defined, or both `fraction` and `curve`.
142
+ * @param pointAndDerivative pre-evaluated curve
143
+ * @param fraction fraction at which to evaluate `curve`
144
+ * @param curve curve to evaluate at `fraction`
145
+ */
146
+ evaluateFunction(pointAndDerivative, fraction, curve) {
147
+ if (pointAndDerivative)
148
+ this._workRay.setFrom(pointAndDerivative);
149
+ else if (fraction !== undefined && curve)
150
+ this._workRay = curve.fractionToPointAndDerivative(fraction, this._workRay);
151
+ else
152
+ return undefined;
153
+ return this._workRay.dotProductToPoint(this._spacePoint);
154
+ }
130
155
  evaluate(fraction) {
131
156
  let curve = this._curve;
132
157
  if (this._parentCurvePrimitive)
133
158
  curve = this._parentCurvePrimitive;
134
- if (curve) {
135
- this._workRay = curve.fractionToPointAndDerivative(fraction, this._workRay);
136
- this.currentF = this._workRay.dotProductToPoint(this._spacePoint);
137
- return true;
138
- }
139
- return false;
159
+ const value = this.evaluateFunction(undefined, fraction, curve);
160
+ if (value === undefined)
161
+ return false;
162
+ this.currentF = value;
163
+ return true;
140
164
  }
141
165
  announceRay(fraction, data) {
142
- this.evaluateB(fraction, data);
143
- if (this._numThisCurve++ > 0)
166
+ this._functionB = this.evaluateFunction(data);
167
+ this._fractionB = fraction;
168
+ if (this._numThisCurve++ > 0) // after the first stroke point, a stroke segment is defined, so we have an interval
144
169
  this.searchInterval();
145
170
  this._functionA = this._functionB;
146
171
  this._fractionA = this._fractionB;
@@ -1 +1 @@
1
- {"version":3,"file":"ClosestPointStrokeHandler.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/ClosestPointStrokeHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { Geometry } from \"../../Geometry\";\nimport { IStrokeHandler } from \"../../geometry3d/GeometryHandler\";\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\nimport { Newton1dUnboundedApproximateDerivative } from \"../../numerics/Newton\";\nimport { CurveExtendOptions, VariantCurveExtendParameter } from \"../CurveExtendMode\";\nimport { CurveLocationDetail } from \"../CurveLocationDetail\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { NewtonRtoRStrokeHandler } from \"./NewtonRtoRStrokeHandler\";\n\n/**\n * Context for searching for the closest point to a CurvePrimitive.\n * @internal\n */\nexport class ClosestPointStrokeHandler extends NewtonRtoRStrokeHandler implements IStrokeHandler {\n private _curve: CurvePrimitive | undefined;\n private _closestPoint: CurveLocationDetail | undefined;\n private _spacePoint: Point3d;\n private _extend: VariantCurveExtendParameter;\n private _fractionA: number = 0;\n private _functionA: number = 0;\n private _functionB: number = 0;\n private _fractionB: number = 0;\n private _numThisCurve: number = 0;\n // scratch vars for use within methods.\n private _workPoint: Point3d;\n private _workRay: Ray3d;\n private _newtonSolver: Newton1dUnboundedApproximateDerivative;\n\n public constructor(spacePoint: Point3d, extend: VariantCurveExtendParameter, result?: CurveLocationDetail) {\n super();\n this._spacePoint = spacePoint;\n this._workPoint = Point3d.create();\n this._workRay = Ray3d.createZero();\n this._closestPoint = result;\n this._extend = extend;\n this.startCurvePrimitive(undefined);\n this._newtonSolver = new Newton1dUnboundedApproximateDerivative(this);\n }\n\n public claimResult(): CurveLocationDetail | undefined {\n if (this._closestPoint) {\n this._newtonSolver.setX(this._closestPoint.fraction);\n this._curve = this._closestPoint.curve;\n if (this._newtonSolver.runIterations()) {\n let fraction = this._newtonSolver.getX();\n fraction = CurveExtendOptions.correctFraction(this._extend, fraction);\n this.announceSolutionFraction(fraction);\n }\n }\n return this._closestPoint;\n }\n\n public needPrimaryGeometryForStrokes() {\n return true;\n }\n\n public startCurvePrimitive(curve: CurvePrimitive | undefined) {\n this._curve = curve;\n this._fractionA = 0.0;\n this._numThisCurve = 0;\n this._functionA = 0.0;\n }\n\n public endCurvePrimitive() {\n }\n\n public announceIntervalForUniformStepStrokes(cp: CurvePrimitive, numStrokes: number, fraction0: number, fraction1: number): void {\n this.startCurvePrimitive(cp);\n this.announceSolutionFraction(0.0); // test start point as closest\n this.announceSolutionFraction(1.0); // test end point as closest\n if (numStrokes < 1) numStrokes = 1;\n const df = 1.0 / numStrokes;\n for (let i = 0; i <= numStrokes; i++) {\n const fraction = Geometry.interpolate(fraction0, i * df, fraction1);\n cp.fractionToPointAndDerivative(fraction, this._workRay);\n this.announceRay(fraction, this._workRay);\n }\n }\n\n private announceCandidate(cp: CurvePrimitive, fraction: number, point: Point3d) {\n const distance = this._spacePoint.distance(point);\n if (this._closestPoint && distance > this._closestPoint.a)\n return;\n this._closestPoint = CurveLocationDetail.createCurveFractionPoint(cp, fraction, point, this._closestPoint);\n this._closestPoint.a = distance;\n if (this._parentCurvePrimitive !== undefined)\n this._closestPoint.curve = this._parentCurvePrimitive;\n }\n\n public announceSegmentInterval(cp: CurvePrimitive, point0: Point3d, point1: Point3d, _numStrokes: number, fraction0: number, fraction1: number): void {\n let localFraction = this._spacePoint.fractionOfProjectionToLine(point0, point1, 0.0);\n // only consider extending the segment if the immediate caller says we are at endpoints ...\n if (!this._extend)\n localFraction = Geometry.clampToStartEnd(localFraction, 0.0, 1.0);\n else {\n if (fraction0 !== 0.0)\n localFraction = Math.max(localFraction, 0.0);\n if (fraction1 !== 1.0)\n localFraction = Math.min(localFraction, 1.0);\n }\n this._workPoint = point0.interpolate(localFraction, point1);\n const globalFraction = Geometry.interpolate(fraction0, localFraction, fraction1);\n this.announceCandidate(cp, globalFraction, this._workPoint);\n }\n\n private searchInterval() {\n if (this._functionA * this._functionB > 0) return;\n if (this._functionA === 0) this.announceSolutionFraction(this._fractionA);\n if (this._functionB === 0) this.announceSolutionFraction(this._fractionB);\n if (this._functionA * this._functionB < 0) {\n const fraction = Geometry.inverseInterpolate(this._fractionA, this._functionA, this._fractionB, this._functionB);\n if (fraction) {\n this._newtonSolver.setX(fraction);\n if (this._newtonSolver.runIterations())\n this.announceSolutionFraction(this._newtonSolver.getX());\n }\n }\n }\n\n private evaluateB(fractionB: number, dataB: Ray3d) {\n this._functionB = dataB.dotProductToPoint(this._spacePoint);\n this._fractionB = fractionB;\n }\n\n private announceSolutionFraction(fraction: number) {\n if (this._curve)\n this.announceCandidate(this._curve, fraction, this._curve.fractionToPoint(fraction));\n }\n\n public evaluate(fraction: number): boolean {\n let curve = this._curve;\n if (this._parentCurvePrimitive)\n curve = this._parentCurvePrimitive;\n if (curve) {\n this._workRay = curve.fractionToPointAndDerivative(fraction, this._workRay);\n this.currentF = this._workRay.dotProductToPoint(this._spacePoint);\n return true;\n }\n return false;\n }\n\n public announceRay(fraction: number, data: Ray3d): void {\n this.evaluateB(fraction, data);\n if (this._numThisCurve++ > 0) this.searchInterval();\n this._functionA = this._functionB;\n this._fractionA = this._fractionB;\n }\n\n public announcePointTangent(point: Point3d, fraction: number, tangent: Vector3d) {\n this._workRay.set(point, tangent);\n this.announceRay(fraction, this._workRay);\n }\n}\n"]}
1
+ {"version":3,"file":"ClosestPointStrokeHandler.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/ClosestPointStrokeHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { Geometry } from \"../../Geometry\";\nimport { IStrokeHandler } from \"../../geometry3d/GeometryHandler\";\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\nimport { Newton1dUnboundedApproximateDerivative } from \"../../numerics/Newton\";\nimport { CurveExtendOptions, VariantCurveExtendParameter } from \"../CurveExtendMode\";\nimport { CurveLocationDetail } from \"../CurveLocationDetail\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { NewtonRtoRStrokeHandler } from \"./NewtonRtoRStrokeHandler\";\n\n/**\n * Context for searching for the closest point to a CurvePrimitive.\n * @internal\n */\nexport class ClosestPointStrokeHandler extends NewtonRtoRStrokeHandler implements IStrokeHandler {\n private _curve: CurvePrimitive | undefined;\n private _closestPoint: CurveLocationDetail | undefined;\n private _spacePoint: Point3d;\n private _extend: VariantCurveExtendParameter;\n // fraction and function value on one side of an interval that may bracket a root\n private _fractionA: number = 0;\n private _functionA: number = 0;\n // fraction and function value on the other side of an interval that may bracket a root\n private _fractionB: number = 0;\n private _functionB: number = 0;\n private _numThisCurve: number = 0;\n // scratch vars to use within methods\n private _workPoint: Point3d;\n private _workRay: Ray3d;\n private _newtonSolver: Newton1dUnboundedApproximateDerivative;\n /** Constructor */\n public constructor(spacePoint: Point3d, extend?: VariantCurveExtendParameter, result?: CurveLocationDetail) {\n super();\n this._spacePoint = spacePoint;\n this._workPoint = Point3d.create();\n this._workRay = Ray3d.createZero();\n this._closestPoint = result;\n this._extend = extend ?? false;\n this.startCurvePrimitive(undefined);\n this._newtonSolver = new Newton1dUnboundedApproximateDerivative(this);\n }\n public claimResult(): CurveLocationDetail | undefined {\n if (this._closestPoint) {\n this._newtonSolver.setX(this._closestPoint.fraction);\n this._curve = this._closestPoint.curve;\n if (this._newtonSolver.runIterations()) {\n let fraction = this._newtonSolver.getX();\n fraction = CurveExtendOptions.correctFraction(this._extend, fraction);\n this.announceSolutionFraction(fraction);\n }\n }\n return this._closestPoint;\n }\n public needPrimaryGeometryForStrokes() {\n return true;\n }\n public startCurvePrimitive(curve: CurvePrimitive | undefined) {\n this._curve = curve;\n this._fractionA = 0.0;\n this._numThisCurve = 0;\n this._functionA = 0.0;\n }\n public endCurvePrimitive() {\n }\n public announceIntervalForUniformStepStrokes(\n cp: CurvePrimitive, numStrokes: number, fraction0: number, fraction1: number,\n ): void {\n this.startCurvePrimitive(cp);\n this.announceSolutionFraction(0.0); // test start point as closest\n this.announceSolutionFraction(1.0); // test end point as closest\n if (numStrokes < 1)\n numStrokes = 1;\n const df = 1.0 / numStrokes;\n for (let i = 0; i <= numStrokes; i++) {\n const fraction = Geometry.interpolate(fraction0, i * df, fraction1);\n cp.fractionToPointAndDerivative(fraction, this._workRay);\n this.announceRay(fraction, this._workRay);\n }\n }\n private announceCandidate(cp: CurvePrimitive, fraction: number, point: Point3d) {\n const distance = this._spacePoint.distance(point);\n if (this._closestPoint && distance > this._closestPoint.a)\n return;\n this._closestPoint = CurveLocationDetail.createCurveFractionPoint(cp, fraction, point, this._closestPoint);\n this._closestPoint.a = distance;\n if (this._parentCurvePrimitive !== undefined)\n this._closestPoint.curve = this._parentCurvePrimitive;\n }\n public announceSegmentInterval(\n cp: CurvePrimitive, point0: Point3d, point1: Point3d, _numStrokes: number, fraction0: number, fraction1: number,\n ): void {\n let localFraction = this._spacePoint.fractionOfProjectionToLine(point0, point1, 0.0);\n // only consider extending the segment if the immediate caller says we are at endpoints\n if (!this._extend)\n localFraction = Geometry.clampToStartEnd(localFraction, 0.0, 1.0);\n else {\n if (fraction0 !== 0.0)\n localFraction = Math.max(localFraction, 0.0);\n if (fraction1 !== 1.0)\n localFraction = Math.min(localFraction, 1.0);\n }\n this._workPoint = point0.interpolate(localFraction, point1);\n const globalFraction = Geometry.interpolate(fraction0, localFraction, fraction1);\n this.announceCandidate(cp, globalFraction, this._workPoint);\n }\n /**\n * Given a function `f` and (unordered) fractions `a` and `b`, search for and announce a root of `f` in this\n * fractional interval.\n * * This method searches for a root of `f` if and only if the stroke segment defined by `(a, f(a))` and\n * `(b, f(b))` has a root. This is a HEURISTIC: given continuous `f` between `a` and `b`, a root of the stroke\n * segment implies a root of `f`, but not vice-versa. Therefore, if the strokes are not sufficiently dense,\n * this method can miss a root of `f`.\n */\n private searchInterval() {\n if (this._functionA * this._functionB > 0)\n return; // stroke segment has no root; ASSUME the function has no root either\n if (this._functionA === 0)\n this.announceSolutionFraction(this._fractionA);\n if (this._functionB === 0)\n this.announceSolutionFraction(this._fractionB);\n // by the Intermediate Value Theorem, a root lies between fractionA and fractionB; use Newton to find it.\n if (this._functionA * this._functionB < 0) {\n const fraction = Geometry.inverseInterpolate(this._fractionA, this._functionA, this._fractionB, this._functionB);\n if (fraction) {\n this._newtonSolver.setX(fraction);\n if (this._newtonSolver.runIterations())\n this.announceSolutionFraction(this._newtonSolver.getX());\n }\n }\n }\n private announceSolutionFraction(fraction: number) {\n if (this._curve)\n this.announceCandidate(this._curve, fraction, this._curve.fractionToPoint(fraction));\n }\n /**\n * Evaluate the univariate real-valued function for which we are finding roots.\n * * For finding the closest point to curve X from point Q, this function is `f(t) := Q-X(t) dot X'(t)`.\n * * Either `pointAndDerivative` must be defined, or both `fraction` and `curve`.\n * @param pointAndDerivative pre-evaluated curve\n * @param fraction fraction at which to evaluate `curve`\n * @param curve curve to evaluate at `fraction`\n */\n private evaluateFunction(pointAndDerivative?: Ray3d, fraction?: number, curve?: CurvePrimitive): number | undefined {\n if (pointAndDerivative)\n this._workRay.setFrom(pointAndDerivative);\n else if (fraction !== undefined && curve)\n this._workRay = curve.fractionToPointAndDerivative(fraction, this._workRay);\n else\n return undefined;\n return this._workRay.dotProductToPoint(this._spacePoint);\n }\n public evaluate(fraction: number): boolean {\n let curve = this._curve;\n if (this._parentCurvePrimitive)\n curve = this._parentCurvePrimitive;\n const value = this.evaluateFunction(undefined, fraction, curve);\n if (value === undefined)\n return false;\n this.currentF = value;\n return true;\n }\n private announceRay(fraction: number, data: Ray3d): void {\n this._functionB = this.evaluateFunction(data)!;\n this._fractionB = fraction;\n if (this._numThisCurve++ > 0) // after the first stroke point, a stroke segment is defined, so we have an interval\n this.searchInterval();\n this._functionA = this._functionB;\n this._fractionA = this._fractionB;\n }\n public announcePointTangent(point: Point3d, fraction: number, tangent: Vector3d) {\n this._workRay.set(point, tangent);\n this.announceRay(fraction, this._workRay);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"CurveCurveIntersectXY.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveIntersectXY.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CurveCurveIntersectXY.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveIntersectXY.ts"],"names":[],"mappings":"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"}
@@ -261,6 +261,8 @@ class CurveCurveIntersectXY extends GeometryHandler_1.RecurseToCurvesGeometryHan
261
261
  // The line segment in question might be (a) a full line segment or (b) a fragment within a linestring.
262
262
  // The fraction and extend parameters allow all combinations to be passed in.
263
263
  dispatchSegmentArc(cpA, extendA0, pointA0, fractionA0, pointA1, fractionA1, extendA1, arc, extendB0, extendB1, reversed) {
264
+ const tol2 = this._coincidentGeometryContext.tolerance * this._coincidentGeometryContext.tolerance;
265
+ let dist2;
264
266
  // Arc: X = C + cU + sV
265
267
  // Line: contains points A0,A1
266
268
  // Arc point colinear with line if det (A0, A1, X) = 0
@@ -271,6 +273,10 @@ class CurveCurveIntersectXY extends GeometryHandler_1.RecurseToCurvesGeometryHan
271
273
  // project back to line.
272
274
  if (this._worldToLocalPerspective) {
273
275
  const data = arc.toTransformedPoint4d(this._worldToLocalPerspective);
276
+ const radians0 = data.sweep.fractionToRadians(0);
277
+ const pointB0H = data.center.plus2Scaled(data.vector0, Math.cos(radians0), data.vector90, Math.sin(radians0));
278
+ const radians1 = data.sweep.fractionToRadians(1);
279
+ const pointB1H = data.center.plus2Scaled(data.vector0, Math.cos(radians1), data.vector90, Math.sin(radians1));
274
280
  const pointA0H = this._worldToLocalPerspective.multiplyPoint3d(pointA0, 1);
275
281
  const pointA1H = this._worldToLocalPerspective.multiplyPoint3d(pointA1, 1);
276
282
  const alpha = Geometry_1.Geometry.tripleProductPoint4dXYW(pointA0H, pointA1H, data.center);
@@ -280,19 +286,31 @@ class CurveCurveIntersectXY extends GeometryHandler_1.RecurseToCurvesGeometryHan
280
286
  const sines = new GrowableFloat64Array_1.GrowableFloat64Array(2);
281
287
  const radians = new GrowableFloat64Array_1.GrowableFloat64Array(2);
282
288
  const numRoots = Polynomials_1.AnalyticRoots.appendImplicitLineUnitCircleIntersections(alpha, beta, gamma, cosines, sines, radians);
289
+ if (numRoots <= 0)
290
+ return;
283
291
  for (let i = 0; i < numRoots; i++) {
284
292
  const arcPoint = data.center.plus2Scaled(data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i));
285
- const arcFraction = data.sweep.radiansToSignedFraction(radians.atUncheckedIndex(i), extendB0);
293
+ let arcFraction = data.sweep.radiansToSignedFraction(radians.atUncheckedIndex(i), extendB0);
286
294
  const lineFraction = SmallSystem_1.SmallSystem.lineSegment3dHXYClosestPointUnbounded(pointA0H, pointA1H, arcPoint);
287
- if (lineFraction !== undefined &&
288
- this.acceptFraction(extendA0, lineFraction, extendA1) &&
289
- this.acceptFraction(extendB0, arcFraction, extendB1)) {
290
- this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed);
295
+ if (lineFraction !== undefined) {
296
+ if (this.acceptFraction(extendA0, lineFraction, extendA1) && this.acceptFraction(extendB0, arcFraction, extendB1)) {
297
+ this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed);
298
+ }
299
+ else { // check for endpoint intersections beyond parametric tolerance but within point tolerance
300
+ const pointAH = lineFraction < 0.5 ? pointA0H : pointA1H;
301
+ const pointBH = (arcFraction = data.sweep.fractionToSignedPeriodicFraction(arcFraction)) < 0.5 ? pointB0H : pointB1H;
302
+ if ((dist2 = pointAH.realDistanceSquaredXY(pointBH)) !== undefined && Geometry_1.Geometry.isDistanceWithinTol(dist2, tol2))
303
+ this.recordPointWithLocalFractions(lineFraction < 0.5 ? 0 : 1, cpA, fractionA0, fractionA1, arcFraction < 0.5 ? 0 : 1, arc, 0, 1, reversed);
304
+ }
291
305
  }
292
306
  }
293
307
  }
294
308
  else {
295
309
  const data = arc.toTransformedVectors(this._worldToLocalAffine);
310
+ const radians0 = data.sweep.fractionToRadians(0);
311
+ const pointB0Local = data.center.plus2Scaled(data.vector0, Math.cos(radians0), data.vector90, Math.sin(radians0));
312
+ const radians1 = data.sweep.fractionToRadians(1);
313
+ const pointB1Local = data.center.plus2Scaled(data.vector0, Math.cos(radians1), data.vector90, Math.sin(radians1));
296
314
  let pointA0Local = pointA0;
297
315
  let pointA1Local = pointA1;
298
316
  if (this._worldToLocalAffine) {
@@ -306,16 +324,22 @@ class CurveCurveIntersectXY extends GeometryHandler_1.RecurseToCurvesGeometryHan
306
324
  const sines = new GrowableFloat64Array_1.GrowableFloat64Array(2);
307
325
  const radians = new GrowableFloat64Array_1.GrowableFloat64Array(2);
308
326
  const numRoots = Polynomials_1.AnalyticRoots.appendImplicitLineUnitCircleIntersections(alpha, beta, gamma, cosines, sines, radians);
309
- const lineFractionTol = 1.0e-10; // TODO: why are we loosening tolerances here?
310
- const arcFractionTol = 1.0e-7;
327
+ if (numRoots <= 0)
328
+ return;
311
329
  for (let i = 0; i < numRoots; i++) {
312
330
  const arcPoint = data.center.plus2Scaled(data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i));
313
- const arcFraction = data.sweep.radiansToSignedFraction(radians.atUncheckedIndex(i), extendB0);
331
+ let arcFraction = data.sweep.radiansToSignedFraction(radians.atUncheckedIndex(i), extendB0);
314
332
  const lineFraction = SmallSystem_1.SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);
315
- if (lineFraction !== undefined &&
316
- this.acceptFraction(extendA0, lineFraction, extendA1, lineFractionTol) &&
317
- this.acceptFraction(extendB0, arcFraction, extendB1, arcFractionTol)) {
318
- this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed);
333
+ if (lineFraction !== undefined) {
334
+ if (this.acceptFraction(extendA0, lineFraction, extendA1) && this.acceptFraction(extendB0, arcFraction, extendB1)) {
335
+ this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed);
336
+ }
337
+ else { // check for endpoint intersections beyond parametric tolerance but within point tolerance
338
+ const pointALocal = lineFraction < 0.5 ? pointA0Local : pointA1Local;
339
+ const pointBLocal = (arcFraction = data.sweep.fractionToSignedPeriodicFraction(arcFraction)) < 0.5 ? pointB0Local : pointB1Local;
340
+ if ((dist2 = pointALocal.distanceSquaredXY(pointBLocal)) !== undefined && Geometry_1.Geometry.isDistanceWithinTol(dist2, tol2))
341
+ this.recordPointWithLocalFractions(lineFraction < 0.5 ? 0 : 1, cpA, fractionA0, fractionA1, arcFraction < 0.5 ? 0 : 1, arc, 0, 1, reversed);
342
+ }
319
343
  }
320
344
  }
321
345
  }