@itwin/core-geometry 5.2.0-dev.8 → 5.3.0-dev.1

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 (438) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/lib/cjs/Geometry.d.ts +30 -10
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +74 -10
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/AkimaCurve3d.d.ts +19 -6
  7. package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
  8. package/lib/cjs/bspline/AkimaCurve3d.js +21 -5
  9. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  10. package/lib/cjs/bspline/BSplineCurve.d.ts +3 -3
  11. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  12. package/lib/cjs/bspline/BSplineCurve.js +6 -6
  13. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  14. package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
  15. package/lib/cjs/bspline/BSplineCurveOps.js +1 -1
  16. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  17. package/lib/cjs/bspline/BezierCurveBase.d.ts +2 -2
  18. package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
  19. package/lib/cjs/bspline/BezierCurveBase.js +4 -6
  20. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  21. package/lib/cjs/bspline/InterpolationCurve3d.d.ts +27 -17
  22. package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
  23. package/lib/cjs/bspline/InterpolationCurve3d.js +17 -7
  24. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  25. package/lib/cjs/clipping/ClipPlane.d.ts +19 -6
  26. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  27. package/lib/cjs/clipping/ClipPlane.js +17 -2
  28. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  29. package/lib/cjs/clipping/ClipUtils.d.ts +14 -1
  30. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  31. package/lib/cjs/clipping/ClipUtils.js +21 -3
  32. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  33. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +14 -11
  34. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  35. package/lib/cjs/clipping/ConvexClipPlaneSet.js +23 -16
  36. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  37. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
  38. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  39. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +22 -5
  40. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  41. package/lib/cjs/curve/Arc3d.d.ts +27 -17
  42. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  43. package/lib/cjs/curve/Arc3d.js +61 -35
  44. package/lib/cjs/curve/Arc3d.js.map +1 -1
  45. package/lib/cjs/curve/CurveCollection.d.ts +1 -0
  46. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  47. package/lib/cjs/curve/CurveCollection.js +1 -0
  48. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  49. package/lib/cjs/curve/CurveLocationDetail.d.ts +8 -7
  50. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  51. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  52. package/lib/cjs/curve/CurveOps.d.ts +51 -1
  53. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  54. package/lib/cjs/curve/CurveOps.js +97 -3
  55. package/lib/cjs/curve/CurveOps.js.map +1 -1
  56. package/lib/cjs/curve/LineString3d.d.ts +4 -4
  57. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  58. package/lib/cjs/curve/LineString3d.js +8 -8
  59. package/lib/cjs/curve/LineString3d.js.map +1 -1
  60. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
  61. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  62. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +6 -2
  63. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  64. package/lib/cjs/curve/Query/PlanarSubdivision.js +12 -7
  65. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  66. package/lib/cjs/curve/RegionOps.d.ts +9 -4
  67. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  68. package/lib/cjs/curve/RegionOps.js +10 -5
  69. package/lib/cjs/curve/RegionOps.js.map +1 -1
  70. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  71. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +2 -1
  72. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  73. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +4 -4
  74. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  75. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +21 -18
  76. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  77. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  78. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +30 -50
  79. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  80. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +2 -2
  81. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  82. package/lib/cjs/curve/spiral/DirectSpiral3d.js +6 -2
  83. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  84. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
  85. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  86. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +6 -2
  87. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  88. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +5 -1
  89. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  90. package/lib/cjs/curve/spiral/TransitionSpiral3d.js +0 -3
  91. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  92. package/lib/cjs/geometry3d/AngleSweep.d.ts +6 -2
  93. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  94. package/lib/cjs/geometry3d/AngleSweep.js +12 -3
  95. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  96. package/lib/cjs/geometry3d/FrameBuilder.d.ts +2 -1
  97. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  98. package/lib/cjs/geometry3d/FrameBuilder.js +14 -18
  99. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  100. package/lib/cjs/geometry3d/Matrix3d.d.ts +1 -1
  101. package/lib/cjs/geometry3d/Matrix3d.js +1 -1
  102. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  103. package/lib/cjs/geometry3d/Point2dVector2d.d.ts +18 -2
  104. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  105. package/lib/cjs/geometry3d/Point2dVector2d.js +37 -4
  106. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  107. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  108. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  109. package/lib/cjs/geometry3d/Point3dVector3d.js +1 -0
  110. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  111. package/lib/cjs/geometry3d/PointStreaming.d.ts +8 -0
  112. package/lib/cjs/geometry3d/PointStreaming.d.ts.map +1 -1
  113. package/lib/cjs/geometry3d/PointStreaming.js +18 -2
  114. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  115. package/lib/cjs/geometry3d/PolygonOps.d.ts +18 -9
  116. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  117. package/lib/cjs/geometry3d/PolygonOps.js +53 -26
  118. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  119. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
  120. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  121. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
  122. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  123. package/lib/cjs/geometry3d/PolylineOps.d.ts +14 -3
  124. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  125. package/lib/cjs/geometry3d/PolylineOps.js +20 -4
  126. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  127. package/lib/cjs/geometry3d/Range.d.ts +34 -32
  128. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  129. package/lib/cjs/geometry3d/Range.js +28 -21
  130. package/lib/cjs/geometry3d/Range.js.map +1 -1
  131. package/lib/cjs/geometry3d/Ray2d.d.ts +16 -6
  132. package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
  133. package/lib/cjs/geometry3d/Ray2d.js +28 -4
  134. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  135. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  136. package/lib/cjs/geometry3d/Ray3d.js +3 -4
  137. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  138. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  139. package/lib/cjs/geometry3d/Transform.js +1 -1
  140. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  141. package/lib/cjs/geometry3d/XYZProps.d.ts +12 -1
  142. package/lib/cjs/geometry3d/XYZProps.d.ts.map +1 -1
  143. package/lib/cjs/geometry3d/XYZProps.js +17 -2
  144. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  145. package/lib/cjs/geometry4d/Matrix4d.d.ts +16 -0
  146. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  147. package/lib/cjs/geometry4d/Matrix4d.js +26 -0
  148. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  149. package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
  150. package/lib/cjs/numerics/BezierPolynomials.js +5 -9
  151. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  152. package/lib/cjs/numerics/SmallSystem.d.ts +13 -7
  153. package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
  154. package/lib/cjs/numerics/SmallSystem.js +13 -7
  155. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  156. package/lib/cjs/polyface/Polyface.d.ts +1 -3
  157. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  158. package/lib/cjs/polyface/Polyface.js +2 -6
  159. package/lib/cjs/polyface/Polyface.js.map +1 -1
  160. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +25 -6
  161. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  162. package/lib/cjs/polyface/PolyfaceBuilder.js +59 -8
  163. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  164. package/lib/cjs/polyface/PolyfaceData.d.ts +2 -0
  165. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  166. package/lib/cjs/polyface/PolyfaceData.js +7 -3
  167. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  168. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  169. package/lib/cjs/polyface/PolyfaceQuery.js +8 -10
  170. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  171. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
  172. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
  173. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
  174. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  175. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
  176. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
  177. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
  178. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  179. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
  180. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  181. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +9 -12
  182. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  183. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
  184. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  185. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
  186. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  187. package/lib/cjs/serialization/DeepCompare.js +1 -1
  188. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  189. package/lib/cjs/serialization/GeometrySamples.d.ts +2 -1
  190. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  191. package/lib/cjs/serialization/GeometrySamples.js +2 -1
  192. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  193. package/lib/cjs/topology/Graph.d.ts +38 -12
  194. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  195. package/lib/cjs/topology/Graph.js +91 -23
  196. package/lib/cjs/topology/Graph.js.map +1 -1
  197. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
  198. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
  199. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
  200. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  201. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +20 -11
  202. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  203. package/lib/cjs/topology/HalfEdgeGraphSearch.js +43 -39
  204. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  205. package/lib/cjs/topology/Merging.d.ts +7 -4
  206. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  207. package/lib/cjs/topology/Merging.js +16 -11
  208. package/lib/cjs/topology/Merging.js.map +1 -1
  209. package/lib/cjs/topology/Triangulation.d.ts +13 -11
  210. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  211. package/lib/cjs/topology/Triangulation.js +40 -36
  212. package/lib/cjs/topology/Triangulation.js.map +1 -1
  213. package/lib/cjs/topology/Voronoi.d.ts +195 -0
  214. package/lib/cjs/topology/Voronoi.d.ts.map +1 -0
  215. package/lib/cjs/topology/Voronoi.js +700 -0
  216. package/lib/cjs/topology/Voronoi.js.map +1 -0
  217. package/lib/cjs/topology/XYParitySearchContext.d.ts +1 -1
  218. package/lib/cjs/topology/XYParitySearchContext.d.ts.map +1 -1
  219. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  220. package/lib/esm/Geometry.d.ts +30 -10
  221. package/lib/esm/Geometry.d.ts.map +1 -1
  222. package/lib/esm/Geometry.js +74 -10
  223. package/lib/esm/Geometry.js.map +1 -1
  224. package/lib/esm/bspline/AkimaCurve3d.d.ts +19 -6
  225. package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
  226. package/lib/esm/bspline/AkimaCurve3d.js +21 -5
  227. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  228. package/lib/esm/bspline/BSplineCurve.d.ts +3 -3
  229. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  230. package/lib/esm/bspline/BSplineCurve.js +6 -6
  231. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  232. package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
  233. package/lib/esm/bspline/BSplineCurveOps.js +1 -1
  234. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  235. package/lib/esm/bspline/BezierCurveBase.d.ts +2 -2
  236. package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
  237. package/lib/esm/bspline/BezierCurveBase.js +4 -6
  238. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  239. package/lib/esm/bspline/InterpolationCurve3d.d.ts +27 -17
  240. package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
  241. package/lib/esm/bspline/InterpolationCurve3d.js +17 -7
  242. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  243. package/lib/esm/clipping/ClipPlane.d.ts +19 -6
  244. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  245. package/lib/esm/clipping/ClipPlane.js +17 -2
  246. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  247. package/lib/esm/clipping/ClipUtils.d.ts +14 -1
  248. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  249. package/lib/esm/clipping/ClipUtils.js +21 -3
  250. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  251. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +14 -11
  252. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  253. package/lib/esm/clipping/ConvexClipPlaneSet.js +23 -16
  254. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  255. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
  256. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  257. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +22 -5
  258. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  259. package/lib/esm/curve/Arc3d.d.ts +27 -17
  260. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  261. package/lib/esm/curve/Arc3d.js +61 -35
  262. package/lib/esm/curve/Arc3d.js.map +1 -1
  263. package/lib/esm/curve/CurveCollection.d.ts +1 -0
  264. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  265. package/lib/esm/curve/CurveCollection.js +1 -0
  266. package/lib/esm/curve/CurveCollection.js.map +1 -1
  267. package/lib/esm/curve/CurveLocationDetail.d.ts +8 -7
  268. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  269. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  270. package/lib/esm/curve/CurveOps.d.ts +51 -1
  271. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  272. package/lib/esm/curve/CurveOps.js +98 -4
  273. package/lib/esm/curve/CurveOps.js.map +1 -1
  274. package/lib/esm/curve/LineString3d.d.ts +4 -4
  275. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  276. package/lib/esm/curve/LineString3d.js +8 -8
  277. package/lib/esm/curve/LineString3d.js.map +1 -1
  278. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
  279. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  280. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +6 -2
  281. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  282. package/lib/esm/curve/Query/PlanarSubdivision.js +12 -7
  283. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  284. package/lib/esm/curve/RegionOps.d.ts +9 -4
  285. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  286. package/lib/esm/curve/RegionOps.js +10 -5
  287. package/lib/esm/curve/RegionOps.js.map +1 -1
  288. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  289. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +2 -1
  290. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  291. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +4 -4
  292. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  293. package/lib/esm/curve/internalContexts/MultiChainCollector.js +21 -18
  294. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  295. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  296. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +30 -50
  297. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  298. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +2 -2
  299. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  300. package/lib/esm/curve/spiral/DirectSpiral3d.js +6 -2
  301. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  302. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
  303. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  304. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +6 -2
  305. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  306. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +5 -1
  307. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  308. package/lib/esm/curve/spiral/TransitionSpiral3d.js +0 -3
  309. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  310. package/lib/esm/geometry3d/AngleSweep.d.ts +6 -2
  311. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  312. package/lib/esm/geometry3d/AngleSweep.js +12 -3
  313. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  314. package/lib/esm/geometry3d/FrameBuilder.d.ts +2 -1
  315. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  316. package/lib/esm/geometry3d/FrameBuilder.js +14 -18
  317. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  318. package/lib/esm/geometry3d/Matrix3d.d.ts +1 -1
  319. package/lib/esm/geometry3d/Matrix3d.js +1 -1
  320. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  321. package/lib/esm/geometry3d/Point2dVector2d.d.ts +18 -2
  322. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  323. package/lib/esm/geometry3d/Point2dVector2d.js +37 -4
  324. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  325. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  326. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  327. package/lib/esm/geometry3d/Point3dVector3d.js +1 -0
  328. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  329. package/lib/esm/geometry3d/PointStreaming.d.ts +8 -0
  330. package/lib/esm/geometry3d/PointStreaming.d.ts.map +1 -1
  331. package/lib/esm/geometry3d/PointStreaming.js +18 -2
  332. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  333. package/lib/esm/geometry3d/PolygonOps.d.ts +18 -9
  334. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  335. package/lib/esm/geometry3d/PolygonOps.js +53 -26
  336. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  337. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
  338. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  339. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
  340. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  341. package/lib/esm/geometry3d/PolylineOps.d.ts +14 -3
  342. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  343. package/lib/esm/geometry3d/PolylineOps.js +20 -4
  344. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  345. package/lib/esm/geometry3d/Range.d.ts +34 -32
  346. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  347. package/lib/esm/geometry3d/Range.js +28 -21
  348. package/lib/esm/geometry3d/Range.js.map +1 -1
  349. package/lib/esm/geometry3d/Ray2d.d.ts +16 -6
  350. package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
  351. package/lib/esm/geometry3d/Ray2d.js +28 -4
  352. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  353. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  354. package/lib/esm/geometry3d/Ray3d.js +3 -4
  355. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  356. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  357. package/lib/esm/geometry3d/Transform.js +1 -1
  358. package/lib/esm/geometry3d/Transform.js.map +1 -1
  359. package/lib/esm/geometry3d/XYZProps.d.ts +12 -1
  360. package/lib/esm/geometry3d/XYZProps.d.ts.map +1 -1
  361. package/lib/esm/geometry3d/XYZProps.js +16 -1
  362. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  363. package/lib/esm/geometry4d/Matrix4d.d.ts +16 -0
  364. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  365. package/lib/esm/geometry4d/Matrix4d.js +26 -0
  366. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  367. package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
  368. package/lib/esm/numerics/BezierPolynomials.js +5 -9
  369. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  370. package/lib/esm/numerics/SmallSystem.d.ts +13 -7
  371. package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
  372. package/lib/esm/numerics/SmallSystem.js +13 -7
  373. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  374. package/lib/esm/polyface/Polyface.d.ts +1 -3
  375. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  376. package/lib/esm/polyface/Polyface.js +2 -6
  377. package/lib/esm/polyface/Polyface.js.map +1 -1
  378. package/lib/esm/polyface/PolyfaceBuilder.d.ts +25 -6
  379. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  380. package/lib/esm/polyface/PolyfaceBuilder.js +59 -8
  381. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  382. package/lib/esm/polyface/PolyfaceData.d.ts +2 -0
  383. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  384. package/lib/esm/polyface/PolyfaceData.js +7 -3
  385. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  386. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  387. package/lib/esm/polyface/PolyfaceQuery.js +8 -10
  388. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  389. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
  390. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
  391. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
  392. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  393. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
  394. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
  395. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
  396. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  397. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
  398. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  399. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +9 -12
  400. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  401. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
  402. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  403. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
  404. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  405. package/lib/esm/serialization/DeepCompare.js +1 -1
  406. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  407. package/lib/esm/serialization/GeometrySamples.d.ts +2 -1
  408. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  409. package/lib/esm/serialization/GeometrySamples.js +2 -1
  410. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  411. package/lib/esm/topology/Graph.d.ts +38 -12
  412. package/lib/esm/topology/Graph.d.ts.map +1 -1
  413. package/lib/esm/topology/Graph.js +92 -24
  414. package/lib/esm/topology/Graph.js.map +1 -1
  415. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
  416. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
  417. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
  418. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  419. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +20 -11
  420. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  421. package/lib/esm/topology/HalfEdgeGraphSearch.js +43 -39
  422. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  423. package/lib/esm/topology/Merging.d.ts +7 -4
  424. package/lib/esm/topology/Merging.d.ts.map +1 -1
  425. package/lib/esm/topology/Merging.js +17 -12
  426. package/lib/esm/topology/Merging.js.map +1 -1
  427. package/lib/esm/topology/Triangulation.d.ts +13 -11
  428. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  429. package/lib/esm/topology/Triangulation.js +40 -36
  430. package/lib/esm/topology/Triangulation.js.map +1 -1
  431. package/lib/esm/topology/Voronoi.d.ts +195 -0
  432. package/lib/esm/topology/Voronoi.d.ts.map +1 -0
  433. package/lib/esm/topology/Voronoi.js +696 -0
  434. package/lib/esm/topology/Voronoi.js.map +1 -0
  435. package/lib/esm/topology/XYParitySearchContext.d.ts +1 -1
  436. package/lib/esm/topology/XYParitySearchContext.d.ts.map +1 -1
  437. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  438. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"BSplineCurveOps.js","sourceRoot":"","sources":["../../../src/bspline/BSplineCurveOps.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 Bspline\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\nimport { BandedSystem } from \"../numerics/BandedSystem\";\nimport { BSplineCurve3d } from \"./BSplineCurve\";\nimport { InterpolationCurve3dOptions, InterpolationCurve3dProps } from \"./InterpolationCurve3d\";\nimport { BSplineWrapMode, KnotVector } from \"./KnotVector\";\n\n/**\n * A class with static methods for creating B-spline curves.\n * @public\n */\nexport class BSplineCurveOps {\n /**\n * Greville knot algorithm: alternative to traditional c2 cubic algorithm allowing for any order, but no end conditions or periodicity.\n * @param points pass-through points.\n * @param order bspline order (1 more than degree)\n */\n public static createThroughPoints(points: IndexedXYZCollection | Point3d[], order: number): BSplineCurve3d | undefined {\n const numPoints = points.length;\n if (order > numPoints || order < 2)\n return undefined;\n const degree = order - 1;\n const bw = 1 + 2 * degree; // probably less than that . . just zeros at fringe.\n const matrix = new Float64Array(bw * numPoints);\n const basisFunctions = new Float64Array(order);\n const rhs = new GrowableXYZArray();\n const knots = KnotVector.createUniformClamped(numPoints, order - 1, 0.0, 1.0);\n const xyz = Point3d.create();\n for (let basePointIndex = 0; basePointIndex < numPoints; basePointIndex++) {\n const u = knots.grevilleKnot(basePointIndex);\n const spanIndex = knots.knotToLeftKnotIndex(u);\n knots.evaluateBasisFunctions(spanIndex, u, basisFunctions);\n // puzzlement .. how do the max points shift within the order spots?\n let maxIndex = 0;\n for (let i = 1; i < order; i++)\n if (basisFunctions[i] > basisFunctions[maxIndex])\n maxIndex = i;\n const basisFunctionStartWithinRow = degree - maxIndex;\n const rowStart = basePointIndex * bw;\n for (let i = 0; i < order; i++) {\n const realColumn = basePointIndex - degree + basisFunctionStartWithinRow + i;\n if (rowStart + realColumn >= 0 && realColumn < numPoints)\n matrix[rowStart + basisFunctionStartWithinRow + i] = basisFunctions[i];\n }\n if (points instanceof IndexedXYZCollection) {\n rhs.push(points.getPoint3dAtUncheckedPointIndex(basePointIndex, xyz));\n } else {\n rhs.push(points[basePointIndex].clone());\n }\n }\n const poles = BandedSystem.solveBandedSystemMultipleRHS(numPoints, bw, matrix, 3, rhs.float64Data());\n if (poles) {\n return BSplineCurve3d.create(poles, knots.knots, order);\n }\n return undefined;\n }\n\n /**\n * Construct BSplineCurve3d that fit points using the C2 cubic algorithm.\n * @param options curve definition, unmodified\n */\n public static createThroughPointsC2Cubic(options: InterpolationCurve3dOptions): BSplineCurve3d | undefined {\n // Work on a copy rather than installing computed knots/tangents that could become stale when fit points change\n // Knots/tangents that come in, however, are used without recomputation.\n const validatedOptions = options.clone();\n if (!this.C2CubicFit.validateOptions(validatedOptions))\n return undefined;\n\n const poles = this.C2CubicFit.constructPoles(validatedOptions);\n if (undefined === poles)\n return undefined;\n\n const fullKnots = this.C2CubicFit.convertFitParamsToCubicKnotVector(validatedOptions.knots, validatedOptions.closed);\n if (undefined === fullKnots)\n return undefined;\n\n const interpolant = BSplineCurve3d.create(poles, fullKnots, validatedOptions.order);\n\n if (validatedOptions.closed)\n interpolant?.setWrappable(BSplineWrapMode.OpenByAddingControlPoints);\n\n return interpolant;\n }\n}\n\n/**\n * Namespace for collecting curve fit API\n * @public\n */\nexport namespace BSplineCurveOps {\n /**\n * A helper class for creating C2 cubic fit curves.\n * Knots herein are understood to be *interior* knots (including the start/end knot),\n * so that there is one knot per fit point. In other words, the knots are fit parameters.\n * @private\n */\n export class C2CubicFit {\n /** Transform fit parameters to span [0,1]\n * @param knots fit parameters, normalized in place\n */\n private static normalizeKnots(knots: number[] | undefined): boolean {\n if (undefined === knots || knots.length < 2) {\n knots = undefined;\n return false;\n }\n const myKnots = KnotVector.create(knots, 1, false); // no extra knots at start/end\n if (!myKnots.normalize()) {\n knots = undefined;\n return false;\n }\n for (let i = 0; i < knots.length; ++i)\n knots[i] = myKnots.knots[i];\n return true;\n }\n\n /** Compute chord-length fit parameters for C2 cubic fit algorithm */\n private static constructChordLengthParameters(fitPoints: Point3d[]): number[] | undefined {\n if (fitPoints.length < 2)\n return undefined;\n const params: number[] = [0.0];\n for (let i = 1; i < fitPoints.length; ++i)\n params[i] = params[i - 1] + fitPoints[i].distance(fitPoints[i - 1]);\n if (!this.normalizeKnots(params))\n return undefined;\n return params;\n }\n\n /** Compute uniform fit parameters for C2 cubic fit algorithm */\n private static constructUniformParameters(numParams: number): number[] | undefined {\n if (numParams < 2)\n return undefined;\n const knots = KnotVector.createUniformClamped(numParams + 2, 3, 0.0, 1.0);\n const params: number[] = [];\n for (let i = knots.leftKnotIndex; i <= knots.rightKnotIndex; ++i)\n params.push(knots.knots[i]);\n return params;\n }\n\n /** Remove duplicate fit points, and their given knots in parallel */\n private static removeDuplicateFitPoints(options: InterpolationCurve3dOptions): boolean {\n if (undefined !== options.knots && options.knots.length !== options.fitPoints.length)\n options.knots = undefined;\n const carrier = new Point3dArrayCarrier(options.fitPoints);\n const indices = carrier.findOrderedDuplicates(undefined, true); // use default tolerance\n if (indices.length > 0) {\n // remove duplicate fit points, and their corresponding params\n let iWrite = 0;\n for (let iRead = 0, iIndex = 0; iRead < options.fitPoints.length; ++iRead) {\n if (iIndex < indices.length && iRead === indices[iIndex])\n ++iIndex; // skip the duplicate\n else {\n options.fitPoints[iWrite] = options.fitPoints[iRead];\n if (options.knots)\n options.knots[iWrite] = options.knots[iRead];\n ++iWrite;\n }\n }\n options.fitPoints.splice(iWrite);\n if (options.knots)\n options.knots.splice(iWrite);\n }\n return true;\n }\n\n /** Construct fit parameters for the c2 cubic fit algorithm.\n * @param fitPoints validated fit points (should not contain duplicates)\n * @param isChordLength whether knots are computed using distances between successive fit points\n * @param closed whether curve is periodically defined\n * @return fit parameters, one per fit point\n */\n public static constructFitParametersFromPoints(fitPoints: Point3d[], isChordLength: number | undefined, closed: boolean | undefined): number[] | undefined {\n let params: number[] | undefined;\n if (isChordLength || !closed)\n params = this.constructChordLengthParameters(fitPoints);\n if (undefined === params)\n params = this.constructUniformParameters(fitPoints.length);\n return params;\n }\n\n /** Construct fit parameters for the c2 cubic fit algorithm, if they are missing.\n * @param options validated as per validateOptions, possibly modified\n * @return whether fit parameters are valid\n */\n public static constructFitParameters(options: InterpolationCurve3dOptions): boolean {\n if (undefined === options.knots)\n options.knots = this.constructFitParametersFromPoints(options.fitPoints, options.isChordLenKnots, options.closed);\n return options.knots?.length === options.fitPoints.length;\n }\n\n /** Compute a row of the tridiagonal system matrix from Farin.\n * @param alpha sub-diagonal, length = # fit points\n * @param beta diagonal, length = # fit points\n * @param gamma super-diagonal, length = # fit points\n * @param index 0-based row index to set\n */\n private static computeAlphaBetaGamma(alpha: number[], beta: number[], gamma: number[], index: number, deltaIPlus1: number, deltaI: number, deltaIMinus1: number, deltaIMinus2: number) {\n let denomReciprocal = 1.0 / (deltaIMinus2 + deltaIMinus1 + deltaI);\n alpha[index] = deltaI * deltaI * denomReciprocal;\n beta[index] = deltaI * (deltaIMinus2 + deltaIMinus1) * denomReciprocal;\n\n denomReciprocal = 1.0 / (deltaIMinus1 + deltaI + deltaIPlus1);\n beta[index] += deltaIMinus1 * (deltaI + deltaIPlus1) * denomReciprocal;\n gamma[index] = deltaIMinus1 * deltaIMinus1 * denomReciprocal;\n\n denomReciprocal = 1.0 / (deltaIMinus1 + deltaI);\n alpha[index] *= denomReciprocal;\n beta[index] *= denomReciprocal;\n gamma[index] *= denomReciprocal;\n }\n\n /** Setup tridiagonal system for 2 fit points\n * @param alpha sub-diagonal, length = 2\n * @param beta diagonal, length = 2\n * @param gamma super-diagonal, length = 2\n */\n private static setUpSystem2Points(alpha: number[], beta: number[], gamma: number[]): boolean {\n if (alpha.length !== 2 || beta.length !== 2 || gamma.length !== 2)\n return false;\n\n // identity matrix\n alpha[0] = alpha[1] = gamma[0] = gamma[1] = 0.0;\n beta[0] = beta[1] = 1.0;\n return true;\n }\n\n /** Setup tridiagonal system for 3 fit points\n * @param alpha sub-diagonal, length = 3\n * @param beta diagonal, length = 3\n * @param gamma super-diagonal, length = 3\n * @param options validated as per validateOptions, unmodified\n * @param useNaturalStartTangent whether to bake the natural end condition into the first row\n * @param useNaturalEndTangent whether to bake the natural end condition into the last row\n */\n private static setUpSystem3Points(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions, useNaturalStartTangent: boolean, useNaturalEndTangent: boolean): boolean {\n if (undefined === options.knots)\n return false;\n if (alpha.length !== 3 || beta.length !== 3 || gamma.length !== 3)\n return false;\n if (options.knots.length !== 3 || options.fitPoints.length !== 3)\n return false;\n\n let deltaIPlus1 = 0, deltaI = 0, deltaIMinus1 = 0, deltaIMinus2 = 0, sum = 0, sumReciprocal = 0;\n\n // first row\n if (useNaturalStartTangent) {\n alpha[0] = 0.0;\n deltaI = options.knots[1] - options.knots[0];\n deltaIPlus1 = options.knots[2] - options.knots[1];\n sum = deltaI + deltaIPlus1;\n sumReciprocal = 1.0 / sum;\n beta[0] = (deltaI + sum) * sumReciprocal;\n gamma[0] = -deltaI * sumReciprocal;\n } else {\n alpha[0] = gamma[0] = 0.0;\n beta[0] = 1.0;\n }\n\n // middle row\n deltaIMinus1 = options.knots[1] - options.knots[0];\n deltaI = options.knots[2] - options.knots[1];\n sumReciprocal = 1.0 / (deltaIMinus1 + deltaI);\n sumReciprocal *= sumReciprocal;\n alpha[1] = deltaI * deltaI * sumReciprocal;\n beta[1] = 2.0 * (deltaI * deltaIMinus1) * sumReciprocal;\n gamma[1] = deltaIMinus1 * deltaIMinus1 * sumReciprocal;\n\n // last row\n if (useNaturalEndTangent) {\n deltaIMinus1 = options.knots[2] - options.knots[1];\n deltaIMinus2 = options.knots[1] - options.knots[0];\n sum = deltaIMinus2 + deltaIMinus1;\n sumReciprocal = 1.0 / sum;\n alpha[2] = -deltaIMinus1 * sumReciprocal;\n beta[2] = (deltaIMinus1 + sum) * sumReciprocal;\n gamma[2] = 0.0;\n } else {\n alpha[2] = gamma[2] = 0.0;\n beta[2] = 1.0;\n }\n return true;\n }\n\n /** Setup tridiagonal system for 4 fit points or more\n * @param alpha sub-diagonal, length = # fit points\n * @param beta diagonal, length = # fit points\n * @param gamma super-diagonal, length = # fit points\n * @param options validated as per validateOptions, unmodified\n * @param useNaturalStartTangent whether to bake the natural end condition into the first row\n * @param useNaturalEndTangent whether to bake the natural end condition into the last row\n */\n private static setUpSystem4PointsOrMore(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions, useNaturalStartTangent: boolean, useNaturalEndTangent: boolean): boolean {\n if (undefined === options.knots)\n return false;\n if (alpha.length !== beta.length || alpha.length !== gamma.length || alpha.length !== options.knots.length)\n return false;\n if (options.knots.length !== options.fitPoints.length)\n return false;\n\n const numIntervals = options.fitPoints.length - 1;\n const numIntervalsMinus1 = numIntervals - 1;\n let deltaIPlus1 = 0, deltaI = 0, deltaIMinus1 = 0, deltaIMinus2 = 0, sum = 0, sumReciprocal = 0;\n\n if (options.closed) {\n // first row\n deltaI = options.knots[1] - options.knots[0];\n deltaIMinus2 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\n deltaIMinus1 = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\n deltaIPlus1 = options.knots[2] - options.knots[1];\n this.computeAlphaBetaGamma(alpha, beta, gamma, 0, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n\n // second row\n deltaIMinus2 = deltaIMinus1;\n deltaIMinus1 = deltaI;\n deltaI = options.knots[2] - options.knots[1];\n deltaIPlus1 = options.knots[3] - options.knots[2];\n this.computeAlphaBetaGamma(alpha, beta, gamma, 1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n\n // last row; there's one less equation than open case\n deltaIPlus1 = deltaIMinus1;\n deltaI = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\n deltaIMinus2 = options.knots[numIntervalsMinus1 - 1] - options.knots[numIntervalsMinus1 - 2];\n deltaIMinus1 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\n this.computeAlphaBetaGamma(alpha, beta, gamma, numIntervalsMinus1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n } else { // open\n // first row\n if (useNaturalStartTangent) {\n alpha[0] = 0.0;\n deltaI = options.knots[1] - options.knots[0];\n deltaIPlus1 = options.knots[2] - options.knots[1];\n sum = deltaI + deltaIPlus1;\n sumReciprocal = 1.0 / sum;\n beta[0] = (deltaI + sum) * sumReciprocal;\n gamma[0] = -deltaI * sumReciprocal;\n } else {\n alpha[0] = gamma[0] = 0.0;\n beta[0] = 1.0;\n }\n\n // second row\n deltaI = options.knots[2] - options.knots[1];\n deltaIMinus1 = options.knots[1] - options.knots[0];\n deltaIMinus2 = 0.0;\n deltaIPlus1 = options.knots[3] - options.knots[2];\n this.computeAlphaBetaGamma(alpha, beta, gamma, 1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n\n // penultimate row\n deltaI = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\n deltaIMinus1 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\n deltaIMinus2 = options.knots[numIntervalsMinus1 - 1] - options.knots[numIntervalsMinus1 - 2];\n deltaIPlus1 = 0.0;\n this.computeAlphaBetaGamma(alpha, beta, gamma, numIntervalsMinus1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n\n // last row\n if (useNaturalEndTangent) {\n deltaIMinus1 = options.knots[numIntervals] - options.knots[numIntervals - 1];\n deltaIMinus2 = options.knots[numIntervals - 1] - options.knots[numIntervals - 2];\n sum = deltaIMinus2 + deltaIMinus1;\n sumReciprocal = 1.0 / sum;\n alpha[numIntervals] = -deltaIMinus1 * sumReciprocal;\n beta[numIntervals] = (deltaIMinus1 + sum) * sumReciprocal;\n gamma[numIntervals] = 0.0;\n } else {\n alpha[numIntervals] = gamma[numIntervals] = 0.0;\n beta[numIntervals] = 1.0;\n }\n }\n\n // middle rows\n for (let i = 2; i < numIntervalsMinus1; ++i) {\n deltaI = options.knots[i + 1] - options.knots[i];\n deltaIMinus2 = options.knots[i - 1] - options.knots[i - 2];\n deltaIMinus1 = options.knots[i] - options.knots[i - 1];\n deltaIPlus1 = options.knots[i + 2] - options.knots[i + 1];\n this.computeAlphaBetaGamma(alpha, beta, gamma, i, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n }\n return true;\n }\n\n /** Setup tridiagonal system\n * @param alpha sub-diagonal, length = # fitPoints\n * @param beta diagonal, length = # fitPoints\n * @param gamma super-diagonal, length = # fitPoints\n * @param options validated as per validateOptions, unmodified\n */\n private static setUpSystem(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions): boolean {\n let useNaturalStartTangent = false;\n let useNaturalEndTangent = false;\n if (options.isNaturalTangents && !options.closed) {\n useNaturalStartTangent = (undefined === options.startTangent);\n useNaturalEndTangent = (undefined === options.endTangent);\n }\n\n let succeeded = false;\n if (2 === options.fitPoints.length)\n succeeded = this.setUpSystem2Points(alpha, beta, gamma);\n else if (3 === options.fitPoints.length)\n succeeded = this.setUpSystem3Points(alpha, beta, gamma, options, useNaturalStartTangent, useNaturalEndTangent);\n else if (4 <= options.fitPoints.length)\n succeeded = this.setUpSystem4PointsOrMore(alpha, beta, gamma, options, useNaturalStartTangent, useNaturalEndTangent);\n\n return succeeded;\n }\n\n /** Set the Bessel end condition for the linear system.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n * @param atStart whether end condition is for start of curve (false: end of curve)\n */\n private static setBesselEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\n if (dataPts.length !== options.fitPoints.length + 2)\n return false;\n if (undefined === options.knots)\n return false;\n\n const scale = 1.0/3.0;\n const numIntervals = options.fitPoints.length - 1;\n\n if (1 === numIntervals) { // linear Bezier\n if (atStart)\n dataPts[0].interpolate(scale, dataPts[3], dataPts[1]);\n else\n dataPts[3].interpolate(scale, dataPts[0], dataPts[2]);\n return true;\n }\n\n if (2 === numIntervals) {\n const alpha = (options.knots[2] - options.knots[1]) / (options.knots[2] - options.knots[0]);\n const beta = 1.0 - alpha;\n const temp = dataPts[2].plus2Scaled(dataPts[0], -alpha * alpha, dataPts[4], -beta * beta);\n if (atStart)\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * alpha), dataPts[0], alpha).interpolate(scale, dataPts[0], dataPts[1]);\n else\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * beta), dataPts[4], beta).interpolate(scale, dataPts[4], dataPts[3]);\n return true;\n }\n\n // numIntervals > 2\n if (atStart) {\n const alpha = (options.knots[2] - options.knots[1]) / (options.knots[2] - options.knots[0]);\n const beta = 1.0 - alpha;\n const temp = dataPts[2].plus2Scaled(dataPts[0], -alpha * alpha, dataPts[3], -beta * beta);\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * alpha), dataPts[0], alpha).interpolate(scale, dataPts[0], dataPts[1]);\n } else {\n const alpha = (options.knots[numIntervals] - options.knots[numIntervals - 1]) / (options.knots[numIntervals] - options.knots[numIntervals - 2]);\n const beta = 1.0 - alpha;\n const temp = dataPts[numIntervals].plus2Scaled(dataPts[numIntervals - 1], -alpha * alpha, dataPts[numIntervals + 2], -beta * beta);\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * beta), dataPts[numIntervals + 2], beta).interpolate(scale, dataPts[numIntervals + 2], dataPts[numIntervals + 1]);\n }\n return true;\n }\n\n /** Set the natural end condition for the linear system.\n * This is the end condition used by ADSK for fit-splines with a given zero tangent.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n * @param atStart whether end condition is for start of curve (false: end of curve)\n */\n private static setNaturalEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\n if (dataPts.length !== options.fitPoints.length + 2)\n return false;\n\n const numIntervals = options.fitPoints.length - 1;\n if (1 === numIntervals)\n return this.setBesselEndCondition(dataPts, options, atStart);\n\n if (atStart)\n dataPts[1] = dataPts[0];\n else\n dataPts[dataPts.length - 2] = dataPts[dataPts.length - 1];\n return true;\n }\n\n /** Set the end condition for the linear system to the given tangent, scaled by chord length.\n * This is the end condition used by ADSK for fit-splines with a given nonzero tangent.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n * @param atStart whether end condition is for start of curve (false: end of curve)\n */\n private static setChordLengthScaledEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\n if (dataPts.length !== options.fitPoints.length + 2)\n return false;\n\n const tangent = atStart ? options.startTangent : options.endTangent;\n if (undefined === tangent)\n return false;\n\n let iExt = 0; // index of first/last fitPoint\n let iSet = 0; // index of 2nd/penultimate Bezier point to set (determines start/end tangent of the curve)\n let iInt = 0; // index of 2nd/penultimate fitPoint\n\n const numIntervals = options.fitPoints.length - 1;\n if (1 === numIntervals) { // no interior fit points\n if (atStart) {\n iExt = 0;\n iSet = 1;\n iInt = 3;\n } else {\n iExt = 3;\n iSet = 2;\n iInt = 0;\n }\n } else {\n if (atStart) {\n iExt = 0;\n iSet = 1;\n iInt = 2;\n } else {\n iExt = numIntervals + 2;\n iSet = numIntervals + 1;\n iInt = numIntervals;\n }\n }\n\n // NOTE: tangent points INTO curve\n const chordLength = dataPts[iInt].distance(dataPts[iExt]);\n dataPts[iExt].plusScaled(tangent, chordLength / 3.0, dataPts[iSet]);\n return true;\n }\n\n /** Set the end condition for the linear system to the given tangent, scaled by bessel length.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n * @param atStart whether end condition is for start of curve (false: end of curve)\n */\n private static setBesselLengthScaledEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\n if (dataPts.length !== options.fitPoints.length + 2)\n return false;\n\n const tangent = atStart ? options.startTangent : options.endTangent;\n if (undefined === tangent)\n return false;\n\n // temporarily set bessel end condition\n if (!this.setBesselEndCondition(dataPts, options, atStart))\n return false;\n\n const numIntervals = options.fitPoints.length - 1;\n const iExt = atStart ? 0 : numIntervals + 2; // index of first/last fitPoint\n const iSet = atStart ? 1 : numIntervals + 1; // index of 2nd/penultimate Bezier point to set (determines start/end tangent of the curve)\n\n // reset end condition with our tangent, but scaled to the bessel tangent's length\n dataPts[iExt].plusScaled(tangent, dataPts[iExt].distance(dataPts[iSet]), dataPts[iSet]);\n return true;\n }\n\n /** Set the end condition for a physically closed (non-periodic) interpolant.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n */\n private static setPhysicallyClosedEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions): boolean {\n const numIntervals = options.fitPoints.length - 1;\n if (!options.isColinearTangents\n || numIntervals <= 2\n || (undefined !== options.startTangent && undefined !== options.endTangent)\n || options.isNaturalTangents\n || !dataPts[0].isAlmostEqual(dataPts[numIntervals + 2])) {\n return true;\n }\n // force parallel start/end tangents, using chord length scale for undefined tangents\n if (undefined !== options.startTangent) { // start tangent is supplied; compute a parallel end tangent\n const outwardStartTangent = Vector3d.createStartEnd(dataPts[1], dataPts[0]).normalize();\n if (undefined !== outwardStartTangent) {\n const endTangentMag = dataPts[numIntervals + 2].distance(dataPts[numIntervals + 1]);\n dataPts[numIntervals + 2].plusScaled(outwardStartTangent, endTangentMag, dataPts[numIntervals + 1]);\n }\n } else if (undefined !== options.endTangent) { // end tangent is supplied; compute a parallel start tangent\n const outwardEndTangent = Vector3d.createStartEnd(dataPts[numIntervals + 1], dataPts[numIntervals + 2]).normalize();\n if (undefined !== outwardEndTangent) {\n const startTangentMag = dataPts[0].distance(dataPts[1]);\n dataPts[0].plusScaled(outwardEndTangent, startTangentMag, dataPts[1]);\n }\n } else { // neither tangent is supplied, compute both along same vector\n const commonTangent = Vector3d.createStartEnd(dataPts[numIntervals + 1], dataPts[1]).normalize();\n if (undefined !== commonTangent) {\n const startTangentMag = dataPts[0].distance(dataPts[1]);\n dataPts[0].plusScaled(commonTangent, startTangentMag, dataPts[1]);\n const endTangentMag = dataPts[numIntervals + 2].distance(dataPts[numIntervals + 1]);\n dataPts[numIntervals + 2].plusScaled(commonTangent, -endTangentMag, dataPts[numIntervals + 1]);\n }\n }\n return true;\n }\n\n /** Set end conditions for the linear system to solve for the poles of the open interpolant, as per Farin 3e/4e.\n * @param dataPts array whose interior is the system rhs and whose first/last entries are the first/last fitPoints;\n * points are inserted to become the 2nd and penultimate dataPts, the first/last rows of the system rhs.\n * @param options validated as per validateOptions, unmodified\n */\n private static setEndConditions(dataPts: Point3d[], options: InterpolationCurve3dOptions): boolean {\n if (dataPts.length !== options.fitPoints.length)\n return false;\n\n // insert dummy points to be computed below\n const dummy0 = Point3d.createZero();\n const dummy1 = Point3d.createZero();\n dataPts.splice(1, 0, dummy0);\n dataPts.splice(dataPts.length - 1, 0, dummy1);\n\n let succeeded = false;\n if (undefined === options.startTangent) {\n if (options.isNaturalTangents)\n succeeded = this.setNaturalEndCondition(dataPts, options, true);\n else\n succeeded = this.setBesselEndCondition(dataPts, options, true);\n } else { // scale startTangent\n if (options.isChordLenTangents)\n succeeded = this.setChordLengthScaledEndCondition(dataPts, options, true);\n else\n succeeded = this.setBesselLengthScaledEndCondition(dataPts, options, true);\n }\n\n if (undefined === options.endTangent) {\n if (options.isNaturalTangents)\n succeeded = this.setNaturalEndCondition(dataPts, options, false);\n else\n succeeded = this.setBesselEndCondition(dataPts, options, false);\n } else { // scale endTangent\n if (options.isChordLenTangents)\n succeeded = this.setChordLengthScaledEndCondition(dataPts, options, false);\n else\n succeeded = this.setBesselLengthScaledEndCondition(dataPts, options, false);\n }\n\n if (succeeded)\n succeeded = this.setPhysicallyClosedEndCondition(dataPts, options);\n\n return succeeded;\n }\n\n /** Solve the near tridiagonal system for a periodic C2 cubic interpolant.\n * Alpha, beta, gamma are computed by setUpSystem, have same length as fitPts, and are overwritten.\n */\n private static solveNearTridiagonal(fitPts: Point3d[], alpha: number[], beta: number[], gamma: number[]): Point3d[] | undefined {\n if (alpha.length !== beta.length || alpha.length !== gamma.length || alpha.length !== fitPts.length)\n return undefined;\n const poles: Point3d[] = [];\n const numIntervals = fitPts.length - 1;\n const leftPts = fitPts.slice(0, -1); // last fitPt is ignored\n let tmp: number | undefined = 0.0;\n\n // first forward substitution\n for (let i = 1; i < numIntervals; ++i) {\n if (undefined === (tmp = Geometry.conditionalDivideFraction(- alpha[i], beta[i - 1])))\n return undefined;\n beta[i] += tmp * gamma[i - 1];\n alpha[i] = tmp * alpha[i - 1];\n leftPts[i].addScaledInPlace(leftPts[i - 1], tmp);\n }\n\n // first backward substitution\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, beta[numIntervals - 1] + alpha[numIntervals - 1])))\n return undefined;\n gamma[numIntervals - 1] *= tmp;\n leftPts[numIntervals - 1].scaleInPlace(tmp);\n for (let i = numIntervals - 2; i >= 0; --i) {\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, beta[i])))\n return undefined;\n Point3d.createScale(leftPts[i].plus2Scaled(leftPts[i + 1], - gamma[i], leftPts[numIntervals - 1], - alpha[i]), tmp, leftPts[i]);\n gamma[i] = - (gamma[i] * gamma[i + 1] + alpha[i] * gamma[numIntervals - 1]) * tmp;\n }\n\n // second forward substitution\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, 1.0 + gamma[0])))\n return undefined;\n poles.push(Point3d.createScale(leftPts[0], tmp));\n for (let i = 1; i < numIntervals; ++i) {\n poles.push(leftPts[i].plusScaled(poles[0], - gamma[i]));\n }\n return poles;\n }\n\n /** Adjust options by correcting invalid combinations\n * @param options curve definition, possibly modified\n */\n public static validateOptions(options: InterpolationCurve3dOptions): boolean {\n options.order = 4;\n\n // remove relevant exterior knots so knots and fit points align *before* we start compressing fit points.\n options.knots = this.convertCubicKnotVectorToFitParams(options.knots, options.fitPoints.length, true);\n\n // compress out duplicate fit points (and their corresponding knots)\n if (!this.removeDuplicateFitPoints(options))\n return false;\n\n // if only 2 unique points, then must create open curve\n let hasClosurePoint = options.fitPoints[0].isAlmostEqual(options.fitPoints[options.fitPoints.length - 1]);\n if (3 === options.fitPoints.length && hasClosurePoint) {\n options.fitPoints.pop();\n if (undefined !== options.knots)\n options.knots.pop();\n hasClosurePoint = options.fitPoints[0].isAlmostEqual(options.fitPoints[options.fitPoints.length - 1]);\n }\n if (options.fitPoints.length <= 2) {\n if (hasClosurePoint)\n return false;\n options.closed = false;\n }\n\n // append closure point if missing\n if (options.closed) {\n if (!hasClosurePoint) {\n options.fitPoints.push(options.fitPoints[0].clone());\n if (undefined !== options.knots) { // best guess: uniform knots\n options.knots.push(options.knots[options.knots.length - 1] + (options.knots[options.knots.length - 1] - options.knots[0]) / (options.knots.length - 1));\n }\n }\n if (options.fitPoints.length <= 4)\n options.closed = false; // can't fit cubic closed curve to 3 unique points\n }\n\n if (options.fitPoints.length < 2)\n return false;\n\n // ASSUME: tangents point INTO curve\n if (undefined !== options.startTangent) {\n if (options.startTangent.isAlmostZero)\n options.startTangent = undefined;\n else\n options.startTangent.normalizeInPlace();\n }\n if (undefined !== options.endTangent) {\n if (options.endTangent.isAlmostZero)\n options.endTangent = undefined;\n else\n options.endTangent.normalizeInPlace();\n }\n\n return true;\n }\n\n /** Converts a full cubic knot vector of expected length into fit parameters, by removing extraneous exterior knots.\n * @param knots cubic knot vector, unmodified\n * @param numFitPoints number of fit points\n * @return fit parameters, or undefined if unexpected input\n **/\n public static convertCubicKnotVectorToFitParams(knots: number[] | undefined, numFitPoints: number, normalize?: boolean): number[] | undefined {\n let params = knots?.slice();\n if (undefined !== params) {\n const numExtraKnots = params.length - numFitPoints;\n switch (numExtraKnots) {\n case 0: { // ASSUME caller passed in interior knots\n break;\n }\n case 4: // modern full cubic knots\n case 6: { // legacy full cubic knots\n for (let i = 0; i < numExtraKnots / 2; ++i) {\n params.pop();\n params.shift();\n }\n break;\n }\n default: { // other knot configurations are unusable\n params = undefined;\n break;\n }\n }\n if (normalize && !this.normalizeKnots(params))\n params = undefined;\n }\n return params;\n }\n\n /** Return fit parameters augmented to a full cubic knot vector.\n * @param params fit parameters, unmodified\n * @param legacy whether to create a legacy (DGN) full knot vector, or modern vector with two less knots\n **/\n public static convertFitParamsToCubicKnotVector(params: number[] | undefined, closed?: boolean, legacy?: boolean): number[] | undefined {\n const knots = params?.slice();\n if (undefined !== knots) {\n const numExtraKnots = legacy ? 6 : 4;\n if (closed) {\n const iTail = knots.length - 2;\n for (let iHead = 2; iHead <= numExtraKnots; iHead += 2) {\n knots.unshift(knots[iTail] - 1.0); // index is constant\n knots.push(1.0 + knots[iHead]); // index increments by two\n }\n } else {\n for (let i = 0; i < numExtraKnots / 2; ++i) {\n knots.unshift(0.0);\n knots.push(1.0);\n }\n }\n }\n return knots;\n }\n\n /** Ensure full legacy knot vector for JSON export **/\n public static convertToJsonKnots(props: InterpolationCurve3dProps) {\n if (undefined !== props.knots) {\n props.knots = this.convertCubicKnotVectorToFitParams(props.knots, props.fitPoints.length, false);\n props.knots = this.convertFitParamsToCubicKnotVector(props.knots, props.closed, true);\n } else {\n props.knots = this.constructFitParametersFromPoints(Point3dArray.clonePoint3dArray(props.fitPoints), props.isChordLenKnots, props.closed);\n props.knots = this.convertFitParamsToCubicKnotVector(props.knots, props.closed, true);\n }\n }\n\n /** Construct the control points for the c2 cubic fit algorithm\n * @param options validated as per validateOptions, possibly modified\n */\n public static constructPoles(options: InterpolationCurve3dOptions): Point3d[] | Float64Array | undefined {\n if (!this.constructFitParameters(options) || (undefined === options.knots))\n return undefined;\n\n const numRow = options.fitPoints.length;\n const alpha: number[] = Array(numRow);\n const beta: number[] = Array(numRow);\n const gamma: number[] = Array(numRow);\n if (!this.setUpSystem(alpha, beta, gamma, options))\n return undefined;\n\n let poles: Point3d[] | Float64Array | undefined = [];\n if (!options.closed) {\n const dataPts = options.fitPoints.slice();\n if (!this.setEndConditions(dataPts, options))\n return undefined;\n if (dataPts.length !== numRow + 2)\n return undefined; // sanity check: we added 2nd/penultimate points, rhs is middle numRow entries.\n\n // construct tridiagonal banded system components\n const matrix = new Float64Array(numRow * 3);\n const rhs = new Float64Array(numRow * 3);\n for (let iRow = 0, iMatrixRead = 0, iRhsRead = 0; iRow < numRow; ++iRow) {\n matrix[iMatrixRead++] = alpha[iRow];\n matrix[iMatrixRead++] = beta[iRow];\n matrix[iMatrixRead++] = gamma[iRow];\n rhs[iRhsRead++] = dataPts[iRow+1].x;\n rhs[iRhsRead++] = dataPts[iRow+1].y;\n rhs[iRhsRead++] = dataPts[iRow+1].z;\n }\n\n const solution = BandedSystem.solveBandedSystemMultipleRHS(numRow, 3, matrix, 3, rhs);\n if (undefined === solution)\n return undefined;\n\n // pre/append first/last poles/fitPoints\n poles = new Float64Array(3 + solution.length + 3);\n let iWrite = 0;\n poles[iWrite++] = options.fitPoints[0].x;\n poles[iWrite++] = options.fitPoints[0].y;\n poles[iWrite++] = options.fitPoints[0].z;\n for (let iRead = 0; iRead < solution.length; ) {\n poles[iWrite++] = solution[iRead++];\n }\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].x;\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].y;\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].z;\n } else { // closed\n if (undefined !== (poles = this.solveNearTridiagonal(options.fitPoints, alpha, beta, gamma))) {\n if (poles.length > 2) {\n poles.unshift(poles.pop()!); // shift poles right to line up with the knots\n for (let i = 0; i < options.order - 1; ++i)\n poles.push(poles[i].clone()); // periodically extend (the modern way)\n }\n }\n }\n return poles;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"BSplineCurveOps.js","sourceRoot":"","sources":["../../../src/bspline/BSplineCurveOps.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 Bspline\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\nimport { BandedSystem } from \"../numerics/BandedSystem\";\nimport { BSplineCurve3d } from \"./BSplineCurve\";\nimport { InterpolationCurve3dOptions, InterpolationCurve3dProps } from \"./InterpolationCurve3d\";\nimport { BSplineWrapMode, KnotVector } from \"./KnotVector\";\n\n/**\n * A class with static methods for creating B-spline curves.\n * @public\n */\nexport class BSplineCurveOps {\n /**\n * Greville knot algorithm: alternative to traditional c2 cubic algorithm allowing for any order, but no end conditions or periodicity.\n * @param points pass-through points.\n * @param order bspline order (1 more than degree)\n */\n public static createThroughPoints(points: IndexedXYZCollection | Point3d[], order: number): BSplineCurve3d | undefined {\n const numPoints = points.length;\n if (order > numPoints || order < 2)\n return undefined;\n const degree = order - 1;\n const bw = 1 + 2 * degree; // probably less than that . . just zeros at fringe.\n const matrix = new Float64Array(bw * numPoints);\n const basisFunctions = new Float64Array(order);\n const rhs = new GrowableXYZArray();\n const knots = KnotVector.createUniformClamped(numPoints, order - 1, 0.0, 1.0);\n const xyz = Point3d.create();\n for (let basePointIndex = 0; basePointIndex < numPoints; basePointIndex++) {\n const u = knots.grevilleKnot(basePointIndex);\n const spanIndex = knots.knotToLeftKnotIndex(u);\n knots.evaluateBasisFunctions(spanIndex, u, basisFunctions);\n // puzzlement .. how do the max points shift within the order spots?\n let maxIndex = 0;\n for (let i = 1; i < order; i++)\n if (basisFunctions[i] > basisFunctions[maxIndex])\n maxIndex = i;\n const basisFunctionStartWithinRow = degree - maxIndex;\n const rowStart = basePointIndex * bw;\n for (let i = 0; i < order; i++) {\n const realColumn = basePointIndex - degree + basisFunctionStartWithinRow + i;\n if (rowStart + realColumn >= 0 && realColumn < numPoints)\n matrix[rowStart + basisFunctionStartWithinRow + i] = basisFunctions[i];\n }\n if (points instanceof IndexedXYZCollection) {\n rhs.push(points.getPoint3dAtUncheckedPointIndex(basePointIndex, xyz));\n } else {\n rhs.push(points[basePointIndex].clone());\n }\n }\n const poles = BandedSystem.solveBandedSystemMultipleRHS(numPoints, bw, matrix, 3, rhs.float64Data());\n if (poles) {\n return BSplineCurve3d.create(poles, knots.knots, order);\n }\n return undefined;\n }\n\n /**\n * Construct BSplineCurve3d that fit points using the C2 cubic algorithm.\n * @param options curve definition, unmodified\n */\n public static createThroughPointsC2Cubic(options: InterpolationCurve3dOptions): BSplineCurve3d | undefined {\n // Work on a copy rather than installing computed knots/tangents that could become stale when fit points change\n // Knots/tangents that come in, however, are used without recomputation.\n const validatedOptions = options.clone();\n if (!this.C2CubicFit.validateOptions(validatedOptions))\n return undefined;\n\n const poles = this.C2CubicFit.constructPoles(validatedOptions);\n if (undefined === poles)\n return undefined;\n\n const fullKnots = this.C2CubicFit.convertFitParamsToCubicKnotVector(validatedOptions.knots, validatedOptions.closed);\n if (undefined === fullKnots)\n return undefined;\n\n const interpolant = BSplineCurve3d.create(poles, fullKnots, validatedOptions.order);\n\n if (validatedOptions.closed)\n interpolant?.setWrappable(BSplineWrapMode.OpenByAddingControlPoints);\n\n return interpolant;\n }\n}\n\n/**\n * Namespace for collecting curve fit API\n * @public\n */\nexport namespace BSplineCurveOps {\n /**\n * A helper class for creating C2 cubic fit curves.\n * Knots herein are understood to be *interior* knots (including the start/end knot),\n * so that there is one knot per fit point. In other words, the knots are fit parameters.\n * @private\n */\n export class C2CubicFit {\n /** Transform fit parameters to span [0,1]\n * @param knots fit parameters, normalized in place\n */\n private static normalizeKnots(knots: number[] | undefined): boolean {\n if (undefined === knots || knots.length < 2) {\n knots = undefined;\n return false;\n }\n const myKnots = KnotVector.create(knots, 1, false); // no extra knots at start/end\n if (!myKnots.normalize()) {\n knots = undefined;\n return false;\n }\n for (let i = 0; i < knots.length; ++i)\n knots[i] = myKnots.knots[i];\n return true;\n }\n\n /** Compute chord-length fit parameters for C2 cubic fit algorithm */\n private static constructChordLengthParameters(fitPoints: Point3d[]): number[] | undefined {\n if (fitPoints.length < 2)\n return undefined;\n const params: number[] = [0.0];\n for (let i = 1; i < fitPoints.length; ++i)\n params[i] = params[i - 1] + fitPoints[i].distance(fitPoints[i - 1]);\n if (!this.normalizeKnots(params))\n return undefined;\n return params;\n }\n\n /** Compute uniform fit parameters for C2 cubic fit algorithm */\n private static constructUniformParameters(numParams: number): number[] | undefined {\n if (numParams < 2)\n return undefined;\n const knots = KnotVector.createUniformClamped(numParams + 2, 3, 0.0, 1.0);\n const params: number[] = [];\n for (let i = knots.leftKnotIndex; i <= knots.rightKnotIndex; ++i)\n params.push(knots.knots[i]);\n return params;\n }\n\n /** Remove duplicate fit points, and their given knots in parallel */\n private static removeDuplicateFitPoints(options: InterpolationCurve3dOptions): boolean {\n if (undefined !== options.knots && options.knots.length !== options.fitPoints.length)\n options.knots = undefined;\n const carrier = new Point3dArrayCarrier(options.fitPoints);\n const indices = carrier.findOrderedDuplicates(undefined, true); // use default tolerance\n if (indices.length > 0) {\n // remove duplicate fit points, and their corresponding params\n let iWrite = 0;\n for (let iRead = 0, iIndex = 0; iRead < options.fitPoints.length; ++iRead) {\n if (iIndex < indices.length && iRead === indices[iIndex])\n ++iIndex; // skip the duplicate\n else {\n options.fitPoints[iWrite] = options.fitPoints[iRead];\n if (options.knots)\n options.knots[iWrite] = options.knots[iRead];\n ++iWrite;\n }\n }\n options.fitPoints.splice(iWrite);\n if (options.knots)\n options.knots.splice(iWrite);\n }\n return true;\n }\n\n /** Construct fit parameters for the c2 cubic fit algorithm.\n * @param fitPoints validated fit points (should not contain duplicates)\n * @param isChordLength whether knots are computed using distances between successive fit points\n * @param closed whether curve is periodically defined\n * @return fit parameters, one per fit point\n */\n public static constructFitParametersFromPoints(fitPoints: Point3d[], isChordLength: number | undefined, closed: boolean | undefined): number[] | undefined {\n let params: number[] | undefined;\n if (isChordLength || !closed)\n params = this.constructChordLengthParameters(fitPoints);\n if (undefined === params)\n params = this.constructUniformParameters(fitPoints.length);\n return params;\n }\n\n /** Construct fit parameters for the c2 cubic fit algorithm, if they are missing.\n * @param options validated as per validateOptions, possibly modified\n * @return whether fit parameters are valid\n */\n public static constructFitParameters(options: InterpolationCurve3dOptions): boolean {\n if (undefined === options.knots)\n options.knots = this.constructFitParametersFromPoints(options.fitPoints, options.isChordLenKnots, options.closed);\n return options.knots?.length === options.fitPoints.length;\n }\n\n /** Compute a row of the tridiagonal system matrix from Farin.\n * @param alpha sub-diagonal, length = # fit points\n * @param beta diagonal, length = # fit points\n * @param gamma super-diagonal, length = # fit points\n * @param index 0-based row index to set\n */\n private static computeAlphaBetaGamma(alpha: number[], beta: number[], gamma: number[], index: number, deltaIPlus1: number, deltaI: number, deltaIMinus1: number, deltaIMinus2: number) {\n let denomReciprocal = 1.0 / (deltaIMinus2 + deltaIMinus1 + deltaI);\n alpha[index] = deltaI * deltaI * denomReciprocal;\n beta[index] = deltaI * (deltaIMinus2 + deltaIMinus1) * denomReciprocal;\n\n denomReciprocal = 1.0 / (deltaIMinus1 + deltaI + deltaIPlus1);\n beta[index] += deltaIMinus1 * (deltaI + deltaIPlus1) * denomReciprocal;\n gamma[index] = deltaIMinus1 * deltaIMinus1 * denomReciprocal;\n\n denomReciprocal = 1.0 / (deltaIMinus1 + deltaI);\n alpha[index] *= denomReciprocal;\n beta[index] *= denomReciprocal;\n gamma[index] *= denomReciprocal;\n }\n\n /** Setup tridiagonal system for 2 fit points\n * @param alpha sub-diagonal, length = 2\n * @param beta diagonal, length = 2\n * @param gamma super-diagonal, length = 2\n */\n private static setUpSystem2Points(alpha: number[], beta: number[], gamma: number[]): boolean {\n if (alpha.length !== 2 || beta.length !== 2 || gamma.length !== 2)\n return false;\n\n // identity matrix\n alpha[0] = alpha[1] = gamma[0] = gamma[1] = 0.0;\n beta[0] = beta[1] = 1.0;\n return true;\n }\n\n /** Setup tridiagonal system for 3 fit points\n * @param alpha sub-diagonal, length = 3\n * @param beta diagonal, length = 3\n * @param gamma super-diagonal, length = 3\n * @param options validated as per validateOptions, unmodified\n * @param useNaturalStartTangent whether to bake the natural end condition into the first row\n * @param useNaturalEndTangent whether to bake the natural end condition into the last row\n */\n private static setUpSystem3Points(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions, useNaturalStartTangent: boolean, useNaturalEndTangent: boolean): boolean {\n if (undefined === options.knots)\n return false;\n if (alpha.length !== 3 || beta.length !== 3 || gamma.length !== 3)\n return false;\n if (options.knots.length !== 3 || options.fitPoints.length !== 3)\n return false;\n\n let deltaIPlus1 = 0, deltaI = 0, deltaIMinus1 = 0, deltaIMinus2 = 0, sum = 0, sumReciprocal = 0;\n\n // first row\n if (useNaturalStartTangent) {\n alpha[0] = 0.0;\n deltaI = options.knots[1] - options.knots[0];\n deltaIPlus1 = options.knots[2] - options.knots[1];\n sum = deltaI + deltaIPlus1;\n sumReciprocal = 1.0 / sum;\n beta[0] = (deltaI + sum) * sumReciprocal;\n gamma[0] = -deltaI * sumReciprocal;\n } else {\n alpha[0] = gamma[0] = 0.0;\n beta[0] = 1.0;\n }\n\n // middle row\n deltaIMinus1 = options.knots[1] - options.knots[0];\n deltaI = options.knots[2] - options.knots[1];\n sumReciprocal = 1.0 / (deltaIMinus1 + deltaI);\n sumReciprocal *= sumReciprocal;\n alpha[1] = deltaI * deltaI * sumReciprocal;\n beta[1] = 2.0 * (deltaI * deltaIMinus1) * sumReciprocal;\n gamma[1] = deltaIMinus1 * deltaIMinus1 * sumReciprocal;\n\n // last row\n if (useNaturalEndTangent) {\n deltaIMinus1 = options.knots[2] - options.knots[1];\n deltaIMinus2 = options.knots[1] - options.knots[0];\n sum = deltaIMinus2 + deltaIMinus1;\n sumReciprocal = 1.0 / sum;\n alpha[2] = -deltaIMinus1 * sumReciprocal;\n beta[2] = (deltaIMinus1 + sum) * sumReciprocal;\n gamma[2] = 0.0;\n } else {\n alpha[2] = gamma[2] = 0.0;\n beta[2] = 1.0;\n }\n return true;\n }\n\n /** Setup tridiagonal system for 4 fit points or more\n * @param alpha sub-diagonal, length = # fit points\n * @param beta diagonal, length = # fit points\n * @param gamma super-diagonal, length = # fit points\n * @param options validated as per validateOptions, unmodified\n * @param useNaturalStartTangent whether to bake the natural end condition into the first row\n * @param useNaturalEndTangent whether to bake the natural end condition into the last row\n */\n private static setUpSystem4PointsOrMore(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions, useNaturalStartTangent: boolean, useNaturalEndTangent: boolean): boolean {\n if (undefined === options.knots)\n return false;\n if (alpha.length !== beta.length || alpha.length !== gamma.length || alpha.length !== options.knots.length)\n return false;\n if (options.knots.length !== options.fitPoints.length)\n return false;\n\n const numIntervals = options.fitPoints.length - 1;\n const numIntervalsMinus1 = numIntervals - 1;\n let deltaIPlus1 = 0, deltaI = 0, deltaIMinus1 = 0, deltaIMinus2 = 0, sum = 0, sumReciprocal = 0;\n\n if (options.closed) {\n // first row\n deltaI = options.knots[1] - options.knots[0];\n deltaIMinus2 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\n deltaIMinus1 = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\n deltaIPlus1 = options.knots[2] - options.knots[1];\n this.computeAlphaBetaGamma(alpha, beta, gamma, 0, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n\n // second row\n deltaIMinus2 = deltaIMinus1;\n deltaIMinus1 = deltaI;\n deltaI = options.knots[2] - options.knots[1];\n deltaIPlus1 = options.knots[3] - options.knots[2];\n this.computeAlphaBetaGamma(alpha, beta, gamma, 1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n\n // last row; there's one less equation than open case\n deltaIPlus1 = deltaIMinus1;\n deltaI = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\n deltaIMinus2 = options.knots[numIntervalsMinus1 - 1] - options.knots[numIntervalsMinus1 - 2];\n deltaIMinus1 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\n this.computeAlphaBetaGamma(alpha, beta, gamma, numIntervalsMinus1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n } else { // open\n // first row\n if (useNaturalStartTangent) {\n alpha[0] = 0.0;\n deltaI = options.knots[1] - options.knots[0];\n deltaIPlus1 = options.knots[2] - options.knots[1];\n sum = deltaI + deltaIPlus1;\n sumReciprocal = 1.0 / sum;\n beta[0] = (deltaI + sum) * sumReciprocal;\n gamma[0] = -deltaI * sumReciprocal;\n } else {\n alpha[0] = gamma[0] = 0.0;\n beta[0] = 1.0;\n }\n\n // second row\n deltaI = options.knots[2] - options.knots[1];\n deltaIMinus1 = options.knots[1] - options.knots[0];\n deltaIMinus2 = 0.0;\n deltaIPlus1 = options.knots[3] - options.knots[2];\n this.computeAlphaBetaGamma(alpha, beta, gamma, 1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n\n // penultimate row\n deltaI = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\n deltaIMinus1 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\n deltaIMinus2 = options.knots[numIntervalsMinus1 - 1] - options.knots[numIntervalsMinus1 - 2];\n deltaIPlus1 = 0.0;\n this.computeAlphaBetaGamma(alpha, beta, gamma, numIntervalsMinus1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n\n // last row\n if (useNaturalEndTangent) {\n deltaIMinus1 = options.knots[numIntervals] - options.knots[numIntervals - 1];\n deltaIMinus2 = options.knots[numIntervals - 1] - options.knots[numIntervals - 2];\n sum = deltaIMinus2 + deltaIMinus1;\n sumReciprocal = 1.0 / sum;\n alpha[numIntervals] = -deltaIMinus1 * sumReciprocal;\n beta[numIntervals] = (deltaIMinus1 + sum) * sumReciprocal;\n gamma[numIntervals] = 0.0;\n } else {\n alpha[numIntervals] = gamma[numIntervals] = 0.0;\n beta[numIntervals] = 1.0;\n }\n }\n\n // middle rows\n for (let i = 2; i < numIntervalsMinus1; ++i) {\n deltaI = options.knots[i + 1] - options.knots[i];\n deltaIMinus2 = options.knots[i - 1] - options.knots[i - 2];\n deltaIMinus1 = options.knots[i] - options.knots[i - 1];\n deltaIPlus1 = options.knots[i + 2] - options.knots[i + 1];\n this.computeAlphaBetaGamma(alpha, beta, gamma, i, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\n }\n return true;\n }\n\n /** Setup tridiagonal system\n * @param alpha sub-diagonal, length = # fitPoints\n * @param beta diagonal, length = # fitPoints\n * @param gamma super-diagonal, length = # fitPoints\n * @param options validated as per validateOptions, unmodified\n */\n private static setUpSystem(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions): boolean {\n let useNaturalStartTangent = false;\n let useNaturalEndTangent = false;\n if (options.isNaturalTangents && !options.closed) {\n useNaturalStartTangent = (undefined === options.startTangent);\n useNaturalEndTangent = (undefined === options.endTangent);\n }\n\n let succeeded = false;\n if (2 === options.fitPoints.length)\n succeeded = this.setUpSystem2Points(alpha, beta, gamma);\n else if (3 === options.fitPoints.length)\n succeeded = this.setUpSystem3Points(alpha, beta, gamma, options, useNaturalStartTangent, useNaturalEndTangent);\n else if (4 <= options.fitPoints.length)\n succeeded = this.setUpSystem4PointsOrMore(alpha, beta, gamma, options, useNaturalStartTangent, useNaturalEndTangent);\n\n return succeeded;\n }\n\n /** Set the Bessel end condition for the linear system.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n * @param atStart whether end condition is for start of curve (false: end of curve)\n */\n private static setBesselEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\n if (dataPts.length !== options.fitPoints.length + 2)\n return false;\n if (undefined === options.knots)\n return false;\n\n const scale = 1.0/3.0;\n const numIntervals = options.fitPoints.length - 1;\n\n if (1 === numIntervals) { // linear Bezier\n if (atStart)\n dataPts[0].interpolate(scale, dataPts[3], dataPts[1]);\n else\n dataPts[3].interpolate(scale, dataPts[0], dataPts[2]);\n return true;\n }\n\n if (2 === numIntervals) {\n const alpha = (options.knots[2] - options.knots[1]) / (options.knots[2] - options.knots[0]);\n const beta = 1.0 - alpha;\n const temp = dataPts[2].plus2Scaled(dataPts[0], -alpha * alpha, dataPts[4], -beta * beta);\n if (atStart)\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * alpha), dataPts[0], alpha).interpolate(scale, dataPts[0], dataPts[1]);\n else\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * beta), dataPts[4], beta).interpolate(scale, dataPts[4], dataPts[3]);\n return true;\n }\n\n // numIntervals > 2\n if (atStart) {\n const alpha = (options.knots[2] - options.knots[1]) / (options.knots[2] - options.knots[0]);\n const beta = 1.0 - alpha;\n const temp = dataPts[2].plus2Scaled(dataPts[0], -alpha * alpha, dataPts[3], -beta * beta);\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * alpha), dataPts[0], alpha).interpolate(scale, dataPts[0], dataPts[1]);\n } else {\n const alpha = (options.knots[numIntervals] - options.knots[numIntervals - 1]) / (options.knots[numIntervals] - options.knots[numIntervals - 2]);\n const beta = 1.0 - alpha;\n const temp = dataPts[numIntervals].plus2Scaled(dataPts[numIntervals - 1], -alpha * alpha, dataPts[numIntervals + 2], -beta * beta);\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * beta), dataPts[numIntervals + 2], beta).interpolate(scale, dataPts[numIntervals + 2], dataPts[numIntervals + 1]);\n }\n return true;\n }\n\n /** Set the natural end condition for the linear system.\n * This is the end condition used by ADSK for fit-splines with a given zero tangent.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n * @param atStart whether end condition is for start of curve (false: end of curve)\n */\n private static setNaturalEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\n if (dataPts.length !== options.fitPoints.length + 2)\n return false;\n\n const numIntervals = options.fitPoints.length - 1;\n if (1 === numIntervals)\n return this.setBesselEndCondition(dataPts, options, atStart);\n\n if (atStart)\n dataPts[1] = dataPts[0];\n else\n dataPts[dataPts.length - 2] = dataPts[dataPts.length - 1];\n return true;\n }\n\n /** Set the end condition for the linear system to the given tangent, scaled by chord length.\n * This is the end condition used by ADSK for fit-splines with a given nonzero tangent.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n * @param atStart whether end condition is for start of curve (false: end of curve)\n */\n private static setChordLengthScaledEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\n if (dataPts.length !== options.fitPoints.length + 2)\n return false;\n\n const tangent = atStart ? options.startTangent : options.endTangent;\n if (undefined === tangent)\n return false;\n\n let iExt = 0; // index of first/last fitPoint\n let iSet = 0; // index of 2nd/penultimate Bezier point to set (determines start/end tangent of the curve)\n let iInt = 0; // index of 2nd/penultimate fitPoint\n\n const numIntervals = options.fitPoints.length - 1;\n if (1 === numIntervals) { // no interior fit points\n if (atStart) {\n iExt = 0;\n iSet = 1;\n iInt = 3;\n } else {\n iExt = 3;\n iSet = 2;\n iInt = 0;\n }\n } else {\n if (atStart) {\n iExt = 0;\n iSet = 1;\n iInt = 2;\n } else {\n iExt = numIntervals + 2;\n iSet = numIntervals + 1;\n iInt = numIntervals;\n }\n }\n\n // NOTE: tangent points INTO curve\n const chordLength = dataPts[iInt].distance(dataPts[iExt]);\n dataPts[iExt].plusScaled(tangent, chordLength / 3.0, dataPts[iSet]);\n return true;\n }\n\n /** Set the end condition for the linear system to the given tangent, scaled by bessel length.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n * @param atStart whether end condition is for start of curve (false: end of curve)\n */\n private static setBesselLengthScaledEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\n if (dataPts.length !== options.fitPoints.length + 2)\n return false;\n\n const tangent = atStart ? options.startTangent : options.endTangent;\n if (undefined === tangent)\n return false;\n\n // temporarily set bessel end condition\n if (!this.setBesselEndCondition(dataPts, options, atStart))\n return false;\n\n const numIntervals = options.fitPoints.length - 1;\n const iExt = atStart ? 0 : numIntervals + 2; // index of first/last fitPoint\n const iSet = atStart ? 1 : numIntervals + 1; // index of 2nd/penultimate Bezier point to set (determines start/end tangent of the curve)\n\n // reset end condition with our tangent, but scaled to the bessel tangent's length\n dataPts[iExt].plusScaled(tangent, dataPts[iExt].distance(dataPts[iSet]), dataPts[iSet]);\n return true;\n }\n\n /** Set the end condition for a physically closed (non-periodic) interpolant.\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\n * 2nd or penultimate point is set by this function.\n * @param options validated as per validateOptions, unmodified\n */\n private static setPhysicallyClosedEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions): boolean {\n const numIntervals = options.fitPoints.length - 1;\n if (!options.isColinearTangents\n || numIntervals <= 2\n || (undefined !== options.startTangent && undefined !== options.endTangent)\n || options.isNaturalTangents\n || !dataPts[0].isAlmostEqual(dataPts[numIntervals + 2])) {\n return true;\n }\n // force parallel start/end tangents, using chord length scale for undefined tangents\n if (undefined !== options.startTangent) { // start tangent is supplied; compute a parallel end tangent\n const outwardStartTangent = Vector3d.createStartEnd(dataPts[1], dataPts[0]).normalize();\n if (undefined !== outwardStartTangent) {\n const endTangentMag = dataPts[numIntervals + 2].distance(dataPts[numIntervals + 1]);\n dataPts[numIntervals + 2].plusScaled(outwardStartTangent, endTangentMag, dataPts[numIntervals + 1]);\n }\n } else if (undefined !== options.endTangent) { // end tangent is supplied; compute a parallel start tangent\n const outwardEndTangent = Vector3d.createStartEnd(dataPts[numIntervals + 1], dataPts[numIntervals + 2]).normalize();\n if (undefined !== outwardEndTangent) {\n const startTangentMag = dataPts[0].distance(dataPts[1]);\n dataPts[0].plusScaled(outwardEndTangent, startTangentMag, dataPts[1]);\n }\n } else { // neither tangent is supplied, compute both along same vector\n const commonTangent = Vector3d.createStartEnd(dataPts[numIntervals + 1], dataPts[1]).normalize();\n if (undefined !== commonTangent) {\n const startTangentMag = dataPts[0].distance(dataPts[1]);\n dataPts[0].plusScaled(commonTangent, startTangentMag, dataPts[1]);\n const endTangentMag = dataPts[numIntervals + 2].distance(dataPts[numIntervals + 1]);\n dataPts[numIntervals + 2].plusScaled(commonTangent, -endTangentMag, dataPts[numIntervals + 1]);\n }\n }\n return true;\n }\n\n /** Set end conditions for the linear system to solve for the poles of the open interpolant, as per Farin 3e/4e.\n * @param dataPts array whose interior is the system rhs and whose first/last entries are the first/last fitPoints;\n * points are inserted to become the 2nd and penultimate dataPts, the first/last rows of the system rhs.\n * @param options validated as per validateOptions, unmodified\n */\n private static setEndConditions(dataPts: Point3d[], options: InterpolationCurve3dOptions): boolean {\n if (dataPts.length !== options.fitPoints.length)\n return false;\n\n // insert dummy points to be computed below\n const dummy0 = Point3d.createZero();\n const dummy1 = Point3d.createZero();\n dataPts.splice(1, 0, dummy0);\n dataPts.splice(dataPts.length - 1, 0, dummy1);\n\n let succeeded = false;\n if (undefined === options.startTangent) {\n if (options.isNaturalTangents)\n succeeded = this.setNaturalEndCondition(dataPts, options, true);\n else\n succeeded = this.setBesselEndCondition(dataPts, options, true);\n } else { // scale startTangent\n if (options.isChordLenTangents)\n succeeded = this.setChordLengthScaledEndCondition(dataPts, options, true);\n else\n succeeded = this.setBesselLengthScaledEndCondition(dataPts, options, true);\n }\n\n if (undefined === options.endTangent) {\n if (options.isNaturalTangents)\n succeeded = this.setNaturalEndCondition(dataPts, options, false);\n else\n succeeded = this.setBesselEndCondition(dataPts, options, false);\n } else { // scale endTangent\n if (options.isChordLenTangents)\n succeeded = this.setChordLengthScaledEndCondition(dataPts, options, false);\n else\n succeeded = this.setBesselLengthScaledEndCondition(dataPts, options, false);\n }\n\n if (succeeded)\n succeeded = this.setPhysicallyClosedEndCondition(dataPts, options);\n\n return succeeded;\n }\n\n /** Solve the near tridiagonal system for a periodic C2 cubic interpolant.\n * Alpha, beta, gamma are computed by setUpSystem, have same length as fitPts, and are overwritten.\n */\n private static solveNearTridiagonal(fitPts: Point3d[], alpha: number[], beta: number[], gamma: number[]): Point3d[] | undefined {\n if (alpha.length !== beta.length || alpha.length !== gamma.length || alpha.length !== fitPts.length)\n return undefined;\n const poles: Point3d[] = [];\n const numIntervals = fitPts.length - 1;\n const leftPts = fitPts.slice(0, -1); // last fitPt is ignored\n let tmp: number | undefined = 0.0;\n\n // first forward substitution\n for (let i = 1; i < numIntervals; ++i) {\n if (undefined === (tmp = Geometry.conditionalDivideFraction(- alpha[i], beta[i - 1])))\n return undefined;\n beta[i] += tmp * gamma[i - 1];\n alpha[i] = tmp * alpha[i - 1];\n leftPts[i].addScaledInPlace(leftPts[i - 1], tmp);\n }\n\n // first backward substitution\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, beta[numIntervals - 1] + alpha[numIntervals - 1])))\n return undefined;\n gamma[numIntervals - 1] *= tmp;\n leftPts[numIntervals - 1].scaleInPlace(tmp);\n for (let i = numIntervals - 2; i >= 0; --i) {\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, beta[i])))\n return undefined;\n Point3d.createScale(leftPts[i].plus2Scaled(leftPts[i + 1], - gamma[i], leftPts[numIntervals - 1], - alpha[i]), tmp, leftPts[i]);\n gamma[i] = - (gamma[i] * gamma[i + 1] + alpha[i] * gamma[numIntervals - 1]) * tmp;\n }\n\n // second forward substitution\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, 1.0 + gamma[0])))\n return undefined;\n poles.push(Point3d.createScale(leftPts[0], tmp));\n for (let i = 1; i < numIntervals; ++i) {\n poles.push(leftPts[i].plusScaled(poles[0], - gamma[i]));\n }\n return poles;\n }\n\n /** Adjust options by correcting invalid combinations\n * @param options curve definition, possibly modified\n */\n public static validateOptions(options: InterpolationCurve3dOptions): boolean {\n options.order = 4;\n\n // remove relevant exterior knots so knots and fit points align *before* we start compressing fit points.\n options.knots = this.convertCubicKnotVectorToFitParams(options.knots, options.fitPoints.length, true);\n\n // compress out duplicate fit points (and their corresponding knots)\n if (!this.removeDuplicateFitPoints(options))\n return false;\n\n let hasClosurePoint = (options.fitPoints.length > 1) && options.fitPoints[0].isAlmostEqual(options.fitPoints[options.fitPoints.length - 1]);\n\n // if only 2 unique points, then must create open curve\n if (3 === options.fitPoints.length && hasClosurePoint) {\n options.fitPoints.pop();\n if (undefined !== options.knots)\n options.knots.pop();\n hasClosurePoint = options.fitPoints[0].isAlmostEqual(options.fitPoints[options.fitPoints.length - 1]);\n }\n if (options.fitPoints.length <= 2) {\n if (hasClosurePoint)\n return false;\n options.closed = false;\n }\n\n // append closure point if missing\n if (options.closed) {\n if (!hasClosurePoint) {\n options.fitPoints.push(options.fitPoints[0].clone());\n if (undefined !== options.knots) { // best guess: uniform knots\n options.knots.push(options.knots[options.knots.length - 1] + (options.knots[options.knots.length - 1] - options.knots[0]) / (options.knots.length - 1));\n }\n }\n if (options.fitPoints.length <= 4)\n options.closed = false; // can't fit cubic closed curve to 3 unique points\n }\n\n if (options.fitPoints.length < 2)\n return false;\n\n // ASSUME: tangents point INTO curve\n if (undefined !== options.startTangent) {\n if (options.startTangent.isAlmostZero)\n options.startTangent = undefined;\n else\n options.startTangent.normalizeInPlace();\n }\n if (undefined !== options.endTangent) {\n if (options.endTangent.isAlmostZero)\n options.endTangent = undefined;\n else\n options.endTangent.normalizeInPlace();\n }\n\n return true;\n }\n\n /** Converts a full cubic knot vector of expected length into fit parameters, by removing extraneous exterior knots.\n * @param knots cubic knot vector, unmodified\n * @param numFitPoints number of fit points\n * @return fit parameters, or undefined if unexpected input\n **/\n public static convertCubicKnotVectorToFitParams(knots: number[] | undefined, numFitPoints: number, normalize?: boolean): number[] | undefined {\n let params = knots?.slice();\n if (undefined !== params) {\n const numExtraKnots = params.length - numFitPoints;\n switch (numExtraKnots) {\n case 0: { // ASSUME caller passed in interior knots\n break;\n }\n case 4: // modern full cubic knots\n case 6: { // legacy full cubic knots\n for (let i = 0; i < numExtraKnots / 2; ++i) {\n params.pop();\n params.shift();\n }\n break;\n }\n default: { // other knot configurations are unusable\n params = undefined;\n break;\n }\n }\n if (normalize && !this.normalizeKnots(params))\n params = undefined;\n }\n return params;\n }\n\n /** Return fit parameters augmented to a full cubic knot vector.\n * @param params fit parameters, unmodified\n * @param legacy whether to create a legacy (DGN) full knot vector, or modern vector with two less knots\n **/\n public static convertFitParamsToCubicKnotVector(params: number[] | undefined, closed?: boolean, legacy?: boolean): number[] | undefined {\n const knots = params?.slice();\n if (undefined !== knots) {\n const numExtraKnots = legacy ? 6 : 4;\n if (closed) {\n const iTail = knots.length - 2;\n for (let iHead = 2; iHead <= numExtraKnots; iHead += 2) {\n knots.unshift(knots[iTail] - 1.0); // index is constant\n knots.push(1.0 + knots[iHead]); // index increments by two\n }\n } else {\n for (let i = 0; i < numExtraKnots / 2; ++i) {\n knots.unshift(0.0);\n knots.push(1.0);\n }\n }\n }\n return knots;\n }\n\n /** Ensure full legacy knot vector for JSON export **/\n public static convertToJsonKnots(props: InterpolationCurve3dProps) {\n if (undefined !== props.knots) {\n props.knots = this.convertCubicKnotVectorToFitParams(props.knots, props.fitPoints.length, false);\n props.knots = this.convertFitParamsToCubicKnotVector(props.knots, props.closed, true);\n } else {\n props.knots = this.constructFitParametersFromPoints(Point3dArray.clonePoint3dArray(props.fitPoints), props.isChordLenKnots, props.closed);\n props.knots = this.convertFitParamsToCubicKnotVector(props.knots, props.closed, true);\n }\n }\n\n /** Construct the control points for the c2 cubic fit algorithm\n * @param options validated as per validateOptions, possibly modified\n */\n public static constructPoles(options: InterpolationCurve3dOptions): Point3d[] | Float64Array | undefined {\n if (!this.constructFitParameters(options) || (undefined === options.knots))\n return undefined;\n\n const numRow = options.fitPoints.length;\n const alpha: number[] = Array(numRow);\n const beta: number[] = Array(numRow);\n const gamma: number[] = Array(numRow);\n if (!this.setUpSystem(alpha, beta, gamma, options))\n return undefined;\n\n let poles: Point3d[] | Float64Array | undefined = [];\n if (!options.closed) {\n const dataPts = options.fitPoints.slice();\n if (!this.setEndConditions(dataPts, options))\n return undefined;\n if (dataPts.length !== numRow + 2)\n return undefined; // sanity check: we added 2nd/penultimate points, rhs is middle numRow entries.\n\n // construct tridiagonal banded system components\n const matrix = new Float64Array(numRow * 3);\n const rhs = new Float64Array(numRow * 3);\n for (let iRow = 0, iMatrixRead = 0, iRhsRead = 0; iRow < numRow; ++iRow) {\n matrix[iMatrixRead++] = alpha[iRow];\n matrix[iMatrixRead++] = beta[iRow];\n matrix[iMatrixRead++] = gamma[iRow];\n rhs[iRhsRead++] = dataPts[iRow+1].x;\n rhs[iRhsRead++] = dataPts[iRow+1].y;\n rhs[iRhsRead++] = dataPts[iRow+1].z;\n }\n\n const solution = BandedSystem.solveBandedSystemMultipleRHS(numRow, 3, matrix, 3, rhs);\n if (undefined === solution)\n return undefined;\n\n // pre/append first/last poles/fitPoints\n poles = new Float64Array(3 + solution.length + 3);\n let iWrite = 0;\n poles[iWrite++] = options.fitPoints[0].x;\n poles[iWrite++] = options.fitPoints[0].y;\n poles[iWrite++] = options.fitPoints[0].z;\n for (let iRead = 0; iRead < solution.length; ) {\n poles[iWrite++] = solution[iRead++];\n }\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].x;\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].y;\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].z;\n } else { // closed\n if (undefined !== (poles = this.solveNearTridiagonal(options.fitPoints, alpha, beta, gamma))) {\n if (poles.length > 2) {\n poles.unshift(poles.pop()!); // shift poles right to line up with the knots\n for (let i = 0; i < options.order - 1; ++i)\n poles.push(poles[i].clone()); // periodically extend (the modern way)\n }\n }\n }\n return poles;\n }\n }\n}\n"]}
