@itwin/core-geometry 4.3.0-dev.9 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/CHANGELOG.md +52 -1
  2. package/lib/cjs/Geometry.d.ts +14 -2
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +20 -9
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/BSpline1dNd.d.ts +12 -2
  7. package/lib/cjs/bspline/BSpline1dNd.d.ts.map +1 -1
  8. package/lib/cjs/bspline/BSpline1dNd.js +27 -17
  9. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  10. package/lib/cjs/bspline/BSplineCurve.d.ts +30 -16
  11. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  12. package/lib/cjs/bspline/BSplineCurve.js +68 -44
  13. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  14. package/lib/cjs/bspline/BSplineCurve3dH.d.ts +27 -20
  15. package/lib/cjs/bspline/BSplineCurve3dH.d.ts.map +1 -1
  16. package/lib/cjs/bspline/BSplineCurve3dH.js +136 -87
  17. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  18. package/lib/cjs/bspline/BSplineSurface.d.ts +138 -74
  19. package/lib/cjs/bspline/BSplineSurface.d.ts.map +1 -1
  20. package/lib/cjs/bspline/BSplineSurface.js +242 -119
  21. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  22. package/lib/cjs/bspline/Bezier1dNd.d.ts +18 -4
  23. package/lib/cjs/bspline/Bezier1dNd.d.ts.map +1 -1
  24. package/lib/cjs/bspline/Bezier1dNd.js +19 -5
  25. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  26. package/lib/cjs/bspline/BezierCurve3dH.d.ts.map +1 -1
  27. package/lib/cjs/bspline/BezierCurve3dH.js +2 -1
  28. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  29. package/lib/cjs/bspline/KnotVector.d.ts +30 -33
  30. package/lib/cjs/bspline/KnotVector.d.ts.map +1 -1
  31. package/lib/cjs/bspline/KnotVector.js +76 -69
  32. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  33. package/lib/cjs/clipping/ClipUtils.d.ts +32 -5
  34. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  35. package/lib/cjs/clipping/ClipUtils.js +92 -11
  36. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  37. package/lib/cjs/core-geometry.d.ts +0 -2
  38. package/lib/cjs/core-geometry.d.ts.map +1 -1
  39. package/lib/cjs/core-geometry.js +0 -2
  40. package/lib/cjs/core-geometry.js.map +1 -1
  41. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  42. package/lib/cjs/curve/Arc3d.js +5 -5
  43. package/lib/cjs/curve/Arc3d.js.map +1 -1
  44. package/lib/cjs/curve/CurveLocationDetail.d.ts +1 -4
  45. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  46. package/lib/cjs/curve/CurveLocationDetail.js +4 -10
  47. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  48. package/lib/cjs/curve/CurveOps.d.ts +4 -5
  49. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  50. package/lib/cjs/curve/CurveOps.js +1 -1
  51. package/lib/cjs/curve/CurveOps.js.map +1 -1
  52. package/lib/cjs/curve/CurveTypes.d.ts +14 -2
  53. package/lib/cjs/curve/CurveTypes.d.ts.map +1 -1
  54. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  55. package/lib/cjs/curve/LineString3d.d.ts +3 -2
  56. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  57. package/lib/cjs/curve/LineString3d.js +1 -0
  58. package/lib/cjs/curve/LineString3d.js.map +1 -1
  59. package/lib/cjs/curve/PointString3d.d.ts +2 -1
  60. package/lib/cjs/curve/PointString3d.d.ts.map +1 -1
  61. package/lib/cjs/curve/PointString3d.js.map +1 -1
  62. package/lib/cjs/curve/RegionOps.d.ts +5 -11
  63. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  64. package/lib/cjs/curve/RegionOps.js.map +1 -1
  65. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +15 -9
  66. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  67. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +68 -56
  68. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  69. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +14 -16
  70. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  71. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +51 -69
  72. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  73. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -1
  74. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js +3 -2
  75. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  76. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +2 -3
  77. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  78. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  79. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts +4 -4
  80. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  81. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +38 -36
  82. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  83. package/lib/cjs/geometry3d/Angle.d.ts +0 -1
  84. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  85. package/lib/cjs/geometry3d/Angle.js +0 -1
  86. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  87. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts +21 -5
  88. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  89. package/lib/cjs/geometry3d/CoincidentGeometryOps.js +71 -45
  90. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  91. package/lib/cjs/geometry3d/Matrix3d.d.ts +20 -13
  92. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  93. package/lib/cjs/geometry3d/Matrix3d.js +28 -21
  94. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  95. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +11 -2
  96. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  97. package/lib/cjs/geometry3d/Point3dVector3d.js +16 -5
  98. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  99. package/lib/cjs/geometry3d/PointHelpers.d.ts +58 -20
  100. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  101. package/lib/cjs/geometry3d/PointHelpers.js +213 -62
  102. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  103. package/lib/cjs/geometry3d/Segment1d.d.ts +5 -1
  104. package/lib/cjs/geometry3d/Segment1d.d.ts.map +1 -1
  105. package/lib/cjs/geometry3d/Segment1d.js +11 -7
  106. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  107. package/lib/cjs/geometry3d/Transform.d.ts +4 -5
  108. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  109. package/lib/cjs/geometry3d/Transform.js +4 -5
  110. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  111. package/lib/cjs/geometry4d/Point4d.d.ts +13 -0
  112. package/lib/cjs/geometry4d/Point4d.d.ts.map +1 -1
  113. package/lib/cjs/geometry4d/Point4d.js +21 -0
  114. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  115. package/lib/cjs/numerics/BezierPolynomials.d.ts +88 -64
  116. package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
  117. package/lib/cjs/numerics/BezierPolynomials.js +92 -73
  118. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  119. package/lib/cjs/numerics/Newton.d.ts +143 -61
  120. package/lib/cjs/numerics/Newton.d.ts.map +1 -1
  121. package/lib/cjs/numerics/Newton.js +233 -66
  122. package/lib/cjs/numerics/Newton.js.map +1 -1
  123. package/lib/cjs/numerics/PascalCoefficients.d.ts +8 -12
  124. package/lib/cjs/numerics/PascalCoefficients.d.ts.map +1 -1
  125. package/lib/cjs/numerics/PascalCoefficients.js +10 -12
  126. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  127. package/lib/cjs/numerics/Polynomials.d.ts +6 -10
  128. package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
  129. package/lib/cjs/numerics/Polynomials.js +6 -10
  130. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  131. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +3 -0
  132. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  133. package/lib/cjs/polyface/PolyfaceBuilder.js +13 -2
  134. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  135. package/lib/cjs/polyface/PolyfaceData.d.ts +1 -1
  136. package/lib/cjs/polyface/PolyfaceData.js +1 -1
  137. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  138. package/lib/cjs/polyface/PolyfaceQuery.d.ts +38 -11
  139. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  140. package/lib/cjs/polyface/PolyfaceQuery.js +93 -16
  141. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  142. package/lib/cjs/serialization/BGFBReader.d.ts +10 -10
  143. package/lib/cjs/serialization/BGFBReader.d.ts.map +1 -1
  144. package/lib/cjs/serialization/BGFBReader.js +69 -42
  145. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  146. package/lib/cjs/serialization/BGFBWriter.d.ts +8 -8
  147. package/lib/cjs/serialization/BGFBWriter.d.ts.map +1 -1
  148. package/lib/cjs/serialization/BGFBWriter.js +80 -55
  149. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  150. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  151. package/lib/cjs/serialization/GeometrySamples.js +6 -8
  152. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  153. package/lib/cjs/serialization/IModelJsonSchema.d.ts +8 -14
  154. package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
  155. package/lib/cjs/serialization/IModelJsonSchema.js +85 -259
  156. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  157. package/lib/cjs/serialization/SerializationHelpers.d.ts +109 -0
  158. package/lib/cjs/serialization/SerializationHelpers.d.ts.map +1 -0
  159. package/lib/cjs/serialization/SerializationHelpers.js +591 -0
  160. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -0
  161. package/lib/cjs/topology/Graph.d.ts +399 -366
  162. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  163. package/lib/cjs/topology/Graph.js +531 -464
  164. package/lib/cjs/topology/Graph.js.map +1 -1
  165. package/lib/cjs/topology/MaskManager.d.ts +8 -9
  166. package/lib/cjs/topology/MaskManager.d.ts.map +1 -1
  167. package/lib/cjs/topology/MaskManager.js +11 -12
  168. package/lib/cjs/topology/MaskManager.js.map +1 -1
  169. package/lib/esm/Geometry.d.ts +14 -2
  170. package/lib/esm/Geometry.d.ts.map +1 -1
  171. package/lib/esm/Geometry.js +20 -9
  172. package/lib/esm/Geometry.js.map +1 -1
  173. package/lib/esm/bspline/BSpline1dNd.d.ts +12 -2
  174. package/lib/esm/bspline/BSpline1dNd.d.ts.map +1 -1
  175. package/lib/esm/bspline/BSpline1dNd.js +27 -17
  176. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  177. package/lib/esm/bspline/BSplineCurve.d.ts +30 -16
  178. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  179. package/lib/esm/bspline/BSplineCurve.js +68 -44
  180. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  181. package/lib/esm/bspline/BSplineCurve3dH.d.ts +27 -20
  182. package/lib/esm/bspline/BSplineCurve3dH.d.ts.map +1 -1
  183. package/lib/esm/bspline/BSplineCurve3dH.js +137 -88
  184. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  185. package/lib/esm/bspline/BSplineSurface.d.ts +138 -74
  186. package/lib/esm/bspline/BSplineSurface.d.ts.map +1 -1
  187. package/lib/esm/bspline/BSplineSurface.js +242 -119
  188. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  189. package/lib/esm/bspline/Bezier1dNd.d.ts +18 -4
  190. package/lib/esm/bspline/Bezier1dNd.d.ts.map +1 -1
  191. package/lib/esm/bspline/Bezier1dNd.js +19 -5
  192. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  193. package/lib/esm/bspline/BezierCurve3dH.d.ts.map +1 -1
  194. package/lib/esm/bspline/BezierCurve3dH.js +2 -1
  195. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  196. package/lib/esm/bspline/KnotVector.d.ts +30 -33
  197. package/lib/esm/bspline/KnotVector.d.ts.map +1 -1
  198. package/lib/esm/bspline/KnotVector.js +76 -69
  199. package/lib/esm/bspline/KnotVector.js.map +1 -1
  200. package/lib/esm/clipping/ClipUtils.d.ts +32 -5
  201. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  202. package/lib/esm/clipping/ClipUtils.js +92 -11
  203. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  204. package/lib/esm/core-geometry.d.ts +0 -2
  205. package/lib/esm/core-geometry.d.ts.map +1 -1
  206. package/lib/esm/core-geometry.js +0 -2
  207. package/lib/esm/core-geometry.js.map +1 -1
  208. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  209. package/lib/esm/curve/Arc3d.js +5 -5
  210. package/lib/esm/curve/Arc3d.js.map +1 -1
  211. package/lib/esm/curve/CurveLocationDetail.d.ts +1 -4
  212. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  213. package/lib/esm/curve/CurveLocationDetail.js +4 -10
  214. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  215. package/lib/esm/curve/CurveOps.d.ts +4 -5
  216. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  217. package/lib/esm/curve/CurveOps.js +1 -1
  218. package/lib/esm/curve/CurveOps.js.map +1 -1
  219. package/lib/esm/curve/CurveTypes.d.ts +14 -2
  220. package/lib/esm/curve/CurveTypes.d.ts.map +1 -1
  221. package/lib/esm/curve/CurveTypes.js.map +1 -1
  222. package/lib/esm/curve/LineString3d.d.ts +3 -2
  223. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  224. package/lib/esm/curve/LineString3d.js +1 -0
  225. package/lib/esm/curve/LineString3d.js.map +1 -1
  226. package/lib/esm/curve/PointString3d.d.ts +2 -1
  227. package/lib/esm/curve/PointString3d.d.ts.map +1 -1
  228. package/lib/esm/curve/PointString3d.js.map +1 -1
  229. package/lib/esm/curve/RegionOps.d.ts +5 -11
  230. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  231. package/lib/esm/curve/RegionOps.js.map +1 -1
  232. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +15 -9
  233. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  234. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +69 -57
  235. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  236. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +14 -16
  237. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  238. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +51 -68
  239. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  240. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -1
  241. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js +3 -2
  242. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  243. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +2 -3
  244. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  245. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  246. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts +4 -4
  247. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  248. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +38 -36
  249. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  250. package/lib/esm/geometry3d/Angle.d.ts +0 -1
  251. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  252. package/lib/esm/geometry3d/Angle.js +0 -1
  253. package/lib/esm/geometry3d/Angle.js.map +1 -1
  254. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts +21 -5
  255. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  256. package/lib/esm/geometry3d/CoincidentGeometryOps.js +71 -45
  257. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  258. package/lib/esm/geometry3d/Matrix3d.d.ts +20 -13
  259. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  260. package/lib/esm/geometry3d/Matrix3d.js +28 -21
  261. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  262. package/lib/esm/geometry3d/Point3dVector3d.d.ts +11 -2
  263. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  264. package/lib/esm/geometry3d/Point3dVector3d.js +16 -5
  265. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  266. package/lib/esm/geometry3d/PointHelpers.d.ts +58 -20
  267. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  268. package/lib/esm/geometry3d/PointHelpers.js +213 -62
  269. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  270. package/lib/esm/geometry3d/Segment1d.d.ts +5 -1
  271. package/lib/esm/geometry3d/Segment1d.d.ts.map +1 -1
  272. package/lib/esm/geometry3d/Segment1d.js +11 -7
  273. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  274. package/lib/esm/geometry3d/Transform.d.ts +4 -5
  275. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  276. package/lib/esm/geometry3d/Transform.js +4 -5
  277. package/lib/esm/geometry3d/Transform.js.map +1 -1
  278. package/lib/esm/geometry4d/Point4d.d.ts +13 -0
  279. package/lib/esm/geometry4d/Point4d.d.ts.map +1 -1
  280. package/lib/esm/geometry4d/Point4d.js +21 -0
  281. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  282. package/lib/esm/numerics/BezierPolynomials.d.ts +88 -64
  283. package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
  284. package/lib/esm/numerics/BezierPolynomials.js +92 -73
  285. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  286. package/lib/esm/numerics/Newton.d.ts +143 -61
  287. package/lib/esm/numerics/Newton.d.ts.map +1 -1
  288. package/lib/esm/numerics/Newton.js +229 -65
  289. package/lib/esm/numerics/Newton.js.map +1 -1
  290. package/lib/esm/numerics/PascalCoefficients.d.ts +8 -12
  291. package/lib/esm/numerics/PascalCoefficients.d.ts.map +1 -1
  292. package/lib/esm/numerics/PascalCoefficients.js +10 -12
  293. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  294. package/lib/esm/numerics/Polynomials.d.ts +6 -10
  295. package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
  296. package/lib/esm/numerics/Polynomials.js +6 -10
  297. package/lib/esm/numerics/Polynomials.js.map +1 -1
  298. package/lib/esm/polyface/PolyfaceBuilder.d.ts +3 -0
  299. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  300. package/lib/esm/polyface/PolyfaceBuilder.js +13 -2
  301. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  302. package/lib/esm/polyface/PolyfaceData.d.ts +1 -1
  303. package/lib/esm/polyface/PolyfaceData.js +1 -1
  304. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  305. package/lib/esm/polyface/PolyfaceQuery.d.ts +38 -11
  306. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  307. package/lib/esm/polyface/PolyfaceQuery.js +93 -16
  308. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  309. package/lib/esm/serialization/BGFBReader.d.ts +10 -10
  310. package/lib/esm/serialization/BGFBReader.d.ts.map +1 -1
  311. package/lib/esm/serialization/BGFBReader.js +69 -42
  312. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  313. package/lib/esm/serialization/BGFBWriter.d.ts +8 -8
  314. package/lib/esm/serialization/BGFBWriter.d.ts.map +1 -1
  315. package/lib/esm/serialization/BGFBWriter.js +80 -55
  316. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  317. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  318. package/lib/esm/serialization/GeometrySamples.js +7 -9
  319. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  320. package/lib/esm/serialization/IModelJsonSchema.d.ts +8 -14
  321. package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
  322. package/lib/esm/serialization/IModelJsonSchema.js +86 -260
  323. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  324. package/lib/esm/serialization/SerializationHelpers.d.ts +109 -0
  325. package/lib/esm/serialization/SerializationHelpers.d.ts.map +1 -0
  326. package/lib/esm/serialization/SerializationHelpers.js +588 -0
  327. package/lib/esm/serialization/SerializationHelpers.js.map +1 -0
  328. package/lib/esm/topology/Graph.d.ts +399 -366
  329. package/lib/esm/topology/Graph.d.ts.map +1 -1
  330. package/lib/esm/topology/Graph.js +531 -464
  331. package/lib/esm/topology/Graph.js.map +1 -1
  332. package/lib/esm/topology/MaskManager.d.ts +8 -9
  333. package/lib/esm/topology/MaskManager.d.ts.map +1 -1
  334. package/lib/esm/topology/MaskManager.js +11 -12
  335. package/lib/esm/topology/MaskManager.js.map +1 -1
  336. package/package.json +3 -4
