@itwin/core-geometry 4.3.0-dev.2 → 4.3.0-dev.21

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 (350) hide show
  1. package/CHANGELOG.md +41 -1
  2. package/lib/cjs/Geometry.d.ts.map +1 -1
  3. package/lib/cjs/Geometry.js +2 -4
  4. package/lib/cjs/Geometry.js.map +1 -1
  5. package/lib/cjs/bspline/BSpline1dNd.d.ts +12 -2
  6. package/lib/cjs/bspline/BSpline1dNd.d.ts.map +1 -1
  7. package/lib/cjs/bspline/BSpline1dNd.js +27 -17
  8. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineCurve.d.ts +30 -16
  10. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  11. package/lib/cjs/bspline/BSplineCurve.js +68 -44
  12. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  13. package/lib/cjs/bspline/BSplineCurve3dH.d.ts +27 -20
  14. package/lib/cjs/bspline/BSplineCurve3dH.d.ts.map +1 -1
  15. package/lib/cjs/bspline/BSplineCurve3dH.js +136 -87
  16. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  17. package/lib/cjs/bspline/BSplineSurface.d.ts +138 -74
  18. package/lib/cjs/bspline/BSplineSurface.d.ts.map +1 -1
  19. package/lib/cjs/bspline/BSplineSurface.js +242 -119
  20. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  21. package/lib/cjs/bspline/Bezier1dNd.d.ts +18 -4
  22. package/lib/cjs/bspline/Bezier1dNd.d.ts.map +1 -1
  23. package/lib/cjs/bspline/Bezier1dNd.js +19 -5
  24. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  25. package/lib/cjs/bspline/BezierCurve3dH.d.ts.map +1 -1
  26. package/lib/cjs/bspline/BezierCurve3dH.js +2 -1
  27. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  28. package/lib/cjs/bspline/KnotVector.d.ts +30 -33
  29. package/lib/cjs/bspline/KnotVector.d.ts.map +1 -1
  30. package/lib/cjs/bspline/KnotVector.js +76 -69
  31. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  32. package/lib/cjs/clipping/AlternatingConvexClipTree.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/curve/CurveChainWithDistanceIndex.d.ts +18 -1
  38. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  39. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +47 -0
  40. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  41. package/lib/cjs/curve/CurveCollection.d.ts +9 -9
  42. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  43. package/lib/cjs/curve/CurveCollection.js +7 -10
  44. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  45. package/lib/cjs/curve/CurveCurve.d.ts +2 -2
  46. package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
  47. package/lib/cjs/curve/CurveCurve.js +3 -16
  48. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  49. package/lib/cjs/curve/CurveLocationDetail.d.ts +17 -4
  50. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  51. package/lib/cjs/curve/CurveLocationDetail.js +32 -10
  52. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  53. package/lib/cjs/curve/CurveOps.d.ts +4 -5
  54. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  55. package/lib/cjs/curve/CurveOps.js +1 -1
  56. package/lib/cjs/curve/CurveOps.js.map +1 -1
  57. package/lib/cjs/curve/CurveTypes.d.ts +14 -2
  58. package/lib/cjs/curve/CurveTypes.d.ts.map +1 -1
  59. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  60. package/lib/cjs/curve/CurveWireMomentsXYZ.d.ts.map +1 -1
  61. package/lib/cjs/curve/CurveWireMomentsXYZ.js +2 -4
  62. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  63. package/lib/cjs/curve/LineString3d.d.ts +3 -6
  64. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  65. package/lib/cjs/curve/LineString3d.js +1 -4
  66. package/lib/cjs/curve/LineString3d.js.map +1 -1
  67. package/lib/cjs/curve/PointString3d.d.ts +2 -1
  68. package/lib/cjs/curve/PointString3d.d.ts.map +1 -1
  69. package/lib/cjs/curve/PointString3d.js.map +1 -1
  70. package/lib/cjs/curve/RegionOps.d.ts +7 -12
  71. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  72. package/lib/cjs/curve/RegionOps.js +2 -1
  73. package/lib/cjs/curve/RegionOps.js.map +1 -1
  74. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +0 -9
  75. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  76. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +16 -35
  77. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  78. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +12 -6
  79. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  80. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +80 -18
  81. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  82. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.d.ts +11 -5
  83. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -1
  84. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js +73 -8
  85. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  86. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +2 -3
  87. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  88. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +2 -3
  89. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  90. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts +4 -4
  91. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  92. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +38 -36
  93. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  94. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts +21 -5
  95. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  96. package/lib/cjs/geometry3d/CoincidentGeometryOps.js +71 -45
  97. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  98. package/lib/cjs/geometry3d/Matrix3d.d.ts +20 -13
  99. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  100. package/lib/cjs/geometry3d/Matrix3d.js +28 -21
  101. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  102. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +11 -2
  103. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  104. package/lib/cjs/geometry3d/Point3dVector3d.js +16 -5
  105. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  106. package/lib/cjs/geometry3d/PointHelpers.d.ts +58 -20
  107. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  108. package/lib/cjs/geometry3d/PointHelpers.js +213 -62
  109. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  110. package/lib/cjs/geometry3d/Segment1d.d.ts +5 -1
  111. package/lib/cjs/geometry3d/Segment1d.d.ts.map +1 -1
  112. package/lib/cjs/geometry3d/Segment1d.js +11 -7
  113. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  114. package/lib/cjs/geometry3d/Transform.d.ts +2 -3
  115. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  116. package/lib/cjs/geometry3d/Transform.js +2 -3
  117. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  118. package/lib/cjs/geometry4d/Point4d.d.ts +14 -1
  119. package/lib/cjs/geometry4d/Point4d.d.ts.map +1 -1
  120. package/lib/cjs/geometry4d/Point4d.js +22 -1
  121. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  122. package/lib/cjs/numerics/BezierPolynomials.d.ts +91 -68
  123. package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
  124. package/lib/cjs/numerics/BezierPolynomials.js +100 -79
  125. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  126. package/lib/cjs/numerics/Newton.d.ts +115 -60
  127. package/lib/cjs/numerics/Newton.d.ts.map +1 -1
  128. package/lib/cjs/numerics/Newton.js +120 -62
  129. package/lib/cjs/numerics/Newton.js.map +1 -1
  130. package/lib/cjs/numerics/PascalCoefficients.d.ts +8 -12
  131. package/lib/cjs/numerics/PascalCoefficients.d.ts.map +1 -1
  132. package/lib/cjs/numerics/PascalCoefficients.js +10 -12
  133. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  134. package/lib/cjs/numerics/Polynomials.d.ts +2 -2
  135. package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
  136. package/lib/cjs/numerics/Polynomials.js +2 -2
  137. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  138. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +3 -0
  139. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  140. package/lib/cjs/polyface/PolyfaceBuilder.js +13 -2
  141. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  142. package/lib/cjs/polyface/PolyfaceClip.d.ts +1 -1
  143. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  144. package/lib/cjs/polyface/PolyfaceClip.js +6 -3
  145. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  146. package/lib/cjs/polyface/PolyfaceData.d.ts +1 -1
  147. package/lib/cjs/polyface/PolyfaceData.js +1 -1
  148. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  149. package/lib/cjs/polyface/PolyfaceQuery.d.ts +39 -12
  150. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  151. package/lib/cjs/polyface/PolyfaceQuery.js +94 -17
  152. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  153. package/lib/cjs/serialization/BGFBReader.d.ts +10 -10
  154. package/lib/cjs/serialization/BGFBReader.d.ts.map +1 -1
  155. package/lib/cjs/serialization/BGFBReader.js +69 -42
  156. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  157. package/lib/cjs/serialization/BGFBWriter.d.ts +8 -8
  158. package/lib/cjs/serialization/BGFBWriter.d.ts.map +1 -1
  159. package/lib/cjs/serialization/BGFBWriter.js +80 -55
  160. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  161. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  162. package/lib/cjs/serialization/GeometrySamples.js +6 -8
  163. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  164. package/lib/cjs/serialization/IModelJsonSchema.d.ts +8 -14
  165. package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
  166. package/lib/cjs/serialization/IModelJsonSchema.js +85 -259
  167. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  168. package/lib/cjs/serialization/SerializationHelpers.d.ts +109 -0
  169. package/lib/cjs/serialization/SerializationHelpers.d.ts.map +1 -0
  170. package/lib/cjs/serialization/SerializationHelpers.js +591 -0
  171. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -0
  172. package/lib/cjs/solid/SweepContour.d.ts +4 -2
  173. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  174. package/lib/cjs/solid/SweepContour.js +4 -2
  175. package/lib/cjs/solid/SweepContour.js.map +1 -1
  176. package/lib/esm/Geometry.d.ts.map +1 -1
  177. package/lib/esm/Geometry.js +2 -4
  178. package/lib/esm/Geometry.js.map +1 -1
  179. package/lib/esm/bspline/BSpline1dNd.d.ts +12 -2
  180. package/lib/esm/bspline/BSpline1dNd.d.ts.map +1 -1
  181. package/lib/esm/bspline/BSpline1dNd.js +27 -17
  182. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  183. package/lib/esm/bspline/BSplineCurve.d.ts +30 -16
  184. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  185. package/lib/esm/bspline/BSplineCurve.js +68 -44
  186. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  187. package/lib/esm/bspline/BSplineCurve3dH.d.ts +27 -20
  188. package/lib/esm/bspline/BSplineCurve3dH.d.ts.map +1 -1
  189. package/lib/esm/bspline/BSplineCurve3dH.js +137 -88
  190. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  191. package/lib/esm/bspline/BSplineSurface.d.ts +138 -74
  192. package/lib/esm/bspline/BSplineSurface.d.ts.map +1 -1
  193. package/lib/esm/bspline/BSplineSurface.js +242 -119
  194. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  195. package/lib/esm/bspline/Bezier1dNd.d.ts +18 -4
  196. package/lib/esm/bspline/Bezier1dNd.d.ts.map +1 -1
  197. package/lib/esm/bspline/Bezier1dNd.js +19 -5
  198. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  199. package/lib/esm/bspline/BezierCurve3dH.d.ts.map +1 -1
  200. package/lib/esm/bspline/BezierCurve3dH.js +2 -1
  201. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  202. package/lib/esm/bspline/KnotVector.d.ts +30 -33
  203. package/lib/esm/bspline/KnotVector.d.ts.map +1 -1
  204. package/lib/esm/bspline/KnotVector.js +76 -69
  205. package/lib/esm/bspline/KnotVector.js.map +1 -1
  206. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  207. package/lib/esm/clipping/ClipUtils.d.ts +32 -5
  208. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  209. package/lib/esm/clipping/ClipUtils.js +92 -11
  210. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  211. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +18 -1
  212. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  213. package/lib/esm/curve/CurveChainWithDistanceIndex.js +48 -1
  214. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  215. package/lib/esm/curve/CurveCollection.d.ts +9 -9
  216. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  217. package/lib/esm/curve/CurveCollection.js +7 -10
  218. package/lib/esm/curve/CurveCollection.js.map +1 -1
  219. package/lib/esm/curve/CurveCurve.d.ts +2 -2
  220. package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
  221. package/lib/esm/curve/CurveCurve.js +3 -16
  222. package/lib/esm/curve/CurveCurve.js.map +1 -1
  223. package/lib/esm/curve/CurveLocationDetail.d.ts +17 -4
  224. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  225. package/lib/esm/curve/CurveLocationDetail.js +32 -10
  226. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  227. package/lib/esm/curve/CurveOps.d.ts +4 -5
  228. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  229. package/lib/esm/curve/CurveOps.js +1 -1
  230. package/lib/esm/curve/CurveOps.js.map +1 -1
  231. package/lib/esm/curve/CurveTypes.d.ts +14 -2
  232. package/lib/esm/curve/CurveTypes.d.ts.map +1 -1
  233. package/lib/esm/curve/CurveTypes.js.map +1 -1
  234. package/lib/esm/curve/CurveWireMomentsXYZ.d.ts.map +1 -1
  235. package/lib/esm/curve/CurveWireMomentsXYZ.js +2 -4
  236. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  237. package/lib/esm/curve/LineString3d.d.ts +3 -6
  238. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  239. package/lib/esm/curve/LineString3d.js +1 -4
  240. package/lib/esm/curve/LineString3d.js.map +1 -1
  241. package/lib/esm/curve/PointString3d.d.ts +2 -1
  242. package/lib/esm/curve/PointString3d.d.ts.map +1 -1
  243. package/lib/esm/curve/PointString3d.js.map +1 -1
  244. package/lib/esm/curve/RegionOps.d.ts +7 -12
  245. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  246. package/lib/esm/curve/RegionOps.js +2 -1
  247. package/lib/esm/curve/RegionOps.js.map +1 -1
  248. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +0 -9
  249. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  250. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +16 -35
  251. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  252. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +12 -6
  253. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  254. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +81 -19
  255. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  256. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.d.ts +11 -5
  257. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -1
  258. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js +74 -9
  259. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  260. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +2 -3
  261. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  262. package/lib/esm/curve/internalContexts/MultiChainCollector.js +2 -3
  263. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  264. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts +4 -4
  265. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  266. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +38 -36
  267. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  268. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts +21 -5
  269. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  270. package/lib/esm/geometry3d/CoincidentGeometryOps.js +71 -45
  271. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  272. package/lib/esm/geometry3d/Matrix3d.d.ts +20 -13
  273. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  274. package/lib/esm/geometry3d/Matrix3d.js +28 -21
  275. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  276. package/lib/esm/geometry3d/Point3dVector3d.d.ts +11 -2
  277. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  278. package/lib/esm/geometry3d/Point3dVector3d.js +16 -5
  279. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  280. package/lib/esm/geometry3d/PointHelpers.d.ts +58 -20
  281. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  282. package/lib/esm/geometry3d/PointHelpers.js +213 -62
  283. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  284. package/lib/esm/geometry3d/Segment1d.d.ts +5 -1
  285. package/lib/esm/geometry3d/Segment1d.d.ts.map +1 -1
  286. package/lib/esm/geometry3d/Segment1d.js +11 -7
  287. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  288. package/lib/esm/geometry3d/Transform.d.ts +2 -3
  289. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  290. package/lib/esm/geometry3d/Transform.js +2 -3
  291. package/lib/esm/geometry3d/Transform.js.map +1 -1
  292. package/lib/esm/geometry4d/Point4d.d.ts +14 -1
  293. package/lib/esm/geometry4d/Point4d.d.ts.map +1 -1
  294. package/lib/esm/geometry4d/Point4d.js +22 -1
  295. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  296. package/lib/esm/numerics/BezierPolynomials.d.ts +91 -68
  297. package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
  298. package/lib/esm/numerics/BezierPolynomials.js +100 -79
  299. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  300. package/lib/esm/numerics/Newton.d.ts +115 -60
  301. package/lib/esm/numerics/Newton.d.ts.map +1 -1
  302. package/lib/esm/numerics/Newton.js +120 -62
  303. package/lib/esm/numerics/Newton.js.map +1 -1
  304. package/lib/esm/numerics/PascalCoefficients.d.ts +8 -12
  305. package/lib/esm/numerics/PascalCoefficients.d.ts.map +1 -1
  306. package/lib/esm/numerics/PascalCoefficients.js +10 -12
  307. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  308. package/lib/esm/numerics/Polynomials.d.ts +2 -2
  309. package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
  310. package/lib/esm/numerics/Polynomials.js +2 -2
  311. package/lib/esm/numerics/Polynomials.js.map +1 -1
  312. package/lib/esm/polyface/PolyfaceBuilder.d.ts +3 -0
  313. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  314. package/lib/esm/polyface/PolyfaceBuilder.js +13 -2
  315. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  316. package/lib/esm/polyface/PolyfaceClip.d.ts +1 -1
  317. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  318. package/lib/esm/polyface/PolyfaceClip.js +6 -3
  319. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  320. package/lib/esm/polyface/PolyfaceData.d.ts +1 -1
  321. package/lib/esm/polyface/PolyfaceData.js +1 -1
  322. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  323. package/lib/esm/polyface/PolyfaceQuery.d.ts +39 -12
  324. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  325. package/lib/esm/polyface/PolyfaceQuery.js +94 -17
  326. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  327. package/lib/esm/serialization/BGFBReader.d.ts +10 -10
  328. package/lib/esm/serialization/BGFBReader.d.ts.map +1 -1
  329. package/lib/esm/serialization/BGFBReader.js +69 -42
  330. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  331. package/lib/esm/serialization/BGFBWriter.d.ts +8 -8
  332. package/lib/esm/serialization/BGFBWriter.d.ts.map +1 -1
  333. package/lib/esm/serialization/BGFBWriter.js +80 -55
  334. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  335. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  336. package/lib/esm/serialization/GeometrySamples.js +7 -9
  337. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  338. package/lib/esm/serialization/IModelJsonSchema.d.ts +8 -14
  339. package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
  340. package/lib/esm/serialization/IModelJsonSchema.js +86 -260
  341. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  342. package/lib/esm/serialization/SerializationHelpers.d.ts +109 -0
  343. package/lib/esm/serialization/SerializationHelpers.d.ts.map +1 -0
  344. package/lib/esm/serialization/SerializationHelpers.js +588 -0
  345. package/lib/esm/serialization/SerializationHelpers.js.map +1 -0
  346. package/lib/esm/solid/SweepContour.d.ts +4 -2
  347. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  348. package/lib/esm/solid/SweepContour.js +4 -2
  349. package/lib/esm/solid/SweepContour.js.map +1 -1
  350. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"AlternatingConvexClipTree.js","sourceRoot":"","sources":["../../../src/clipping/AlternatingConvexClipTree.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,0DAAyD;AACzD,0CAAuC;AACvC,8DAA2D;AAC3D,sEAA4F;AAC5F,4DAAyD;AACzD,0DAAuD;AACvD,wDAAqD;AACrD,+CAA4C;AAG5C,mEAAkE;AAClE,6DAA0D;AAC1D,yDAAsD;AACtD,+CAA8C;AAE9C,2DAAwD;AACxD,2CAAwC;AACxC,2CAA4D;AAC5D,6DAA0D;AAE1D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAa,qBAAqB;IAOhC;QANO,WAAM,GAAc,EAAE,CAAC;QACvB,WAAM,GAAuB,uCAAkB,CAAC,WAAW,EAAE,CAAC;QAC9D,aAAQ,GAA4B,EAAE,CAAC;QACvC,aAAQ,GAAW,CAAC,CAAC,CAAC,CAAI,iEAAiE;QAC3F,cAAS,GAAW,CAAC,CAAC,CAAC,CAAG,4CAA4C;IAErD,CAAC;IAEzB,2EAA2E;IACpE,MAAM,CAAC,iBAAiB,CAAC,MAAc,EAAE,SAAiB,EAAE,MAA8B;QAC/F,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACvD,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;QACzB,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CAAC,MAAiB,EAAE,MAA8B;QAClF,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,wBAAwB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAE,oCAAoC;QACpE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,uEAAuE;IAChE,MAAM,CAAC,6BAA6B,CAAC,MAAiB,EAAE,MAA8B;QAC3F,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,wBAAwB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAE,oCAAoC;QACnF,OAAO,MAAM,CAAC;IAChB,CAAC;IACO,cAAc,CAAC,KAAkB;QACvC,KAAK,CAAC,IAAI,CAAC,2BAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ;YAC3B,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD;;;;OAIG;IACI,YAAY;QACjB,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,0EAA0E;IACnE,KAAK;QACV,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACtB,CAAC;IACD,2GAA2G;IACpG,KAAK,CAAC,MAA8B;QACzC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;YAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,GAAG,uCAAkB,CAAC,WAAW,EAAE,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ;YAC9B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAChC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,qEAAqE;IAC9D,aAAa,CAAC,MAAc,EAAE,SAAiB;QACpD,MAAM,OAAO,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,6CAA6C;IACtC,QAAQ,CAAC,KAAgB;QAC9B,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,oDAAoD;IAC7C,iBAAiB,CAAC,KAAc;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM;YACT,OAAO,KAAK,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjC,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC;gBAChC,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;OAGG;IACI,+BAA+B,CAAC,KAA4B;QACjE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,sFAAsF;IAC/E,iCAAiC,CACtC,KAAqB,EAAE,eAA0C,EAAE,gBAA2C;QAE9G,MAAM,OAAO,GAAG,IAAI,iCAAiC,EAAE,CAAC;QACxD,OAAO,CAAC,yBAAyB,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACpF,CAAC;IACD,sFAAsF;IAC/E,kCAAkC,CACvC,MAAuB,EAAE,eAA0C,EAAE,gBAA2C;QAEhH,MAAM,OAAO,GAAG,IAAI,iCAAiC,EAAE,CAAC;QACxD,OAAO,CAAC,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACrF,CAAC;IACD;;;;;;;OAOG;IACI,iBAAiB,CACtB,GAAyB,EACzB,eAAmC,EACnC,gBAAoC,EACpC,UAAiC;QAEjC,oBAAoB;QACpB,+CAA+C;QAC/C,kCAAkC;QAClC,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;QACvF,IAAI,SAAS,KAAK,SAAS,EAAE;YAC3B,yBAAa,CAAC,uCAAuC,CAAC,gBAAgB,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;SAC3G;aAAM;YACL,IAAI,aAAa,GAAG,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,aAAa,GAAuB,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC;YACX,IAAI,KAAK,CAAC;YACV,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC7B,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzB,OAAO,SAAS,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE;oBAClD,mDAAmD;oBACnD,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;oBACxE,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;iBAC/B;gBACD,MAAM,GAAG,aAAa,CAAC;gBACvB,aAAa,GAAG,aAAa,CAAC,CAAE,oBAAoB;gBACpD,aAAa,GAAG,MAAM,CAAC;aACxB;YACD,OAAO,SAAS,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE;gBAClD,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC7B;SACF;IACH,CAAC;IACM,KAAK;QACV,MAAM,OAAO,GAAG,CAAC,CAAC;QAClB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7B,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;SACpD;QACD,OAAO,OAAO,GAAG,aAAa,CAAC;IACjC,CAAC;CACF;AAtKD,sDAsKC;AAED;;;;;;GAMG;AACH,MAAa,wBAAwB;IAInC;QAHQ,YAAO,GAAc,EAAE,CAAC;QACxB,WAAM,GAAa,EAAE,CAAC;IAEN,CAAC;IAElB,MAAM,CAAC,eAAe,CAAC,MAAiB,EAAE,MAAiC;QAChF,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,wBAAwB,EAAE,CAAC;QAC1D,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QACxB,IAAI,uBAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG;YACjC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IACM,UAAU,CAAC,CAAS;QACzB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACvC,CAAC;IACM,WAAW,CAAC,CAAS;QAC1B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7D,CAAC;IACM,SAAS,CAAC,iBAAyB;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtC,CAAC;IACO,MAAM,CAAC,KAAK,CAAC,MAAe,EAAE,MAAe,EAAE,MAAe;QACpE,OAAO,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IACD;;;;MAIE;IACK,gBAAgB,CAAC,WAAmB;QACzC,IAAI,UAAkB,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,WAAW,GAAG,CAAC;YACjB,UAAU,GAAG,WAAW,CAAC;;YAEzB,UAAU,GAAG,WAAW,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/C,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,CAAC;IACM,gBAAgB,CAAC,UAAkB,EAAE,IAAY;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IACD;;;;;;;;;;;;;;;OAeG;IACH,IAAW,WAAW;QACpB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;YAChC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,CAAC,GAAG,CAAC,CAAC;SACT;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,+DAA+D;IACxD,eAAe,CAAC,CAAS,EAAE,IAAY,EAAE,aAAsB;QACpE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG;YACnE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACpB,IAAI,aAAa;YACf,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IACM,gBAAgB,CAAC,MAAc,EAAE,IAAY,EAAE,IAAY;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE;YACZ,IAAI,CAAC,GAAG,MAAM,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC7B,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACpC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACxB;SACF;IACH,CAAC;IACM,wBAAwB,CAAC,MAAiB,EAAE,MAAc,EAAE,IAAY,EAAE,KAAa;QAC5F,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAClB,IAAI,IAAI,GAAG,CAAC,EAAE;YACZ,IAAI,CAAC,GAAG,MAAM,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACxB;SACF;IACH,CAAC;IACO,eAAe,CACrB,IAA2B,EAAE,cAAuB,EAAE,oBAA6B,IAAI;QAEvF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClF,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;QAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE;gBACpB,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtB,IAAI,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE;oBAC9B,qEAAqE;oBACrE,MAAM,KAAK,GAAG,qBAAS,CAAC,qBAAqB,CAC3C,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,0BAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,aAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CACzE,CAAC;oBACF,IAAI,KAAK,KAAK,SAAS,EAAE;wBACvB,IAAI,cAAc;4BAChB,KAAK,CAAC,aAAa,EAAE,CAAC;wBACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;qBACtB;iBACF;qBAAM;oBACL,IAAI,EAAE,GAAG,EAAE;wBACT,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC;oBACpB,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;iBACrC;aACF;SACF;QACD,IAAI,iBAAiB,EAAE;YACrB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;gBAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC,CAAC;SAChD;aAAM;YACL,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;gBAC/B,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC7G;QACD,OAAO,IAAI,CAAC,CAAI,8DAA8D;IAChF,CAAC;IACD;;;;;;;;OAQG;IACI,4BAA4B,CAAC,IAA2B;QAC7D,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IACD;;;;;;;;OAQG;IACI,aAAa,CAAC,IAA2B;QAC9C,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF;AA1KD,4DA0KC;AAED,MAAa,iCAAiC;IAK5C;QACE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAEO,WAAW,CAAC,KAAqB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IAC3D,eAAe;QACrB,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACxB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAI,aAAa;YAC7C,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;SACvB;IACH,CAAC;IACO,iBAAiB;QACvB,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC,CAAK,mCAAmC;IACnE,CAAC;IACO,qBAAqB;QAC3B,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW;YAClD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,IAAY,WAAW,KAAgB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,0EAA0E;IAC1E,IAAY,WAAW,CAAC,KAAgB;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC;YACP,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACvC,CAAC;IACD,4CAA4C;IACpC,UAAU,CAAC,OAAe;QAChC,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW;YAC7B,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;;YAE3D,OAAO,EAAE,CAAC;IACd,CAAC;IACO,iBAAiB;QACvB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;IACvC,CAAC;IAGO,uBAAuB,CAAC,MAA0B,EAAE,cAAyB;QACnF,MAAM,iBAAiB,GAAG,iCAAiC,CAAC,kBAAkB,CAAC;QAE/E,IAAI,IAAI,CAAC,MAAM,YAAY,6BAAa,EAAE;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;YAC5B,IAAI,EAAU,CAAC;YACf,IAAI,EAAU,CAAC;YACf,IAAI,OAAO,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAU,EAAE,EAAU,EAAE,GAAmB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBACjH,cAAc,CAAC,IAAI,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAG,EAAE,EAAG,CAAC,CAAC,CAAC;aACjD;YACD,OAAO,IAAI,CAAC;SAEb;aAAM,IAAI,IAAI,CAAC,MAAM,YAAY,aAAK,EAAE;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,GAAG,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAU,EAAE,EAAU,EAAE,GAAmB,EAAE,EAAE;gBAChF,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;gBAClD,cAAc,CAAC,IAAI,CAAC,eAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,OAAO,IAAI,CAAC;SAEb;aAAM,IAAI,IAAI,CAAC,MAAM,YAAY,2BAAY,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACjF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;YAC/B,IAAI,EAAU,CAAC;YACf,IAAI,EAAU,CAAC;YACf,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;YACzC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpC,MAAM,OAAO,GAAG,6BAAa,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrF,IAAI,OAAO,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAU,EAAE,EAAU,EAAE,GAAmB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;oBACjH,cAAc,CAAC,IAAI,CAAC,eAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;iBACvE;aACF;YACD,OAAO,IAAI,CAAC;SAEb;aAAM,IAAI,IAAI,CAAC,MAAM,YAAY,6BAAc,EAAE;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAU,EAAE,EAAU,EAAE,GAAmB,EAAE,EAAE;gBACnF,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;gBAClD,cAAc,CAAC,IAAI,CAAC,eAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;OAGG;IACK,OAAO,CAAC,IAA2B;QACzC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,2BAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,OAAO;QACT,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,2BAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrF,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;aAC3B;iBAAM;gBACL,IAAI,CAAC,eAAe,EAAE,CAAC;aACxB;YACD,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBAC1B,MAAM;SACT;IACH,CAAC;IACD;;;OAGG;IACI,yBAAyB,CAAC,IAA2B,EAAE,KAAqB,EACjF,eAA0C,EAAE,iBAA4C;QACxF,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC;YACxB,OAAO;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC;YACxB,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YACvC,eAAe,CAAC,IAAI,CAAC,6CAAuB,CAAC,aAAa,CACxD,yCAAmB,CAAC,wBAAwB,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAC7D,yCAAmB,CAAC,wBAAwB,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAC9D,CAAC,CAAC;SACJ;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD;;;OAGG;IACI,yBAAyB,CAAC,IAA2B,EAAE,KAAsB,EAClF,eAA0C,EAAE,gBAA2C;QACvF,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAS,EAAE;YAChC,IAAI,EAAE,YAAY,+BAAc;gBAC9B,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;iBACzE,IAAI,EAAE,YAAY,iCAAe;gBACpC,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;SAC/E;IACH,CAAC;;AA9GD,6BAA6B;AACd,oDAAkB,GAAa,EAAE,CAAC;AA7CtC,8EAAiC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Range1d } from \"../geometry3d/Range\";\r\nimport { GrowableXYZArrayCache } from \"../geometry3d/ReusableObjectCache\";\r\nimport { Range1dArray } from \"../numerics/Range1dArray\";\r\nimport { ClipPlane } from \"./ClipPlane\";\r\nimport { ClipUtilities, PolygonClipper } from \"./ClipUtils\";\r\nimport { ConvexClipPlaneSet } from \"./ConvexClipPlaneSet\";\r\n\r\n/**\r\n * An AlternatingConvexClipTreeNode is a node in a tree structure in which\r\n * <ul>\r\n * <li>Each node contains a ConvexClipPlaneSet.\r\n * <li>Each node contains an array of children which are also AlternatingConvexClipTreeNode.\r\n * <li>The rule for an in/out decision is that a point is IN the subtree under a node if\r\n * <ul>\r\n * <li>It is IN the node's ConvexClipPlaneSet.\r\n * <li>It is NOT IN any of the children.\r\n * </ul>\r\n * <li>Applying \"NOT IN any of the children\" locally to children at each level means that the ConvexClipPlaneSet\r\n * at adjacent levels flip between being positive areas and holes.\r\n * <li>Use an AlternatingConvexClipTreeNodeBuilder to construct the tree from a polygon.\r\n * <li>It is possible for the root clip plane set to be empty. An empty clip plane set returns \"true\"\r\n * for all point tests, so the meaning is just that holes are to be subtracted from the rest\r\n * of space.\r\n * <li>Although the interpretation of in/out alternates with tree levels, the ConvexClipPlaneSets\r\n * at each level are all \"enclosing\" planes in the usual way.\r\n * </ul>\r\n */\r\nexport class AlternatingCCTreeNode implements PolygonClipper {\r\n public points: Point3d[] = [];\r\n public planes: ConvexClipPlaneSet = ConvexClipPlaneSet.createEmpty();\r\n public children: AlternatingCCTreeNode[] = [];\r\n public startIdx: number = -1; // Start index into the master array (not the local points array)\r\n public numPoints: number = -1; // Number of points used in the master array\r\n\r\n private constructor() { }\r\n\r\n /** Initialize this node with index data referencing the parent polygon. */\r\n public static createWithIndices(index0: number, numPoints: number, result?: AlternatingCCTreeNode): AlternatingCCTreeNode {\r\n result = result ? result : new AlternatingCCTreeNode();\r\n result.startIdx = index0;\r\n result.numPoints = numPoints;\r\n result.children.length = 0;\r\n return result;\r\n }\r\n /**\r\n * <ul>\r\n * <li>Build the tree for a polygon.\r\n * <li>Caller creates the root node with empty constructor AlternatingConvexClipTreeNode.\r\n * </ul>\r\n */\r\n public static createTreeForPolygon(points: Point3d[], result?: AlternatingCCTreeNode): AlternatingCCTreeNode {\r\n result = result ? result : new AlternatingCCTreeNode();\r\n result.empty();\r\n const builder = AlternatingCCTreeBuilder.createPointsRef(points);\r\n builder.buildHullTree(result); // <-- Currently ALWAYS returns true\r\n return result;\r\n }\r\n /** Build the outer convex hull with inlets as first level children. */\r\n public static createHullAndInletsForPolygon(points: Point3d[], result?: AlternatingCCTreeNode): AlternatingCCTreeNode {\r\n result = result ? result : new AlternatingCCTreeNode();\r\n result.empty();\r\n const builder = AlternatingCCTreeBuilder.createPointsRef(points);\r\n builder.buildHullAndInletsForPolygon(result); // <-- Currently ALWAYS returns true\r\n return result;\r\n }\r\n private extractLoopsGo(loops: Point3d[][]) {\r\n loops.push(Point3dArray.clonePoint3dArray(this.points));\r\n for (const c of this.children)\r\n c.extractLoopsGo(loops);\r\n }\r\n /**\r\n * Return an array with all the loops in the tree.\r\n * This loses the alternating structure of the tree, but the collection still matches well-formed polygons by\r\n * parity rules.\r\n */\r\n public extractLoops(): Point3d[][] {\r\n const loops: Point3d[][] = [];\r\n this.extractLoopsGo(loops);\r\n return loops;\r\n }\r\n /** Resets this AlternatingConvexClipTreeNode to a newly-created state. */\r\n public empty() {\r\n this.points.length = 0;\r\n this.planes.planes.length = 0;\r\n this.children.length = 0;\r\n this.startIdx = -1;\r\n this.numPoints = -1;\r\n }\r\n /** Creates a deep copy of this node (expensive - copies Geometry, and is recursive for children array). */\r\n public clone(result?: AlternatingCCTreeNode): AlternatingCCTreeNode {\r\n result = result ? result : new AlternatingCCTreeNode();\r\n for (const point of this.points)\r\n result.points.push(point.clone());\r\n result.planes = ConvexClipPlaneSet.createEmpty();\r\n for (const plane of this.planes.planes)\r\n result.planes.planes.push(plane.clone());\r\n for (const node of this.children)\r\n result.children.push(node.clone());\r\n result.startIdx = this.startIdx;\r\n result.numPoints = this.numPoints;\r\n return result;\r\n }\r\n /** Add a new child that has an empty plane set and given indices. */\r\n public addEmptyChild(index0: number, numPoints: number) {\r\n const newNode = AlternatingCCTreeNode.createWithIndices(index0, numPoints);\r\n this.children.push(newNode);\r\n }\r\n /** Add a plane to the ConvexClipPlaneSet. */\r\n public addPlane(plane: ClipPlane) {\r\n this.planes.addPlaneToConvexSet(plane);\r\n }\r\n /** Search with alternating in and out semantics. */\r\n public isPointOnOrInside(point: Point3d): boolean {\r\n const inRoot = this.planes.isPointOnOrInside(point, 0.0);\r\n if (!inRoot)\r\n return false;\r\n for (const child of this.children) {\r\n if (child.isPointOnOrInside(point))\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Add an AlternatingConvexClipTreeNode as a child of this one -- i.e. a hole.\r\n * * The child pointer is pushed directly to the tree -- not cloned.\r\n */\r\n public captureConvexClipPlaneSetAsVoid(child: AlternatingCCTreeNode) {\r\n this.children.push(child);\r\n }\r\n /** Append start-end positions for curve intervals classified as inside or outside. */\r\n public appendCurvePrimitiveClipIntervals(\r\n curve: CurvePrimitive, insideIntervals: CurveLocationDetailPair[], outsideIntervals: CurveLocationDetailPair[],\r\n ): void {\r\n const clipper = new AlternatingCCTreeNodeCurveClipper();\r\n clipper.appendSingleClipPrimitive(this, curve, insideIntervals, outsideIntervals);\r\n }\r\n /** Append start-end positions for curve intervals classified as inside or outside. */\r\n public appendCurveCollectionClipIntervals(\r\n curves: CurveCollection, insideIntervals: CurveLocationDetailPair[], outsideIntervals: CurveLocationDetailPair[],\r\n ): void {\r\n const clipper = new AlternatingCCTreeNodeCurveClipper();\r\n clipper.appendCurveCollectionClip(this, curves, insideIntervals, outsideIntervals);\r\n }\r\n /**\r\n * @param xyz input polygon. This is not changed.\r\n * @param insideFragments Array to receive \"inside\" fragments. Each fragment is a GrowableXYZArray grabbed from\r\n * the cache. This is NOT cleared.\r\n * @param outsideFragments Array to receive \"outside\" fragments. Each fragment is a GrowableXYZArray grabbed\r\n * from the cache. This is NOT cleared.\r\n * @param arrayCache cache for reusable GrowableXYZArray.\r\n */\r\n public appendPolygonClip(\r\n xyz: IndexedXYZCollection,\r\n insideFragments: GrowableXYZArray[],\r\n outsideFragments: GrowableXYZArray[],\r\n arrayCache: GrowableXYZArrayCache,\r\n ): void {\r\n // At first level ..\r\n // newInside is subject to re-clip by children.\r\n // outside is definitively outside\r\n const oldOutsideCount = outsideFragments.length;\r\n const newInside = this.planes.clipInsidePushOutside(xyz, outsideFragments, arrayCache);\r\n if (newInside === undefined) {\r\n ClipUtilities.restoreSingletonInPlaceOfMultipleShards(outsideFragments, oldOutsideCount, xyz, arrayCache);\r\n } else {\r\n let carryForwardA = [newInside];\r\n let carryForwardB: GrowableXYZArray[] = [];\r\n let tempAB;\r\n let shard;\r\n for (const c of this.children) {\r\n carryForwardB.length = 0;\r\n while (undefined !== (shard = carryForwardA.pop())) {\r\n // Anything inside this child is truly outside ...\r\n c.appendPolygonClip(shard, outsideFragments, carryForwardB, arrayCache);\r\n arrayCache.dropToCache(shard);\r\n }\r\n tempAB = carryForwardB;\r\n carryForwardB = carryForwardA; // and that is empty\r\n carryForwardA = tempAB;\r\n }\r\n while (undefined !== (shard = carryForwardA.pop())) {\r\n insideFragments.push(shard);\r\n }\r\n }\r\n }\r\n public depth(): number {\r\n const myDepth = 1;\r\n let maxChildDepth = 0;\r\n for (const c of this.children) {\r\n maxChildDepth = Math.max(maxChildDepth, c.depth());\r\n }\r\n return myDepth + maxChildDepth;\r\n }\r\n}\r\n\r\n/**\r\n * Context structure for building an AlternatingConvexClipTreeNode from a polygon.\r\n * <ul>\r\n * <li> The polygon is copied to the local m_points structure.\r\n * <li> During construction, m_stack contains indices of a sequence of points with uniform concavity.\r\n * </ul>\r\n */\r\nexport class AlternatingCCTreeBuilder {\r\n private _points: Point3d[] = [];\r\n private _stack: number[] = [];\r\n\r\n private constructor() { }\r\n\r\n public static createPointsRef(points: Point3d[], result?: AlternatingCCTreeBuilder): AlternatingCCTreeBuilder {\r\n result = result ? result : new AlternatingCCTreeBuilder();\r\n result._points = points;\r\n if (PolygonOps.areaXY(points) < 0.0)\r\n result._points.reverse();\r\n if (result._points[result._points.length - 1].isAlmostEqualMetric(result._points[0]))\r\n result._points.pop();\r\n return result;\r\n }\r\n public get period(): number {\r\n return this._points.length;\r\n }\r\n public indexAfter(i: number) {\r\n return (i + 1) % this._points.length;\r\n }\r\n public indexBefore(i: number) {\r\n return (i + this._points.length - 1) % this._points.length;\r\n }\r\n public pushIndex(primaryPointIndex: number) {\r\n this._stack.push(primaryPointIndex);\r\n }\r\n private static cross(pointA: Point3d, pointB: Point3d, pointC: Point3d): number {\r\n return pointA.crossProductToPointsXY(pointB, pointC);\r\n }\r\n /*\r\n public isInsideTurn(pointA: Point3d, pointB: Point3d, pointC: Point3d, sign: number) {\r\n return sign * AlternatingCCTreeBuilder.cross(pointA, pointB, pointC) > 0;\r\n }\r\n */\r\n public cyclicStackPoint(cyclicIndex: number): Point3d { // SIGNED index -- but negatives must be in first 10 periods?\r\n let stackIndex: number;\r\n const stack = this._stack;\r\n if (cyclicIndex > 0)\r\n stackIndex = cyclicIndex;\r\n else\r\n stackIndex = cyclicIndex + 10 * stack.length;\r\n stackIndex = stackIndex % stack.length;\r\n return this._points[stack[stackIndex]];\r\n }\r\n public signFromStackTip(pointIndex: number, sign: number) {\r\n const pointA = this.cyclicStackPoint(-2);\r\n const pointB = this.cyclicStackPoint(-1);\r\n const pointC = this._points[pointIndex];\r\n return sign * AlternatingCCTreeBuilder.cross(pointA, pointB, pointC) >= 0.0 ? 1 : -1;\r\n }\r\n /*\r\n * Test of xyz is in the convex region bounded by stack points:\r\n * <ul>\r\n * <li>polygon[i0]..polygon[i1]\r\n * <li>polygon[j0]..polygon[j1]\r\n * <li>polygon[i0]..polygon[i1]\r\n * </ul>\r\n * with \"inside\" controlled by sign multiplier.\r\n public isConvexContinuation(point: Point3d, i0: number, i1: number, j0: number, j1: number, sign: number): boolean {\r\n const points = this.points;\r\n const stack = this.stack;\r\n return this.isInsideTurn(points[stack[i0]], points[stack[i1]], point, sign)\r\n && this.isInsideTurn(points[stack[i0]], points[stack[j0]], point, sign)\r\n && this.isInsideTurn(points[stack[j1]], points[stack[i1]], point, sign);\r\n }\r\n */\r\n public get indexOfMaxX() {\r\n let k = 0;\r\n const points = this._points;\r\n const nPoints = this._points.length;\r\n for (let i = 1; i < nPoints; i++) {\r\n if (points[i].x > points[k].x)\r\n k = i;\r\n }\r\n return k;\r\n }\r\n /** Pop from the stack until the sign condition is satisfied */\r\n public extendHullChain(k: number, sign: number, pushAfterPops: boolean) {\r\n while (this._stack.length > 1 && this.signFromStackTip(k, sign) < 0.0)\r\n this._stack.pop();\r\n if (pushAfterPops)\r\n this.pushIndex(k);\r\n }\r\n public collectHullChain(kStart: number, numK: number, sign: number) {\r\n this._stack.length = 0;\r\n if (numK > 2) {\r\n let k = kStart;\r\n for (let i = 0; i < numK; i++) {\r\n this.extendHullChain(k, sign, true);\r\n k = this.indexAfter(k);\r\n }\r\n }\r\n }\r\n public collectHullPointsInArray(points: Point3d[], kStart: number, numK: number, _sign: number) {\r\n points.length = 0;\r\n if (numK > 2) {\r\n let k = kStart;\r\n for (let i = 0; i < numK; i++) {\r\n points.push(this._points[k]);\r\n k = this.indexAfter(k);\r\n }\r\n }\r\n }\r\n private buildHullTreeGo(\r\n root: AlternatingCCTreeNode, isPositiveArea: boolean, recurseToChildren: boolean = true,\r\n ): boolean {\r\n this.collectHullChain(root.startIdx, root.numPoints, isPositiveArea ? 1.0 : -1.0);\r\n root.points.length = 0;\r\n const stack = this._stack;\r\n const points = this._points;\r\n const stackLen = stack.length;\r\n\r\n for (let i = 0; i < stackLen; i++) {\r\n const k0 = stack[i];\r\n root.points.push(points[k0]);\r\n if (i + 1 < stackLen) {\r\n let k1 = stack[i + 1];\r\n if (k1 === this.indexAfter(k0)) {\r\n // two original points in sequence -- need a clip plane right here!!!\r\n const plane = ClipPlane.createEdgeAndUpVector(\r\n points[k0], points[k1], Vector3d.create(0, 0, 1), Angle.createRadians(0),\r\n );\r\n if (plane !== undefined) {\r\n if (isPositiveArea)\r\n plane.negateInPlace();\r\n root.addPlane(plane);\r\n }\r\n } else {\r\n if (k1 < k0)\r\n k1 += this.period;\r\n root.addEmptyChild(k0, k1 - k0 + 1);\r\n }\r\n }\r\n }\r\n if (recurseToChildren) {\r\n for (const child of root.children)\r\n this.buildHullTreeGo(child, !isPositiveArea);\r\n } else {\r\n for (const child of root.children)\r\n this.collectHullPointsInArray(child.points, child.startIdx, child.numPoints, isPositiveArea ? -1.0 : 1.0);\r\n }\r\n return true; // Are there failure modes? What happens with crossing data?..\r\n }\r\n /**\r\n * <ul>\r\n * <li> Input a ClipTreeRoot that has start and count data\r\n * <li> Build the hull for that data range\r\n * <li> Store the hull points in the root\r\n * <li> Add children with start and count data\r\n * <li> Recursively move to children\r\n * </ul>\r\n */\r\n public buildHullAndInletsForPolygon(root: AlternatingCCTreeNode): boolean {\r\n AlternatingCCTreeNode.createWithIndices(this.indexOfMaxX, this.period + 1, root);\r\n return this.buildHullTreeGo(root, true, false);\r\n }\r\n /**\r\n * <ul>\r\n * <li> Input a ClipTreeRoot that has start and count data\r\n * <li> Build the hull for that data range\r\n * <li> Store the hull points in the root\r\n * <li> Add children with start and count data\r\n * <li> Recursively move to children\r\n * </ul>\r\n */\r\n public buildHullTree(root: AlternatingCCTreeNode): boolean {\r\n AlternatingCCTreeNode.createWithIndices(this.indexOfMaxX, this.period + 1, root);\r\n return this.buildHullTreeGo(root, true);\r\n }\r\n}\r\n\r\nexport class AlternatingCCTreeNodeCurveClipper {\r\n private _curve: CurvePrimitive | undefined;\r\n private _intervalStack: Range1d[][];\r\n private _stackDepth: number;\r\n\r\n public constructor() {\r\n this._stackDepth = 0;\r\n this._intervalStack = [];\r\n }\r\n\r\n private setCurveRef(curve: CurvePrimitive) { this._curve = curve; }\r\n private popSegmentFrame() {\r\n if (this._stackDepth > 0) {\r\n this._topOfStack.length = 0; // formality.\r\n this._stackDepth -= 1;\r\n }\r\n }\r\n private clearSegmentStack() {\r\n while (this._stackDepth > 0)\r\n this.popSegmentFrame(); // and that will reduce stack depth\r\n }\r\n private pushEmptySegmentFrame() {\r\n this._stackDepth += 1;\r\n while (this._intervalStack.length < this._stackDepth)\r\n this._intervalStack.push([]);\r\n this._topOfStack.length = 0;\r\n }\r\n private get _topOfStack(): Range1d[] { return this._intervalStack[this._stackDepth - 1]; }\r\n // set the top of the stack (as defined by stackDepth -- not array length)\r\n private set _topOfStack(value: Range1d[]) {\r\n const n = this._stackDepth;\r\n if (n > 0)\r\n this._intervalStack[n - 1] = value;\r\n }\r\n /** Access entry [topOfStack() - numSkip] */\r\n private stackEntry(numSkip: number): Range1d[] {\r\n if (numSkip <= this._stackDepth)\r\n return this._intervalStack[this._stackDepth - 1 - numSkip];\r\n else\r\n return [];\r\n }\r\n private isTopOfStackEmpty(): boolean {\r\n return this._topOfStack.length === 0;\r\n }\r\n // Is re-used by method calls\r\n private static _fractionIntervals: number[] = [];\r\n private appendSingleClipToStack(planes: ConvexClipPlaneSet, insideSegments: Range1d[]): boolean {\r\n const fractionIntervals = AlternatingCCTreeNodeCurveClipper._fractionIntervals;\r\n\r\n if (this._curve instanceof LineSegment3d) {\r\n const segment = this._curve;\r\n let f0: number;\r\n let f1: number;\r\n if (segment.announceClipIntervals(planes, (a0: number, a1: number, _cp: CurvePrimitive) => { f0 = a0; f1 = a1; })) {\r\n insideSegments.push(Range1d.createXX(f0!, f1!));\r\n }\r\n return true;\r\n\r\n } else if (this._curve instanceof Arc3d) {\r\n const arc = this._curve;\r\n fractionIntervals.length = 0;\r\n arc.announceClipIntervals(planes, (a0: number, a1: number, _cp: CurvePrimitive) => {\r\n fractionIntervals.push(a0); fractionIntervals.push(a1);\r\n });\r\n for (let i = 0; i < fractionIntervals.length; i += 2)\r\n insideSegments.push(Range1d.createXX(fractionIntervals[i], fractionIntervals[i + 1]));\r\n return true;\r\n\r\n } else if (this._curve instanceof LineString3d && (this._curve).points.length > 1) {\r\n const linestring = this._curve;\r\n let f0: number;\r\n let f1: number;\r\n const nPoints = linestring.points.length;\r\n const df = 1.0 / (nPoints - 1);\r\n for (let i = 0; i < nPoints - 1; i++) {\r\n const segment = LineSegment3d.create(linestring.points[i], linestring.points[i + 1]);\r\n if (segment.announceClipIntervals(planes, (a0: number, a1: number, _cp: CurvePrimitive) => { f0 = a0; f1 = a1; })) {\r\n insideSegments.push(Range1d.createXX((i + f0!) * df, (i + f1!) * df));\r\n }\r\n }\r\n return true;\r\n\r\n } else if (this._curve instanceof BSplineCurve3d) {\r\n const bcurve = this._curve;\r\n fractionIntervals.length = 0;\r\n bcurve.announceClipIntervals(planes, (a0: number, a1: number, _cp: CurvePrimitive) => {\r\n fractionIntervals.push(a0); fractionIntervals.push(a1);\r\n });\r\n for (let i = 0; i < fractionIntervals.length; i += 2)\r\n insideSegments.push(Range1d.createXX(fractionIntervals[i], fractionIntervals[i + 1]));\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n /**\r\n * Run one level of recursion. On return, the stack is one level deeper than at entry and the new top of the stack\r\n * has clip for this node (expensive -- must clone items of arrays during \"swaps\").\r\n */\r\n private recurse(node: AlternatingCCTreeNode) {\r\n this.pushEmptySegmentFrame();\r\n this.appendSingleClipToStack(node.planes, this._topOfStack);\r\n Range1dArray.sort(this._topOfStack);\r\n if (this.isTopOfStackEmpty())\r\n return;\r\n for (const child of node.children) {\r\n this.recurse(child);\r\n if (!this.isTopOfStackEmpty()) {\r\n const ranges = Range1dArray.differenceSorted(this.stackEntry(1), this.stackEntry(0));\r\n this.popSegmentFrame();\r\n this._topOfStack = ranges;\r\n } else {\r\n this.popSegmentFrame();\r\n }\r\n if (this.isTopOfStackEmpty())\r\n break;\r\n }\r\n }\r\n /**\r\n * Modifies the insideIntervals array given in place.\r\n * Note: curve given is passed by reference and stored.\r\n */\r\n public appendSingleClipPrimitive(root: AlternatingCCTreeNode, curve: CurvePrimitive,\r\n insideIntervals: CurveLocationDetailPair[], _outsideIntervals: CurveLocationDetailPair[]) {\r\n this.setCurveRef(curve);\r\n this.clearSegmentStack();\r\n this.recurse(root);\r\n if (this._stackDepth !== 1)\r\n return;\r\n const intervals = this._topOfStack;\r\n for (const interval of intervals) {\r\n const f0 = interval.low;\r\n const f1 = interval.high;\r\n const xyz0 = curve.fractionToPoint(f0);\r\n const xyz1 = curve.fractionToPoint(f1);\r\n insideIntervals.push(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveFractionPoint(curve, f0, xyz0),\r\n CurveLocationDetail.createCurveFractionPoint(curve, f1, xyz1),\r\n ));\r\n }\r\n this.popSegmentFrame();\r\n }\r\n /**\r\n * Modifies the insideIntervals array given in place.\r\n * Note: curve given is passed by reference and stored.\r\n */\r\n public appendCurveCollectionClip(root: AlternatingCCTreeNode, curve: CurveCollection,\r\n insideIntervals: CurveLocationDetailPair[], outsideIntervals: CurveLocationDetailPair[]) {\r\n for (const cp of curve.children!) {\r\n if (cp instanceof CurvePrimitive)\r\n this.appendSingleClipPrimitive(root, cp, insideIntervals, outsideIntervals);\r\n else if (cp instanceof CurveCollection)\r\n this.appendCurveCollectionClip(root, cp, insideIntervals, outsideIntervals);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"AlternatingConvexClipTree.js","sourceRoot":"","sources":["../../../src/clipping/AlternatingConvexClipTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Range1d } from \"../geometry3d/Range\";\r\nimport { GrowableXYZArrayCache } from \"../geometry3d/ReusableObjectCache\";\r\nimport { Range1dArray } from \"../numerics/Range1dArray\";\r\nimport { ClipPlane } from \"./ClipPlane\";\r\nimport { ClipUtilities, PolygonClipper } from \"./ClipUtils\";\r\nimport { ConvexClipPlaneSet } from \"./ConvexClipPlaneSet\";\r\n\r\n/**\r\n * An AlternatingConvexClipTreeNode is a node in a tree structure in which\r\n * <ul>\r\n * <li>Each node contains a ConvexClipPlaneSet.\r\n * <li>Each node contains an array of children which are also AlternatingConvexClipTreeNode.\r\n * <li>The rule for an in/out decision is that a point is IN the subtree under a node if\r\n * <ul>\r\n * <li>It is IN the node's ConvexClipPlaneSet.\r\n * <li>It is NOT IN any of the children.\r\n * </ul>\r\n * <li>Applying \"NOT IN any of the children\" locally to children at each level means that the ConvexClipPlaneSet\r\n * at adjacent levels flip between being positive areas and holes.\r\n * <li>Use an AlternatingConvexClipTreeNodeBuilder to construct the tree from a polygon.\r\n * <li>It is possible for the root clip plane set to be empty. An empty clip plane set returns \"true\"\r\n * for all point tests, so the meaning is just that holes are to be subtracted from the rest\r\n * of space.\r\n * <li>Although the interpretation of in/out alternates with tree levels, the ConvexClipPlaneSets\r\n * at each level are all \"enclosing\" planes in the usual way.\r\n * </ul>\r\n */\r\nexport class AlternatingCCTreeNode implements PolygonClipper {\r\n public points: Point3d[] = [];\r\n public planes: ConvexClipPlaneSet = ConvexClipPlaneSet.createEmpty();\r\n public children: AlternatingCCTreeNode[] = [];\r\n public startIdx: number = -1; // Start index into the master array (not the local points array)\r\n public numPoints: number = -1; // Number of points used in the master array\r\n\r\n private constructor() { }\r\n\r\n /** Initialize this node with index data referencing the parent polygon. */\r\n public static createWithIndices(index0: number, numPoints: number, result?: AlternatingCCTreeNode): AlternatingCCTreeNode {\r\n result = result ? result : new AlternatingCCTreeNode();\r\n result.startIdx = index0;\r\n result.numPoints = numPoints;\r\n result.children.length = 0;\r\n return result;\r\n }\r\n /**\r\n * <ul>\r\n * <li>Build the tree for a polygon.\r\n * <li>Caller creates the root node with empty constructor AlternatingConvexClipTreeNode.\r\n * </ul>\r\n */\r\n public static createTreeForPolygon(points: Point3d[], result?: AlternatingCCTreeNode): AlternatingCCTreeNode {\r\n result = result ? result : new AlternatingCCTreeNode();\r\n result.empty();\r\n const builder = AlternatingCCTreeBuilder.createPointsRef(points);\r\n builder.buildHullTree(result); // <-- Currently ALWAYS returns true\r\n return result;\r\n }\r\n /** Build the outer convex hull with inlets as first level children. */\r\n public static createHullAndInletsForPolygon(points: Point3d[], result?: AlternatingCCTreeNode): AlternatingCCTreeNode {\r\n result = result ? result : new AlternatingCCTreeNode();\r\n result.empty();\r\n const builder = AlternatingCCTreeBuilder.createPointsRef(points);\r\n builder.buildHullAndInletsForPolygon(result); // <-- Currently ALWAYS returns true\r\n return result;\r\n }\r\n private extractLoopsGo(loops: Point3d[][]) {\r\n loops.push(Point3dArray.clonePoint3dArray(this.points));\r\n for (const c of this.children)\r\n c.extractLoopsGo(loops);\r\n }\r\n /**\r\n * Return an array with all the loops in the tree.\r\n * This loses the alternating structure of the tree, but the collection still matches well-formed polygons by\r\n * parity rules.\r\n */\r\n public extractLoops(): Point3d[][] {\r\n const loops: Point3d[][] = [];\r\n this.extractLoopsGo(loops);\r\n return loops;\r\n }\r\n /** Resets this AlternatingConvexClipTreeNode to a newly-created state. */\r\n public empty() {\r\n this.points.length = 0;\r\n this.planes.planes.length = 0;\r\n this.children.length = 0;\r\n this.startIdx = -1;\r\n this.numPoints = -1;\r\n }\r\n /** Creates a deep copy of this node (expensive - copies Geometry, and is recursive for children array). */\r\n public clone(result?: AlternatingCCTreeNode): AlternatingCCTreeNode {\r\n result = result ? result : new AlternatingCCTreeNode();\r\n for (const point of this.points)\r\n result.points.push(point.clone());\r\n result.planes = ConvexClipPlaneSet.createEmpty();\r\n for (const plane of this.planes.planes)\r\n result.planes.planes.push(plane.clone());\r\n for (const node of this.children)\r\n result.children.push(node.clone());\r\n result.startIdx = this.startIdx;\r\n result.numPoints = this.numPoints;\r\n return result;\r\n }\r\n /** Add a new child that has an empty plane set and given indices. */\r\n public addEmptyChild(index0: number, numPoints: number) {\r\n const newNode = AlternatingCCTreeNode.createWithIndices(index0, numPoints);\r\n this.children.push(newNode);\r\n }\r\n /** Add a plane to the ConvexClipPlaneSet. */\r\n public addPlane(plane: ClipPlane) {\r\n this.planes.addPlaneToConvexSet(plane);\r\n }\r\n /** Search with alternating in and out semantics. */\r\n public isPointOnOrInside(point: Point3d): boolean {\r\n const inRoot = this.planes.isPointOnOrInside(point, 0.0);\r\n if (!inRoot)\r\n return false;\r\n for (const child of this.children) {\r\n if (child.isPointOnOrInside(point))\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Add an AlternatingConvexClipTreeNode as a child of this one -- i.e. a hole.\r\n * * The child pointer is pushed directly to the tree -- not cloned.\r\n */\r\n public captureConvexClipPlaneSetAsVoid(child: AlternatingCCTreeNode) {\r\n this.children.push(child);\r\n }\r\n /** Append start-end positions for curve intervals classified as inside or outside. */\r\n public appendCurvePrimitiveClipIntervals(\r\n curve: CurvePrimitive, insideIntervals: CurveLocationDetailPair[], outsideIntervals: CurveLocationDetailPair[],\r\n ): void {\r\n const clipper = new AlternatingCCTreeNodeCurveClipper();\r\n clipper.appendSingleClipPrimitive(this, curve, insideIntervals, outsideIntervals);\r\n }\r\n /** Append start-end positions for curve intervals classified as inside or outside. */\r\n public appendCurveCollectionClipIntervals(\r\n curves: CurveCollection, insideIntervals: CurveLocationDetailPair[], outsideIntervals: CurveLocationDetailPair[],\r\n ): void {\r\n const clipper = new AlternatingCCTreeNodeCurveClipper();\r\n clipper.appendCurveCollectionClip(this, curves, insideIntervals, outsideIntervals);\r\n }\r\n /**\r\n * @param xyz input polygon. This is not changed.\r\n * @param insideFragments Array to receive \"inside\" fragments. Each fragment is a GrowableXYZArray grabbed from\r\n * the cache. This is NOT cleared.\r\n * @param outsideFragments Array to receive \"outside\" fragments. Each fragment is a GrowableXYZArray grabbed\r\n * from the cache. This is NOT cleared.\r\n * @param arrayCache cache for reusable GrowableXYZArray.\r\n */\r\n public appendPolygonClip(\r\n xyz: IndexedXYZCollection,\r\n insideFragments: GrowableXYZArray[],\r\n outsideFragments: GrowableXYZArray[],\r\n arrayCache: GrowableXYZArrayCache,\r\n ): void {\r\n // At first level ..\r\n // newInside is subject to re-clip by children.\r\n // outside is definitively outside\r\n const oldOutsideCount = outsideFragments.length;\r\n const newInside = this.planes.clipInsidePushOutside(xyz, outsideFragments, arrayCache);\r\n if (newInside === undefined) {\r\n ClipUtilities.restoreSingletonInPlaceOfMultipleShards(outsideFragments, oldOutsideCount, xyz, arrayCache);\r\n } else {\r\n let carryForwardA = [newInside];\r\n let carryForwardB: GrowableXYZArray[] = [];\r\n let tempAB;\r\n let shard;\r\n for (const c of this.children) {\r\n carryForwardB.length = 0;\r\n while (undefined !== (shard = carryForwardA.pop())) {\r\n // Anything inside this child is truly outside ...\r\n c.appendPolygonClip(shard, outsideFragments, carryForwardB, arrayCache);\r\n arrayCache.dropToCache(shard);\r\n }\r\n tempAB = carryForwardB;\r\n carryForwardB = carryForwardA; // and that is empty\r\n carryForwardA = tempAB;\r\n }\r\n while (undefined !== (shard = carryForwardA.pop())) {\r\n insideFragments.push(shard);\r\n }\r\n }\r\n }\r\n public depth(): number {\r\n const myDepth = 1;\r\n let maxChildDepth = 0;\r\n for (const c of this.children) {\r\n maxChildDepth = Math.max(maxChildDepth, c.depth());\r\n }\r\n return myDepth + maxChildDepth;\r\n }\r\n}\r\n\r\n/**\r\n * Context structure for building an AlternatingConvexClipTreeNode from a polygon.\r\n * <ul>\r\n * <li> The polygon is copied to the local m_points structure.\r\n * <li> During construction, m_stack contains indices of a sequence of points with uniform concavity.\r\n * </ul>\r\n */\r\nexport class AlternatingCCTreeBuilder {\r\n private _points: Point3d[] = [];\r\n private _stack: number[] = [];\r\n\r\n private constructor() { }\r\n\r\n public static createPointsRef(points: Point3d[], result?: AlternatingCCTreeBuilder): AlternatingCCTreeBuilder {\r\n result = result ? result : new AlternatingCCTreeBuilder();\r\n result._points = points;\r\n if (PolygonOps.areaXY(points) < 0.0)\r\n result._points.reverse();\r\n if (result._points[result._points.length - 1].isAlmostEqualMetric(result._points[0]))\r\n result._points.pop();\r\n return result;\r\n }\r\n public get period(): number {\r\n return this._points.length;\r\n }\r\n public indexAfter(i: number) {\r\n return (i + 1) % this._points.length;\r\n }\r\n public indexBefore(i: number) {\r\n return (i + this._points.length - 1) % this._points.length;\r\n }\r\n public pushIndex(primaryPointIndex: number) {\r\n this._stack.push(primaryPointIndex);\r\n }\r\n private static cross(pointA: Point3d, pointB: Point3d, pointC: Point3d): number {\r\n return pointA.crossProductToPointsXY(pointB, pointC);\r\n }\r\n /*\r\n public isInsideTurn(pointA: Point3d, pointB: Point3d, pointC: Point3d, sign: number) {\r\n return sign * AlternatingCCTreeBuilder.cross(pointA, pointB, pointC) > 0;\r\n }\r\n */\r\n public cyclicStackPoint(cyclicIndex: number): Point3d { // SIGNED index -- but negatives must be in first 10 periods?\r\n let stackIndex: number;\r\n const stack = this._stack;\r\n if (cyclicIndex > 0)\r\n stackIndex = cyclicIndex;\r\n else\r\n stackIndex = cyclicIndex + 10 * stack.length;\r\n stackIndex = stackIndex % stack.length;\r\n return this._points[stack[stackIndex]];\r\n }\r\n public signFromStackTip(pointIndex: number, sign: number) {\r\n const pointA = this.cyclicStackPoint(-2);\r\n const pointB = this.cyclicStackPoint(-1);\r\n const pointC = this._points[pointIndex];\r\n return sign * AlternatingCCTreeBuilder.cross(pointA, pointB, pointC) >= 0.0 ? 1 : -1;\r\n }\r\n /*\r\n * Test of xyz is in the convex region bounded by stack points:\r\n * <ul>\r\n * <li>polygon[i0]..polygon[i1]\r\n * <li>polygon[j0]..polygon[j1]\r\n * <li>polygon[i0]..polygon[i1]\r\n * </ul>\r\n * with \"inside\" controlled by sign multiplier.\r\n public isConvexContinuation(point: Point3d, i0: number, i1: number, j0: number, j1: number, sign: number): boolean {\r\n const points = this.points;\r\n const stack = this.stack;\r\n return this.isInsideTurn(points[stack[i0]], points[stack[i1]], point, sign)\r\n && this.isInsideTurn(points[stack[i0]], points[stack[j0]], point, sign)\r\n && this.isInsideTurn(points[stack[j1]], points[stack[i1]], point, sign);\r\n }\r\n */\r\n public get indexOfMaxX() {\r\n let k = 0;\r\n const points = this._points;\r\n const nPoints = this._points.length;\r\n for (let i = 1; i < nPoints; i++) {\r\n if (points[i].x > points[k].x)\r\n k = i;\r\n }\r\n return k;\r\n }\r\n /** Pop from the stack until the sign condition is satisfied */\r\n public extendHullChain(k: number, sign: number, pushAfterPops: boolean) {\r\n while (this._stack.length > 1 && this.signFromStackTip(k, sign) < 0.0)\r\n this._stack.pop();\r\n if (pushAfterPops)\r\n this.pushIndex(k);\r\n }\r\n public collectHullChain(kStart: number, numK: number, sign: number) {\r\n this._stack.length = 0;\r\n if (numK > 2) {\r\n let k = kStart;\r\n for (let i = 0; i < numK; i++) {\r\n this.extendHullChain(k, sign, true);\r\n k = this.indexAfter(k);\r\n }\r\n }\r\n }\r\n public collectHullPointsInArray(points: Point3d[], kStart: number, numK: number, _sign: number) {\r\n points.length = 0;\r\n if (numK > 2) {\r\n let k = kStart;\r\n for (let i = 0; i < numK; i++) {\r\n points.push(this._points[k]);\r\n k = this.indexAfter(k);\r\n }\r\n }\r\n }\r\n private buildHullTreeGo(\r\n root: AlternatingCCTreeNode, isPositiveArea: boolean, recurseToChildren: boolean = true,\r\n ): boolean {\r\n this.collectHullChain(root.startIdx, root.numPoints, isPositiveArea ? 1.0 : -1.0);\r\n root.points.length = 0;\r\n const stack = this._stack;\r\n const points = this._points;\r\n const stackLen = stack.length;\r\n\r\n for (let i = 0; i < stackLen; i++) {\r\n const k0 = stack[i];\r\n root.points.push(points[k0]);\r\n if (i + 1 < stackLen) {\r\n let k1 = stack[i + 1];\r\n if (k1 === this.indexAfter(k0)) {\r\n // two original points in sequence -- need a clip plane right here!!!\r\n const plane = ClipPlane.createEdgeAndUpVector(\r\n points[k0], points[k1], Vector3d.create(0, 0, 1), Angle.createRadians(0),\r\n );\r\n if (plane !== undefined) {\r\n if (isPositiveArea)\r\n plane.negateInPlace();\r\n root.addPlane(plane);\r\n }\r\n } else {\r\n if (k1 < k0)\r\n k1 += this.period;\r\n root.addEmptyChild(k0, k1 - k0 + 1);\r\n }\r\n }\r\n }\r\n if (recurseToChildren) {\r\n for (const child of root.children)\r\n this.buildHullTreeGo(child, !isPositiveArea);\r\n } else {\r\n for (const child of root.children)\r\n this.collectHullPointsInArray(child.points, child.startIdx, child.numPoints, isPositiveArea ? -1.0 : 1.0);\r\n }\r\n return true; // Are there failure modes? What happens with crossing data?..\r\n }\r\n /**\r\n * <ul>\r\n * <li> Input a ClipTreeRoot that has start and count data\r\n * <li> Build the hull for that data range\r\n * <li> Store the hull points in the root\r\n * <li> Add children with start and count data\r\n * <li> Recursively move to children\r\n * </ul>\r\n */\r\n public buildHullAndInletsForPolygon(root: AlternatingCCTreeNode): boolean {\r\n AlternatingCCTreeNode.createWithIndices(this.indexOfMaxX, this.period + 1, root);\r\n return this.buildHullTreeGo(root, true, false);\r\n }\r\n /**\r\n * <ul>\r\n * <li> Input a ClipTreeRoot that has start and count data\r\n * <li> Build the hull for that data range\r\n * <li> Store the hull points in the root\r\n * <li> Add children with start and count data\r\n * <li> Recursively move to children\r\n * </ul>\r\n */\r\n public buildHullTree(root: AlternatingCCTreeNode): boolean {\r\n AlternatingCCTreeNode.createWithIndices(this.indexOfMaxX, this.period + 1, root);\r\n return this.buildHullTreeGo(root, true);\r\n }\r\n}\r\n\r\nexport class AlternatingCCTreeNodeCurveClipper {\r\n private _curve: CurvePrimitive | undefined;\r\n private _intervalStack: Range1d[][];\r\n private _stackDepth: number;\r\n\r\n public constructor() {\r\n this._stackDepth = 0;\r\n this._intervalStack = [];\r\n }\r\n\r\n private setCurveRef(curve: CurvePrimitive) { this._curve = curve; }\r\n private popSegmentFrame() {\r\n if (this._stackDepth > 0) {\r\n this._topOfStack.length = 0; // formality.\r\n this._stackDepth -= 1;\r\n }\r\n }\r\n private clearSegmentStack() {\r\n while (this._stackDepth > 0)\r\n this.popSegmentFrame(); // and that will reduce stack depth\r\n }\r\n private pushEmptySegmentFrame() {\r\n this._stackDepth += 1;\r\n while (this._intervalStack.length < this._stackDepth)\r\n this._intervalStack.push([]);\r\n this._topOfStack.length = 0;\r\n }\r\n private get _topOfStack(): Range1d[] { return this._intervalStack[this._stackDepth - 1]; }\r\n // set the top of the stack (as defined by stackDepth -- not array length)\r\n private set _topOfStack(value: Range1d[]) {\r\n const n = this._stackDepth;\r\n if (n > 0)\r\n this._intervalStack[n - 1] = value;\r\n }\r\n /** Access entry [topOfStack() - numSkip] */\r\n private stackEntry(numSkip: number): Range1d[] {\r\n if (numSkip <= this._stackDepth)\r\n return this._intervalStack[this._stackDepth - 1 - numSkip];\r\n else\r\n return [];\r\n }\r\n private isTopOfStackEmpty(): boolean {\r\n return this._topOfStack.length === 0;\r\n }\r\n // Is re-used by method calls\r\n private static _fractionIntervals: number[] = [];\r\n private appendSingleClipToStack(planes: ConvexClipPlaneSet, insideSegments: Range1d[]): boolean {\r\n const fractionIntervals = AlternatingCCTreeNodeCurveClipper._fractionIntervals;\r\n\r\n if (this._curve instanceof LineSegment3d) {\r\n const segment = this._curve;\r\n let f0: number;\r\n let f1: number;\r\n if (segment.announceClipIntervals(planes, (a0: number, a1: number, _cp: CurvePrimitive) => { f0 = a0; f1 = a1; })) {\r\n insideSegments.push(Range1d.createXX(f0!, f1!));\r\n }\r\n return true;\r\n\r\n } else if (this._curve instanceof Arc3d) {\r\n const arc = this._curve;\r\n fractionIntervals.length = 0;\r\n arc.announceClipIntervals(planes, (a0: number, a1: number, _cp: CurvePrimitive) => {\r\n fractionIntervals.push(a0); fractionIntervals.push(a1);\r\n });\r\n for (let i = 0; i < fractionIntervals.length; i += 2)\r\n insideSegments.push(Range1d.createXX(fractionIntervals[i], fractionIntervals[i + 1]));\r\n return true;\r\n\r\n } else if (this._curve instanceof LineString3d && (this._curve).points.length > 1) {\r\n const linestring = this._curve;\r\n let f0: number;\r\n let f1: number;\r\n const nPoints = linestring.points.length;\r\n const df = 1.0 / (nPoints - 1);\r\n for (let i = 0; i < nPoints - 1; i++) {\r\n const segment = LineSegment3d.create(linestring.points[i], linestring.points[i + 1]);\r\n if (segment.announceClipIntervals(planes, (a0: number, a1: number, _cp: CurvePrimitive) => { f0 = a0; f1 = a1; })) {\r\n insideSegments.push(Range1d.createXX((i + f0!) * df, (i + f1!) * df));\r\n }\r\n }\r\n return true;\r\n\r\n } else if (this._curve instanceof BSplineCurve3d) {\r\n const bcurve = this._curve;\r\n fractionIntervals.length = 0;\r\n bcurve.announceClipIntervals(planes, (a0: number, a1: number, _cp: CurvePrimitive) => {\r\n fractionIntervals.push(a0); fractionIntervals.push(a1);\r\n });\r\n for (let i = 0; i < fractionIntervals.length; i += 2)\r\n insideSegments.push(Range1d.createXX(fractionIntervals[i], fractionIntervals[i + 1]));\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n /**\r\n * Run one level of recursion. On return, the stack is one level deeper than at entry and the new top of the stack\r\n * has clip for this node (expensive -- must clone items of arrays during \"swaps\").\r\n */\r\n private recurse(node: AlternatingCCTreeNode) {\r\n this.pushEmptySegmentFrame();\r\n this.appendSingleClipToStack(node.planes, this._topOfStack);\r\n Range1dArray.sort(this._topOfStack);\r\n if (this.isTopOfStackEmpty())\r\n return;\r\n for (const child of node.children) {\r\n this.recurse(child);\r\n if (!this.isTopOfStackEmpty()) {\r\n const ranges = Range1dArray.differenceSorted(this.stackEntry(1), this.stackEntry(0));\r\n this.popSegmentFrame();\r\n this._topOfStack = ranges;\r\n } else {\r\n this.popSegmentFrame();\r\n }\r\n if (this.isTopOfStackEmpty())\r\n break;\r\n }\r\n }\r\n /**\r\n * Modifies the insideIntervals array given in place.\r\n * Note: curve given is passed by reference and stored.\r\n */\r\n public appendSingleClipPrimitive(root: AlternatingCCTreeNode, curve: CurvePrimitive,\r\n insideIntervals: CurveLocationDetailPair[], _outsideIntervals: CurveLocationDetailPair[]) {\r\n this.setCurveRef(curve);\r\n this.clearSegmentStack();\r\n this.recurse(root);\r\n if (this._stackDepth !== 1)\r\n return;\r\n const intervals = this._topOfStack;\r\n for (const interval of intervals) {\r\n const f0 = interval.low;\r\n const f1 = interval.high;\r\n const xyz0 = curve.fractionToPoint(f0);\r\n const xyz1 = curve.fractionToPoint(f1);\r\n insideIntervals.push(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveFractionPoint(curve, f0, xyz0),\r\n CurveLocationDetail.createCurveFractionPoint(curve, f1, xyz1),\r\n ));\r\n }\r\n this.popSegmentFrame();\r\n }\r\n /**\r\n * Modifies the insideIntervals array given in place.\r\n * Note: curve given is passed by reference and stored.\r\n */\r\n public appendCurveCollectionClip(root: AlternatingCCTreeNode, curve: CurveCollection,\r\n insideIntervals: CurveLocationDetailPair[], outsideIntervals: CurveLocationDetailPair[]) {\r\n for (const cp of curve.children) {\r\n if (cp instanceof CurvePrimitive)\r\n this.appendSingleClipPrimitive(root, cp, insideIntervals, outsideIntervals);\r\n else if (cp instanceof CurveCollection)\r\n this.appendCurveCollectionClip(root, cp, insideIntervals, outsideIntervals);\r\n }\r\n }\r\n}\r\n"]}