@@ -76,9 +76,9 @@ export declare abstract class BezierCurveBase extends CurvePrimitive {
76
76
  /** Return the length of the control polygon. */
77
77
  polygonLength(): number;
78
78
  /** Return the start point. (first control point) */
79
- startPoint(): Point3d;
79
+ startPoint(result?: Point3d): Point3d;
80
80
  /** Return the end point. (last control point) */
81
- endPoint(): Point3d;
81
+ endPoint(result?: Point3d): Point3d;
82
82
  /** Return the control polygon length as a quick length estimate. */
83
83
  quickLength(): number;
84
84
  /** Concrete classes must implement extendRange . . . */
@@ -1 +1 @@
1
- {"version":3,"file":"BezierCurveBase.d.ts","sourceRoot":"","sources":["../../../src/bspline/BezierCurveBase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BezierCurveBase.d.ts","sourceRoot":"","sources":["../../../src/bspline/BezierCurveBase.ts"],"names":[],"mappings":"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"}
@@ -115,14 +115,12 @@ class BezierCurveBase extends CurvePrimitive_1.CurvePrimitive {
115
115
  return sum;
116
116
  }
117
117
  /** Return the start point. (first control point) */
118
- startPoint() {
119
- const result = this.getPolePoint3d(0); // ASSUME non-trivial pole set -- if null comes back, it bubbles out
120
- return result;
118
+ startPoint(result) {
119
+ return this.getPolePoint3d(0, result); // ASSUME non-trivial pole set -- if null comes back, it bubbles out
121
120
  }
122
121
  /** Return the end point. (last control point) */
123
- endPoint() {
124
- const result = this.getPolePoint3d(this.order - 1); // ASSUME non-trivial pole set
125
- return result;
122
+ endPoint(result) {
123
+ return this.getPolePoint3d(this.order - 1, result); // ASSUME non-trivial pole set
126
124
  }
127
125
  /** Return the control polygon length as a quick length estimate. */
128
126
  quickLength() { return this.polygonLength(); }
@@ -1 +1 @@
1
- {"version":3,"file":"BezierCurveBase.js","sourceRoot":"","sources":["../../../src/bspline/BezierCurveBase.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 Bspline\n */\n\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { CurveOffsetXYHandler } from \"../curve/internalContexts/CurveOffsetXYHandler\";\nimport { PlaneAltitudeRangeContext } from \"../curve/internalContexts/PlaneAltitudeRangeContext\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { OffsetOptions } from \"../curve/OffsetOptions\";\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { IStrokeHandler } from \"../geometry3d/GeometryHandler\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { UnivariateBezier } from \"../numerics/BezierPolynomials\";\nimport { Bezier1dNd } from \"./Bezier1dNd\";\nimport { KnotVector } from \"./KnotVector\";\n\n/**\n * Base class for CurvePrimitive (necessarily 3D) with _polygon.\n * * This has a Bezier1dNd polygon as a member, and implements dimension-independent methods\n * * This exists to support\n * * BezierCurve3d -- 3 coordinates x,y,z per block in the Bezier1dNd poles\n * * BezierCurve3dH -- 4 coordinates x,y,z,w per block in the Bezier1dNd poles\n * * The implementations of \"pure 3d\" queries is based on calling `getPolePoint3d`.\n * * This has the subtle failure difference that `getPolePoint3d` call with a valid index on on a 3d curve always succeeds, but on 3dH curve fails when weight is zero.\n * @public\n */\nexport abstract class BezierCurveBase extends CurvePrimitive {\n /** String name for schema properties */\n public readonly curvePrimitiveType = \"bezierCurve\";\n\n /** Control points */\n protected _polygon: Bezier1dNd;\n /** scratch data blocks accessible by concrete class. Initialized to correct blockSize in constructor. */\n protected _workData0: Float64Array;\n /** scratch data blocks accessible by concrete class. Initialized to correct blockSize in constructor. */\n protected _workData1: Float64Array;\n /** Scratch xyz point accessible by derived classes. */\n protected _workPoint0: Point3d;\n /** Scratch xyz point accessible by derived classes. */\n protected _workPoint1: Point3d;\n\n protected constructor(blockSize: number, data: Float64Array) {\n super();\n this._polygon = new Bezier1dNd(blockSize, data);\n this._workPoint0 = Point3d.create();\n this._workPoint1 = Point3d.create();\n this._workData0 = new Float64Array(blockSize);\n this._workData1 = new Float64Array(blockSize);\n\n }\n /** reverse the poles in place */\n public reverseInPlace(): void { this._polygon.reverseInPlace(); }\n /** saturate the pole in place, using knot intervals from `spanIndex` of the `knotVector` */\n public saturateInPlace(knotVector: KnotVector, spanIndex: number): boolean {\n const boolStat = this._polygon.saturateInPlace(knotVector, spanIndex);\n if (boolStat) {\n this.setInterval(\n knotVector.spanFractionToFraction(spanIndex, 0.0),\n knotVector.spanFractionToFraction(spanIndex, 1.0));\n }\n return boolStat;\n }\n /** (property accessor) Return the polynomial degree (one less than order) */\n public get degree(): number {\n return this._polygon.order - 1;\n }\n /** (property accessor) Return the polynomial order */\n public get order(): number { return this._polygon.order; }\n /** (property accessor) Return the number of poles (aka control points) */\n public get numPoles(): number { return this._polygon.order; }\n /** Get pole `i` as a Point3d.\n * * For 3d curve, this is simple a pole access, and only fails (return `undefined`) for invalid index\n * * For 4d curve, this deweights the homogeneous pole and can fail due to 0 weight.\n */\n public abstract getPolePoint3d(i: number, point?: Point3d): Point3d | undefined;\n\n /** Get pole `i` as a Point4d.\n * * For 3d curve, this accesses the simple pole and returns with weight 1.\n * * For 4d curve, this accesses the (weighted) pole.\n */\n public abstract getPolePoint4d(i: number, point?: Point4d): Point4d | undefined;\n /** Set mapping to parent curve (e.g. if this bezier is a span extracted from a bspline, this is the knot interval of the span) */\n public setInterval(a: number, b: number) { this._polygon.setInterval(a, b); }\n /** map `fraction` from this Bezier curves inherent 0..1 range to the (a,b) range of parent\n * * ( The parent range should have been previously defined with `setInterval`)\n */\n public fractionToParentFraction(fraction: number): number { return this._polygon.fractionToParentFraction(fraction); }\n\n /** append stroke points to a linestring, based on `strokeCount` and `fractionToPoint` from derived class*/\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\n const numPerSpan = this.computeStrokeCountForOptions(options);\n const fractionStep = 1.0 / numPerSpan;\n for (let i = 0; i <= numPerSpan; i++) {\n const fraction = i * fractionStep;\n this.fractionToPoint(fraction, this._workPoint0);\n dest.appendStrokePoint(this._workPoint0);\n }\n }\n /** announce intervals with stroke counts */\n public emitStrokableParts(handler: IStrokeHandler, _options?: StrokeOptions): void {\n const numPerSpan = this.computeStrokeCountForOptions(_options);\n handler.announceIntervalForUniformStepStrokes(this, numPerSpan, 0.0, 1.0);\n }\n /** Return a simple array of arrays with the control points as `[[x,y,z],[x,y,z],..]` */\n public copyPolesAsJsonArray(): any[] { return this._polygon.unpackToJsonArrays(); }\n\n /** return true if all poles are on a plane. */\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\n let point: Point3d | undefined = this._workPoint0;\n for (let i = 0; ; i++) {\n point = this.getPolePoint3d(i, point);\n if (!point)\n return true;\n if (!plane.isPointInPlane(point))\n break; // which gets to return false, which is otherwise unreachable . . .\n }\n return false;\n }\n /** Return the length of the control polygon. */\n public polygonLength(): number {\n if (!this.getPolePoint3d(0, this._workPoint0))\n return 0.0;\n let i = 0;\n let sum = 0.0;\n while (this.getPolePoint3d(++i, this._workPoint1)) {\n sum += this._workPoint0.distance(this._workPoint1);\n this._workPoint0.setFrom(this._workPoint1);\n }\n return sum;\n }\n /** Return the start point. (first control point) */\n public override startPoint(): Point3d {\n const result = this.getPolePoint3d(0)!; // ASSUME non-trivial pole set -- if null comes back, it bubbles out\n return result;\n }\n /** Return the end point. (last control point) */\n public override endPoint(): Point3d {\n const result = this.getPolePoint3d(this.order - 1)!; // ASSUME non-trivial pole set\n return result;\n }\n /** Return the control polygon length as a quick length estimate. */\n public quickLength(): number { return this.polygonLength(); }\n /** Concrete classes must implement extendRange . . . */\n public abstract override extendRange(rangeToExtend: Range3d, transform?: Transform): void;\n /**\n * 1D bezier coefficients for use in range computations.\n * @internal\n */\n protected _workBezier?: UnivariateBezier; // available for bezier logic within a method\n /** scratch array for use by derived classes, using allocateAndZeroBezierWorkData for sizing. */\n protected _workCoffsA?: Float64Array;\n /** scratch array for use by derived classes, using allocateAndZeroBezierWorkData for sizing. */\n protected _workCoffsB?: Float64Array;\n\n /**\n * set up the _workBezier members with specific order.\n * * Try to reuse existing members if their sizes match.\n * * Ignore members corresponding to args that are 0 or negative.\n * @param primaryBezierOrder order of expected bezier\n * @param orderA length of _workCoffsA (simple array)\n * @param orderB length of _workCoffsB (simple array)\n */\n protected allocateAndZeroBezierWorkData(primaryBezierOrder: number, orderA: number, orderB: number) {\n if (primaryBezierOrder > 0) {\n if (this._workBezier !== undefined && this._workBezier.order === primaryBezierOrder) {\n this._workBezier.zero();\n } else\n this._workBezier = new UnivariateBezier(primaryBezierOrder);\n }\n if (orderA > 0) {\n if (this._workCoffsA !== undefined && this._workCoffsA.length === orderA)\n this._workCoffsA.fill(0);\n else\n this._workCoffsA = new Float64Array(orderA);\n }\n if (orderB > 0) {\n if (this._workCoffsB !== undefined && this._workCoffsB.length === orderB)\n this._workCoffsB.fill(0);\n else\n this._workCoffsB = new Float64Array(orderB);\n }\n }\n /**\n * Assess length and turn to determine a stroke count.\n * * this method is used by both BSplineCurve3d and BSplineCurve3dH.\n * * points are accessed via getPolePoint3d.\n * * Hence a zero-weight pole will be a problem\n * @param options stroke options structure.\n */\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\n\n this.getPolePoint3d(0, this._workPoint0);\n this.getPolePoint3d(1, this._workPoint1);\n let numStrokes = 1;\n if (this._workPoint0 && this._workPoint1) {\n let dx0 = this._workPoint1.x - this._workPoint0.x;\n let dy0 = this._workPoint1.y - this._workPoint0.y;\n let dz0 = this._workPoint1.z - this._workPoint0.z;\n let dx1, dy1, dz1; // first differences of leading edge\n let sumRadians = 0.0;\n let thisLength = Geometry.hypotenuseXYZ(dx0, dy0, dz0);\n this._workPoint1.setFromPoint3d(this._workPoint0);\n let sumLength = thisLength;\n let maxLength = thisLength;\n let maxRadians = 0.0;\n let thisRadians;\n for (let i = 2; this.getPolePoint3d(i, this._workPoint1); i++) {\n dx1 = this._workPoint1.x - this._workPoint0.x;\n dy1 = this._workPoint1.y - this._workPoint0.y;\n dz1 = this._workPoint1.z - this._workPoint0.z;\n thisRadians = Angle.radiansBetweenVectorsXYZ(dx0, dy0, dz0, dx1, dy1, dz1);\n sumRadians += thisRadians;\n maxRadians = Geometry.maxAbsXY(thisRadians, maxRadians);\n thisLength = Geometry.hypotenuseXYZ(dx1, dy1, dz1);\n sumLength += thisLength;\n maxLength = Geometry.maxXY(maxLength, thisLength);\n dx0 = dx1;\n dy0 = dy1;\n dz0 = dz1;\n this._workPoint0.setFrom(this._workPoint1);\n }\n const length1 = maxLength * this.degree; // This may be larger than sumLength\n const length2 = Math.sqrt(length1 * sumLength); // This is in between\n let radians1 = maxRadians * (this.degree - 1); // As if worst case keeps happening.\n if (this.degree < 3)\n radians1 *= 3; // so quadratics aren't under-stroked\n const radians2 = Math.sqrt(radians1 * sumRadians);\n const minCount = this.degree; // NOTE: this means 1) a small, nontrivial, straight Bezier is over-stroked, and 2) options.minStrokesPerPrimitive is ignored\n numStrokes = StrokeOptions.applyAngleTol(\n options, StrokeOptions.applyMaxEdgeLength(options, minCount, length2), radians2, 0.1,\n );\n if (options) {\n numStrokes = options.applyChordTolToLengthAndRadians(numStrokes, sumLength, radians1);\n }\n }\n return numStrokes;\n }\n\n /** Return a deep clone. */\n public abstract override clone(): BezierCurveBase;\n\n /** Return a transformed deep clone. */\n public override cloneTransformed(transform: Transform): BezierCurveBase {\n const curve1 = this.clone();\n curve1.tryTransformInPlace(transform);\n return curve1;\n }\n\n /**\n * Construct an offset of the instance curve as viewed in the xy-plane (ignoring z).\n * * No attempt is made to join the offsets of smaller constituent primitives. To construct a fully joined offset\n * for an aggregate instance (e.g., LineString3d, CurveChainWithDistanceIndex), use RegionOps.constructCurveXYOffset() instead.\n * @param offsetDistanceOrOptions offset distance (positive to left of the instance curve), or options object\n */\n public override constructOffsetXY(offsetDistanceOrOptions: number | OffsetOptions): CurvePrimitive | CurvePrimitive[] | undefined {\n const options = OffsetOptions.create(offsetDistanceOrOptions);\n const handler = new CurveOffsetXYHandler(this, options.leftOffsetDistance);\n this.emitStrokableParts(handler, options.strokeOptions);\n return handler.claimResult();\n }\n\n /** Return a curve primitive which is a portion of this curve.\n * @param fractionA [in] start fraction\n * @param fractionB [in] end fraction\n */\n public override clonePartialCurve(fractionA: number, fractionB: number): BezierCurveBase {\n const partialCurve = this.clone();\n partialCurve._polygon.subdivideToIntervalInPlace(fractionA, fractionB);\n return partialCurve;\n }\n\n /** Project instance geometry (via dispatch) onto the given ray, and return the extreme fractional parameters of projection.\n * @param ray ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with zero origin.\n * @param lowHigh optional receiver for output\n * @returns range of fractional projection parameters onto the ray, where 0.0 is start of the ray and 1.0 is the end of the ray.\n */\n public override projectedParameterRange(ray: Vector3d | Ray3d, lowHigh?: Range1d): Range1d | undefined {\n return PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);\n }\n}\n"]}
1
+ {"version":3,"file":"BezierCurveBase.js","sourceRoot":"","sources":["../../../src/bspline/BezierCurveBase.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 Bspline\n */\n\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { CurveOffsetXYHandler } from \"../curve/internalContexts/CurveOffsetXYHandler\";\nimport { PlaneAltitudeRangeContext } from \"../curve/internalContexts/PlaneAltitudeRangeContext\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { OffsetOptions } from \"../curve/OffsetOptions\";\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { IStrokeHandler } from \"../geometry3d/GeometryHandler\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { UnivariateBezier } from \"../numerics/BezierPolynomials\";\nimport { Bezier1dNd } from \"./Bezier1dNd\";\nimport { KnotVector } from \"./KnotVector\";\n\n/**\n * Base class for CurvePrimitive (necessarily 3D) with _polygon.\n * * This has a Bezier1dNd polygon as a member, and implements dimension-independent methods\n * * This exists to support\n * * BezierCurve3d -- 3 coordinates x,y,z per block in the Bezier1dNd poles\n * * BezierCurve3dH -- 4 coordinates x,y,z,w per block in the Bezier1dNd poles\n * * The implementations of \"pure 3d\" queries is based on calling `getPolePoint3d`.\n * * This has the subtle failure difference that `getPolePoint3d` call with a valid index on on a 3d curve always succeeds, but on 3dH curve fails when weight is zero.\n * @public\n */\nexport abstract class BezierCurveBase extends CurvePrimitive {\n /** String name for schema properties */\n public readonly curvePrimitiveType = \"bezierCurve\";\n\n /** Control points */\n protected _polygon: Bezier1dNd;\n /** scratch data blocks accessible by concrete class. Initialized to correct blockSize in constructor. */\n protected _workData0: Float64Array;\n /** scratch data blocks accessible by concrete class. Initialized to correct blockSize in constructor. */\n protected _workData1: Float64Array;\n /** Scratch xyz point accessible by derived classes. */\n protected _workPoint0: Point3d;\n /** Scratch xyz point accessible by derived classes. */\n protected _workPoint1: Point3d;\n\n protected constructor(blockSize: number, data: Float64Array) {\n super();\n this._polygon = new Bezier1dNd(blockSize, data);\n this._workPoint0 = Point3d.create();\n this._workPoint1 = Point3d.create();\n this._workData0 = new Float64Array(blockSize);\n this._workData1 = new Float64Array(blockSize);\n\n }\n /** reverse the poles in place */\n public reverseInPlace(): void { this._polygon.reverseInPlace(); }\n /** saturate the pole in place, using knot intervals from `spanIndex` of the `knotVector` */\n public saturateInPlace(knotVector: KnotVector, spanIndex: number): boolean {\n const boolStat = this._polygon.saturateInPlace(knotVector, spanIndex);\n if (boolStat) {\n this.setInterval(\n knotVector.spanFractionToFraction(spanIndex, 0.0),\n knotVector.spanFractionToFraction(spanIndex, 1.0));\n }\n return boolStat;\n }\n /** (property accessor) Return the polynomial degree (one less than order) */\n public get degree(): number {\n return this._polygon.order - 1;\n }\n /** (property accessor) Return the polynomial order */\n public get order(): number { return this._polygon.order; }\n /** (property accessor) Return the number of poles (aka control points) */\n public get numPoles(): number { return this._polygon.order; }\n /** Get pole `i` as a Point3d.\n * * For 3d curve, this is simple a pole access, and only fails (return `undefined`) for invalid index\n * * For 4d curve, this deweights the homogeneous pole and can fail due to 0 weight.\n */\n public abstract getPolePoint3d(i: number, point?: Point3d): Point3d | undefined;\n\n /** Get pole `i` as a Point4d.\n * * For 3d curve, this accesses the simple pole and returns with weight 1.\n * * For 4d curve, this accesses the (weighted) pole.\n */\n public abstract getPolePoint4d(i: number, point?: Point4d): Point4d | undefined;\n /** Set mapping to parent curve (e.g. if this bezier is a span extracted from a bspline, this is the knot interval of the span) */\n public setInterval(a: number, b: number) { this._polygon.setInterval(a, b); }\n /** map `fraction` from this Bezier curves inherent 0..1 range to the (a,b) range of parent\n * * ( The parent range should have been previously defined with `setInterval`)\n */\n public fractionToParentFraction(fraction: number): number { return this._polygon.fractionToParentFraction(fraction); }\n\n /** append stroke points to a linestring, based on `strokeCount` and `fractionToPoint` from derived class*/\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\n const numPerSpan = this.computeStrokeCountForOptions(options);\n const fractionStep = 1.0 / numPerSpan;\n for (let i = 0; i <= numPerSpan; i++) {\n const fraction = i * fractionStep;\n this.fractionToPoint(fraction, this._workPoint0);\n dest.appendStrokePoint(this._workPoint0);\n }\n }\n /** announce intervals with stroke counts */\n public emitStrokableParts(handler: IStrokeHandler, _options?: StrokeOptions): void {\n const numPerSpan = this.computeStrokeCountForOptions(_options);\n handler.announceIntervalForUniformStepStrokes(this, numPerSpan, 0.0, 1.0);\n }\n /** Return a simple array of arrays with the control points as `[[x,y,z],[x,y,z],..]` */\n public copyPolesAsJsonArray(): any[] { return this._polygon.unpackToJsonArrays(); }\n\n /** return true if all poles are on a plane. */\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\n let point: Point3d | undefined = this._workPoint0;\n for (let i = 0; ; i++) {\n point = this.getPolePoint3d(i, point);\n if (!point)\n return true;\n if (!plane.isPointInPlane(point))\n break; // which gets to return false, which is otherwise unreachable . . .\n }\n return false;\n }\n /** Return the length of the control polygon. */\n public polygonLength(): number {\n if (!this.getPolePoint3d(0, this._workPoint0))\n return 0.0;\n let i = 0;\n let sum = 0.0;\n while (this.getPolePoint3d(++i, this._workPoint1)) {\n sum += this._workPoint0.distance(this._workPoint1);\n this._workPoint0.setFrom(this._workPoint1);\n }\n return sum;\n }\n /** Return the start point. (first control point) */\n public override startPoint(result?: Point3d): Point3d {\n return this.getPolePoint3d(0, result)!; // ASSUME non-trivial pole set -- if null comes back, it bubbles out\n }\n /** Return the end point. (last control point) */\n public override endPoint(result?: Point3d): Point3d {\n return this.getPolePoint3d(this.order - 1, result)!; // ASSUME non-trivial pole set\n }\n /** Return the control polygon length as a quick length estimate. */\n public quickLength(): number { return this.polygonLength(); }\n /** Concrete classes must implement extendRange . . . */\n public abstract override extendRange(rangeToExtend: Range3d, transform?: Transform): void;\n /**\n * 1D bezier coefficients for use in range computations.\n * @internal\n */\n protected _workBezier?: UnivariateBezier; // available for bezier logic within a method\n /** scratch array for use by derived classes, using allocateAndZeroBezierWorkData for sizing. */\n protected _workCoffsA?: Float64Array;\n /** scratch array for use by derived classes, using allocateAndZeroBezierWorkData for sizing. */\n protected _workCoffsB?: Float64Array;\n\n /**\n * set up the _workBezier members with specific order.\n * * Try to reuse existing members if their sizes match.\n * * Ignore members corresponding to args that are 0 or negative.\n * @param primaryBezierOrder order of expected bezier\n * @param orderA length of _workCoffsA (simple array)\n * @param orderB length of _workCoffsB (simple array)\n */\n protected allocateAndZeroBezierWorkData(primaryBezierOrder: number, orderA: number, orderB: number) {\n if (primaryBezierOrder > 0) {\n if (this._workBezier !== undefined && this._workBezier.order === primaryBezierOrder) {\n this._workBezier.zero();\n } else\n this._workBezier = new UnivariateBezier(primaryBezierOrder);\n }\n if (orderA > 0) {\n if (this._workCoffsA !== undefined && this._workCoffsA.length === orderA)\n this._workCoffsA.fill(0);\n else\n this._workCoffsA = new Float64Array(orderA);\n }\n if (orderB > 0) {\n if (this._workCoffsB !== undefined && this._workCoffsB.length === orderB)\n this._workCoffsB.fill(0);\n else\n this._workCoffsB = new Float64Array(orderB);\n }\n }\n /**\n * Assess length and turn to determine a stroke count.\n * * this method is used by both BSplineCurve3d and BSplineCurve3dH.\n * * points are accessed via getPolePoint3d.\n * * Hence a zero-weight pole will be a problem\n * @param options stroke options structure.\n */\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\n\n this.getPolePoint3d(0, this._workPoint0);\n this.getPolePoint3d(1, this._workPoint1);\n let numStrokes = 1;\n if (this._workPoint0 && this._workPoint1) {\n let dx0 = this._workPoint1.x - this._workPoint0.x;\n let dy0 = this._workPoint1.y - this._workPoint0.y;\n let dz0 = this._workPoint1.z - this._workPoint0.z;\n let dx1, dy1, dz1; // first differences of leading edge\n let sumRadians = 0.0;\n let thisLength = Geometry.hypotenuseXYZ(dx0, dy0, dz0);\n this._workPoint1.setFromPoint3d(this._workPoint0);\n let sumLength = thisLength;\n let maxLength = thisLength;\n let maxRadians = 0.0;\n let thisRadians;\n for (let i = 2; this.getPolePoint3d(i, this._workPoint1); i++) {\n dx1 = this._workPoint1.x - this._workPoint0.x;\n dy1 = this._workPoint1.y - this._workPoint0.y;\n dz1 = this._workPoint1.z - this._workPoint0.z;\n thisRadians = Angle.radiansBetweenVectorsXYZ(dx0, dy0, dz0, dx1, dy1, dz1);\n sumRadians += thisRadians;\n maxRadians = Geometry.maxAbsXY(thisRadians, maxRadians);\n thisLength = Geometry.hypotenuseXYZ(dx1, dy1, dz1);\n sumLength += thisLength;\n maxLength = Geometry.maxXY(maxLength, thisLength);\n dx0 = dx1;\n dy0 = dy1;\n dz0 = dz1;\n this._workPoint0.setFrom(this._workPoint1);\n }\n const length1 = maxLength * this.degree; // This may be larger than sumLength\n const length2 = Math.sqrt(length1 * sumLength); // This is in between\n let radians1 = maxRadians * (this.degree - 1); // As if worst case keeps happening.\n if (this.degree < 3)\n radians1 *= 3; // so quadratics aren't under-stroked\n const radians2 = Math.sqrt(radians1 * sumRadians);\n const minCount = this.degree; // NOTE: this means 1) a small, nontrivial, straight Bezier is over-stroked, and 2) options.minStrokesPerPrimitive is ignored\n numStrokes = StrokeOptions.applyAngleTol(\n options, StrokeOptions.applyMaxEdgeLength(options, minCount, length2), radians2, 0.1,\n );\n if (options) {\n numStrokes = options.applyChordTolToLengthAndRadians(numStrokes, sumLength, radians1);\n }\n }\n return numStrokes;\n }\n\n /** Return a deep clone. */\n public abstract override clone(): BezierCurveBase;\n\n /** Return a transformed deep clone. */\n public override cloneTransformed(transform: Transform): BezierCurveBase {\n const curve1 = this.clone();\n curve1.tryTransformInPlace(transform);\n return curve1;\n }\n\n /**\n * Construct an offset of the instance curve as viewed in the xy-plane (ignoring z).\n * * No attempt is made to join the offsets of smaller constituent primitives. To construct a fully joined offset\n * for an aggregate instance (e.g., LineString3d, CurveChainWithDistanceIndex), use RegionOps.constructCurveXYOffset() instead.\n * @param offsetDistanceOrOptions offset distance (positive to left of the instance curve), or options object\n */\n public override constructOffsetXY(offsetDistanceOrOptions: number | OffsetOptions): CurvePrimitive | CurvePrimitive[] | undefined {\n const options = OffsetOptions.create(offsetDistanceOrOptions);\n const handler = new CurveOffsetXYHandler(this, options.leftOffsetDistance);\n this.emitStrokableParts(handler, options.strokeOptions);\n return handler.claimResult();\n }\n\n /** Return a curve primitive which is a portion of this curve.\n * @param fractionA [in] start fraction\n * @param fractionB [in] end fraction\n */\n public override clonePartialCurve(fractionA: number, fractionB: number): BezierCurveBase {\n const partialCurve = this.clone();\n partialCurve._polygon.subdivideToIntervalInPlace(fractionA, fractionB);\n return partialCurve;\n }\n\n /** Project instance geometry (via dispatch) onto the given ray, and return the extreme fractional parameters of projection.\n * @param ray ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with zero origin.\n * @param lowHigh optional receiver for output\n * @returns range of fractional projection parameters onto the ray, where 0.0 is start of the ray and 1.0 is the end of the ray.\n */\n public override projectedParameterRange(ray: Vector3d | Ray3d, lowHigh?: Range1d): Range1d | undefined {\n return PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);\n }\n}\n"]}
@@ -1,11 +1,13 @@
1
1
  /** @packageDocumentation
2
2
  * @module Bspline
3
3
  */
4
- import { Point3d, Vector3d } from "../geometry3d/Point3dVector3d";
5
- import { ProxyCurve } from "../curve/ProxyCurve";
4
+ import { Clipper } from "../clipping/ClipUtils";
5
+ import { AnnounceNumberNumberCurvePrimitive } from "../curve/CurvePrimitive";
6
6
  import { GeometryQuery } from "../curve/GeometryQuery";
7
- import { Transform } from "../geometry3d/Transform";
7
+ import { ProxyCurve } from "../curve/ProxyCurve";
8
8
  import { GeometryHandler } from "../geometry3d/GeometryHandler";
9
+ import { Point3d, Vector3d } from "../geometry3d/Point3dVector3d";
10
+ import { Transform } from "../geometry3d/Transform";
9
11
  import { XYZProps } from "../geometry3d/XYZProps";
10
12
  /**
11
13
  * fitPoints and end condition data for [[InterpolationCurve3d]]
@@ -13,25 +15,25 @@ import { XYZProps } from "../geometry3d/XYZProps";
13
15
  * @public
14
16
  */
15
17
  export interface InterpolationCurve3dProps {
16
- /** order of the computed bspline (one more than degree) */
18
+ /** The order of the computed B-spline curve (one more than its degree). */
17
19
  order?: number;
18
- /** true if the B-spline construction should be periodic */
20
+ /** Whether the B-spline construction should be periodic. Default is `false`. */
19
21
  closed?: boolean;
20
- /** if closed and no knots, compute chord length knots (1) or uniform knots (0). Chord length knots give best fit. */
22
+ /** If closed and no knots, compute chord length knots (1) or uniform knots (0, default). Chord length knots give best fit. */
21
23
  isChordLenKnots?: number;
22
- /** if !closed but first and last fitPoints are equal, pivot computed start/end tangent(s) so that they are colinear (1) or leave them be (0). */
24
+ /** If !closed but first and last fitPoints are equal, pivot computed start/end tangent(s) so that they are colinear (1) or leave them be (0, default). */
23
25
  isColinearTangents?: number;
24
- /** if !closed and start/endTangent is given, set its magnitude to the first/last fit point chord length (1) or to the magnitude of the Bessel tangent (0). Bessel gives best fit. */
26
+ /** If !closed and start/endTangent is defined, set its magnitude to the first/last fit point chord length (1) or to the magnitude of the Bessel tangent (0, default). Bessel gives best fit. */
25
27
  isChordLenTangents?: number;
26
- /** if !closed and start/endTangent is absent, compute it using the natural end condition (1) or Bessel (0). Bessel gives best fit. */
28
+ /** If !closed and start/endTangent is `undefined`, compute it using the natural end condition (1) or Bessel (0, default). Bessel gives best fit. */
27
29
  isNaturalTangents?: number;
28
- /** optional start tangent, pointing into curve. Magnitude is ignored. */
30
+ /** Optional start tangent, pointing into curve. Magnitude is ignored. */
29
31
  startTangent?: XYZProps;
30
- /** optional end tangent, pointing into curve. Magnitude is ignored. */
32
+ /** Optional end tangent, pointing into curve. Magnitude is ignored. */
31
33
  endTangent?: XYZProps;
32
- /** points that the curve must pass through */
34
+ /** Points that the curve must pass through. */
33
35
  fitPoints: XYZProps[];
34
- /** parameters for curve fitting, one per fit point */
36
+ /** Optional parameters for curve fitting, one per fit point. If `undefined`, knots are computed. */
35
37
  knots?: number[];
36
38
  }
37
39
  /**
@@ -113,10 +115,9 @@ export declare class InterpolationCurve3dOptions {
113
115
  export declare class InterpolationCurve3d extends ProxyCurve {
114
116
  readonly curvePrimitiveType = "interpolationCurve";
115
117
  private _options;
116
- /**
117
- * CAPTURE properties and proxy curve.
118
- */
118
+ /** CAPTURE properties and proxy curve. */
119
119
  private constructor();
120
+ /** Second step of double dispatch: call `handler.handleInterpolationCurve3d(this)` */
120
121
  dispatchToGeometryHandler(handler: GeometryHandler): any;
121
122
  /**
122
123
  * Create an [[InterpolationCurve3d]] based on points, knots, and other properties in the [[InterpolationCurve3dProps]] or [[InterpolationCurve3dOptions]].
@@ -124,7 +125,8 @@ export declare class InterpolationCurve3d extends ProxyCurve {
124
125
  * * Use createCapture () if the options or props can be used without copy
125
126
  */
126
127
  static create(options: InterpolationCurve3dOptions | InterpolationCurve3dProps): InterpolationCurve3d | undefined;
127
- /** Create an [[InterpolationCurve3d]]
128
+ /**
129
+ * Create an [[InterpolationCurve3d]]
128
130
  * * The options object is captured into the new curve object (not copied)
129
131
  */
130
132
  static createCapture(options: InterpolationCurve3dOptions): InterpolationCurve3d | undefined;
@@ -148,6 +150,14 @@ export declare class InterpolationCurve3d extends ProxyCurve {
148
150
  * Transform this [[InterpolationCurve3d]] and its defining data in place
149
151
  */
150
152
  tryTransformInPlace(transform: Transform): boolean;
153
+ /**
154
+ * Find intervals of this CurvePrimitive that are interior to a clipper.
155
+ * * This implementation simply passes the call to the proxy curve.
156
+ * @param clipper clip structure (e.g. clip planes).
157
+ * @param announce (optional) function to be called announcing fractional intervals of the input curve.
158
+ * @returns true if any "in" segments are announced.
159
+ */
160
+ announceClipIntervals(clipper: Clipper, announce?: AnnounceNumberNumberCurvePrimitive): boolean;
151
161
  /** Return a deep clone */
152
162
  clone(): InterpolationCurve3d;
153
163
  isAlmostEqual(other: GeometryQuery): boolean;