@@ -13,7 +13,7 @@ import { Point3dArray, Point4dArray } from "../geometry3d/PointHelpers";
13
13
  import { Point4d } from "../geometry4d/Point4d";
14
14
  import { BezierCurve3dH } from "./BezierCurve3dH";
15
15
  import { BSplineCurve3dBase } from "./BSplineCurve";
16
- import { KnotVector } from "./KnotVector";
16
+ import { BSplineWrapMode, KnotVector } from "./KnotVector";
17
17
  /**
18
18
  * Weighted (Homogeneous) BSplineCurve in 3d
19
19
  * @public
@@ -88,13 +88,13 @@ export class BSplineCurve3dH extends BSplineCurve3dBase {
88
88
  }
89
89
  return result;
90
90
  }
91
- /** Create a bspline with uniform knots.
91
+ /** Create a homogeneous B-spline curve with uniform knots.
92
92
  * * Control points may be supplied as:
93
93
  * * array of Point4d, with weight already multiplied into the `[wx,wy,wz,w]`
94
94
  * * array of Point3d, with implied weight 1.
95
- * * Float64Array, blocked as xyzw, i.e. 4 doubles per control point.
95
+ * * Float64Array, blocked as [wx,wy,wz,w], i.e. 4 numbers per control point.
96
96
  * @param controlPoints pole data in array form as noted above.
97
- * @param order curve order (1 more than degree)
97
+ * @param order curve order (1 more than degree)
98
98
  */