@@ -2,8 +2,8 @@
2
2
  * @module CartesianGeometry
3
3
  */
4
4
  import { Arc3d } from "../curve/Arc3d";
5
- import { AnyCurve, AnyRegion } from "../curve/CurveTypes";
6
5
  import { AnnounceNumberNumber, AnnounceNumberNumberCurvePrimitive, CurvePrimitive } from "../curve/CurvePrimitive";
6
+ import { AnyCurve, AnyRegion } from "../curve/CurveTypes";
7
7
  import { GeometryQuery } from "../curve/GeometryQuery";
8
8
  import { GrowableFloat64Array } from "../geometry3d/GrowableFloat64Array";
9
9
  import { GrowableXYZArray } from "../geometry3d/GrowableXYZArray";
@@ -238,17 +238,44 @@ export declare class ClipUtilities {
238
238
  * @param ignoreInvisiblePlanes if true, do NOT compute a facet for convex set faces marked invisible.
239
239
  */
240
240
  static doesConvexClipPlaneSetIntersectRange(convexSet: ConvexClipPlaneSet, range: Range3d, includeConvexSetFaces?: boolean, includeRangeFaces?: boolean, ignoreInvisiblePlanes?: boolean): boolean;
241
+ /**
242
+ * Create a clipper from the transformed range.
243
+ * @param range input range to create clipper from
244
+ * @param transform how to transform the range (NOTE: applied to the range faces without swelling the range volume)
245
+ * @param degeneratePoints optionally populated with the 1 or 2 points defining the transformed range if it is degenerate (all points colinear/coincident); otherwise untouched
246
+ * @returns newly constructed clipper. If no clip planes could be computed, fill `degeneratePoints` and return undefined.
247
+ */
248
+ private static createClipperFromTransformedRange3d;
249
+ /**
250
+ * Handle pathological cases of range-range intersection, where one of the ranges defines no area or volume (is a line segment or single point).
251
+ * @param range local range to intersect with the point/segment
252
+ * @param points isolated local point, or local segment's start and end
253
+ * @param localToWorld optional transform for output range
254
+ * @param intersection optional range of the intersection, in world coordinates, or null range if no intersection.
255
+ * @returns whether the point/segment intersects the range
256
+ */
257
+ private static rangeIntersectPointOrSegment;
241
258
  /**
242
259
  * Test for intersection of two ranges in different local coordinates.
243
260
  * * Useful for clash detection of elements in iModels, using their stored (tight) local ranges and placement transforms.
244
- * @param range0 range in local coordinates of first geometry
245
- * @param local0ToWorld placement transform for first geometry
246
- * @param range1 range in local coordinates of second geometry
247
- * @param local1ToWorld placement transform for second geometry. Assumed to be invertible.
261
+ * @param range0 first range in local coordinates
262
+ * @param local0ToWorld placement transform for first range
263
+ * @param range1 second range in local coordinates
264
+ * @param local1ToWorld placement transform for second range. Assumed to be invertible.
248
265
  * @param range1Margin optional signed local distance to expand/contract the second range before intersection. Positive expands.
249
266
  * @return whether the local ranges are adjacent or intersect. Also returns false if local1ToWorld is singular.
250
267
  */
251
268
  static doLocalRangesIntersect(range0: Range3d, local0ToWorld: Transform, range1: Range3d, local1ToWorld: Transform, range1Margin?: number): boolean;
269
+ /**
270
+ * Compute the range of the intersection between two local (e.g., element-aligned) ranges.
271
+ * @param range0 first range in local coordinates
272
+ * @param local0ToWorld placement transform for first range
273
+ * @param range1 second range in local coordinates
274
+ * @param local1ToWorld placement transform for second range. Assumed to be invertible.
275
+ * @param result optional pre-allocated range to fill and return
276
+ * @return range of the intersection (aligned to world axes). Returns null range if local1ToWorld is singular.
277
+ */
278
+ static rangeOfIntersectionOfLocalRanges(range0: Range3d, local0ToWorld: Transform, range1: Range3d, local1ToWorld: Transform, result?: Range3d): Range3d;
252
279
  /**
253
280
  * Test if `obj` is a `Clipper` object.
254
281
  * * This is implemented by testing for each of the methods in the `Clipper` interface.
@@ -1 +1 @@
1
- {"version":3,"file":"ClipUtils.d.ts","sourceRoot":"","sources":["../../../src/clipping/ClipUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClipUtils.d.ts","sourceRoot":"","sources":["../../../src/clipping/ClipUtils.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,11 @@
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.ClipUtilities = exports.ClipStatus = exports.ClipStepAction = exports.ClipPlaneContainment = void 0;
11
+ const core_bentley_1 = require("@itwin/core-bentley");
11
12
  const CurveCollection_1 = require("../curve/CurveCollection");
12
13
  const CurveFactory_1 = require("../curve/CurveFactory");
13
14
  const CurvePrimitive_1 = require("../curve/CurvePrimitive");
15
+ const LineSegment3d_1 = require("../curve/LineSegment3d");
14
16
  const LineString3d_1 = require("../curve/LineString3d");
15
17
  const Loop_1 = require("../curve/Loop");
16
18
  const Path_1 = require("../curve/Path");
@@ -23,6 +25,7 @@ const Point3dArrayCarrier_1 = require("../geometry3d/Point3dArrayCarrier");
23
25
  const Point3dVector3d_1 = require("../geometry3d/Point3dVector3d");
24
26
  const Range_1 = require("../geometry3d/Range");
25
27
  const ReusableObjectCache_1 = require("../geometry3d/ReusableObjectCache");
28
+ const Transform_1 = require("../geometry3d/Transform");
26
29
  const PolyfaceBuilder_1 = require("../polyface/PolyfaceBuilder");
27
30
  const ClipPlane_1 = require("./ClipPlane");
28
31
  const ClipPrimitive_1 = require("./ClipPrimitive");
@@ -498,32 +501,110 @@ class ClipUtilities {
498
501
  }
499
502
  return false;
500
503
  }
504
+ /**
505
+ * Create a clipper from the transformed range.
506
+ * @param range input range to create clipper from
507
+ * @param transform how to transform the range (NOTE: applied to the range faces without swelling the range volume)
508
+ * @param degeneratePoints optionally populated with the 1 or 2 points defining the transformed range if it is degenerate (all points colinear/coincident); otherwise untouched
509
+ * @returns newly constructed clipper. If no clip planes could be computed, fill `degeneratePoints` and return undefined.
510
+ */
511
+ static createClipperFromTransformedRange3d(range, transform, degeneratePoints) {
512
+ if (!transform)
513
+ transform = Transform_1.Transform.createIdentity();
514
+ const builder = PolyfaceBuilder_1.PolyfaceBuilder.create();
515
+ builder.addTransformedRangeMesh(transform, range);
516
+ const mesh = builder.claimPolyface();
517
+ const clipper = this._workClipper = ConvexClipPlaneSet_1.ConvexClipPlaneSet.createConvexPolyface(mesh, this._workClipper).clipper;
518
+ if (clipper.planes.length > 0)
519
+ return clipper;
520
+ // no faces found in the compressed mesh
521
+ if (degeneratePoints) {
522
+ (0, core_bentley_1.assert)(mesh.data.point.length <= 2);
523
+ for (let i = 0; i < 2; ++i) {
524
+ const point = mesh.data.point.getPoint3dAtCheckedPointIndex(i);
525
+ if (point)
526
+ degeneratePoints.push(point);
527
+ }
528
+ }
529
+ return undefined;
530
+ }
531
+ /**
532
+ * Handle pathological cases of range-range intersection, where one of the ranges defines no area or volume (is a line segment or single point).
533
+ * @param range local range to intersect with the point/segment
534
+ * @param points isolated local point, or local segment's start and end
535
+ * @param localToWorld optional transform for output range
536
+ * @param intersection optional range of the intersection, in world coordinates, or null range if no intersection.
537
+ * @returns whether the point/segment intersects the range
538
+ */
539
+ static rangeIntersectPointOrSegment(range, points, localToWorld, intersection) {
540
+ const announceInterval = intersection ?
541
+ (f0, f1, cp) => {
542
+ intersection.extendPoint(cp.fractionToPoint(f0), localToWorld);
543
+ intersection.extendPoint(cp.fractionToPoint(f1), localToWorld);
544
+ } : undefined;
545
+ let hasIntersection = false;
546
+ if (points.length > 1) {
547
+ const segment = LineSegment3d_1.LineSegment3d.createCapture(points[0], points[1]);
548
+ const clipper = ConvexClipPlaneSet_1.ConvexClipPlaneSet.createRange3dPlanes(range);
549
+ hasIntersection = segment.announceClipIntervals(clipper, announceInterval);
550
+ }
551
+ else if (points.length > 0) {
552
+ hasIntersection = range.containsPoint(points[0]);
553
+ if (hasIntersection && intersection)
554
+ intersection.extendPoint(points[0], localToWorld);
555
+ }
556
+ return hasIntersection;
557
+ }
501
558
  /**
502
559
  * Test for intersection of two ranges in different local coordinates.
503
560
  * * Useful for clash detection of elements in iModels, using their stored (tight) local ranges and placement transforms.
504
- * @param range0 range in local coordinates of first geometry
505
- * @param local0ToWorld placement transform for first geometry
506
- * @param range1 range in local coordinates of second geometry
507
- * @param local1ToWorld placement transform for second geometry. Assumed to be invertible.
561
+ * @param range0 first range in local coordinates
562
+ * @param local0ToWorld placement transform for first range
563
+ * @param range1 second range in local coordinates
564
+ * @param local1ToWorld placement transform for second range. Assumed to be invertible.
508
565
  * @param range1Margin optional signed local distance to expand/contract the second range before intersection. Positive expands.
509
566
  * @return whether the local ranges are adjacent or intersect. Also returns false if local1ToWorld is singular.
510
567
  */
511
568
  static doLocalRangesIntersect(range0, local0ToWorld, range1, local1ToWorld, range1Margin) {
512
- const worldToLocal1 = ClipUtilities._workTransform = local1ToWorld.inverse(ClipUtilities._workTransform);
569
+ const worldToLocal1 = this._workTransform = local1ToWorld.inverse(this._workTransform);
513
570
  if (!worldToLocal1)
514
571
  return false;
515
572
  let myRange1 = range1;
516
573
  if (range1Margin) {
517
- myRange1 = ClipUtilities._workRange = range1.clone(ClipUtilities._workRange);
574
+ myRange1 = this._workRange = range1.clone(this._workRange);
518
575
  myRange1.expandInPlace(range1Margin);
519
576
  }
577
+ const degeneratePoints = [];
578
+ const local0ToLocal1 = worldToLocal1.multiplyTransformTransform(local0ToWorld, worldToLocal1);
520
579
  // convert range0 into a clipper in local1 coordinates, then intersect with range1
580
+ const clipper = this.createClipperFromTransformedRange3d(range0, local0ToLocal1, degeneratePoints);
581
+ if (clipper)
582
+ return this.doesClipperIntersectRange(clipper, myRange1);
583
+ return this.rangeIntersectPointOrSegment(myRange1, degeneratePoints, local1ToWorld);
584
+ }
585
+ /**
586
+ * Compute the range of the intersection between two local (e.g., element-aligned) ranges.
587
+ * @param range0 first range in local coordinates
588
+ * @param local0ToWorld placement transform for first range
589
+ * @param range1 second range in local coordinates
590
+ * @param local1ToWorld placement transform for second range. Assumed to be invertible.
591
+ * @param result optional pre-allocated range to fill and return
592
+ * @return range of the intersection (aligned to world axes). Returns null range if local1ToWorld is singular.
593
+ */
594
+ static rangeOfIntersectionOfLocalRanges(range0, local0ToWorld, range1, local1ToWorld, result) {
595
+ const myResult = Range_1.Range3d.createNull(result);
596
+ const worldToLocal1 = this._workTransform = local1ToWorld.inverse(this._workTransform);
597
+ if (!worldToLocal1)
598
+ return myResult;
599
+ const degeneratePoints = [];
521
600
  const local0ToLocal1 = worldToLocal1.multiplyTransformTransform(local0ToWorld, worldToLocal1);
522
- const builder = PolyfaceBuilder_1.PolyfaceBuilder.create();
523
- builder.addTransformedRangeMesh(local0ToLocal1, range0);
524
- const mesh0 = builder.claimPolyface();
525
- const clipper = ClipUtilities._workClipper = ConvexClipPlaneSet_1.ConvexClipPlaneSet.createConvexPolyface(mesh0, ClipUtilities._workClipper).clipper;
526
- return ClipUtilities.doesClipperIntersectRange(clipper, myRange1);
601
+ // convert range0 into a clipper in local1 coordinates, then intersect with range1
602
+ const clipper = this.createClipperFromTransformedRange3d(range0, local0ToLocal1, degeneratePoints);
603
+ if (clipper)
604
+ this.announceLoopsOfConvexClipPlaneSetIntersectRange(clipper, range1, (loopPoints) => { loopPoints.extendRange(myResult, local1ToWorld); });
605
+ else
606
+ this.rangeIntersectPointOrSegment(range1, degeneratePoints, local1ToWorld, myResult);
607
+ return myResult;
527
608
  }
528
609
  /**
529
610
  * Test if `obj` is a `Clipper` object.