99
99
  static createUniformKnots(controlPoints, order) {
100
100
  const numPoles = (controlPoints instanceof Float64Array) ? controlPoints.length / 4 : controlPoints.length;
@@ -103,30 +103,91 @@ export class BSplineCurve3dH extends BSplineCurve3dBase {
103
103
  const knots = KnotVector.createUniformClamped(controlPoints.length, order - 1, 0.0, 1.0);
104
104
  const curve = new BSplineCurve3dH(numPoles, order, knots);
105
105
  let i = 0;
106
- if (controlPoints[0] instanceof Point3d) {
107
- for (const p of controlPoints) {
108
- curve._bcurve.packedData[i++] = p.x;
109
- curve._bcurve.packedData[i++] = p.y;
110
- curve._bcurve.packedData[i++] = p.z;
111
- curve._bcurve.packedData[i++] = 1.0;
106
+ if (Array.isArray(controlPoints)) {
107
+ if (controlPoints[0] instanceof Point3d) {
108
+ for (const p of controlPoints) {
109
+ curve._bcurve.packedData[i++] = p.x;
110
+ curve._bcurve.packedData[i++] = p.y;
111
+ curve._bcurve.packedData[i++] = p.z;
112
+ curve._bcurve.packedData[i++] = 1.0;
113
+ }
112
114
  }
113
- }
114
- else if (controlPoints[0] instanceof Point4d) {
115
- for (const p of controlPoints) {
116
- curve._bcurve.packedData[i++] = p.x;
117
- curve._bcurve.packedData[i++] = p.y;
118
- curve._bcurve.packedData[i++] = p.z;
119
- curve._bcurve.packedData[i++] = p.w;
115
+ else if (controlPoints[0] instanceof Point4d) {
116
+ for (const p of controlPoints) {
117
+ curve._bcurve.packedData[i++] = p.x;
118
+ curve._bcurve.packedData[i++] = p.y;
119
+ curve._bcurve.packedData[i++] = p.z;
120
+ curve._bcurve.packedData[i++] = p.w;
121
+ }
120
122
  }
121
123
  }
122
- else if (controlPoints instanceof Float64Array) {
124
+ else {
123
125
  const numQ = controlPoints.length;
124
- for (let k = 0; k < numQ; k++) {
126
+ for (let k = 0; k < numQ; k++)
125
127
  curve._bcurve.packedData[k] = controlPoints[k];
128
+ }
129
+ return curve;
130
+ }
131
+ /** Create a smoothly closed homogeneous B-spline curve with uniform knots.
132
+ * * Note that the curve does not start at the first pole!
133
+ * * Control points (poles) may be supplied as:
134
+ * * array of Point4d, with weight already multiplied into the `[wx,wy,wz,w]`
135
+ * * array of Point3d, with implied weight 1.
136
+ * * Float64Array, blocked as [wx,wy,wz,w], i.e. 4 numbers per control point.
137
+ * @param poles control point data in array form as noted above.
138
+ * @param order curve order (1 more than degree)
139
+ */
140
+ static createPeriodicUniformKnots(poles, order) {
141
+ if (order < 2)
142
+ return undefined;
143
+ let numPoles = poles instanceof Float64Array ? poles.length / 4 : poles.length;
144
+ if (numPoles < 2)
145
+ return undefined;
146
+ const is4d = poles[0] instanceof Point4d;
147
+ const startPoint = Point4d.createZero();
148
+ const endPoint = Point4d.createZero();
149
+ let hasClosurePoint = false;
150
+ do {
151
+ if (poles instanceof Float64Array) {
152
+ startPoint.set(poles[0], poles[1], poles[2], poles[3]);
153
+ endPoint.set(poles[4 * numPoles - 4], poles[4 * numPoles - 3], poles[4 * numPoles - 2], poles[4 * numPoles - 1]);
154
+ }
155
+ else {
156
+ startPoint.set(poles[0].x, poles[0].y, poles[0].z, is4d ? poles[0].w : 1.0);
157
+ endPoint.set(poles[numPoles - 1].x, poles[numPoles - 1].y, poles[numPoles - 1].z, is4d ? poles[numPoles - 1].w : 1.0);
126
158
  }
159
+ if (hasClosurePoint = startPoint.isAlmostEqual(endPoint))
160
+ --numPoles; // remove wraparound pole if found
161
+ } while (hasClosurePoint && numPoles > 1);
162
+ if (numPoles < order)
163
+ return undefined;
164
+ const degree = order - 1;
165
+ const numIntervals = numPoles;
166
+ const knots = KnotVector.createUniformWrapped(numIntervals, degree, 0.0, 1.0);
167
+ knots.wrappable = BSplineWrapMode.OpenByAddingControlPoints;
168
+ // append degree wraparound poles
169
+ const curve = new BSplineCurve3dH(numPoles + degree, order, knots);
170
+ if (poles instanceof Float64Array) {
171
+ let i = 0;
172
+ for (let j = 0; j < 4 * numPoles; j++)
173
+ curve._bcurve.packedData[i++] = poles[j];
174
+ for (let j = 0; j < 4 * degree; j++)
175
+ curve._bcurve.packedData[i++] = poles[j];
127
176
  }
128
177
  else {
129
- return undefined;
178
+ let i = 0;
179
+ for (let j = 0; j < numPoles; j++) {
180
+ curve._bcurve.packedData[i++] = poles[j].x;
181
+ curve._bcurve.packedData[i++] = poles[j].y;
182
+ curve._bcurve.packedData[i++] = poles[j].z;
183
+ curve._bcurve.packedData[i++] = is4d ? poles[j].w : 1.0;
184
+ }
185
+ for (let j = 0; j < degree; j++) {
186
+ curve._bcurve.packedData[i++] = poles[j].x;
187
+ curve._bcurve.packedData[i++] = poles[j].y;
188
+ curve._bcurve.packedData[i++] = poles[j].z;
189
+ curve._bcurve.packedData[i++] = is4d ? poles[j].w : 1.0;
190
+ }
130
191
  }
131
192
  return curve;
132
193
  }
@@ -135,41 +196,52 @@ export class BSplineCurve3dH extends BSplineCurve3dBase {
135
196
  * @param controlPoints
136
197
  */
137
198
  static assemblePackedXYZW(controlPoints) {
138
- if (controlPoints instanceof Float64Array) {
199
+ if (controlPoints instanceof Float64Array)
139
200
  return controlPoints.slice();
140
- }
141
- else if (Array.isArray(controlPoints)) {
142
- const cpArray = controlPoints; // This should not be necessary -- but the predicate controlPoints[0] is not recognized even though Array.isArray(controlPoints) was just passed.
143
- if (cpArray[0] instanceof Point4d) {
144
- const numPoints = cpArray.length;
145
- const packedPoints = new Float64Array(4 * numPoints);
146
- let i = 0;
201
+ let packedPoints;
202
+ if (Array.isArray(controlPoints) && controlPoints.length > 0) {
203
+ const numPoints = controlPoints.length;
204
+ let i = 0;
205
+ if (controlPoints[0] instanceof Point4d) {
206
+ packedPoints = new Float64Array(4 * numPoints);
147
207
  for (const p of controlPoints) {
148
208
  packedPoints[i++] = p.x;
149
209
  packedPoints[i++] = p.y;
150
210
  packedPoints[i++] = p.z;
151
211
  packedPoints[i++] = p.w;
152
212
  }
153
- return packedPoints;
154
213
  }
155
- else if (cpArray[0] instanceof Point3d) {
156
- const numPoints = cpArray.length;
157
- const packedPoints = new Float64Array(4 * numPoints);
158
- let i = 0;
214
+ else if (controlPoints[0] instanceof Point3d) {
215
+ packedPoints = new Float64Array(4 * numPoints);
159
216
  for (const p of controlPoints) {
160
217
  packedPoints[i++] = p.x;
161
218
  packedPoints[i++] = p.y;
162
219
  packedPoints[i++] = p.z;
163
220
  packedPoints[i++] = 1.0;
164
221
  }
165
- return packedPoints;
222
+ }
223
+ else if (Array.isArray(controlPoints[0])) {
224
+ if (controlPoints[0].length === 4) {
225
+ packedPoints = new Float64Array(4 * numPoints);
226
+ for (const point of controlPoints)
227
+ for (const coord of point)
228
+ packedPoints[i++] = coord;
229
+ }
230
+ else if (controlPoints[0].length === 3) {
231
+ packedPoints = new Float64Array(4 * numPoints);
232
+ for (const point of controlPoints) {
233
+ for (const coord of point)
234
+ packedPoints[i++] = coord;
235
+ packedPoints[i++] = 1.0;
236
+ }
237
+ }
166
238
  }
167
239
  }
168
- else {
240
+ else { // controlPoints is NOT an array
169
241
  const obj = controlPoints;
170
242
  if (obj.xyz instanceof Float64Array && obj.weights instanceof Float64Array && obj.xyz.length === 3 * obj.weights.length) {
171
243
  const numPoints = obj.weights.length;
172
- const packedPoints = new Float64Array(4 * numPoints);
244
+ packedPoints = new Float64Array(4 * numPoints);
173
245
  let m = 0;
174
246
  for (let i = 0; i < obj.weights.length; i++) {
175
247
  const k = 3 * i;
@@ -178,45 +250,41 @@ export class BSplineCurve3dH extends BSplineCurve3dBase {
178
250
  packedPoints[m++] = obj.xyz[k + 2];
179
251
  packedPoints[m++] = obj.weights[i];
180
252
  }
181
- return packedPoints;
182
253
  }
183
254
  }
184
- return undefined;
255
+ return packedPoints;
185
256
  }
186
- /** Create a bspline with given knots.
257
+ /**
258
+ * Create a bspline with given knots.
187
259
  * * The poles have several variants:
188
- * * Float64Array(4 * numPoles) in blocks of [wx,xy,wz,w]
189
- * * Point4d[numPoles]
190
- * * Point3d[], with implied unit weight to be added.
191
- * * {xyz: Float64Array(3 * numPoles), weights: Float64Array (numPoles)}
192
- *
193
- * * Two count conditions are recognized:
194
- *
195
- * ** If poleArray.length + order == knotArray.length, the first and last are assumed to be the
196
- * extraneous knots of classic clamping.
197
- * ** If poleArray.length + order == knotArray.length + 2, the knots are in modern form.
198
- *
260
+ * * Float64Array(4 * numPoles) in blocks of [wx,xy,wz,w]
261
+ * * Point4d[numPoles]
262
+ * * Point3d[], with implied unit weight to be added
263
+ * * number[][], with inner dimension 4
264
+ * * {xyz: Float64Array(3 * numPoles), weights: Float64Array (numPoles)}
265
+ * * Two count conditions are recognized:
266
+ * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the extraneous knots of classic clamping.
267
+ * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form.
199
268
  */
200
269
  static create(controlPointData, knotArray, order) {
201
270
  if (order < 2)
202
271
  return undefined;
203
272
  const controlPoints = this.assemblePackedXYZW(controlPointData);
204
- if (controlPoints instanceof Float64Array) {
205
- const numPoles = Math.floor(controlPoints.length / 4);
206
- const numKnots = knotArray.length;
207
- // shift knots-of-interest limits for overclamped case ...
208
- const skipFirstAndLast = (numPoles + order === numKnots);
209
- const knots = KnotVector.create(knotArray, order - 1, skipFirstAndLast);
210
- if (numPoles < order)
211
- return undefined;
212
- const curve = new BSplineCurve3dH(numPoles, order, knots);
213
- let i = 0;
214
- for (const coordinate of controlPoints) {
215
- curve._bcurve.packedData[i++] = coordinate;
216
- }
217
- return curve;
218
- }
219
- return undefined;
273
+ if (undefined === controlPoints)
274
+ return undefined;
275
+ const numPoles = Math.floor(controlPoints.length / 4);
276
+ if (numPoles < order)
277
+ return undefined;
278
+ const numKnots = knotArray.length;
279
+ const skipFirstAndLast = (numPoles + order === numKnots); // classic over-clamped input knots
280
+ if (!skipFirstAndLast && numPoles + order !== numKnots + 2) // modern knots
281
+ return undefined;
282
+ const knots = KnotVector.create(knotArray, order - 1, skipFirstAndLast);
283
+ const curve = new BSplineCurve3dH(numPoles, order, knots);
284
+ let i = 0;
285
+ for (const coordinate of controlPoints)
286
+ curve._bcurve.packedData[i++] = coordinate;
287
+ return curve;
220
288
  }
221
289
  /** Return a deep clone of this curve. */
222
290
  clone() {
@@ -337,30 +405,11 @@ export class BSplineCurve3dH extends BSplineCurve3dBase {
337
405
  CurvePrimitive.installStrokeCountMap(this, myData, parentStrokeMap);
338
406
  }
339
407
  /**
340
- * return true if the spline is (a) unclamped with (degree-1) matching knot intervals,
341
- * (b) (degree-1) wrapped points,
342
- * (c) marked wrappable from construction time.
408
+ * Test knots and control points to determine if it is possible to close (aka "wrap") the curve.
409
+ * @return whether the curve can be wrapped.
343
410
  */
344
411
  get isClosable() {
345
- if (!this._bcurve.knots.wrappable)
346
- return false;
347
- const degree = this.degree;
348
- const leftKnotIndex = this._bcurve.knots.leftKnotIndex;
349
- const rightKnotIndex = this._bcurve.knots.rightKnotIndex;
350
- const period = this._bcurve.knots.rightKnot - this._bcurve.knots.leftKnot;
351
- const indexDelta = rightKnotIndex - leftKnotIndex;
352
- for (let k0 = leftKnotIndex - degree + 1; k0 < leftKnotIndex + degree - 1; k0++) {
353
- const k1 = k0 + indexDelta;
354
- if (!Geometry.isSameCoordinate(this._bcurve.knots.knots[k0] + period, this._bcurve.knots.knots[k1]))
355
- return false;
356
- }
357
- const poleIndexDelta = this.numPoles - this.degree;
358
- for (let p0 = 0; p0 < degree; p0++) {
359
- const p1 = p0 + poleIndexDelta;
360
- if (!Geometry.isSamePoint3d(this.getPolePoint3d(p0), this.getPolePoint3d(p1)))
361
- return false;
362
- }
363
- return true;
412
+ return BSplineWrapMode.None !== this.isClosableCurve;
364
413
  }
365
414
  /**
366
415
  * Return a CurvePrimitive (which is a BezierCurve3dH) for a specified span of this curve.
@@ -1 +1 @@
1
- {"version":3,"file":"BSplineCurve3dH.js","sourceRoot":"","sources":["../../../src/bspline/BSplineCurve3dH.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Serialization\r\n */\r\n\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { StrokeCountMap } from \"../curve/Query/StrokeCountMap\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray, Point4dArray } from \"../geometry3d/PointHelpers\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { BezierCurve3dH } from \"./BezierCurve3dH\";\r\nimport { BezierCurveBase } from \"./BezierCurveBase\";\r\nimport { BSplineCurve3dBase } from \"./BSplineCurve\";\r\nimport { KnotVector } from \"./KnotVector\";\r\n\r\n/**\r\n * Weighted (Homogeneous) BSplineCurve in 3d\r\n * @public\r\n */\r\nexport class BSplineCurve3dH extends BSplineCurve3dBase {\r\n private _workBezier?: BezierCurve3dH;\r\n private initializeWorkBezier(): BezierCurve3dH {\r\n if (this._workBezier === undefined)\r\n this._workBezier = BezierCurve3dH.createOrder(this.order);\r\n return this._workBezier;\r\n }\r\n /** Test if `other` is an instance of `BSplineCurve3dH` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof BSplineCurve3dH; }\r\n /** Apply `transform` to the curve */\r\n public tryTransformInPlace(transform: Transform): boolean { Point4dArray.multiplyInPlace(transform, this._bcurve.packedData); return true; }\r\n /** Get a pole, normalized to Point3d. */\r\n public getPolePoint3d(poleIndex: number, result?: Point3d): Point3d | undefined {\r\n const k = this.poleIndexToDataIndex(poleIndex);\r\n if (k !== undefined) {\r\n const data = this._bcurve.packedData;\r\n const divW = Geometry.conditionalDivideFraction(1.0, data[k + 3]);\r\n if (divW !== undefined)\r\n return Point3d.create(data[k] * divW, data[k + 1] * divW, data[k + 2] * divW, result);\r\n }\r\n return undefined;\r\n }\r\n /** Get a pole as Point4d */\r\n public getPolePoint4d(poleIndex: number, result?: Point4d): Point4d | undefined {\r\n const k = this.poleIndexToDataIndex(poleIndex);\r\n if (k !== undefined) {\r\n const data = this._bcurve.packedData;\r\n return Point4d.create(data[k], data[k + 1], data[k + 2], data[k + 3], result);\r\n }\r\n return undefined;\r\n }\r\n /** map a spanIndex and fraction to a knot value. */\r\n public spanFractionToKnot(span: number, localFraction: number): number {\r\n return this._bcurve.spanFractionToKnot(span, localFraction);\r\n }\r\n private constructor(numPoles: number, order: number, knots: KnotVector) {\r\n super(4, numPoles, order, knots);\r\n }\r\n /** Return a simple array of arrays with the control points as `[[x,y,z,w],[x,y,z,w],..]` */\r\n public copyPoints(): any[] { return Point3dArray.unpackNumbersToNestedArrays(this._bcurve.packedData, 4); }\r\n /** Return a simple array of the control points coordinates */\r\n public copyPointsFloat64Array(): Float64Array { return this._bcurve.packedData.slice(); }\r\n /** Return a simple array of the control points xyz coordinates. */\r\n public copyXYZFloat64Array(deweighted: boolean): Float64Array {\r\n const numValue = this.numPoles * 3;\r\n const result = new Float64Array(numValue);\r\n let k = 0;\r\n for (let poleIndex = 0; poleIndex < this.numPoles; poleIndex++) {\r\n let i = poleIndex * 4;\r\n if (deweighted) {\r\n const w = this._bcurve.packedData[i + 3];\r\n const dw = w === 0.0 ? 1.0 : 1.0 / w;\r\n result[k++] = this._bcurve.packedData[i++] * dw;\r\n result[k++] = this._bcurve.packedData[i++] * dw;\r\n result[k++] = this._bcurve.packedData[i++] * dw;\r\n\r\n } else {\r\n result[k++] = this._bcurve.packedData[i++];\r\n result[k++] = this._bcurve.packedData[i++];\r\n result[k++] = this._bcurve.packedData[i++];\r\n }\r\n }\r\n return result;\r\n }\r\n public copyWeightsFloat64Array(): Float64Array {\r\n const result = new Float64Array(this.numPoles);\r\n for (let poleIndex = 0; poleIndex < this.numPoles; poleIndex++) {\r\n result[poleIndex] = this._bcurve.packedData[4 * poleIndex + 3];\r\n }\r\n return result;\r\n }\r\n\r\n /** Create a bspline with uniform knots.\r\n * * Control points may be supplied as:\r\n * * array of Point4d, with weight already multiplied into the `[wx,wy,wz,w]`\r\n * * array of Point3d, with implied weight 1.\r\n * * Float64Array, blocked as xyzw, i.e. 4 doubles per control point.\r\n * @param controlPoints pole data in array form as noted above.\r\n * @param order curve order (1 more than degree)\r\n */\r\n public static createUniformKnots(controlPoints: Point3d[] | Point4d[] | Float64Array, order: number): BSplineCurve3dH | undefined {\r\n const numPoles = (controlPoints instanceof Float64Array) ? controlPoints.length / 4 : controlPoints.length;\r\n if (order < 1 || numPoles < order)\r\n return undefined;\r\n const knots = KnotVector.createUniformClamped(controlPoints.length, order - 1, 0.0, 1.0);\r\n const curve = new BSplineCurve3dH(numPoles, order, knots);\r\n let i = 0;\r\n if (controlPoints[0] instanceof Point3d) {\r\n for (const p of (controlPoints as Point3d[])) { curve._bcurve.packedData[i++] = p.x; curve._bcurve.packedData[i++] = p.y; curve._bcurve.packedData[i++] = p.z; curve._bcurve.packedData[i++] = 1.0; }\r\n } else if (controlPoints[0] instanceof Point4d) {\r\n for (const p of (controlPoints as Point4d[])) { curve._bcurve.packedData[i++] = p.x; curve._bcurve.packedData[i++] = p.y; curve._bcurve.packedData[i++] = p.z; curve._bcurve.packedData[i++] = p.w; }\r\n } else if (controlPoints instanceof Float64Array) {\r\n const numQ = controlPoints.length;\r\n for (let k = 0; k < numQ; k++) {\r\n curve._bcurve.packedData[k] = controlPoints[k];\r\n }\r\n } else {\r\n return undefined;\r\n }\r\n return curve;\r\n }\r\n\r\n /**\r\n * Assemble a variously structured control points into packed array of [xyzw].\r\n * @param controlPoints\r\n */\r\n public static assemblePackedXYZW(controlPoints: Float64Array | Point4d[] | { xyz: Float64Array, weights: Float64Array } | Point3d[]): Float64Array | undefined {\r\n if (controlPoints instanceof Float64Array) {\r\n return controlPoints.slice();\r\n } else if (Array.isArray(controlPoints)) {\r\n const cpArray = controlPoints as any[]; // This should not be necessary -- but the predicate controlPoints[0] is not recognized even though Array.isArray(controlPoints) was just passed.\r\n if (cpArray[0] instanceof Point4d) {\r\n const numPoints = cpArray.length;\r\n const packedPoints = new Float64Array(4 * numPoints);\r\n let i = 0;\r\n for (const p of (controlPoints as Point4d[])) {\r\n packedPoints[i++] = p.x;\r\n packedPoints[i++] = p.y;\r\n packedPoints[i++] = p.z;\r\n packedPoints[i++] = p.w;\r\n }\r\n return packedPoints;\r\n } else if (cpArray[0] instanceof Point3d) {\r\n const numPoints = cpArray.length;\r\n const packedPoints = new Float64Array(4 * numPoints);\r\n let i = 0;\r\n for (const p of (controlPoints as Point3d[])) {\r\n packedPoints[i++] = p.x;\r\n packedPoints[i++] = p.y;\r\n packedPoints[i++] = p.z;\r\n packedPoints[i++] = 1.0;\r\n }\r\n return packedPoints;\r\n }\r\n } else {\r\n const obj = controlPoints as any;\r\n if (obj.xyz instanceof Float64Array && obj.weights instanceof Float64Array && obj.xyz.length === 3 * obj.weights.length) {\r\n const numPoints = obj.weights.length;\r\n const packedPoints = new Float64Array(4 * numPoints);\r\n\r\n let m = 0;\r\n for (let i = 0; i < obj.weights.length; i++) {\r\n const k = 3 * i;\r\n packedPoints[m++] = obj.xyz[k];\r\n packedPoints[m++] = obj.xyz[k + 1];\r\n packedPoints[m++] = obj.xyz[k + 2];\r\n packedPoints[m++] = obj.weights[i];\r\n }\r\n return packedPoints;\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Create a bspline with given knots.\r\n * * The poles have several variants:\r\n * * Float64Array(4 * numPoles) in blocks of [wx,xy,wz,w]\r\n * * Point4d[numPoles]\r\n * * Point3d[], with implied unit weight to be added.\r\n * * {xyz: Float64Array(3 * numPoles), weights: Float64Array (numPoles)}\r\n *\r\n * * Two count conditions are recognized:\r\n *\r\n * ** If poleArray.length + order == knotArray.length, the first and last are assumed to be the\r\n * extraneous knots of classic clamping.\r\n * ** If poleArray.length + order == knotArray.length + 2, the knots are in modern form.\r\n *\r\n */\r\n public static create(controlPointData: Float64Array | Point4d[] | { xyz: Float64Array, weights: Float64Array } | Point3d[], knotArray: Float64Array | number[], order: number): BSplineCurve3dH | undefined {\r\n if (order < 2)\r\n return undefined;\r\n const controlPoints = this.assemblePackedXYZW(controlPointData);\r\n if (controlPoints instanceof Float64Array) {\r\n const numPoles = Math.floor(controlPoints.length / 4);\r\n const numKnots = knotArray.length;\r\n // shift knots-of-interest limits for overclamped case ...\r\n const skipFirstAndLast = (numPoles + order === numKnots);\r\n const knots = KnotVector.create(knotArray, order - 1, skipFirstAndLast);\r\n if (numPoles < order)\r\n return undefined;\r\n const curve = new BSplineCurve3dH(numPoles, order, knots);\r\n let i = 0;\r\n for (const coordinate of controlPoints) { curve._bcurve.packedData[i++] = coordinate; }\r\n return curve;\r\n }\r\n return undefined;\r\n }\r\n /** Return a deep clone of this curve. */\r\n public override clone(): BSplineCurve3dH {\r\n const knotVector1 = this._bcurve.knots.clone();\r\n const curve1 = new BSplineCurve3dH(this.numPoles, this.order, knotVector1);\r\n curve1._bcurve.packedData = this._bcurve.packedData.slice();\r\n return curve1;\r\n }\r\n\r\n /** Evaluate at a position given by fractional position within a span. */\r\n public evaluatePointInSpan(spanIndex: number, spanFraction: number, result?: Point3d): Point3d {\r\n this._bcurve.evaluateBuffersInSpan(spanIndex, spanFraction);\r\n const xyzw = this._bcurve.poleBuffer;\r\n return Point4d.createRealPoint3dDefault000(xyzw[0], xyzw[1], xyzw[2], xyzw[3], result);\r\n }\r\n\r\n /** Evaluate at a position given by fractional position within a span. */\r\n public evaluatePointAndDerivativeInSpan(spanIndex: number, spanFraction: number, result?: Ray3d): Ray3d {\r\n this._bcurve.evaluateBuffersInSpan1(spanIndex, spanFraction);\r\n const xyzw = this._bcurve.poleBuffer;\r\n const dXYZW = this._bcurve.poleBuffer1;\r\n return Point4d.createRealDerivativeRay3dDefault000(\r\n xyzw[0], xyzw[1], xyzw[2], xyzw[3],\r\n dXYZW[0], dXYZW[1], dXYZW[2], dXYZW[3], result);\r\n }\r\n\r\n /** Evaluate at a position given by a knot value. */\r\n public knotToPoint(u: number, result?: Point3d): Point3d {\r\n this._bcurve.evaluateBuffersAtKnot(u);\r\n const xyzw = this._bcurve.poleBuffer;\r\n return Point4d.createRealPoint3dDefault000(xyzw[0], xyzw[1], xyzw[2], xyzw[3], result);\r\n }\r\n /** Evaluate at a position given by a knot value. */\r\n public knotToPointAndDerivative(u: number, result?: Ray3d): Ray3d {\r\n this._bcurve.evaluateBuffersAtKnot(u, 1);\r\n const xyzw = this._bcurve.poleBuffer;\r\n const dXYZW = this._bcurve.poleBuffer1;\r\n return Point4d.createRealDerivativeRay3dDefault000(\r\n xyzw[0], xyzw[1], xyzw[2], xyzw[3],\r\n dXYZW[0], dXYZW[1], dXYZW[2], dXYZW[3], result);\r\n }\r\n\r\n /** Evaluate at a position given by a knot value. Return point with 2 derivatives. */\r\n public knotToPointAnd2Derivatives(u: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n this._bcurve.evaluateBuffersAtKnot(u, 2);\r\n const xyzw = this._bcurve.poleBuffer;\r\n const dXYZW = this._bcurve.poleBuffer1;\r\n const ddXYZW = this._bcurve.poleBuffer2;\r\n return Point4d.createRealDerivativePlane3dByOriginAndVectorsDefault000(\r\n xyzw[0], xyzw[1], xyzw[2], xyzw[3],\r\n dXYZW[0], dXYZW[1], dXYZW[2], dXYZW[3],\r\n ddXYZW[0], ddXYZW[1], ddXYZW[2], ddXYZW[3],\r\n result);\r\n }\r\n /** test if the curve is almost equal to `other` */\r\n public override isAlmostEqual(other: any): boolean {\r\n if (other instanceof BSplineCurve3dH) {\r\n return this._bcurve.knots.isAlmostEqual(other._bcurve.knots)\r\n && Point4dArray.isAlmostEqual(this._bcurve.packedData, other._bcurve.packedData);\r\n }\r\n return false;\r\n }\r\n /** Test if the curve is entirely within a plane. */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n return Point4dArray.isCloseToPlane(this._bcurve.packedData, plane);\r\n }\r\n /** Return the control polygon length as quick approximation to the curve length. */\r\n public quickLength(): number { return Point3dArray.sumEdgeLengths(this._bcurve.packedData); }\r\n /** call a handler with interval data for stroking. */\r\n public emitStrokableParts(handler: IStrokeHandler, options?: StrokeOptions): void {\r\n const needBeziers = (handler as any).announceBezierCurve;\r\n const workBezier = this.initializeWorkBezier();\r\n const numSpan = this.numSpan;\r\n let numStrokes;\r\n for (let spanIndex = 0; spanIndex < numSpan; spanIndex++) {\r\n const bezier = this.getSaturatedBezierSpan3dOr3dH(spanIndex, false, workBezier);\r\n if (bezier) {\r\n numStrokes = bezier.computeStrokeCountForOptions(options);\r\n if (needBeziers) {\r\n (handler as any).announceBezierCurve(bezier, numStrokes, this,\r\n spanIndex,\r\n this._bcurve.knots.spanFractionToFraction(spanIndex, 0.0),\r\n this._bcurve.knots.spanFractionToFraction(spanIndex, 1.0));\r\n\r\n } else {\r\n handler.announceIntervalForUniformStepStrokes(this, numStrokes,\r\n this._bcurve.knots.spanFractionToFraction(spanIndex, 0.0),\r\n this._bcurve.knots.spanFractionToFraction(spanIndex, 1.0));\r\n }\r\n }\r\n }\r\n }\r\n /** Append stroked approximation of this curve to the linestring. */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\r\n const workBezier = this.initializeWorkBezier();\r\n const numSpan = this.numSpan;\r\n for (let spanIndex = 0; spanIndex < numSpan; spanIndex++) {\r\n const bezier = this.getSaturatedBezierSpan3dH(spanIndex, workBezier);\r\n if (bezier)\r\n bezier.emitStrokes(dest, options);\r\n }\r\n }\r\n /**\r\n * Assess length and turn to determine a stroke count.\r\n * @param options stroke options structure.\r\n */\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n const workBezier = this.initializeWorkBezier();\r\n const numSpan = this.numSpan;\r\n let numStroke = 0;\r\n for (let spanIndex = 0; spanIndex < numSpan; spanIndex++) {\r\n const bezier = this.getSaturatedBezierSpan3dH(spanIndex, workBezier);\r\n if (bezier)\r\n numStroke += bezier.computeStrokeCountForOptions(options);\r\n }\r\n return numStroke;\r\n }\r\n /**\r\n * Compute individual segment stroke counts. Attach in a StrokeCountMap.\r\n * @param options StrokeOptions that determine count\r\n * @param parentStrokeMap evolving parent map.\r\n */\r\n public override computeAndAttachRecursiveStrokeCounts(options?: StrokeOptions, parentStrokeMap?: StrokeCountMap) {\r\n const workBezier = this.initializeWorkBezier();\r\n const numSpan = this.numSpan;\r\n const myData = StrokeCountMap.createWithCurvePrimitiveAndOptionalParent(this, parentStrokeMap, []);\r\n\r\n for (let spanIndex = 0; spanIndex < numSpan; spanIndex++) {\r\n const bezier = this.getSaturatedBezierSpan3dH(spanIndex, workBezier);\r\n if (bezier) {\r\n const segmentLength = workBezier.curveLength();\r\n const numStrokeOnSegment = workBezier.computeStrokeCountForOptions(options);\r\n myData.addToCountAndLength(numStrokeOnSegment, segmentLength);\r\n }\r\n }\r\n CurvePrimitive.installStrokeCountMap(this, myData, parentStrokeMap);\r\n }\r\n /**\r\n * return true if the spline is (a) unclamped with (degree-1) matching knot intervals,\r\n * (b) (degree-1) wrapped points,\r\n * (c) marked wrappable from construction time.\r\n */\r\n public get isClosable(): boolean {\r\n if (!this._bcurve.knots.wrappable)\r\n return false;\r\n const degree = this.degree;\r\n const leftKnotIndex = this._bcurve.knots.leftKnotIndex;\r\n const rightKnotIndex = this._bcurve.knots.rightKnotIndex;\r\n const period = this._bcurve.knots.rightKnot - this._bcurve.knots.leftKnot;\r\n const indexDelta = rightKnotIndex - leftKnotIndex;\r\n for (let k0 = leftKnotIndex - degree + 1; k0 < leftKnotIndex + degree - 1; k0++) {\r\n const k1 = k0 + indexDelta;\r\n if (!Geometry.isSameCoordinate(this._bcurve.knots.knots[k0] + period, this._bcurve.knots.knots[k1]))\r\n return false;\r\n }\r\n const poleIndexDelta = this.numPoles - this.degree;\r\n for (let p0 = 0; p0 < degree; p0++) {\r\n const p1 = p0 + poleIndexDelta;\r\n if (!Geometry.isSamePoint3d(this.getPolePoint3d(p0) as Point3d, this.getPolePoint3d(p1) as Point3d))\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Return a CurvePrimitive (which is a BezierCurve3dH) for a specified span of this curve.\r\n * @param spanIndex\r\n * @param result optional reusable curve. This will only be reused if it is a BezierCurve3d with matching order.\r\n */\r\n public getSaturatedBezierSpan3dH(spanIndex: number, result?: BezierCurveBase): BezierCurveBase | undefined {\r\n if (spanIndex < 0 || spanIndex >= this.numSpan)\r\n return undefined;\r\n\r\n const order = this.order;\r\n if (result === undefined || !(result instanceof BezierCurve3dH) || result.order !== order)\r\n result = BezierCurve3dH.createOrder(order);\r\n const bezier = result as BezierCurve3dH;\r\n bezier.loadSpan4dPoles(this._bcurve.packedData, spanIndex);\r\n if (bezier.saturateInPlace(this._bcurve.knots, spanIndex))\r\n return result;\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Return a BezierCurveBase for this curve. Because BSplineCurve3dH is homogeneous, the returned BezierCurveBase is always homogeneous.\r\n * @param spanIndex\r\n * @param result optional reusable curve. This will only be reused if it is a BezierCurve3dH with matching order.\r\n */\r\n public getSaturatedBezierSpan3dOr3dH(spanIndex: number, _prefer3dH: boolean, result?: BezierCurveBase): BezierCurveBase | undefined {\r\n return this.getSaturatedBezierSpan3dH(spanIndex, result);\r\n }\r\n /** Second step of double dispatch: call `handler.handleBSplineCurve3dH(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleBSplineCurve3dH(this);\r\n }\r\n /**\r\n * Extend a range so in includes the range of this curve\r\n * * REMARK: this is based on the poles, not the exact curve. This is generally larger than the true curve range.\r\n * @param rangeToExtend\r\n * @param transform transform to apply to points as they are entered into the range.\r\n */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n const buffer = this._bcurve.packedData;\r\n const n = buffer.length - 3;\r\n if (transform) {\r\n for (let i0 = 0; i0 < n; i0 += 4)\r\n rangeToExtend.extendTransformedXYZW(transform, buffer[i0], buffer[i0 + 1], buffer[i0 + 2], buffer[i0 + 3]);\r\n } else {\r\n for (let i0 = 0; i0 < n; i0 += 4)\r\n rangeToExtend.extendXYZW(buffer[i0], buffer[i0 + 1], buffer[i0 + 2], buffer[i0 + 3]);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BSplineCurve3dH.js","sourceRoot":"","sources":["../../../src/bspline/BSplineCurve3dH.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Serialization\r\n */\r\n\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { StrokeCountMap } from \"../curve/Query/StrokeCountMap\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray, Point4dArray } from \"../geometry3d/PointHelpers\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { BezierCurve3dH } from \"./BezierCurve3dH\";\r\nimport { BezierCurveBase } from \"./BezierCurveBase\";\r\nimport { BSplineCurve3dBase } from \"./BSplineCurve\";\r\nimport { BSplineWrapMode, KnotVector } from \"./KnotVector\";\r\n\r\n/**\r\n * Weighted (Homogeneous) BSplineCurve in 3d\r\n * @public\r\n */\r\nexport class BSplineCurve3dH extends BSplineCurve3dBase {\r\n private _workBezier?: BezierCurve3dH;\r\n private initializeWorkBezier(): BezierCurve3dH {\r\n if (this._workBezier === undefined)\r\n this._workBezier = BezierCurve3dH.createOrder(this.order);\r\n return this._workBezier;\r\n }\r\n /** Test if `other` is an instance of `BSplineCurve3dH` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof BSplineCurve3dH; }\r\n /** Apply `transform` to the curve */\r\n public tryTransformInPlace(transform: Transform): boolean { Point4dArray.multiplyInPlace(transform, this._bcurve.packedData); return true; }\r\n /** Get a pole, normalized to Point3d. */\r\n public getPolePoint3d(poleIndex: number, result?: Point3d): Point3d | undefined {\r\n const k = this.poleIndexToDataIndex(poleIndex);\r\n if (k !== undefined) {\r\n const data = this._bcurve.packedData;\r\n const divW = Geometry.conditionalDivideFraction(1.0, data[k + 3]);\r\n if (divW !== undefined)\r\n return Point3d.create(data[k] * divW, data[k + 1] * divW, data[k + 2] * divW, result);\r\n }\r\n return undefined;\r\n }\r\n /** Get a pole as Point4d */\r\n public getPolePoint4d(poleIndex: number, result?: Point4d): Point4d | undefined {\r\n const k = this.poleIndexToDataIndex(poleIndex);\r\n if (k !== undefined) {\r\n const data = this._bcurve.packedData;\r\n return Point4d.create(data[k], data[k + 1], data[k + 2], data[k + 3], result);\r\n }\r\n return undefined;\r\n }\r\n /** map a spanIndex and fraction to a knot value. */\r\n public spanFractionToKnot(span: number, localFraction: number): number {\r\n return this._bcurve.spanFractionToKnot(span, localFraction);\r\n }\r\n private constructor(numPoles: number, order: number, knots: KnotVector) {\r\n super(4, numPoles, order, knots);\r\n }\r\n /** Return a simple array of arrays with the control points as `[[x,y,z,w],[x,y,z,w],..]` */\r\n public copyPoints(): any[] { return Point3dArray.unpackNumbersToNestedArrays(this._bcurve.packedData, 4); }\r\n /** Return a simple array of the control points coordinates */\r\n public copyPointsFloat64Array(): Float64Array { return this._bcurve.packedData.slice(); }\r\n /** Return a simple array of the control points xyz coordinates. */\r\n public copyXYZFloat64Array(deweighted: boolean): Float64Array {\r\n const numValue = this.numPoles * 3;\r\n const result = new Float64Array(numValue);\r\n let k = 0;\r\n for (let poleIndex = 0; poleIndex < this.numPoles; poleIndex++) {\r\n let i = poleIndex * 4;\r\n if (deweighted) {\r\n const w = this._bcurve.packedData[i + 3];\r\n const dw = w === 0.0 ? 1.0 : 1.0 / w;\r\n result[k++] = this._bcurve.packedData[i++] * dw;\r\n result[k++] = this._bcurve.packedData[i++] * dw;\r\n result[k++] = this._bcurve.packedData[i++] * dw;\r\n\r\n } else {\r\n result[k++] = this._bcurve.packedData[i++];\r\n result[k++] = this._bcurve.packedData[i++];\r\n result[k++] = this._bcurve.packedData[i++];\r\n }\r\n }\r\n return result;\r\n }\r\n public copyWeightsFloat64Array(): Float64Array {\r\n const result = new Float64Array(this.numPoles);\r\n for (let poleIndex = 0; poleIndex < this.numPoles; poleIndex++) {\r\n result[poleIndex] = this._bcurve.packedData[4 * poleIndex + 3];\r\n }\r\n return result;\r\n }\r\n\r\n /** Create a homogeneous B-spline curve with uniform knots.\r\n * * Control points may be supplied as:\r\n * * array of Point4d, with weight already multiplied into the `[wx,wy,wz,w]`\r\n * * array of Point3d, with implied weight 1.\r\n * * Float64Array, blocked as [wx,wy,wz,w], i.e. 4 numbers per control point.\r\n * @param controlPoints pole data in array form as noted above.\r\n * @param order curve order (1 more than degree)\r\n */\r\n public static createUniformKnots(controlPoints: Point3d[] | Point4d[] | Float64Array, order: number): BSplineCurve3dH | undefined {\r\n const numPoles = (controlPoints instanceof Float64Array) ? controlPoints.length / 4 : controlPoints.length;\r\n if (order < 1 || numPoles < order)\r\n return undefined;\r\n const knots = KnotVector.createUniformClamped(controlPoints.length, order - 1, 0.0, 1.0);\r\n const curve = new BSplineCurve3dH(numPoles, order, knots);\r\n let i = 0;\r\n if (Array.isArray(controlPoints)) {\r\n if (controlPoints[0] instanceof Point3d) {\r\n for (const p of (controlPoints as Point3d[])) {\r\n curve._bcurve.packedData[i++] = p.x;\r\n curve._bcurve.packedData[i++] = p.y;\r\n curve._bcurve.packedData[i++] = p.z;\r\n curve._bcurve.packedData[i++] = 1.0;\r\n }\r\n } else if (controlPoints[0] instanceof Point4d) {\r\n for (const p of (controlPoints as Point4d[])) {\r\n curve._bcurve.packedData[i++] = p.x;\r\n curve._bcurve.packedData[i++] = p.y;\r\n curve._bcurve.packedData[i++] = p.z;\r\n curve._bcurve.packedData[i++] = p.w;\r\n }\r\n }\r\n } else {\r\n const numQ = controlPoints.length;\r\n for (let k = 0; k < numQ; k++)\r\n curve._bcurve.packedData[k] = controlPoints[k];\r\n }\r\n return curve;\r\n }\r\n\r\n /** Create a smoothly closed homogeneous B-spline curve with uniform knots.\r\n * * Note that the curve does not start at the first pole!\r\n * * Control points (poles) may be supplied as:\r\n * * array of Point4d, with weight already multiplied into the `[wx,wy,wz,w]`\r\n * * array of Point3d, with implied weight 1.\r\n * * Float64Array, blocked as [wx,wy,wz,w], i.e. 4 numbers per control point.\r\n * @param poles control point data in array form as noted above.\r\n * @param order curve order (1 more than degree)\r\n */\r\n public static createPeriodicUniformKnots(poles: Point3d[] | Point4d[] | Float64Array, order: number): BSplineCurve3dH | undefined {\r\n if (order < 2)\r\n return undefined;\r\n\r\n let numPoles = poles instanceof Float64Array ? poles.length / 4 : poles.length;\r\n if (numPoles < 2)\r\n return undefined;\r\n\r\n const is4d = poles[0] instanceof Point4d;\r\n const startPoint = Point4d.createZero();\r\n const endPoint = Point4d.createZero();\r\n let hasClosurePoint = false;\r\n do {\r\n if (poles instanceof Float64Array) {\r\n startPoint.set(poles[0], poles[1], poles[2], poles[3]);\r\n endPoint.set(poles[4 * numPoles - 4], poles[4 * numPoles - 3], poles[4 * numPoles - 2], poles[4 * numPoles - 1]);\r\n } else {\r\n startPoint.set(poles[0].x, poles[0].y, poles[0].z, is4d ? (poles[0] as Point4d).w : 1.0);\r\n endPoint.set(poles[numPoles - 1].x, poles[numPoles - 1].y, poles[numPoles - 1].z, is4d ? (poles[numPoles - 1] as Point4d).w : 1.0);\r\n }\r\n if (hasClosurePoint = startPoint.isAlmostEqual(endPoint))\r\n --numPoles; // remove wraparound pole if found\r\n } while (hasClosurePoint && numPoles > 1);\r\n\r\n if (numPoles < order)\r\n return undefined;\r\n\r\n const degree = order - 1;\r\n const numIntervals = numPoles;\r\n const knots = KnotVector.createUniformWrapped(numIntervals, degree, 0.0, 1.0);\r\n knots.wrappable = BSplineWrapMode.OpenByAddingControlPoints;\r\n // append degree wraparound poles\r\n const curve = new BSplineCurve3dH(numPoles + degree, order, knots);\r\n if (poles instanceof Float64Array) {\r\n let i = 0;\r\n for (let j = 0; j < 4 * numPoles; j++)\r\n curve._bcurve.packedData[i++] = poles[j];\r\n for (let j = 0; j < 4 * degree; j++)\r\n curve._bcurve.packedData[i++] = poles[j];\r\n } else {\r\n let i = 0;\r\n for (let j = 0; j < numPoles; j++) {\r\n curve._bcurve.packedData[i++] = poles[j].x;\r\n curve._bcurve.packedData[i++] = poles[j].y;\r\n curve._bcurve.packedData[i++] = poles[j].z;\r\n curve._bcurve.packedData[i++] = is4d ? (poles[j] as Point4d).w : 1.0;\r\n }\r\n for (let j = 0; j < degree; j++) {\r\n curve._bcurve.packedData[i++] = poles[j].x;\r\n curve._bcurve.packedData[i++] = poles[j].y;\r\n curve._bcurve.packedData[i++] = poles[j].z;\r\n curve._bcurve.packedData[i++] = is4d ? (poles[j] as Point4d).w : 1.0;\r\n }\r\n }\r\n return curve;\r\n }\r\n\r\n /**\r\n * Assemble a variously structured control points into packed array of [xyzw].\r\n * @param controlPoints\r\n */\r\n public static assemblePackedXYZW(controlPoints: Float64Array | Point4d[] | { xyz: Float64Array, weights: Float64Array } | Point3d[] | number[][]): Float64Array | undefined {\r\n if (controlPoints instanceof Float64Array)\r\n return controlPoints.slice();\r\n\r\n let packedPoints: Float64Array | undefined;\r\n if (Array.isArray(controlPoints) && controlPoints.length > 0) {\r\n const numPoints = controlPoints.length;\r\n let i = 0;\r\n if (controlPoints[0] instanceof Point4d) {\r\n packedPoints = new Float64Array(4 * numPoints);\r\n for (const p of (controlPoints as Point4d[])) {\r\n packedPoints[i++] = p.x;\r\n packedPoints[i++] = p.y;\r\n packedPoints[i++] = p.z;\r\n packedPoints[i++] = p.w;\r\n }\r\n } else if (controlPoints[0] instanceof Point3d) {\r\n packedPoints = new Float64Array(4 * numPoints);\r\n for (const p of (controlPoints as Point3d[])) {\r\n packedPoints[i++] = p.x;\r\n packedPoints[i++] = p.y;\r\n packedPoints[i++] = p.z;\r\n packedPoints[i++] = 1.0;\r\n }\r\n } else if (Array.isArray(controlPoints[0])) {\r\n if (controlPoints[0].length === 4) {\r\n packedPoints = new Float64Array(4 * numPoints);\r\n for (const point of controlPoints as number[][])\r\n for (const coord of point)\r\n packedPoints[i++] = coord;\r\n } else if (controlPoints[0].length === 3) {\r\n packedPoints = new Float64Array(4 * numPoints);\r\n for (const point of controlPoints as number[][]) {\r\n for (const coord of point)\r\n packedPoints[i++] = coord;\r\n packedPoints[i++] = 1.0;\r\n }\r\n }\r\n }\r\n } else { // controlPoints is NOT an array\r\n const obj = controlPoints as any;\r\n if (obj.xyz instanceof Float64Array && obj.weights instanceof Float64Array && obj.xyz.length === 3 * obj.weights.length) {\r\n const numPoints = obj.weights.length;\r\n packedPoints = new Float64Array(4 * numPoints);\r\n let m = 0;\r\n for (let i = 0; i < obj.weights.length; i++) {\r\n const k = 3 * i;\r\n packedPoints[m++] = obj.xyz[k];\r\n packedPoints[m++] = obj.xyz[k + 1];\r\n packedPoints[m++] = obj.xyz[k + 2];\r\n packedPoints[m++] = obj.weights[i];\r\n }\r\n }\r\n }\r\n return packedPoints;\r\n }\r\n\r\n /**\r\n * Create a bspline with given knots.\r\n * * The poles have several variants:\r\n * * Float64Array(4 * numPoles) in blocks of [wx,xy,wz,w]\r\n * * Point4d[numPoles]\r\n * * Point3d[], with implied unit weight to be added\r\n * * number[][], with inner dimension 4\r\n * * {xyz: Float64Array(3 * numPoles), weights: Float64Array (numPoles)}\r\n * * Two count conditions are recognized:\r\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the extraneous knots of classic clamping.\r\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form.\r\n */\r\n public static create(controlPointData: Float64Array | Point4d[] | { xyz: Float64Array, weights: Float64Array } | Point3d[] | number[][], knotArray: Float64Array | number[], order: number): BSplineCurve3dH | undefined {\r\n if (order < 2)\r\n return undefined;\r\n\r\n const controlPoints = this.assemblePackedXYZW(controlPointData);\r\n if (undefined === controlPoints)\r\n return undefined;\r\n\r\n const numPoles = Math.floor(controlPoints.length / 4);\r\n if (numPoles < order)\r\n return undefined;\r\n\r\n const numKnots = knotArray.length;\r\n const skipFirstAndLast = (numPoles + order === numKnots); // classic over-clamped input knots\r\n if (!skipFirstAndLast && numPoles + order !== numKnots + 2) // modern knots\r\n return undefined;\r\n const knots = KnotVector.create(knotArray, order - 1, skipFirstAndLast);\r\n\r\n const curve = new BSplineCurve3dH(numPoles, order, knots);\r\n\r\n let i = 0;\r\n for (const coordinate of controlPoints)\r\n curve._bcurve.packedData[i++] = coordinate;\r\n return curve;\r\n }\r\n\r\n /** Return a deep clone of this curve. */\r\n public override clone(): BSplineCurve3dH {\r\n const knotVector1 = this._bcurve.knots.clone();\r\n const curve1 = new BSplineCurve3dH(this.numPoles, this.order, knotVector1);\r\n curve1._bcurve.packedData = this._bcurve.packedData.slice();\r\n return curve1;\r\n }\r\n\r\n /** Evaluate at a position given by fractional position within a span. */\r\n public evaluatePointInSpan(spanIndex: number, spanFraction: number, result?: Point3d): Point3d {\r\n this._bcurve.evaluateBuffersInSpan(spanIndex, spanFraction);\r\n const xyzw = this._bcurve.poleBuffer;\r\n return Point4d.createRealPoint3dDefault000(xyzw[0], xyzw[1], xyzw[2], xyzw[3], result);\r\n }\r\n\r\n /** Evaluate at a position given by fractional position within a span. */\r\n public evaluatePointAndDerivativeInSpan(spanIndex: number, spanFraction: number, result?: Ray3d): Ray3d {\r\n this._bcurve.evaluateBuffersInSpan1(spanIndex, spanFraction);\r\n const xyzw = this._bcurve.poleBuffer;\r\n const dXYZW = this._bcurve.poleBuffer1;\r\n return Point4d.createRealDerivativeRay3dDefault000(\r\n xyzw[0], xyzw[1], xyzw[2], xyzw[3],\r\n dXYZW[0], dXYZW[1], dXYZW[2], dXYZW[3], result);\r\n }\r\n\r\n /** Evaluate at a position given by a knot value. */\r\n public knotToPoint(u: number, result?: Point3d): Point3d {\r\n this._bcurve.evaluateBuffersAtKnot(u);\r\n const xyzw = this._bcurve.poleBuffer;\r\n return Point4d.createRealPoint3dDefault000(xyzw[0], xyzw[1], xyzw[2], xyzw[3], result);\r\n }\r\n /** Evaluate at a position given by a knot value. */\r\n public knotToPointAndDerivative(u: number, result?: Ray3d): Ray3d {\r\n this._bcurve.evaluateBuffersAtKnot(u, 1);\r\n const xyzw = this._bcurve.poleBuffer;\r\n const dXYZW = this._bcurve.poleBuffer1;\r\n return Point4d.createRealDerivativeRay3dDefault000(\r\n xyzw[0], xyzw[1], xyzw[2], xyzw[3],\r\n dXYZW[0], dXYZW[1], dXYZW[2], dXYZW[3], result);\r\n }\r\n\r\n /** Evaluate at a position given by a knot value. Return point with 2 derivatives. */\r\n public knotToPointAnd2Derivatives(u: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n this._bcurve.evaluateBuffersAtKnot(u, 2);\r\n const xyzw = this._bcurve.poleBuffer;\r\n const dXYZW = this._bcurve.poleBuffer1;\r\n const ddXYZW = this._bcurve.poleBuffer2;\r\n return Point4d.createRealDerivativePlane3dByOriginAndVectorsDefault000(\r\n xyzw[0], xyzw[1], xyzw[2], xyzw[3],\r\n dXYZW[0], dXYZW[1], dXYZW[2], dXYZW[3],\r\n ddXYZW[0], ddXYZW[1], ddXYZW[2], ddXYZW[3],\r\n result);\r\n }\r\n /** test if the curve is almost equal to `other` */\r\n public override isAlmostEqual(other: any): boolean {\r\n if (other instanceof BSplineCurve3dH) {\r\n return this._bcurve.knots.isAlmostEqual(other._bcurve.knots)\r\n && Point4dArray.isAlmostEqual(this._bcurve.packedData, other._bcurve.packedData);\r\n }\r\n return false;\r\n }\r\n /** Test if the curve is entirely within a plane. */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n return Point4dArray.isCloseToPlane(this._bcurve.packedData, plane);\r\n }\r\n /** Return the control polygon length as quick approximation to the curve length. */\r\n public quickLength(): number { return Point3dArray.sumEdgeLengths(this._bcurve.packedData); }\r\n /** call a handler with interval data for stroking. */\r\n public emitStrokableParts(handler: IStrokeHandler, options?: StrokeOptions): void {\r\n const needBeziers = (handler as any).announceBezierCurve;\r\n const workBezier = this.initializeWorkBezier();\r\n const numSpan = this.numSpan;\r\n let numStrokes;\r\n for (let spanIndex = 0; spanIndex < numSpan; spanIndex++) {\r\n const bezier = this.getSaturatedBezierSpan3dOr3dH(spanIndex, false, workBezier);\r\n if (bezier) {\r\n numStrokes = bezier.computeStrokeCountForOptions(options);\r\n if (needBeziers) {\r\n (handler as any).announceBezierCurve(bezier, numStrokes, this,\r\n spanIndex,\r\n this._bcurve.knots.spanFractionToFraction(spanIndex, 0.0),\r\n this._bcurve.knots.spanFractionToFraction(spanIndex, 1.0));\r\n\r\n } else {\r\n handler.announceIntervalForUniformStepStrokes(this, numStrokes,\r\n this._bcurve.knots.spanFractionToFraction(spanIndex, 0.0),\r\n this._bcurve.knots.spanFractionToFraction(spanIndex, 1.0));\r\n }\r\n }\r\n }\r\n }\r\n /** Append stroked approximation of this curve to the linestring. */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\r\n const workBezier = this.initializeWorkBezier();\r\n const numSpan = this.numSpan;\r\n for (let spanIndex = 0; spanIndex < numSpan; spanIndex++) {\r\n const bezier = this.getSaturatedBezierSpan3dH(spanIndex, workBezier);\r\n if (bezier)\r\n bezier.emitStrokes(dest, options);\r\n }\r\n }\r\n /**\r\n * Assess length and turn to determine a stroke count.\r\n * @param options stroke options structure.\r\n */\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n const workBezier = this.initializeWorkBezier();\r\n const numSpan = this.numSpan;\r\n let numStroke = 0;\r\n for (let spanIndex = 0; spanIndex < numSpan; spanIndex++) {\r\n const bezier = this.getSaturatedBezierSpan3dH(spanIndex, workBezier);\r\n if (bezier)\r\n numStroke += bezier.computeStrokeCountForOptions(options);\r\n }\r\n return numStroke;\r\n }\r\n /**\r\n * Compute individual segment stroke counts. Attach in a StrokeCountMap.\r\n * @param options StrokeOptions that determine count\r\n * @param parentStrokeMap evolving parent map.\r\n */\r\n public override computeAndAttachRecursiveStrokeCounts(options?: StrokeOptions, parentStrokeMap?: StrokeCountMap) {\r\n const workBezier = this.initializeWorkBezier();\r\n const numSpan = this.numSpan;\r\n const myData = StrokeCountMap.createWithCurvePrimitiveAndOptionalParent(this, parentStrokeMap, []);\r\n\r\n for (let spanIndex = 0; spanIndex < numSpan; spanIndex++) {\r\n const bezier = this.getSaturatedBezierSpan3dH(spanIndex, workBezier);\r\n if (bezier) {\r\n const segmentLength = workBezier.curveLength();\r\n const numStrokeOnSegment = workBezier.computeStrokeCountForOptions(options);\r\n myData.addToCountAndLength(numStrokeOnSegment, segmentLength);\r\n }\r\n }\r\n CurvePrimitive.installStrokeCountMap(this, myData, parentStrokeMap);\r\n }\r\n /**\r\n * Test knots and control points to determine if it is possible to close (aka \"wrap\") the curve.\r\n * @return whether the curve can be wrapped.\r\n */\r\n public get isClosable(): boolean {\r\n return BSplineWrapMode.None !== this.isClosableCurve;\r\n }\r\n /**\r\n * Return a CurvePrimitive (which is a BezierCurve3dH) for a specified span of this curve.\r\n * @param spanIndex\r\n * @param result optional reusable curve. This will only be reused if it is a BezierCurve3d with matching order.\r\n */\r\n public getSaturatedBezierSpan3dH(spanIndex: number, result?: BezierCurveBase): BezierCurveBase | undefined {\r\n if (spanIndex < 0 || spanIndex >= this.numSpan)\r\n return undefined;\r\n\r\n const order = this.order;\r\n if (result === undefined || !(result instanceof BezierCurve3dH) || result.order !== order)\r\n result = BezierCurve3dH.createOrder(order);\r\n const bezier = result as BezierCurve3dH;\r\n bezier.loadSpan4dPoles(this._bcurve.packedData, spanIndex);\r\n if (bezier.saturateInPlace(this._bcurve.knots, spanIndex))\r\n return result;\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Return a BezierCurveBase for this curve. Because BSplineCurve3dH is homogeneous, the returned BezierCurveBase is always homogeneous.\r\n * @param spanIndex\r\n * @param result optional reusable curve. This will only be reused if it is a BezierCurve3dH with matching order.\r\n */\r\n public getSaturatedBezierSpan3dOr3dH(spanIndex: number, _prefer3dH: boolean, result?: BezierCurveBase): BezierCurveBase | undefined {\r\n return this.getSaturatedBezierSpan3dH(spanIndex, result);\r\n }\r\n /** Second step of double dispatch: call `handler.handleBSplineCurve3dH(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleBSplineCurve3dH(this);\r\n }\r\n /**\r\n * Extend a range so in includes the range of this curve\r\n * * REMARK: this is based on the poles, not the exact curve. This is generally larger than the true curve range.\r\n * @param rangeToExtend\r\n * @param transform transform to apply to points as they are entered into the range.\r\n */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n const buffer = this._bcurve.packedData;\r\n const n = buffer.length - 3;\r\n if (transform) {\r\n for (let i0 = 0; i0 < n; i0 += 4)\r\n rangeToExtend.extendTransformedXYZW(transform, buffer[i0], buffer[i0 + 1], buffer[i0 + 2], buffer[i0 + 3]);\r\n } else {\r\n for (let i0 = 0; i0 < n; i0 += 4)\r\n rangeToExtend.extendXYZW(buffer[i0], buffer[i0 + 1], buffer[i0 + 2], buffer[i0 + 3]);\r\n }\r\n }\r\n}\r\n"]}