@itwin/core-geometry 5.1.0-dev.17 → 5.1.0-dev.18

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 (277) hide show
  1. package/lib/cjs/clipping/ClipPlane.d.ts +7 -5
  2. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  3. package/lib/cjs/clipping/ClipPlane.js +9 -5
  4. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  5. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  6. package/lib/cjs/clipping/ConvexClipPlaneSet.js +12 -23
  7. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  8. package/lib/cjs/core-geometry.d.ts +1 -0
  9. package/lib/cjs/core-geometry.d.ts.map +1 -1
  10. package/lib/cjs/core-geometry.js +1 -0
  11. package/lib/cjs/core-geometry.js.map +1 -1
  12. package/lib/cjs/curve/Arc3d.d.ts +53 -31
  13. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  14. package/lib/cjs/curve/Arc3d.js +55 -36
  15. package/lib/cjs/curve/Arc3d.js.map +1 -1
  16. package/lib/cjs/curve/CurveCollection.d.ts +2 -0
  17. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  18. package/lib/cjs/curve/CurveCollection.js +14 -0
  19. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  20. package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
  21. package/lib/cjs/curve/LineSegment3d.js +1 -0
  22. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  23. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  24. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +10 -5
  25. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  26. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  27. package/lib/cjs/curve/Query/PlanarSubdivision.js +7 -2
  28. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  29. package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
  30. package/lib/cjs/curve/RegionMomentsXY.js +1 -1
  31. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  32. package/lib/cjs/curve/RegionOps.d.ts +32 -28
  33. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  34. package/lib/cjs/curve/RegionOps.js +32 -28
  35. package/lib/cjs/curve/RegionOps.js.map +1 -1
  36. package/lib/cjs/geometry3d/AngleSweep.d.ts +14 -11
  37. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  38. package/lib/cjs/geometry3d/AngleSweep.js +14 -11
  39. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  40. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +7 -2
  41. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  42. package/lib/cjs/geometry3d/GrowableXYZArray.js +20 -2
  43. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  44. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +2 -1
  45. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  46. package/lib/cjs/geometry3d/IndexedXYZCollection.js +7 -3
  47. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  48. package/lib/cjs/geometry3d/Plane3d.d.ts +2 -0
  49. package/lib/cjs/geometry3d/Plane3d.d.ts.map +1 -1
  50. package/lib/cjs/geometry3d/Plane3d.js +6 -1
  51. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  52. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  53. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  54. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  55. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  56. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  57. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  58. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  59. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  60. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +3 -3
  61. package/lib/cjs/geometry3d/Point3dVector3d.js +3 -3
  62. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  63. package/lib/cjs/geometry3d/PointHelpers.d.ts +7 -7
  64. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  65. package/lib/cjs/geometry3d/PointHelpers.js +66 -26
  66. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  67. package/lib/cjs/geometry3d/PolygonOps.d.ts +49 -2
  68. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  69. package/lib/cjs/geometry3d/PolygonOps.js +38 -2
  70. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  71. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  72. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  73. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  74. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  75. package/lib/cjs/geometry3d/PolylineOps.d.ts +5 -4
  76. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  77. package/lib/cjs/geometry3d/PolylineOps.js +5 -4
  78. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  79. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  80. package/lib/cjs/geometry3d/Ray3d.js +11 -23
  81. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  82. package/lib/cjs/geometry3d/Transform.d.ts +21 -2
  83. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  84. package/lib/cjs/geometry3d/Transform.js +32 -13
  85. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  86. package/lib/cjs/geometry4d/Point4d.d.ts +4 -2
  87. package/lib/cjs/geometry4d/Point4d.d.ts.map +1 -1
  88. package/lib/cjs/geometry4d/Point4d.js +17 -13
  89. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  90. package/lib/cjs/polyface/FacetOrientation.d.ts +1 -1
  91. package/lib/cjs/polyface/FacetOrientation.js +1 -1
  92. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  93. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts +55 -40
  94. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  95. package/lib/cjs/polyface/IndexedEdgeMatcher.js +83 -75
  96. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  97. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  98. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  99. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +47 -38
  100. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  101. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  102. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  103. package/lib/cjs/polyface/IndexedPolyfaceWalker.js +47 -32
  104. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  105. package/lib/cjs/polyface/Polyface.d.ts +17 -3
  106. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  107. package/lib/cjs/polyface/Polyface.js +16 -0
  108. package/lib/cjs/polyface/Polyface.js.map +1 -1
  109. package/lib/cjs/polyface/PolyfaceBuilder.js +2 -2
  110. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  111. package/lib/cjs/polyface/PolyfaceClip.d.ts +19 -18
  112. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  113. package/lib/cjs/polyface/PolyfaceClip.js +39 -42
  114. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  115. package/lib/cjs/polyface/PolyfaceQuery.d.ts +116 -75
  116. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  117. package/lib/cjs/polyface/PolyfaceQuery.js +312 -228
  118. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  119. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  120. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  121. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +3 -3
  122. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  123. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  124. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  125. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  126. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  127. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  128. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  129. package/lib/cjs/solid/LinearSweep.d.ts +2 -3
  130. package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
  131. package/lib/cjs/solid/LinearSweep.js +2 -3
  132. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  133. package/lib/cjs/solid/RotationalSweep.d.ts +2 -2
  134. package/lib/cjs/solid/RotationalSweep.js +2 -2
  135. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  136. package/lib/cjs/topology/ChainMerge.d.ts +1 -1
  137. package/lib/cjs/topology/ChainMerge.js +1 -1
  138. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  139. package/lib/esm/clipping/ClipPlane.d.ts +7 -5
  140. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  141. package/lib/esm/clipping/ClipPlane.js +9 -5
  142. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  143. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  144. package/lib/esm/clipping/ConvexClipPlaneSet.js +12 -23
  145. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  146. package/lib/esm/core-geometry.d.ts +1 -0
  147. package/lib/esm/core-geometry.d.ts.map +1 -1
  148. package/lib/esm/core-geometry.js +1 -0
  149. package/lib/esm/core-geometry.js.map +1 -1
  150. package/lib/esm/curve/Arc3d.d.ts +53 -31
  151. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  152. package/lib/esm/curve/Arc3d.js +55 -36
  153. package/lib/esm/curve/Arc3d.js.map +1 -1
  154. package/lib/esm/curve/CurveCollection.d.ts +2 -0
  155. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  156. package/lib/esm/curve/CurveCollection.js +14 -0
  157. package/lib/esm/curve/CurveCollection.js.map +1 -1
  158. package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
  159. package/lib/esm/curve/LineSegment3d.js +1 -0
  160. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  161. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  162. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +10 -5
  163. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  164. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  165. package/lib/esm/curve/Query/PlanarSubdivision.js +7 -2
  166. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  167. package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
  168. package/lib/esm/curve/RegionMomentsXY.js +1 -1
  169. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  170. package/lib/esm/curve/RegionOps.d.ts +32 -28
  171. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  172. package/lib/esm/curve/RegionOps.js +32 -28
  173. package/lib/esm/curve/RegionOps.js.map +1 -1
  174. package/lib/esm/geometry3d/AngleSweep.d.ts +14 -11
  175. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  176. package/lib/esm/geometry3d/AngleSweep.js +14 -11
  177. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  178. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +7 -2
  179. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  180. package/lib/esm/geometry3d/GrowableXYZArray.js +20 -2
  181. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  182. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +2 -1
  183. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  184. package/lib/esm/geometry3d/IndexedXYZCollection.js +7 -3
  185. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  186. package/lib/esm/geometry3d/Plane3d.d.ts +2 -0
  187. package/lib/esm/geometry3d/Plane3d.d.ts.map +1 -1
  188. package/lib/esm/geometry3d/Plane3d.js +6 -1
  189. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  190. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  191. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  192. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  193. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  194. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  195. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  196. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  197. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  198. package/lib/esm/geometry3d/Point3dVector3d.d.ts +3 -3
  199. package/lib/esm/geometry3d/Point3dVector3d.js +3 -3
  200. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  201. package/lib/esm/geometry3d/PointHelpers.d.ts +7 -7
  202. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  203. package/lib/esm/geometry3d/PointHelpers.js +66 -26
  204. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  205. package/lib/esm/geometry3d/PolygonOps.d.ts +49 -2
  206. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  207. package/lib/esm/geometry3d/PolygonOps.js +38 -2
  208. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  209. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  210. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  211. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  212. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  213. package/lib/esm/geometry3d/PolylineOps.d.ts +5 -4
  214. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  215. package/lib/esm/geometry3d/PolylineOps.js +5 -4
  216. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  217. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  218. package/lib/esm/geometry3d/Ray3d.js +11 -23
  219. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  220. package/lib/esm/geometry3d/Transform.d.ts +21 -2
  221. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  222. package/lib/esm/geometry3d/Transform.js +32 -13
  223. package/lib/esm/geometry3d/Transform.js.map +1 -1
  224. package/lib/esm/geometry4d/Point4d.d.ts +4 -2
  225. package/lib/esm/geometry4d/Point4d.d.ts.map +1 -1
  226. package/lib/esm/geometry4d/Point4d.js +17 -13
  227. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  228. package/lib/esm/polyface/FacetOrientation.d.ts +1 -1
  229. package/lib/esm/polyface/FacetOrientation.js +1 -1
  230. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  231. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts +55 -40
  232. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  233. package/lib/esm/polyface/IndexedEdgeMatcher.js +83 -75
  234. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  235. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  236. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  237. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +47 -38
  238. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  239. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  240. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  241. package/lib/esm/polyface/IndexedPolyfaceWalker.js +47 -32
  242. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  243. package/lib/esm/polyface/Polyface.d.ts +17 -3
  244. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  245. package/lib/esm/polyface/Polyface.js +16 -0
  246. package/lib/esm/polyface/Polyface.js.map +1 -1
  247. package/lib/esm/polyface/PolyfaceBuilder.js +2 -2
  248. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  249. package/lib/esm/polyface/PolyfaceClip.d.ts +19 -18
  250. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  251. package/lib/esm/polyface/PolyfaceClip.js +39 -42
  252. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  253. package/lib/esm/polyface/PolyfaceQuery.d.ts +116 -75
  254. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  255. package/lib/esm/polyface/PolyfaceQuery.js +313 -229
  256. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  257. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  258. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  259. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +3 -3
  260. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  261. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  262. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  263. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  264. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  265. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  266. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  267. package/lib/esm/solid/LinearSweep.d.ts +2 -3
  268. package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
  269. package/lib/esm/solid/LinearSweep.js +2 -3
  270. package/lib/esm/solid/LinearSweep.js.map +1 -1
  271. package/lib/esm/solid/RotationalSweep.d.ts +2 -2
  272. package/lib/esm/solid/RotationalSweep.js +2 -2
  273. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  274. package/lib/esm/topology/ChainMerge.d.ts +1 -1
  275. package/lib/esm/topology/ChainMerge.js +1 -1
  276. package/lib/esm/topology/ChainMerge.js.map +1 -1
  277. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"ConvexClipPlaneSet.js","sourceRoot":"","sources":["../../../src/clipping/ConvexClipPlaneSet.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { AnnounceNumberNumber, AnnounceNumberNumberCurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { GrowableFloat64Array } from \"../geometry3d/GrowableFloat64Array\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { IndexedXYZCollectionPolygonOps, PolygonOps } from \"../geometry3d/PolygonOps\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { GrowableXYZArrayCache } from \"../geometry3d/ReusableObjectCache\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\nimport { Polyface, PolyfaceVisitor } from \"../polyface/Polyface\";\nimport { PolyfaceQuery } from \"../polyface/PolyfaceQuery\";\nimport { ClipPlane, ClipPlaneProps } from \"./ClipPlane\";\nimport { Clipper, ClipPlaneContainment, ClipUtilities, PolygonClipper } from \"./ClipUtils\";\n\n/** Wire format describing a [[ConvexClipPlaneSet]].\n * @public\n */\nexport type ConvexClipPlaneSetProps = ClipPlaneProps[];\n\n/**\n * A ConvexClipPlaneSet is a collection of ClipPlanes, often used for bounding regions of space.\n * @public\n */\nexport class ConvexClipPlaneSet implements Clipper, PolygonClipper {\n /** Value acting as \"at infinity\" for coordinates along a ray. */\n public static readonly hugeVal = 1e37;\n /** Planes that define the convex set. */\n private _planes: ClipPlane[];\n // private _parity: number; <--- Not yet used\n // public get parity() { return this._parity; }\n // public set parity(value: number) { this._parity = value; }\n private constructor(planes?: ClipPlane[]) {\n // this._parity = 1;\n this._planes = planes ? planes : [];\n }\n /**\n * Return an array containing all the planes of the convex set.\n * * Note that this has no leading keyword identifying it as a ConvexClipPlaneSet.\n */\n public toJSON(): ConvexClipPlaneSetProps {\n const val: ClipPlaneProps[] = [];\n for (const plane of this._planes)\n val.push(plane.toJSON());\n return val;\n }\n /**\n * Extract clip planes from a json array `[ clipPlane, clipPlane ]`.\n * * Non-clipPlane members are ignored.\n */\n public static fromJSON(json: ConvexClipPlaneSetProps | undefined, result?: ConvexClipPlaneSet): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n if (!Array.isArray(json))\n return result;\n for (const thisJson of json) {\n const plane = ClipPlane.fromJSON(thisJson);\n if (plane)\n result._planes.push(plane);\n }\n return result;\n }\n /**\n * Return true if all members are almostEqual to corresponding members of other. This includes identical order in array.\n * @param other clip plane to compare\n */\n public isAlmostEqual(other: ConvexClipPlaneSet): boolean {\n if (this._planes.length !== other._planes.length)\n return false;\n for (let i = 0; i < this._planes.length; i++)\n if (!this._planes[i].isAlmostEqual(other._planes[i]))\n return false;\n return true;\n }\n /**\n * Create ConvexClipPlaneSet from an array of planes.\n * * Each plane reference in the `planes` array is taken into the result.\n * * The input array itself is NOT taken into the result.\n */\n public static createPlanes(\n planes: (ClipPlane | Plane3dByOriginAndUnitNormal)[], result?: ConvexClipPlaneSet,\n ): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n for (const plane of planes) {\n if (plane instanceof ClipPlane) {\n result._planes.push(plane);\n } else if (plane instanceof Plane3dByOriginAndUnitNormal) {\n const clipPlane = ClipPlane.createPlane(plane);\n result._planes.push(clipPlane);\n }\n }\n return result;\n }\n /**\n * Create new convex set using selected planes of a Range3d.\n * @param range range with coordinates\n * @param lowX true to clip at the low x plane\n * @param highX true to clip at the high x plane\n * @param lowY true to clip at the low y plane\n * @param highY true to clip at the high z plane\n * @param lowZ true to clip at the low z plane\n * @param highZ true to clip at the high z plane\n */\n public static createRange3dPlanes(\n range: Range3d,\n lowX: boolean = true,\n highX: boolean = true,\n lowY: boolean = true,\n highY: boolean = true,\n lowZ: boolean = true,\n highZ: boolean = true,\n ): ConvexClipPlaneSet {\n const result = ConvexClipPlaneSet.createEmpty();\n\n if (lowX)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(1, 0, 0, range.low.x, 0, 0)!);\n if (highX)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(-1, 0, 0, range.high.x, 0, 0)!);\n\n if (lowY)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(0, 1, 0, 0, range.low.y, 0)!);\n if (highY)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(0, -1, 0, 0, range.high.y, 0)!);\n\n if (lowZ)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(0, 0, 1, 0, 0, range.low.z)!);\n if (highZ)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(0, 0, -1, 0, 0, range.high.z)!);\n\n return result;\n }\n /** Create an empty `ConvexClipPlaneSet` */\n public static createEmpty(result?: ConvexClipPlaneSet): ConvexClipPlaneSet {\n if (result) {\n result._planes.length = 0;\n return result;\n }\n return new ConvexClipPlaneSet();\n }\n /** Negate all planes of the set. */\n public negateAllPlanes(): void {\n for (const plane of this._planes)\n plane.negateInPlace();\n }\n /**\n * Create a convex clip plane set that clips to `x0 <= x <= x1` and `y0 <= y <= y1`.\n * * Note that there is no test for the usual ordering `x0 <= x1` or `y0 <= y1`.\n * * if the usual ordering is violated, the convex set is an empty set.\n * * More details can be found at docs/learning/geometry/Clipping.md\n */\n public static createXYBox(\n x0: number, y0: number, x1: number, y1: number, result?: ConvexClipPlaneSet,\n ): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n const clip0 = ClipPlane.createNormalAndDistance(Vector3d.create(-1, 0, 0), -x1, false, true);\n const clip1 = ClipPlane.createNormalAndDistance(Vector3d.create(1, 0, 0), x0, false, true);\n const clip2 = ClipPlane.createNormalAndDistance(Vector3d.create(0, -1, 0), -y1, false, true);\n const clip3 = ClipPlane.createNormalAndDistance(Vector3d.create(0, 1, 0), y0, false, true);\n if (clip0 && clip1 && clip2 && clip3) {\n result._planes.push(clip0, clip1, clip2, clip3);\n }\n return result;\n }\n /**\n * Create a convex set containing a half space for each edge between points of a polyline.\n * * Caller is responsible for assuring the polyline is convex.\n * @param points array of points. Only xy parts are considered.\n * @param interior array whose boolean value is used as both the `interior` and `invisible` bits of the plane for the\n * succeeding segment. If this array is not provided, both are false.\n * @param leftIsInside if true, the interior is \"to the left\" of the segments. If false, interior is \"to the right\".\n */\n public static createXYPolyLine(\n points: Point3d[], interior: boolean[] | undefined, leftIsInside: boolean, result?: ConvexClipPlaneSet,\n ): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n for (let i0 = 0; (i0 + 1) < points.length; i0++) {\n const edgeVector: Vector3d = Vector3d.createStartEnd(points[i0], points[i0 + 1]);\n const perp: Vector3d = edgeVector.unitPerpendicularXY();\n perp.z = 0.0;\n\n if (!leftIsInside)\n perp.scaleInPlace(-1.0);\n\n const perpNormalized = perp.normalize();\n if (perpNormalized) {\n const flag = interior !== undefined ? interior[i0] : false;\n const clip = ClipPlane.createNormalAndPoint(perp, points[i0], flag, flag);\n if (clip) {\n result._planes.push(clip);\n }\n }\n }\n return result;\n }\n /**\n * Create a convexClipPlaneSet with planes whose \"inside\" normal is to the left of each segment.\n * @param points array of points.\n */\n public static createXYPolyLineInsideLeft(points: Point3d[], result?: ConvexClipPlaneSet): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n for (let i0 = 0; (i0 + 1) < points.length; i0++) {\n const edgeVector: Vector3d = Vector3d.createStartEnd(points[i0], points[i0 + 1]);\n const perp: Vector3d = edgeVector.unitPerpendicularXY();\n perp.z = 0.0;\n\n const perpNormalized = perp.normalize();\n if (perpNormalized) {\n const clip = ClipPlane.createNormalAndPoint(perp, points[i0], false, false);\n if (clip) { result._planes.push(clip); }\n }\n }\n return result;\n }\n /**\n * Set (or reset) a plane and ConvexClipPlaneSet for a convex array, such as a convex facet used for xy clip.\n * * The planeOfPolygon is (re)initialized with the normal from 3 points, but not otherwise referenced.\n * * The ConvexClipPlaneSet is filled with outward normals of the facet edges as viewed to xy plane.\n * @param points\n * @param result\n */\n public static setPlaneAndXYLoopCCW(points: GrowableXYZArray, planeOfPolygon: ClipPlane, frustum: ConvexClipPlaneSet) {\n const i0 = points.length - 1;\n const n = points.length;\n let x0 = points.getXAtUncheckedPointIndex(i0);\n let y0 = points.getYAtUncheckedPointIndex(i0);\n let x1, y1, nx, ny;\n frustum._planes.length = 0;\n const z0 = points.getZAtUncheckedPointIndex(i0); // z for planes can stay fixed\n const planeNormal = points.crossProductIndexIndexIndex(0, 2, 1)!;\n ClipPlane.createNormalAndPointXYZXYZ(planeNormal.x, planeNormal.y, planeNormal.z, x0, y0, z0, false, false, planeOfPolygon);\n if (planeNormal.normalizeInPlace()) {\n for (let i1 = 0; i1 < n; i1++, x0 = x1, y0 = y1) {\n x1 = points.getXAtUncheckedPointIndex(i1);\n y1 = points.getYAtUncheckedPointIndex(i1);\n nx = -(y1 - y0);\n ny = x1 - x0;\n const clipper = ClipPlane.createNormalAndPointXYZXYZ(nx, ny, 0, x1, y1, z0);\n if (clipper)\n frustum._planes.push(clipper);\n }\n }\n }\n /** Deep clone of all planes. */\n public clone(result?: ConvexClipPlaneSet): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n for (const plane of this._planes)\n result._planes.push(plane.clone());\n return result;\n }\n /** Return the (reference to the) array of `ClipPlane` */\n public get planes(): ClipPlane[] {\n return this._planes;\n }\n /**\n * Test if there is any intersection with a ray defined by origin and direction.\n * * Optionally record the range (null or otherwise) in caller-allocated result.\n * * If the ray is unbounded inside the clip, result can contain positive or negative\n * \"Geometry.largeCoordinateResult\" values.\n * * If no result is provide, there are no object allocations.\n * @param result optional Range1d to receive parameters along the ray.\n */\n public hasIntersectionWithRay(ray: Ray3d, result?: Range1d, tolerance: number = Geometry.smallMetricDistance): boolean {\n // form low and high values in locals that do not require allocation.\n // transfer to caller-supplied result at end\n let t0 = -Geometry.largeCoordinateResult;\n let t1 = Geometry.largeCoordinateResult;\n if (result)\n result.setNull();\n const velocityTolerance = 1.0e-13;\n for (const plane of this._planes) {\n const vD = plane.velocity(ray.direction);\n const vN = plane.altitude(ray.origin);\n\n if (Math.abs(vD) <= velocityTolerance) {\n // Ray is parallel... No need to continue testing if outside halfspace.\n if (vN < -tolerance)\n return false; // and result is a null range.\n } else {\n const rayFraction = - vN / vD;\n if (vD < 0.0) {\n if (rayFraction < t1)\n t1 = rayFraction;\n } else {\n if (rayFraction > t0)\n t0 = rayFraction;\n }\n }\n }\n if (t1 < t0)\n return false; // and result is a null range.\n if (result) {\n result.extendX(t0);\n result.extendX(t1);\n }\n return true;\n }\n /**\n * Multiply all the ClipPlanes DPoint4d by matrix.\n * @param matrix matrix to apply.\n * @param invert if true, use in verse of the matrix.\n * @param transpose if true, use the transpose of the matrix (or inverse, per invert parameter)\n * * Note that if matrixA is applied to all of space, the matrix to send to this method to get a corresponding effect\n * on the plane is the inverse transpose of matrixA.\n * * Callers that will apply the same matrix to many planes should pre-invert the matrix for efficiency.\n * * Both params default to true to get the full effect of transforming space.\n * @param matrix matrix to apply\n */\n public multiplyPlanesByMatrix4d(matrix: Matrix4d, invert: boolean = true, transpose: boolean = true): boolean {\n if (invert) { // form inverse once here, reuse for all planes\n const inverse = matrix.createInverse();\n if (!inverse)\n return false;\n return this.multiplyPlanesByMatrix4d(inverse, false, transpose);\n }\n for (const plane of this._planes) {\n plane.multiplyPlaneByMatrix4d(matrix, false, transpose);\n }\n return true;\n }\n /** Return true if `point` satisfies `point.isPointInside` for all planes */\n public isPointInside(point: Point3d): boolean {\n for (const plane of this._planes) {\n // Defaults to strict inside check. Other clipping classes may use \"on or inside\" check for the \"on\" case\n if (!plane.isPointInside(point))\n return false;\n }\n return true;\n }\n\n /** Return true if `point` satisfies `point.isPointOnOrInside` for all planes */\n public isPointOnOrInside(point: Point3d, tolerance: number = Geometry.smallMetricDistance): boolean {\n const interiorTolerance = Math.abs(tolerance); // Interior tolerance should always be positive. (TFS# 246598).\n for (const plane of this._planes) {\n if (!plane.isPointOnOrInside(point, (plane.interior ? interiorTolerance : tolerance)))\n return false;\n }\n return true;\n }\n /**\n * Test if a sphere is completely inside the convex set.\n * @param centerPoint center of sphere\n * @param radius radius of sphere.\n */\n public isSphereInside(centerPoint: Point3d, radius: number): boolean {\n const r1 = Math.abs(radius) + Geometry.smallMetricDistance;\n for (const plane of this._planes) {\n if (!plane.isPointOnOrInside(centerPoint, r1)) {\n return false;\n }\n }\n return true;\n }\n /**\n * Find the parts of the line segment (if any) that is within the convex clip volume.\n * * The line segment is defined by `pointA` and `pointB`.\n * * The input fractional interval from `fraction0` to `fraction1` (increasing) is the active part to consider.\n * * To clip to the usual bounded line segment, start with fractions (0,1).\n * If the clip volume is unbounded, the line interval may also be unbounded.\n * * An unbounded line portion will have fraction coordinates positive or negative `Number.MAX_VALUE`.\n * @param f0 fraction that is the initial lower fraction of the active interval (e.g., 0.0 for bounded segment).\n * @param f1 fraction that is the initial upper fraction of the active interval (e.g., 1.0 for bounded segment).\n * @param pointA segment start (fraction 0)\n * @param pointB segment end (fraction 1)\n * @param announce function to be called to announce a fraction interval that is within the convex clip volume.\n * @returns true if a segment was announced, false if entirely outside.\n */\n public announceClippedSegmentIntervals(\n f0: number, f1: number, pointA: Point3d, pointB: Point3d, announce?: AnnounceNumberNumber,\n ): boolean {\n let fraction: number | undefined;\n if (f1 < f0)\n return false;\n for (const plane of this._planes) {\n const hA = -plane.altitude(pointA);\n const hB = -plane.altitude(pointB);\n fraction = Geometry.conditionalDivideFraction(-hA, (hB - hA));\n if (fraction === undefined) {\n // Line parallel to the plane. If positive, it is all OUT\n if (hA > 0.0)\n return false;\n } else if (hB > hA) { // STRICTLY moving outward\n if (fraction < f0)\n return false;\n if (fraction < f1)\n f1 = fraction;\n } else if (hA > hB) { // STRICTLY moving inward\n if (fraction > f1)\n return false;\n if (fraction > f0)\n f0 = fraction;\n } else {\n // Strictly equal evaluations\n if (hA > 0.0)\n return false;\n }\n }\n if (f1 >= f0) {\n if (announce)\n announce(f0, f1);\n return true;\n }\n return false;\n }\n private static _clipArcFractionArray = new GrowableFloat64Array();\n /**\n * Find fractional parts of the arc that are within this ClipPlaneSet, and announce each as\n * * `announce(fraction, fraction, curve)`\n */\n public announceClippedArcIntervals(arc: Arc3d, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\n const breaks = ConvexClipPlaneSet._clipArcFractionArray;\n breaks.clear();\n for (const clipPlane of this.planes) {\n clipPlane.appendIntersectionRadians(arc, breaks);\n }\n arc.sweep.radiansArrayToPositivePeriodicFractions(breaks);\n return ClipUtilities.selectIntervals01(arc, breaks, this, announce);\n }\n /**\n * Find the parts of the (unbounded) line segment (if any) that is within the convex clip volume.\n * @param pointA segment start (fraction 0)\n * @param pointB segment end (fraction 1)\n * @param announce function to be called to announce a fraction interval that is within the convex clip volume.\n * @returns true if a segment was announced, false if entirely outside.\n */\n public clipUnboundedSegment(pointA: Point3d, pointB: Point3d, announce?: AnnounceNumberNumber): boolean {\n return this.announceClippedSegmentIntervals(-Number.MAX_VALUE, Number.MAX_VALUE, pointA, pointB, announce);\n }\n /** transform each plane in place. */\n public transformInPlace(transform: Transform) {\n for (const plane of this._planes) {\n plane.transformInPlace(transform);\n }\n }\n /**\n * Clip a polygon to the inside of the convex set.\n * * Results with 2 or fewer points are ignored.\n * * Other than ensuring capacity in the arrays, there are no object allocations during execution of this function.\n * @param xyz input points.\n * @param work work buffer\n * @param tolerance tolerance for \"on plane\" decision.\n */\n public clipConvexPolygonInPlace(\n xyz: GrowableXYZArray, work: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance,\n ): void {\n for (const plane of this._planes) {\n plane.clipConvexPolygonInPlace(xyz, work, true, tolerance);\n if (xyz.length < 3)\n return;\n }\n }\n /**\n * Clip a convex polygon to (a single) inside part and (possibly many) outside parts.\n * @param xyz input polygon.\n * @param outsideFragments an array to receive (via push, with no preliminary clear) outside fragments\n * @param arrayCache cache for work arrays.\n * @return the surviving inside part (if any)\n */\n public clipInsidePushOutside(\n xyz: IndexedXYZCollection, outsideFragments: GrowableXYZArray[] | undefined, arrayCache: GrowableXYZArrayCache,\n ): GrowableXYZArray | undefined {\n const perpendicularRange = Range1d.createNull();\n let newInside = arrayCache.grabFromCache();\n let newOutside = arrayCache.grabFromCache();\n let insidePart = arrayCache.grabFromCache(); // this is empty ...\n insidePart.pushFrom(xyz);\n // While looping through planes . .\n // the outside part for the current plane is definitely outside and can be stashed to the final outside\n // the inside part for the current plane passes forward to be further split by the remaining planes.\n for (const plane of this._planes) {\n IndexedXYZCollectionPolygonOps.splitConvexPolygonInsideOutsidePlane(\n plane, insidePart, newInside, newOutside, perpendicularRange,\n );\n if (newOutside.length > 0) {\n // the newOutside fragment is definitely outside the ConvexClipPlaneSet\n if (outsideFragments) // save the definitely outside part as return data.\n ClipUtilities.captureOrDrop(newOutside, 3, outsideFragments, arrayCache);\n newOutside = arrayCache.grabFromCache();\n if (newInside.length === 0) {\n insidePart.length = 0;\n break;\n }\n // insideWork is changed ... swap it with insidePart\n arrayCache.dropToCache(insidePart);\n insidePart = newInside;\n newInside = arrayCache.grabFromCache();\n }\n // outside clip was empty .. insideWork is identical to insidePart .. let insidePart feed through to the next clipper.\n }\n // at break or fall out ...\n // ALWAYS drop `newInside` and `newOutside` to the cache\n arrayCache.dropToCache(newInside);\n arrayCache.dropToCache(newOutside);\n // if `insidePart` is alive, return it to caller. Otherwise drop it to cache and return undefined.\n if (insidePart.length > 0)\n return insidePart;\n arrayCache.dropToCache(insidePart);\n return undefined;\n }\n /**\n * Returns 1, 2, or 3 based on whether point array is strongly inside, ambiguous, or strongly outside respectively.\n * * This has a peculiar expected use case as a very fast pre-filter for more precise clipping.\n * * The expected point set is for a polygon.\n * * Hence any clipping will eventually have to consider the lines between the points.\n * * This method looks for the special case of a single clip plane that has all the points outside.\n * * In this case the whole polygon must be outside.\n * * Note that this does not detect a polygon that is outside but \"crosses a corner\" -- it is mixed with respect to\n * multiple planes.\n */\n public classifyPointContainment(points: Point3d[], onIsOutside: boolean): ClipPlaneContainment {\n let allInside = true;\n const onTolerance = onIsOutside ? 1.0e-8 : -1.0e-8;\n const interiorTolerance = 1.0e-8; // Interior tolerance should always be positive\n\n for (const plane of this._planes) {\n let nOutside = 0;\n for (const point of points) {\n if (plane.altitude(point) < (plane.interior ? interiorTolerance : onTolerance)) {\n nOutside++;\n allInside = false;\n }\n }\n if (nOutside === points.length)\n return ClipPlaneContainment.StronglyOutside;\n }\n return allInside ? ClipPlaneContainment.StronglyInside : ClipPlaneContainment.Ambiguous;\n }\n /**\n * * Create a convex clip set for a polygon swept with possible tilt angle.\n * * planes are constructed by ClipPlane.createEdgeAndUpVector, using successive points from the array.\n * * If the first and last points match, the polygon area is checked. If the area is negative, points are used in\n * reverse order.\n * * If first and last points do not match, points are used in order given\n * @param points polygon points. (Closure point optional)\n * @param upVector primary sweep direction, as applied by ClipPlane.createEdgeAndUpVector\n * @param tiltAngle angle to tilt sweep planes away from the sweep direction.\n */\n public static createSweptPolyline(\n points: Point3d[], upVector: Vector3d, tiltAngle?: Angle,\n ): ConvexClipPlaneSet | undefined {\n const result = ConvexClipPlaneSet.createEmpty();\n let reverse = false;\n if (points.length > 3 && points[0].isAlmostEqual(points[points.length - 1])) {\n const polygonNormal: Vector3d = PolygonOps.areaNormal(points);\n const normalDot = polygonNormal.dotProduct(upVector);\n if (normalDot > 0.0)\n reverse = true;\n }\n for (let i = 0; (i + 1) < points.length; i++) {\n if (reverse) {\n const toAdd = ClipPlane.createEdgeAndUpVector(points[i + 1], points[i], upVector, tiltAngle);\n if (toAdd) { // clipPlane creation could result in undefined\n result.addPlaneToConvexSet(toAdd);\n } else {\n return undefined;\n }\n } else {\n const toAdd = ClipPlane.createEdgeAndUpVector(points[i], points[i + 1], upVector, tiltAngle);\n if (toAdd) { // clipPlane creation could result in undefined\n result.addPlaneToConvexSet(toAdd);\n } else {\n return undefined;\n }\n }\n }\n return result;\n }\n /**\n * Add a plane to the convex set.\n * @param plane plane to add\n */\n public addPlaneToConvexSet(plane: ClipPlane | Plane3dByOriginAndUnitNormal | undefined) {\n if (plane instanceof ClipPlane)\n this._planes.push(plane);\n else if (plane instanceof Plane3dByOriginAndUnitNormal)\n this._planes.push(ClipPlane.createPlane(plane));\n }\n /**\n * Test many points. Distribute them to arrays depending on in/out result.\n * @param points points to test\n * @param inOrOn points that are in or on the set\n * @param out points that are out.\n */\n public clipPointsOnOrInside(points: Point3d[], inOrOn: Point3d[], out: Point3d[]) {\n inOrOn.length = 0;\n out.length = 0;\n for (const xyz of points) {\n if (this.isPointOnOrInside(xyz, 0.0)) {\n inOrOn.push(xyz);\n } else {\n out.push(xyz);\n }\n }\n }\n /**\n * Clip a polygon to the planes of the clip plane set.\n * * For a convex input polygon, the output is another convex polygon.\n * * For a non-convex input, the output may have double-back edges along plane intersections. This is still a\n * valid clip in a parity sense.\n * * The containingPlane parameter allows callers within ConvexClipPlane set to bypass planes known to contain\n * the polygon.\n * @param input polygon, usually convex.\n * @param output output polygon\n * @param work work array.\n * @param containingPlane if this plane is found in the convex set, it is NOT applied.\n */\n public polygonClip(\n input: GrowableXYZArray | Point3d[], output: GrowableXYZArray, work: GrowableXYZArray, planeToSkip?: ClipPlane,\n ): void {\n if (input instanceof GrowableXYZArray)\n input.clone(output);\n else\n GrowableXYZArray.create(input, output);\n\n for (const plane of this._planes) {\n if (planeToSkip === plane)\n continue;\n if (output.length === 0)\n break;\n plane.clipConvexPolygonInPlace(output, work);\n }\n }\n /**\n * * Define new planes in this ConvexClipPlaneSet so it clips to the inside of a polygon.\n * * always create planes for the swept edges of the polygon\n * * optionally (with nonzero sideSelect) create a cap plane using the polygon normal.\n * @param points Points of a bounding polygon\n * @param sweepDirection direction to sweep.\n * @param sideSelect 0 to have no cap polygon, 1 if the sweep vector side is in, -1 if sweep vector side is out.\n */\n public reloadSweptPolygon(points: Point3d[], sweepDirection: Vector3d, sideSelect: number): number {\n this._planes.length = 0;\n const n = points.length;\n if (n <= 2)\n return 0;\n\n const planeNormal: Vector3d = PolygonOps.areaNormal(points);\n const isCCW = sweepDirection.dotProduct(planeNormal) > 0.0;\n\n const delta = isCCW ? 1 : n - 1;\n for (let i = 0; i < n; i++) {\n const i1 = (i + delta) % n;\n const xyz0: Point3d = points[i];\n const xyz1: Point3d = points[i1];\n if (xyz0.isAlmostEqual(xyz1))\n continue;\n const edgeVector: Vector3d = Vector3d.createStartEnd(xyz0, xyz1);\n const inwardNormal: Vector3d = Vector3d.createCrossProduct(sweepDirection.x, sweepDirection.y, sweepDirection.z,\n edgeVector.x, edgeVector.y, edgeVector.z);\n const inwardNormalNormalized = inwardNormal.normalize();\n let distance;\n if (inwardNormalNormalized) { // should never fail... simply a check due to the format of the normalize function return\n distance = inwardNormalNormalized.dotProduct(xyz0);\n const clipToAdd = ClipPlane.createNormalAndDistance(inwardNormalNormalized, distance, false, false);\n if (clipToAdd) { this._planes.push(clipToAdd); } // clipPlane creation could result in undefined\n }\n }\n if (sideSelect !== 0.0) {\n let planeNormalNormalized = planeNormal.normalize();\n if (planeNormalNormalized) { // Again.. should never fail\n const a = sweepDirection.dotProduct(planeNormalNormalized) * sideSelect;\n if (a < 0.0)\n planeNormalNormalized = planeNormalNormalized.negate();\n const xyz0: Point3d = points[0];\n const distance = planeNormalNormalized.dotProduct(xyz0);\n const clipToAdd = ClipPlane.createNormalAndDistance(planeNormalNormalized, distance, false, false);\n if (clipToAdd) { this._planes.push(clipToAdd); } // clipPlane creation could result in undefined\n }\n }\n return isCCW ? 1 : -1;\n }\n /**\n * Compute intersections among all combinations of 3 planes in the convex set.\n * * optionally throw out points that are not in the set.\n * * optionally push the points in the caller-supplied point array.\n * * optionally extend a caller supplied range.\n * * In the common case where the convex set is (a) a slab or (b) a view frustum, there will be 8 points and the\n * range is the range of the convex set.\n * * If the convex set is unbounded, the range only contains the range of the accepted (corner) points, and the\n * range is not a representative of the \"range of all points in the set\".\n * @param transform (optional) transform to apply to the points.\n * @param points (optional) array to which computed points are to be added.\n * @param range (optional) range to be extended by the computed points\n * @param transform (optional) transform to apply to the accepted points.\n * @param testContainment if true, test each point to see if it is within the convex set. (send false if confident\n * that the convex set is rectilinear set such as a slab. Send true if chiseled corners are possible).\n * @returns number of points.\n */\n public computePlanePlanePlaneIntersections(\n points: Point3d[] | undefined,\n rangeToExtend: Range3d | undefined,\n transform?: Transform,\n testContainment: boolean = true,\n ): number {\n const normalRows = Matrix3d.createIdentity();\n const allPlanes = this._planes;\n const n = allPlanes.length;\n let numPoints = 0; // explicitly count points -- can't wait to end for points.length because it may be an optional output.\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++)\n for (let k = j + 1; k < n; k++) {\n Matrix3d.createRowValues(\n allPlanes[i].inwardNormalRef.x, allPlanes[i].inwardNormalRef.y, allPlanes[i].inwardNormalRef.z,\n allPlanes[j].inwardNormalRef.x, allPlanes[j].inwardNormalRef.y, allPlanes[j].inwardNormalRef.z,\n allPlanes[k].inwardNormalRef.x, allPlanes[k].inwardNormalRef.y, allPlanes[k].inwardNormalRef.z,\n normalRows);\n if (normalRows.computeCachedInverse(false)) {\n const xyz = normalRows.multiplyInverseXYZAsPoint3d(allPlanes[i].distance, allPlanes[j].distance, allPlanes[k].distance)!;\n if (!testContainment || this.isPointOnOrInside(xyz, Geometry.smallMetricDistance)) {\n numPoints++;\n if (transform)\n transform.multiplyPoint3d(xyz, xyz);\n if (points)\n points.push(xyz);\n if (rangeToExtend)\n rangeToExtend.extendPoint(xyz);\n }\n }\n }\n }\n return numPoints;\n }\n /**\n * Set the `invisible` property on each plane of the convex set.\n * @param invisible value to store\n */\n public setInvisible(invisible: boolean) {\n for (const plane of this._planes) {\n plane.setInvisible(invisible);\n }\n }\n /**\n * Add planes for z-direction clip between low and high z levels.\n * @param invisible value to apply to the `invisible` bit for the new planes\n * @param zLow low z value. The plane clips out points with z below this.\n * @param zHigh high z value. The plane clips out points with z above this.\n */\n public addZClipPlanes(invisible: boolean, zLow?: number, zHigh?: number) {\n if (zLow !== undefined)\n this._planes.push(ClipPlane.createNormalAndDistance(Vector3d.create(0, 0, 1), zLow, invisible)!);\n if (zHigh !== undefined)\n this._planes.push(ClipPlane.createNormalAndDistance(Vector3d.create(0, 0, -1), -zHigh, invisible)!);\n }\n /**\n * Implement appendPolygonClip, as defined in interface PolygonClipper.\n * @param xyz convex polygon. This is not changed.\n * @param insideFragments Array to receive \"inside\" fragments. Each fragment is a GrowableXYZArray grabbed from\n * the cache. This is NOT cleared.\n * @param outsideFragments Array to receive \"outside\" fragments. Each fragment is a GrowableXYZArray grabbed from\n * the cache. This is NOT cleared.\n * @param arrayCache cache for reusable GrowableXYZArray.\n */\n public appendPolygonClip(\n xyz: IndexedXYZCollection,\n insideFragments: GrowableXYZArray[],\n outsideFragments: GrowableXYZArray[],\n arrayCache: GrowableXYZArrayCache,\n ): void {\n const newInside = this.clipInsidePushOutside(xyz, outsideFragments, arrayCache);\n if (newInside)\n insideFragments.push(newInside);\n }\n /**\n * Create a convex clip set from a convex mesh.\n * * Create a plane for each facet.\n * * Assemble the planes as a single clip plane set.\n * * If the facets are closed by edge pairing, use the sign of the computed volume to point the plane normals inward.\n * * If the facets are not closed, the facet orientation determines plane orientation.\n * * The implication of this is that if the facets are a convex volume, the returned clip plane set is convex.\n * @param convexMesh input mesh. For best results, the mesh should be closed and convex.\n * @param result optional preallocated result to reuse and return\n * @return clipper and volume (zero if mesh is not closed)\n */\n public static createConvexPolyface(\n convexMesh: Polyface | PolyfaceVisitor, result?: ConvexClipPlaneSet,\n ): { clipper: ConvexClipPlaneSet, volume: number } {\n result = this.createEmpty(result);\n let vol = 0;\n let myMesh: Polyface | undefined;\n let myVisitor: PolyfaceVisitor;\n if (convexMesh instanceof Polyface) {\n myMesh = convexMesh;\n myVisitor = convexMesh.createVisitor(0);\n } else {\n myMesh = convexMesh.clientPolyface();\n myVisitor = convexMesh;\n }\n if (myMesh && myVisitor) {\n if (PolyfaceQuery.isPolyfaceClosedByEdgePairing(myMesh))\n vol = PolyfaceQuery.sumTetrahedralVolumes(myVisitor);\n const scale = vol > 0.0 ? -1.0 : 1.0; // point clipper normals inward if mesh normals point outward\n const normal = Vector3d.create();\n const plane = Plane3dByOriginAndUnitNormal.createXYPlane();\n myVisitor.reset();\n while (myVisitor.moveToNextFacet()) {\n if (undefined !== PolygonOps.areaNormalGo(myVisitor.point, normal)) {\n normal.scaleInPlace(scale);\n if (undefined !== Plane3dByOriginAndUnitNormal.create(myVisitor.point.front()!, normal, plane))\n result.addPlaneToConvexSet(plane);\n }\n }\n }\n return { clipper: result, volume: vol };\n }\n\n // FUNCTIONS SKIPPED DUE TO BSPLINES, VU, OR NON-USAGE IN NATIVE CODE----------------------------------------------------------------\n\n // Uses bsplines... skipping for now:\n // public convexAppendIntervalsFromBspline();\n\n // Uses pushing and clearing from/to a cache and added functionality for arrays. . . skipping for now\n // public convexPolygonClipInsideOutside(input: Point3d[], inside: Point3d[], outside: Point3d[], work1: Point3d[], work2: Point3d[],\n // clearOutside: boolean, distanceTolerance: number)\n}\n"]}
1
+ {"version":3,"file":"ConvexClipPlaneSet.js","sourceRoot":"","sources":["../../../src/clipping/ConvexClipPlaneSet.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { AnnounceNumberNumber, AnnounceNumberNumberCurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { GrowableFloat64Array } from \"../geometry3d/GrowableFloat64Array\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { IndexedXYZCollectionPolygonOps, PolygonOps } from \"../geometry3d/PolygonOps\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { GrowableXYZArrayCache } from \"../geometry3d/ReusableObjectCache\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\nimport { Polyface, PolyfaceVisitor } from \"../polyface/Polyface\";\nimport { PolyfaceQuery } from \"../polyface/PolyfaceQuery\";\nimport { ClipPlane, ClipPlaneProps } from \"./ClipPlane\";\nimport { Clipper, ClipPlaneContainment, ClipUtilities, PolygonClipper } from \"./ClipUtils\";\n\n/** Wire format describing a [[ConvexClipPlaneSet]].\n * @public\n */\nexport type ConvexClipPlaneSetProps = ClipPlaneProps[];\n\n/**\n * A ConvexClipPlaneSet is a collection of ClipPlanes, often used for bounding regions of space.\n * @public\n */\nexport class ConvexClipPlaneSet implements Clipper, PolygonClipper {\n /** Value acting as \"at infinity\" for coordinates along a ray. */\n public static readonly hugeVal = 1e37;\n /** Planes that define the convex set. */\n private _planes: ClipPlane[];\n // private _parity: number; <--- Not yet used\n // public get parity() { return this._parity; }\n // public set parity(value: number) { this._parity = value; }\n private constructor(planes?: ClipPlane[]) {\n // this._parity = 1;\n this._planes = planes ? planes : [];\n }\n /**\n * Return an array containing all the planes of the convex set.\n * * Note that this has no leading keyword identifying it as a ConvexClipPlaneSet.\n */\n public toJSON(): ConvexClipPlaneSetProps {\n const val: ClipPlaneProps[] = [];\n for (const plane of this._planes)\n val.push(plane.toJSON());\n return val;\n }\n /**\n * Extract clip planes from a json array `[ clipPlane, clipPlane ]`.\n * * Non-clipPlane members are ignored.\n */\n public static fromJSON(json: ConvexClipPlaneSetProps | undefined, result?: ConvexClipPlaneSet): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n if (!Array.isArray(json))\n return result;\n for (const thisJson of json) {\n const plane = ClipPlane.fromJSON(thisJson);\n if (plane)\n result._planes.push(plane);\n }\n return result;\n }\n /**\n * Return true if all members are almostEqual to corresponding members of other. This includes identical order in array.\n * @param other clip plane to compare\n */\n public isAlmostEqual(other: ConvexClipPlaneSet): boolean {\n if (this._planes.length !== other._planes.length)\n return false;\n for (let i = 0; i < this._planes.length; i++)\n if (!this._planes[i].isAlmostEqual(other._planes[i]))\n return false;\n return true;\n }\n /**\n * Create ConvexClipPlaneSet from an array of planes.\n * * Each plane reference in the `planes` array is taken into the result.\n * * The input array itself is NOT taken into the result.\n */\n public static createPlanes(\n planes: (ClipPlane | Plane3dByOriginAndUnitNormal)[], result?: ConvexClipPlaneSet,\n ): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n for (const plane of planes) {\n if (plane instanceof ClipPlane) {\n result._planes.push(plane);\n } else if (plane instanceof Plane3dByOriginAndUnitNormal) {\n const clipPlane = ClipPlane.createPlane(plane);\n result._planes.push(clipPlane);\n }\n }\n return result;\n }\n /**\n * Create new convex set using selected planes of a Range3d.\n * @param range range with coordinates\n * @param lowX true to clip at the low x plane\n * @param highX true to clip at the high x plane\n * @param lowY true to clip at the low y plane\n * @param highY true to clip at the high z plane\n * @param lowZ true to clip at the low z plane\n * @param highZ true to clip at the high z plane\n */\n public static createRange3dPlanes(\n range: Range3d,\n lowX: boolean = true,\n highX: boolean = true,\n lowY: boolean = true,\n highY: boolean = true,\n lowZ: boolean = true,\n highZ: boolean = true,\n ): ConvexClipPlaneSet {\n const result = ConvexClipPlaneSet.createEmpty();\n\n if (lowX)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(1, 0, 0, range.low.x, 0, 0)!);\n if (highX)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(-1, 0, 0, range.high.x, 0, 0)!);\n\n if (lowY)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(0, 1, 0, 0, range.low.y, 0)!);\n if (highY)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(0, -1, 0, 0, range.high.y, 0)!);\n\n if (lowZ)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(0, 0, 1, 0, 0, range.low.z)!);\n if (highZ)\n result.planes.push(ClipPlane.createNormalAndPointXYZXYZ(0, 0, -1, 0, 0, range.high.z)!);\n\n return result;\n }\n /** Create an empty `ConvexClipPlaneSet` */\n public static createEmpty(result?: ConvexClipPlaneSet): ConvexClipPlaneSet {\n if (result) {\n result._planes.length = 0;\n return result;\n }\n return new ConvexClipPlaneSet();\n }\n /** Negate all planes of the set. */\n public negateAllPlanes(): void {\n for (const plane of this._planes)\n plane.negateInPlace();\n }\n /**\n * Create a convex clip plane set that clips to `x0 <= x <= x1` and `y0 <= y <= y1`.\n * * Note that there is no test for the usual ordering `x0 <= x1` or `y0 <= y1`.\n * * if the usual ordering is violated, the convex set is an empty set.\n * * More details can be found at docs/learning/geometry/Clipping.md\n */\n public static createXYBox(\n x0: number, y0: number, x1: number, y1: number, result?: ConvexClipPlaneSet,\n ): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n const clip0 = ClipPlane.createNormalAndDistance(Vector3d.create(-1, 0, 0), -x1, false, true);\n const clip1 = ClipPlane.createNormalAndDistance(Vector3d.create(1, 0, 0), x0, false, true);\n const clip2 = ClipPlane.createNormalAndDistance(Vector3d.create(0, -1, 0), -y1, false, true);\n const clip3 = ClipPlane.createNormalAndDistance(Vector3d.create(0, 1, 0), y0, false, true);\n if (clip0 && clip1 && clip2 && clip3) {\n result._planes.push(clip0, clip1, clip2, clip3);\n }\n return result;\n }\n /**\n * Create a convex set containing a half space for each edge between points of a polyline.\n * * Caller is responsible for assuring the polyline is convex.\n * @param points array of points. Only xy parts are considered.\n * @param interior array whose boolean value is used as both the `interior` and `invisible` bits of the plane for the\n * succeeding segment. If this array is not provided, both are false.\n * @param leftIsInside if true, the interior is \"to the left\" of the segments. If false, interior is \"to the right\".\n */\n public static createXYPolyLine(\n points: Point3d[], interior: boolean[] | undefined, leftIsInside: boolean, result?: ConvexClipPlaneSet,\n ): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n for (let i0 = 0; (i0 + 1) < points.length; i0++) {\n const edgeVector: Vector3d = Vector3d.createStartEnd(points[i0], points[i0 + 1]);\n const perp: Vector3d = edgeVector.unitPerpendicularXY();\n perp.z = 0.0;\n\n if (!leftIsInside)\n perp.scaleInPlace(-1.0);\n\n const perpNormalized = perp.normalize();\n if (perpNormalized) {\n const flag = interior !== undefined ? interior[i0] : false;\n const clip = ClipPlane.createNormalAndPoint(perp, points[i0], flag, flag);\n if (clip) {\n result._planes.push(clip);\n }\n }\n }\n return result;\n }\n /**\n * Create a convexClipPlaneSet with planes whose \"inside\" normal is to the left of each segment.\n * @param points array of points.\n */\n public static createXYPolyLineInsideLeft(points: Point3d[], result?: ConvexClipPlaneSet): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n for (let i0 = 0; (i0 + 1) < points.length; i0++) {\n const edgeVector: Vector3d = Vector3d.createStartEnd(points[i0], points[i0 + 1]);\n const perp: Vector3d = edgeVector.unitPerpendicularXY();\n perp.z = 0.0;\n\n const perpNormalized = perp.normalize();\n if (perpNormalized) {\n const clip = ClipPlane.createNormalAndPoint(perp, points[i0], false, false);\n if (clip) { result._planes.push(clip); }\n }\n }\n return result;\n }\n /**\n * Set (or reset) a plane and ConvexClipPlaneSet for a convex array, such as a convex facet used for xy clip.\n * * The planeOfPolygon is (re)initialized with the normal from 3 points, but not otherwise referenced.\n * * The ConvexClipPlaneSet is filled with outward normals of the facet edges as viewed to xy plane.\n * @param points\n * @param result\n */\n public static setPlaneAndXYLoopCCW(points: GrowableXYZArray, planeOfPolygon: ClipPlane, frustum: ConvexClipPlaneSet) {\n const i0 = points.length - 1;\n const n = points.length;\n let x0 = points.getXAtUncheckedPointIndex(i0);\n let y0 = points.getYAtUncheckedPointIndex(i0);\n let x1, y1, nx, ny;\n frustum._planes.length = 0;\n const z0 = points.getZAtUncheckedPointIndex(i0); // z for planes can stay fixed\n const planeNormal = points.crossProductIndexIndexIndex(0, 2, 1)!;\n ClipPlane.createNormalAndPointXYZXYZ(planeNormal.x, planeNormal.y, planeNormal.z, x0, y0, z0, false, false, planeOfPolygon);\n if (planeNormal.normalizeInPlace()) {\n for (let i1 = 0; i1 < n; i1++, x0 = x1, y0 = y1) {\n x1 = points.getXAtUncheckedPointIndex(i1);\n y1 = points.getYAtUncheckedPointIndex(i1);\n nx = -(y1 - y0);\n ny = x1 - x0;\n const clipper = ClipPlane.createNormalAndPointXYZXYZ(nx, ny, 0, x1, y1, z0);\n if (clipper)\n frustum._planes.push(clipper);\n }\n }\n }\n /** Deep clone of all planes. */\n public clone(result?: ConvexClipPlaneSet): ConvexClipPlaneSet {\n result = result ? result : new ConvexClipPlaneSet();\n result._planes.length = 0;\n for (const plane of this._planes)\n result._planes.push(plane.clone());\n return result;\n }\n /** Return the (reference to the) array of `ClipPlane` */\n public get planes(): ClipPlane[] {\n return this._planes;\n }\n /**\n * Test if there is any intersection with a ray defined by origin and direction.\n * * Optionally record the range (null or otherwise) in caller-allocated result.\n * * If the ray is unbounded inside the clip, result can contain positive or negative\n * \"Geometry.largeCoordinateResult\" values.\n * * If no result is provide, there are no object allocations.\n * @param result optional Range1d to receive parameters along the ray.\n */\n public hasIntersectionWithRay(ray: Ray3d, result?: Range1d, tolerance: number = Geometry.smallMetricDistance): boolean {\n // form low and high values in locals that do not require allocation.\n // transfer to caller-supplied result at end\n let t0 = -Geometry.largeCoordinateResult;\n let t1 = Geometry.largeCoordinateResult;\n if (result)\n result.setNull();\n const velocityTolerance = 1.0e-13;\n for (const plane of this._planes) {\n const vD = plane.velocity(ray.direction);\n const vN = plane.altitude(ray.origin);\n\n if (Math.abs(vD) <= velocityTolerance) {\n // Ray is parallel... No need to continue testing if outside halfspace.\n if (vN < -tolerance)\n return false; // and result is a null range.\n } else {\n const rayFraction = - vN / vD;\n if (vD < 0.0) {\n if (rayFraction < t1)\n t1 = rayFraction;\n } else {\n if (rayFraction > t0)\n t0 = rayFraction;\n }\n }\n }\n if (t1 < t0)\n return false; // and result is a null range.\n if (result) {\n result.extendX(t0);\n result.extendX(t1);\n }\n return true;\n }\n /**\n * Multiply all the ClipPlanes DPoint4d by matrix.\n * @param matrix matrix to apply.\n * @param invert if true, use in verse of the matrix.\n * @param transpose if true, use the transpose of the matrix (or inverse, per invert parameter)\n * * Note that if matrixA is applied to all of space, the matrix to send to this method to get a corresponding effect\n * on the plane is the inverse transpose of matrixA.\n * * Callers that will apply the same matrix to many planes should pre-invert the matrix for efficiency.\n * * Both params default to true to get the full effect of transforming space.\n * @param matrix matrix to apply\n */\n public multiplyPlanesByMatrix4d(matrix: Matrix4d, invert: boolean = true, transpose: boolean = true): boolean {\n if (invert) { // form inverse once here, reuse for all planes\n const inverse = matrix.createInverse();\n if (!inverse)\n return false;\n return this.multiplyPlanesByMatrix4d(inverse, false, transpose);\n }\n for (const plane of this._planes) {\n plane.multiplyPlaneByMatrix4d(matrix, false, transpose);\n }\n return true;\n }\n /** Return true if `point` satisfies `point.isPointInside` for all planes */\n public isPointInside(point: Point3d): boolean {\n for (const plane of this._planes) {\n // Defaults to strict inside check. Other clipping classes may use \"on or inside\" check for the \"on\" case\n if (!plane.isPointInside(point))\n return false;\n }\n return true;\n }\n\n /** Return true if `point` satisfies `point.isPointOnOrInside` for all planes */\n public isPointOnOrInside(point: Point3d, tolerance: number = Geometry.smallMetricDistance): boolean {\n const interiorTolerance = Math.abs(tolerance); // Interior tolerance should always be positive. (TFS# 246598).\n for (const plane of this._planes) {\n if (!plane.isPointOnOrInside(point, (plane.interior ? interiorTolerance : tolerance)))\n return false;\n }\n return true;\n }\n /**\n * Test if a sphere is completely inside the convex set.\n * @param centerPoint center of sphere\n * @param radius radius of sphere.\n */\n public isSphereInside(centerPoint: Point3d, radius: number): boolean {\n const r1 = Math.abs(radius) + Geometry.smallMetricDistance;\n for (const plane of this._planes) {\n if (!plane.isPointOnOrInside(centerPoint, r1)) {\n return false;\n }\n }\n return true;\n }\n /**\n * Find the parts of the line segment (if any) that is within the convex clip volume.\n * * The line segment is defined by `pointA` and `pointB`.\n * * The input fractional interval from `fraction0` to `fraction1` (increasing) is the active part to consider.\n * * To clip to the usual bounded line segment, start with fractions (0,1).\n * If the clip volume is unbounded, the line interval may also be unbounded.\n * * An unbounded line portion will have fraction coordinates positive or negative `Number.MAX_VALUE`.\n * @param f0 fraction that is the initial lower fraction of the active interval (e.g., 0.0 for bounded segment).\n * @param f1 fraction that is the initial upper fraction of the active interval (e.g., 1.0 for bounded segment).\n * @param pointA segment start (fraction 0)\n * @param pointB segment end (fraction 1)\n * @param announce function to be called to announce a fraction interval that is within the convex clip volume.\n * @returns true if a segment was announced, false if entirely outside.\n */\n public announceClippedSegmentIntervals(\n f0: number, f1: number, pointA: Point3d, pointB: Point3d, announce?: AnnounceNumberNumber,\n ): boolean {\n let fraction: number | undefined;\n if (f1 < f0)\n return false;\n for (const plane of this._planes) {\n const hA = -plane.altitude(pointA);\n const hB = -plane.altitude(pointB);\n fraction = Geometry.conditionalDivideFraction(-hA, (hB - hA));\n if (fraction === undefined) {\n // Line parallel to the plane. If positive, it is all OUT\n if (hA > 0.0)\n return false;\n } else if (hB > hA) { // STRICTLY moving outward\n if (fraction < f0)\n return false;\n if (fraction < f1)\n f1 = fraction;\n } else if (hA > hB) { // STRICTLY moving inward\n if (fraction > f1)\n return false;\n if (fraction > f0)\n f0 = fraction;\n } else {\n // Strictly equal evaluations\n if (hA > 0.0)\n return false;\n }\n }\n if (f1 >= f0) {\n if (announce)\n announce(f0, f1);\n return true;\n }\n return false;\n }\n private static _clipArcFractionArray = new GrowableFloat64Array();\n /**\n * Find fractional parts of the arc that are within this ClipPlaneSet, and announce each as\n * * `announce(fraction, fraction, curve)`\n */\n public announceClippedArcIntervals(arc: Arc3d, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\n const breaks = ConvexClipPlaneSet._clipArcFractionArray;\n breaks.clear();\n for (const clipPlane of this.planes) {\n clipPlane.appendIntersectionRadians(arc, breaks);\n }\n arc.sweep.radiansArrayToPositivePeriodicFractions(breaks);\n return ClipUtilities.selectIntervals01(arc, breaks, this, announce);\n }\n /**\n * Find the parts of the (unbounded) line segment (if any) that is within the convex clip volume.\n * @param pointA segment start (fraction 0)\n * @param pointB segment end (fraction 1)\n * @param announce function to be called to announce a fraction interval that is within the convex clip volume.\n * @returns true if a segment was announced, false if entirely outside.\n */\n public clipUnboundedSegment(pointA: Point3d, pointB: Point3d, announce?: AnnounceNumberNumber): boolean {\n return this.announceClippedSegmentIntervals(-Number.MAX_VALUE, Number.MAX_VALUE, pointA, pointB, announce);\n }\n /** transform each plane in place. */\n public transformInPlace(transform: Transform) {\n for (const plane of this._planes) {\n plane.transformInPlace(transform);\n }\n }\n /**\n * Clip a polygon to the inside of the convex set.\n * * Results with 2 or fewer points are ignored.\n * * Other than ensuring capacity in the arrays, there are no object allocations during execution of this function.\n * @param xyz input points.\n * @param work work buffer\n * @param tolerance tolerance for \"on plane\" decision.\n */\n public clipConvexPolygonInPlace(\n xyz: GrowableXYZArray, work: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance,\n ): void {\n for (const plane of this._planes) {\n plane.clipConvexPolygonInPlace(xyz, work, true, tolerance);\n if (xyz.length < 3)\n return;\n }\n }\n /**\n * Clip a convex polygon to (a single) inside part and (possibly many) outside parts.\n * @param xyz input polygon.\n * @param outsideFragments an array to receive (via push, with no preliminary clear) outside fragments\n * @param arrayCache cache for work arrays.\n * @return the surviving inside part (if any)\n */\n public clipInsidePushOutside(\n xyz: IndexedXYZCollection, outsideFragments: GrowableXYZArray[] | undefined, arrayCache: GrowableXYZArrayCache,\n ): GrowableXYZArray | undefined {\n const perpendicularRange = Range1d.createNull();\n let newInside = arrayCache.grabFromCache();\n let newOutside = arrayCache.grabFromCache();\n let insidePart = arrayCache.grabFromCache(); // this is empty ...\n insidePart.pushFrom(xyz);\n // While looping through planes . .\n // the outside part for the current plane is definitely outside and can be stashed to the final outside\n // the inside part for the current plane passes forward to be further split by the remaining planes.\n for (const plane of this._planes) {\n IndexedXYZCollectionPolygonOps.splitConvexPolygonInsideOutsidePlane(\n plane, insidePart, newInside, newOutside, perpendicularRange,\n );\n if (newOutside.length > 0) {\n // the newOutside fragment is definitely outside the ConvexClipPlaneSet\n if (outsideFragments) // save the definitely outside part as return data.\n ClipUtilities.captureOrDrop(newOutside, 3, outsideFragments, arrayCache);\n newOutside = arrayCache.grabFromCache();\n if (newInside.length === 0) {\n insidePart.length = 0;\n break;\n }\n // insideWork is changed ... swap it with insidePart\n arrayCache.dropToCache(insidePart);\n insidePart = newInside;\n newInside = arrayCache.grabFromCache();\n }\n // outside clip was empty .. insideWork is identical to insidePart .. let insidePart feed through to the next clipper.\n }\n // at break or fall out ...\n // ALWAYS drop `newInside` and `newOutside` to the cache\n arrayCache.dropToCache(newInside);\n arrayCache.dropToCache(newOutside);\n // if `insidePart` is alive, return it to caller. Otherwise drop it to cache and return undefined.\n if (insidePart.length > 0)\n return insidePart;\n arrayCache.dropToCache(insidePart);\n return undefined;\n }\n /**\n * Returns 1, 2, or 3 based on whether point array is strongly inside, ambiguous, or strongly outside respectively.\n * * This has a peculiar expected use case as a very fast pre-filter for more precise clipping.\n * * The expected point set is for a polygon.\n * * Hence any clipping will eventually have to consider the lines between the points.\n * * This method looks for the special case of a single clip plane that has all the points outside.\n * * In this case the whole polygon must be outside.\n * * Note that this does not detect a polygon that is outside but \"crosses a corner\" -- it is mixed with respect to\n * multiple planes.\n */\n public classifyPointContainment(points: Point3d[], onIsOutside: boolean): ClipPlaneContainment {\n let allInside = true;\n const onTolerance = onIsOutside ? 1.0e-8 : -1.0e-8;\n const interiorTolerance = 1.0e-8; // Interior tolerance should always be positive\n\n for (const plane of this._planes) {\n let nOutside = 0;\n for (const point of points) {\n if (plane.altitude(point) < (plane.interior ? interiorTolerance : onTolerance)) {\n nOutside++;\n allInside = false;\n }\n }\n if (nOutside === points.length)\n return ClipPlaneContainment.StronglyOutside;\n }\n return allInside ? ClipPlaneContainment.StronglyInside : ClipPlaneContainment.Ambiguous;\n }\n /**\n * * Create a convex clip set for a polygon swept with possible tilt angle.\n * * planes are constructed by ClipPlane.createEdgeAndUpVector, using successive points from the array.\n * * If the first and last points match, the polygon area is checked. If the area is negative, points are used in\n * reverse order.\n * * If first and last points do not match, points are used in order given\n * @param points polygon points. (Closure point optional)\n * @param upVector primary sweep direction, as applied by ClipPlane.createEdgeAndUpVector\n * @param tiltAngle angle to tilt sweep planes away from the sweep direction.\n */\n public static createSweptPolyline(\n points: Point3d[], upVector: Vector3d, tiltAngle?: Angle,\n ): ConvexClipPlaneSet | undefined {\n const result = ConvexClipPlaneSet.createEmpty();\n let reverse = false;\n if (points.length > 3 && points[0].isAlmostEqual(points[points.length - 1])) {\n const polygonNormal: Vector3d = PolygonOps.areaNormal(points);\n const normalDot = polygonNormal.dotProduct(upVector);\n if (normalDot > 0.0)\n reverse = true;\n }\n for (let i = 0; (i + 1) < points.length; i++) {\n if (reverse) {\n const toAdd = ClipPlane.createEdgeAndUpVector(points[i + 1], points[i], upVector, tiltAngle);\n if (toAdd) { // clipPlane creation could result in undefined\n result.addPlaneToConvexSet(toAdd);\n } else {\n return undefined;\n }\n } else {\n const toAdd = ClipPlane.createEdgeAndUpVector(points[i], points[i + 1], upVector, tiltAngle);\n if (toAdd) { // clipPlane creation could result in undefined\n result.addPlaneToConvexSet(toAdd);\n } else {\n return undefined;\n }\n }\n }\n return result;\n }\n /**\n * Add a plane to the convex set.\n * @param plane plane to add\n */\n public addPlaneToConvexSet(plane: ClipPlane | Plane3dByOriginAndUnitNormal | undefined) {\n if (plane instanceof ClipPlane)\n this._planes.push(plane);\n else if (plane instanceof Plane3dByOriginAndUnitNormal)\n this._planes.push(ClipPlane.createPlane(plane));\n }\n /**\n * Test many points. Distribute them to arrays depending on in/out result.\n * @param points points to test\n * @param inOrOn points that are in or on the set\n * @param out points that are out.\n */\n public clipPointsOnOrInside(points: Point3d[], inOrOn: Point3d[], out: Point3d[]) {\n inOrOn.length = 0;\n out.length = 0;\n for (const xyz of points) {\n if (this.isPointOnOrInside(xyz, 0.0)) {\n inOrOn.push(xyz);\n } else {\n out.push(xyz);\n }\n }\n }\n /**\n * Clip a polygon to the planes of the clip plane set.\n * * For a convex input polygon, the output is another convex polygon.\n * * For a non-convex input, the output may have double-back edges along plane intersections. This is still a\n * valid clip in a parity sense.\n * * The containingPlane parameter allows callers within ConvexClipPlane set to bypass planes known to contain\n * the polygon.\n * @param input polygon, usually convex.\n * @param output output polygon\n * @param work work array.\n * @param containingPlane if this plane is found in the convex set, it is NOT applied.\n */\n public polygonClip(\n input: GrowableXYZArray | Point3d[], output: GrowableXYZArray, work: GrowableXYZArray, planeToSkip?: ClipPlane,\n ): void {\n if (input instanceof GrowableXYZArray)\n input.clone(output);\n else\n GrowableXYZArray.create(input, output);\n\n for (const plane of this._planes) {\n if (planeToSkip === plane)\n continue;\n if (output.length === 0)\n break;\n plane.clipConvexPolygonInPlace(output, work);\n }\n }\n /**\n * * Define new planes in this ConvexClipPlaneSet so it clips to the inside of a polygon.\n * * always create planes for the swept edges of the polygon\n * * optionally (with nonzero sideSelect) create a cap plane using the polygon normal.\n * @param points Points of a bounding polygon\n * @param sweepDirection direction to sweep.\n * @param sideSelect 0 to have no cap polygon, 1 if the sweep vector side is in, -1 if sweep vector side is out.\n */\n public reloadSweptPolygon(points: Point3d[], sweepDirection: Vector3d, sideSelect: number): number {\n this._planes.length = 0;\n const n = points.length;\n if (n <= 2)\n return 0;\n\n const planeNormal: Vector3d = PolygonOps.areaNormal(points);\n const isCCW = sweepDirection.dotProduct(planeNormal) > 0.0;\n\n const delta = isCCW ? 1 : n - 1;\n for (let i = 0; i < n; i++) {\n const i1 = (i + delta) % n;\n const xyz0: Point3d = points[i];\n const xyz1: Point3d = points[i1];\n if (xyz0.isAlmostEqual(xyz1))\n continue;\n const edgeVector: Vector3d = Vector3d.createStartEnd(xyz0, xyz1);\n const inwardNormal: Vector3d = Vector3d.createCrossProduct(sweepDirection.x, sweepDirection.y, sweepDirection.z,\n edgeVector.x, edgeVector.y, edgeVector.z);\n const inwardNormalNormalized = inwardNormal.normalize();\n let distance;\n if (inwardNormalNormalized) { // should never fail... simply a check due to the format of the normalize function return\n distance = inwardNormalNormalized.dotProduct(xyz0);\n const clipToAdd = ClipPlane.createNormalAndDistance(inwardNormalNormalized, distance, false, false);\n if (clipToAdd) { this._planes.push(clipToAdd); } // clipPlane creation could result in undefined\n }\n }\n if (sideSelect !== 0.0) {\n let planeNormalNormalized = planeNormal.normalize();\n if (planeNormalNormalized) { // Again.. should never fail\n const a = sweepDirection.dotProduct(planeNormalNormalized) * sideSelect;\n if (a < 0.0)\n planeNormalNormalized = planeNormalNormalized.negate();\n const xyz0: Point3d = points[0];\n const distance = planeNormalNormalized.dotProduct(xyz0);\n const clipToAdd = ClipPlane.createNormalAndDistance(planeNormalNormalized, distance, false, false);\n if (clipToAdd) { this._planes.push(clipToAdd); } // clipPlane creation could result in undefined\n }\n }\n return isCCW ? 1 : -1;\n }\n /**\n * Compute intersections among all combinations of 3 planes in the convex set.\n * * optionally throw out points that are not in the set.\n * * optionally push the points in the caller-supplied point array.\n * * optionally extend a caller supplied range.\n * * In the common case where the convex set is (a) a slab or (b) a view frustum, there will be 8 points and the\n * range is the range of the convex set.\n * * If the convex set is unbounded, the range only contains the range of the accepted (corner) points, and the\n * range is not a representative of the \"range of all points in the set\".\n * @param transform (optional) transform to apply to the points.\n * @param points (optional) array to which computed points are to be added.\n * @param range (optional) range to be extended by the computed points\n * @param transform (optional) transform to apply to the accepted points.\n * @param testContainment if true, test each point to see if it is within the convex set. (send false if confident\n * that the convex set is rectilinear set such as a slab. Send true if chiseled corners are possible).\n * @returns number of points.\n */\n public computePlanePlanePlaneIntersections(\n points: Point3d[] | undefined,\n rangeToExtend: Range3d | undefined,\n transform?: Transform,\n testContainment: boolean = true,\n ): number {\n const normalRows = Matrix3d.createIdentity();\n const allPlanes = this._planes;\n const n = allPlanes.length;\n let numPoints = 0; // explicitly count points -- can't wait to end for points.length because it may be an optional output.\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++)\n for (let k = j + 1; k < n; k++) {\n Matrix3d.createRowValues(\n allPlanes[i].inwardNormalRef.x, allPlanes[i].inwardNormalRef.y, allPlanes[i].inwardNormalRef.z,\n allPlanes[j].inwardNormalRef.x, allPlanes[j].inwardNormalRef.y, allPlanes[j].inwardNormalRef.z,\n allPlanes[k].inwardNormalRef.x, allPlanes[k].inwardNormalRef.y, allPlanes[k].inwardNormalRef.z,\n normalRows);\n if (normalRows.computeCachedInverse(false)) {\n const xyz = normalRows.multiplyInverseXYZAsPoint3d(allPlanes[i].distance, allPlanes[j].distance, allPlanes[k].distance)!;\n if (!testContainment || this.isPointOnOrInside(xyz, Geometry.smallMetricDistance)) {\n numPoints++;\n if (transform)\n transform.multiplyPoint3d(xyz, xyz);\n if (points)\n points.push(xyz);\n if (rangeToExtend)\n rangeToExtend.extendPoint(xyz);\n }\n }\n }\n }\n return numPoints;\n }\n /**\n * Set the `invisible` property on each plane of the convex set.\n * @param invisible value to store\n */\n public setInvisible(invisible: boolean) {\n for (const plane of this._planes) {\n plane.setInvisible(invisible);\n }\n }\n /**\n * Add planes for z-direction clip between low and high z levels.\n * @param invisible value to apply to the `invisible` bit for the new planes\n * @param zLow low z value. The plane clips out points with z below this.\n * @param zHigh high z value. The plane clips out points with z above this.\n */\n public addZClipPlanes(invisible: boolean, zLow?: number, zHigh?: number) {\n if (zLow !== undefined)\n this._planes.push(ClipPlane.createNormalAndDistance(Vector3d.create(0, 0, 1), zLow, invisible)!);\n if (zHigh !== undefined)\n this._planes.push(ClipPlane.createNormalAndDistance(Vector3d.create(0, 0, -1), -zHigh, invisible)!);\n }\n /**\n * Implement appendPolygonClip, as defined in interface PolygonClipper.\n * @param xyz convex polygon. This is not changed.\n * @param insideFragments Array to receive \"inside\" fragments. Each fragment is a GrowableXYZArray grabbed from\n * the cache. This is NOT cleared.\n * @param outsideFragments Array to receive \"outside\" fragments. Each fragment is a GrowableXYZArray grabbed from\n * the cache. This is NOT cleared.\n * @param arrayCache cache for reusable GrowableXYZArray.\n */\n public appendPolygonClip(\n xyz: IndexedXYZCollection,\n insideFragments: GrowableXYZArray[],\n outsideFragments: GrowableXYZArray[],\n arrayCache: GrowableXYZArrayCache,\n ): void {\n const newInside = this.clipInsidePushOutside(xyz, outsideFragments, arrayCache);\n if (newInside)\n insideFragments.push(newInside);\n }\n /**\n * Create a convex clip set from a convex mesh.\n * * Create a plane for each facet.\n * * Assemble the planes as a single clip plane set.\n * * If the facets are closed by edge pairing, use the sign of the computed volume to point the plane normals inward.\n * * If the facets are not closed, the facet orientation determines plane orientation.\n * * The implication of this is that if the facets are a convex volume, the returned clip plane set is convex.\n * @param convexMesh input mesh. For best results, the mesh should be closed and convex.\n * @param result optional preallocated result to reuse and return\n * @return clipper and volume (zero if mesh is not closed)\n */\n public static createConvexPolyface(\n convexMesh: Polyface | PolyfaceVisitor, result?: ConvexClipPlaneSet,\n ): { clipper: ConvexClipPlaneSet, volume: number } {\n result = this.createEmpty(result);\n let vol = 0;\n if (PolyfaceQuery.isPolyfaceClosedByEdgePairing(convexMesh))\n vol = PolyfaceQuery.sumTetrahedralVolumes(convexMesh);\n const scale = vol > 0.0 ? -1.0 : 1.0; // point clipper normals inward if mesh normals point outward\n const normal = Vector3d.create();\n const plane = Plane3dByOriginAndUnitNormal.createXYPlane();\n const visitor = convexMesh instanceof Polyface ? convexMesh.createVisitor(0) : convexMesh;\n visitor.setNumWrap(0);\n for (visitor.reset(); visitor.moveToNextFacet(); ) {\n if (undefined !== PolygonOps.areaNormalGo(visitor.point, normal)) {\n normal.scaleInPlace(scale);\n if (undefined !== Plane3dByOriginAndUnitNormal.create(visitor.point.front()!, normal, plane))\n result.addPlaneToConvexSet(plane);\n }\n }\n return { clipper: result, volume: vol };\n }\n\n // FUNCTIONS SKIPPED DUE TO BSPLINES, VU, OR NON-USAGE IN NATIVE CODE----------------------------------------------------------------\n\n // Uses bsplines... skipping for now:\n // public convexAppendIntervalsFromBspline();\n\n // Uses pushing and clearing from/to a cache and added functionality for arrays. . . skipping for now\n // public convexPolygonClipInsideOutside(input: Point3d[], inside: Point3d[], outside: Point3d[], work1: Point3d[], work2: Point3d[],\n // clearOutside: boolean, distanceTolerance: number)\n}\n"]}
@@ -214,6 +214,7 @@ export * from "./polyface/BoxTopology";
214
214
  export * from "./polyface/FacetFaceData";
215
215
  export * from "./polyface/Polyface";
216
216
  export * from "./polyface/FacetLocationDetail";
217
+ export * from "./polyface/IndexedEdgeMatcher";
217
218
  export * from "./polyface/IndexedPolyfaceVisitor";
218
219
  export * from "./polyface/IndexedPolyfaceWalker";
219
220
  export * from "./polyface/multiclip/GriddedRaggedRange2dSet";
@@ -1 +1 @@
1
- {"version":3,"file":"core-geometry.d.ts","sourceRoot":"","sources":["../../src/core-geometry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core-geometry.d.ts","sourceRoot":"","sources":["../../src/core-geometry.ts"],"names":[],"mappings":"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"}
@@ -250,6 +250,7 @@ __exportStar(require("./polyface/BoxTopology"), exports);
250
250
  __exportStar(require("./polyface/FacetFaceData"), exports);
251
251
  __exportStar(require("./polyface/Polyface"), exports);
252
252
  __exportStar(require("./polyface/FacetLocationDetail"), exports);
253
+ __exportStar(require("./polyface/IndexedEdgeMatcher"), exports);
253
254
  __exportStar(require("./polyface/IndexedPolyfaceVisitor"), exports);
254
255
  __exportStar(require("./polyface/IndexedPolyfaceWalker"), exports);
255
256
  __exportStar(require("./polyface/multiclip/GriddedRaggedRange2dSet"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"core-geometry.js","sourceRoot":"","sources":["../../src/core-geometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Utility\n */\n\n// REMARK:\n// The docs-group-description comments are followed by empty classes with names corresponding to the doc-group.\n// Normally (in committed code) these are commented out.\n// The comments have distinctive strings so that simple search and replace can make the \"real\".\n// This is useful when working on the documentation: When the empty classes are present, VSCode will format the doc comments\n// for and display them when the mouse hovers over the class name.\n\n/**\n * @docs-package-description\n * The core-geometry package contains classes for working with geometry: points, vectors, curves, surfaces, and analytic solids\n */\n/**\n * @docs-group-description CartesianGeometry\n * Points, Vectors, Planes, and Transformations for x,y,z geometry.\n * * Fundamental cartesian geometry objects:\n * * Point2d, Point3d -- points with x,y,z coordinates\n * * Vector2d, Vector3d -- vectors with x,y,z coordinates\n * * Matrix3d -- 3x3 matrix\n * * * commonly used for pure rotations\n * * * scale and skew entries are also allowed.\n * * Transform -- an origin and axes.\n * * Range1d, Range2d, Range3d -- subsets of 1d, 2d, and 3d space bounded by low and high values.\n * * Ray3d -- a ray defined by origin and direction vector\n * * Plane3d -- an abstract base class extended by Plane3dByOriginAndNormal, Plane3dByOriginAndUnitNormal, Point4d, and ClipPlane\n * * Plane3dByOriginAndUnitNormal -- a plane defined by an origin and a single vector which is perpendicular to the plane\n * * plane3dByOriginAndVectors -- a plane defined by an origin and two vectors in the plane.\n * * Angles\n * * Angle -- a strongly typed angle object whose method names make it clear whether input and outputs are degrees or radians.\n * * AngleSweep -- an angular interval\n * * LatitudeLongitudeNumber -- carrier for position and altitude on sphere or ellipsoid\n * * YawPitchAndRollAngles -- 3 angles that define a rotated coordinate system.\n * * Utility classes\n * * FrameBuilder -- construction of coordinate frames from mixed data sources.\n * * ClipPlane -- a single plane\n * * ConvexClipPlaneSet -- an array of planes bounding a convex volume\n * * ClipPlaneSet -- an array of ConvexClipPlaneSet, defining the union of their volumes\n * * BilinearPatch -- twisted quadrilateral defined by 4 points\n * * BarycentricTriangle -- triangle defined by 3 points.\n * * Constant -- various numeric values exported as readonly constants\n */\n// doc:export class CartesianGeometryDoc { }\n/**\n * @docs-group-description ArraysAndInterfaces\n * These classes support array operations and inheritance-based algorithms.\n * * Arrays\n * * GrowableArray -- A carrier for a Float64Array, with methods that hide reallocation of the underlying array as contents are added.\n * * Point2dArray, Point3dArray, Point4dArray, Vector3dArray -- miscellaneous operations on arrays of 2d and 3d points.\n * * Interfaces\n * * GeometryHandler -- a double-dispatch protocol used for efficient implementation of algorithms that work on many geometry types.\n *\n */\n// doc:export class ArraysAndInterfacesDoc { }\n\n/**\n * @docs-group-description Bspline\n * A bspline curve or surface is used for curved freeform geometry defined by controls points (sometimes called poles).\n * * BSplineCurve -- a curve defined by control points (which are not on the curve)\n * * InterpolationCurve -- a curve defined by passthrough points, with \"good\" visual properties\n * * BSplineSurfaceXYZ -- a surface with XYZ\n * * BsplineSurfaceXYZW -- a surface with weighted (rational) XYZ coordinates\n * * KnotVector -- vector of breakpoints in bspline definitions.\n */\n// doc:export class BsplineDoc { }\n\n/**\n * @docs-group-description Curve\n * Curves in the GeometryQuery hierarchy: LineSegment3d, LineString3d, Arc3d, TransitionSpiral3d\n * * CurvePrimitive -- base class for parametric curves\n * * LineSegment3d -- a (bounded) portion of an unbounded line\n * * Arc3d -- a circular or elliptic arc\n * * LineString3d -- a sequence of points joined by line segments\n * * TransitionSpiral -- controlled transition between curvatures\n * * Support classes\n * * PointString3d -- a sequence of isolated points\n * * StrokeOptions -- tolerances to describe stroking accuracy\n * * RecursiveCurveProcessor, RecursiveCurveProcessorWithStack -- algorithmic support for trees with CurvePrimitives at the leaf level.\n */\n// doc:export class CurveDoc { }\n/**\n * @docs-group-description Numerics\n * The Numerics classes have geometric and numeric methods used during large algorithms in other classes.\n */\n// doc:export class NumericsDoc { }\n/**\n * @docs-group-description Polyface\n * A Polyface is a mesh structure with arrays of points that are shared among multiple incident facets.\n */\n// doc:export class PolyfaceDoc { }\n/**\n * @docs-group-description Serialization\n * These classes are related to serialization of geometry classes.\n * * IModelJson.Reader, IModelJson.Writer -- Conversion of in-memory geometry objects to json objects for persistence and transmission.\n */\n// doc:export class SerializationDoc { }\n/**\n * @docs-group-description Solid\n * Analytic Solids in the GeometryQuery hierarchy: Box, Sphere, Cone, TorusPipe, LinearSweep, RotationalSweep, RuledSweep\n * * Box -- a box solid. This is usually rectangular on all faces, but can in one directly like a view frustum\n * * Sphere -- a sphere\n * * Cone -- a cone or cylinder\n * * TorusPipe -- a pipe elbow\n * * LinearSweep -- a linear sweep of a base contour\n * * RotationalSweep -- a rotational sweep of a base contour\n * * RuledSweep -- two or more similarly structured contours joined by linear rule lines.\n */\n// doc:export class SolidDOc { }\n/**\n * @docs-group-description Topology\n * The Topology classes provide adjacency structures used in triangulations.\n */\n// doc:export class TopologyDoc { }\n/**\n * @docs-group-description RangeSearch\n * Support classes for searching collections of ranges.\n */\nexport * from \"./geometry3d/Angle\";\nexport * from \"./geometry3d/AngleSweep\";\nexport * from \"./geometry3d/LongitudeLatitudeAltitude\";\nexport * from \"./geometry3d/BarycentricTriangle\";\nexport * from \"./geometry3d/BilinearPatch\";\nexport * from \"./geometry3d/Ellipsoid\";\nexport * from \"./geometry3d/FrameBuilder\";\nexport * from \"./geometry3d/FrustumAnimation\";\nexport * from \"./geometry3d/GeometryHandler\";\nexport * from \"./geometry3d/GrowableBlockedArray\";\nexport * from \"./geometry3d/GrowableFloat64Array\";\nexport * from \"./geometry3d/GrowableXYArray\";\nexport * from \"./geometry3d/GrowableXYZArray\";\nexport * from \"./geometry3d/IndexedCollectionInterval\";\nexport * from \"./geometry3d/IndexedXYCollection\";\nexport * from \"./geometry3d/IndexedXYZCollection\";\nexport * from \"./geometry3d/Matrix3d\";\nexport * from \"./geometry3d/OrderedRotationAngles\";\nexport * from \"./geometry3d/Plane3d\";\nexport * from \"./geometry3d/Plane3dByOriginAndUnitNormal\";\nexport * from \"./geometry3d/Plane3dByOriginAndVectors\";\nexport * from \"./geometry3d/Point2dArrayCarrier\";\nexport * from \"./geometry3d/Point2dVector2d\";\nexport * from \"./geometry3d/Point3dVector3d\";\nexport * from \"./geometry3d/PointHelpers\";\nexport * from \"./geometry3d/Point3dArrayCarrier\";\nexport * from \"./geometry3d/PolylineOps\";\nexport * from \"./geometry3d/PolygonOps\";\nexport * from \"./geometry3d/Range\";\nexport * from \"./geometry3d/Ray2d\";\nexport * from \"./geometry3d/Ray3d\";\nexport * from \"./geometry3d/Segment1d\";\nexport * from \"./geometry3d/Transform\";\nexport * from \"./geometry3d/UVSurfaceOps\";\nexport * from \"./geometry3d/XYZProps\";\nexport * from \"./geometry3d/YawPitchRollAngles\";\n\nexport * from \"./Geometry\";\nexport * from \"./Constant\";\nexport * from \"./clipping/BooleanClipFactory\";\nexport * from \"./clipping/ClipPlane\";\nexport * from \"./clipping/ConvexClipPlaneSet\";\nexport * from \"./clipping/UnionOfConvexClipPlaneSets\";\nexport * from \"./clipping/ClipPrimitive\";\nexport * from \"./clipping/ClipVector\";\nexport * from \"./clipping/ClipUtils\";\nexport * from \"./numerics/ConvexPolygon2d\";\nexport * from \"./geometry4d/PlaneByOriginAndVectors4d\";\nexport * from \"./geometry4d/Point4d\";\nexport * from \"./geometry4d/Matrix4d\";\nexport * from \"./geometry4d/Map4d\";\nexport * from \"./geometry4d/MomentData\";\nexport * from \"./numerics/BezierPolynomials\";\nexport * from \"./numerics/ClusterableArray\";\nexport * from \"./numerics/Complex\";\nexport * from \"./numerics/ConvexPolygon2d\";\nexport * from \"./numerics/PascalCoefficients\";\nexport * from \"./numerics/Quadrature\";\nexport * from \"./numerics/Range1dArray\";\nexport * from \"./numerics/SmallSystem\";\nexport * from \"./numerics/TriDiagonalSystem\";\n\nexport * from \"./curve/Arc3d\";\nexport * from \"./curve/ConstructCurveBetweenCurves\";\nexport * from \"./curve/CoordinateXYZ\";\nexport * from \"./curve/CurveTypes\";\nexport * from \"./curve/CurveChainWithDistanceIndex\";\nexport * from \"./curve/CurveExtendMode\";\nexport * from \"./curve/CurveCollection\";\nexport * from \"./curve/CurveCurve\";\nexport * from \"./curve/CurveLocationDetail\";\nexport * from \"./curve/CurveFactory\";\nexport * from \"./curve/CurveOps\";\nexport * from \"./curve/CurvePrimitive\";\nexport * from \"./curve/CurveProcessor\";\nexport * from \"./curve/GeometryQuery\";\nexport * from \"./curve/LineSegment3d\";\nexport * from \"./curve/LineString3d\";\nexport * from \"./curve/Loop\";\nexport * from \"./curve/OffsetOptions\";\nexport * from \"./curve/ParityRegion\";\nexport * from \"./curve/Path\";\nexport * from \"./curve/RegionMomentsXY\";\nexport * from \"./curve/RegionOps\";\nexport * from \"./curve/PointString3d\";\nexport * from \"./curve/ProxyCurve\";\nexport * from \"./curve/StrokeOptions\";\nexport * from \"./curve/spiral/TransitionSpiral3d\";\nexport * from \"./curve/spiral/IntegratedSpiral3d\";\nexport * from \"./curve/spiral/DirectSpiral3d\";\nexport * from \"./curve/UnionRegion\";\nexport * from \"./curve/Query/StrokeCountMap\";\nexport * from \"./solid/Box\";\nexport * from \"./solid/Cone\";\nexport * from \"./solid/LinearSweep\";\nexport * from \"./solid/RotationalSweep\";\nexport * from \"./solid/RuledSweep\";\nexport * from \"./solid/SolidPrimitive\";\nexport * from \"./solid/Sphere\";\nexport * from \"./solid/SweepContour\";\nexport * from \"./solid/TorusPipe\";\nexport * from \"./bspline/AkimaCurve3d\";\nexport * from \"./bspline/Bezier1dNd\";\nexport * from \"./bspline/BezierCurveBase\";\nexport * from \"./bspline/BezierCurve3d\";\nexport * from \"./bspline/BezierCurve3dH\";\nexport * from \"./bspline/BSplineCurve\";\nexport * from \"./bspline/BSplineCurveOps\";\nexport * from \"./bspline/BSpline1dNd\";\nexport * from \"./bspline/BSplineCurve3dH\";\nexport * from \"./bspline/BSplineSurface\";\nexport * from \"./bspline/InterpolationCurve3d\";\nexport * from \"./bspline/KnotVector\";\nexport * from \"./polyface/AuxData\";\nexport * from \"./polyface/BoxTopology\";\nexport * from \"./polyface/FacetFaceData\";\nexport * from \"./polyface/Polyface\";\nexport * from \"./polyface/FacetLocationDetail\";\nexport * from \"./polyface/IndexedPolyfaceVisitor\";\nexport * from \"./polyface/IndexedPolyfaceWalker\";\nexport * from \"./polyface/multiclip/GriddedRaggedRange2dSet\";\nexport * from \"./polyface/multiclip/GriddedRaggedRange2dSetWithOverflow\";\nexport * from \"./polyface/PolyfaceBuilder\";\nexport * from \"./polyface/PolyfaceData\";\nexport * from \"./polyface/PolyfaceQuery\";\nexport * from \"./polyface/PolyfaceClip\";\nexport * from \"./polyface/RangeTree/Point3dArrayRangeTreeContext\";\nexport * from \"./polyface/RangeTree/LineString3dRangeTreeContext\";\nexport * from \"./polyface/RangeTree/PolyfaceRangeTreeContext\";\nexport * from \"./polyface/TaggedNumericData\";\nexport * from \"./topology/SpaceTriangulation\";\nexport * from \"./serialization/IModelJsonSchema\";\nexport * from \"./serialization/DeepCompare\";\nexport * from \"./serialization/GeometrySamples\";\nexport * from \"./serialization/SerializationHelpers\";\nexport { BentleyGeometryFlatBuffer } from \"./serialization/BentleyGeometryFlatBuffer\";\n"]}
1
+ {"version":3,"file":"core-geometry.js","sourceRoot":"","sources":["../../src/core-geometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Utility\n */\n\n// REMARK:\n// The docs-group-description comments are followed by empty classes with names corresponding to the doc-group.\n// Normally (in committed code) these are commented out.\n// The comments have distinctive strings so that simple search and replace can make the \"real\".\n// This is useful when working on the documentation: When the empty classes are present, VSCode will format the doc comments\n// for and display them when the mouse hovers over the class name.\n\n/**\n * @docs-package-description\n * The core-geometry package contains classes for working with geometry: points, vectors, curves, surfaces, and analytic solids\n */\n/**\n * @docs-group-description CartesianGeometry\n * Points, Vectors, Planes, and Transformations for x,y,z geometry.\n * * Fundamental cartesian geometry objects:\n * * Point2d, Point3d -- points with x,y,z coordinates\n * * Vector2d, Vector3d -- vectors with x,y,z coordinates\n * * Matrix3d -- 3x3 matrix\n * * * commonly used for pure rotations\n * * * scale and skew entries are also allowed.\n * * Transform -- an origin and axes.\n * * Range1d, Range2d, Range3d -- subsets of 1d, 2d, and 3d space bounded by low and high values.\n * * Ray3d -- a ray defined by origin and direction vector\n * * Plane3d -- an abstract base class extended by Plane3dByOriginAndNormal, Plane3dByOriginAndUnitNormal, Point4d, and ClipPlane\n * * Plane3dByOriginAndUnitNormal -- a plane defined by an origin and a single vector which is perpendicular to the plane\n * * plane3dByOriginAndVectors -- a plane defined by an origin and two vectors in the plane.\n * * Angles\n * * Angle -- a strongly typed angle object whose method names make it clear whether input and outputs are degrees or radians.\n * * AngleSweep -- an angular interval\n * * LatitudeLongitudeNumber -- carrier for position and altitude on sphere or ellipsoid\n * * YawPitchAndRollAngles -- 3 angles that define a rotated coordinate system.\n * * Utility classes\n * * FrameBuilder -- construction of coordinate frames from mixed data sources.\n * * ClipPlane -- a single plane\n * * ConvexClipPlaneSet -- an array of planes bounding a convex volume\n * * ClipPlaneSet -- an array of ConvexClipPlaneSet, defining the union of their volumes\n * * BilinearPatch -- twisted quadrilateral defined by 4 points\n * * BarycentricTriangle -- triangle defined by 3 points.\n * * Constant -- various numeric values exported as readonly constants\n */\n// doc:export class CartesianGeometryDoc { }\n/**\n * @docs-group-description ArraysAndInterfaces\n * These classes support array operations and inheritance-based algorithms.\n * * Arrays\n * * GrowableArray -- A carrier for a Float64Array, with methods that hide reallocation of the underlying array as contents are added.\n * * Point2dArray, Point3dArray, Point4dArray, Vector3dArray -- miscellaneous operations on arrays of 2d and 3d points.\n * * Interfaces\n * * GeometryHandler -- a double-dispatch protocol used for efficient implementation of algorithms that work on many geometry types.\n *\n */\n// doc:export class ArraysAndInterfacesDoc { }\n\n/**\n * @docs-group-description Bspline\n * A bspline curve or surface is used for curved freeform geometry defined by controls points (sometimes called poles).\n * * BSplineCurve -- a curve defined by control points (which are not on the curve)\n * * InterpolationCurve -- a curve defined by passthrough points, with \"good\" visual properties\n * * BSplineSurfaceXYZ -- a surface with XYZ\n * * BsplineSurfaceXYZW -- a surface with weighted (rational) XYZ coordinates\n * * KnotVector -- vector of breakpoints in bspline definitions.\n */\n// doc:export class BsplineDoc { }\n\n/**\n * @docs-group-description Curve\n * Curves in the GeometryQuery hierarchy: LineSegment3d, LineString3d, Arc3d, TransitionSpiral3d\n * * CurvePrimitive -- base class for parametric curves\n * * LineSegment3d -- a (bounded) portion of an unbounded line\n * * Arc3d -- a circular or elliptic arc\n * * LineString3d -- a sequence of points joined by line segments\n * * TransitionSpiral -- controlled transition between curvatures\n * * Support classes\n * * PointString3d -- a sequence of isolated points\n * * StrokeOptions -- tolerances to describe stroking accuracy\n * * RecursiveCurveProcessor, RecursiveCurveProcessorWithStack -- algorithmic support for trees with CurvePrimitives at the leaf level.\n */\n// doc:export class CurveDoc { }\n/**\n * @docs-group-description Numerics\n * The Numerics classes have geometric and numeric methods used during large algorithms in other classes.\n */\n// doc:export class NumericsDoc { }\n/**\n * @docs-group-description Polyface\n * A Polyface is a mesh structure with arrays of points that are shared among multiple incident facets.\n */\n// doc:export class PolyfaceDoc { }\n/**\n * @docs-group-description Serialization\n * These classes are related to serialization of geometry classes.\n * * IModelJson.Reader, IModelJson.Writer -- Conversion of in-memory geometry objects to json objects for persistence and transmission.\n */\n// doc:export class SerializationDoc { }\n/**\n * @docs-group-description Solid\n * Analytic Solids in the GeometryQuery hierarchy: Box, Sphere, Cone, TorusPipe, LinearSweep, RotationalSweep, RuledSweep\n * * Box -- a box solid. This is usually rectangular on all faces, but can in one directly like a view frustum\n * * Sphere -- a sphere\n * * Cone -- a cone or cylinder\n * * TorusPipe -- a pipe elbow\n * * LinearSweep -- a linear sweep of a base contour\n * * RotationalSweep -- a rotational sweep of a base contour\n * * RuledSweep -- two or more similarly structured contours joined by linear rule lines.\n */\n// doc:export class SolidDOc { }\n/**\n * @docs-group-description Topology\n * The Topology classes provide adjacency structures used in triangulations.\n */\n// doc:export class TopologyDoc { }\n/**\n * @docs-group-description RangeSearch\n * Support classes for searching collections of ranges.\n */\nexport * from \"./geometry3d/Angle\";\nexport * from \"./geometry3d/AngleSweep\";\nexport * from \"./geometry3d/LongitudeLatitudeAltitude\";\nexport * from \"./geometry3d/BarycentricTriangle\";\nexport * from \"./geometry3d/BilinearPatch\";\nexport * from \"./geometry3d/Ellipsoid\";\nexport * from \"./geometry3d/FrameBuilder\";\nexport * from \"./geometry3d/FrustumAnimation\";\nexport * from \"./geometry3d/GeometryHandler\";\nexport * from \"./geometry3d/GrowableBlockedArray\";\nexport * from \"./geometry3d/GrowableFloat64Array\";\nexport * from \"./geometry3d/GrowableXYArray\";\nexport * from \"./geometry3d/GrowableXYZArray\";\nexport * from \"./geometry3d/IndexedCollectionInterval\";\nexport * from \"./geometry3d/IndexedXYCollection\";\nexport * from \"./geometry3d/IndexedXYZCollection\";\nexport * from \"./geometry3d/Matrix3d\";\nexport * from \"./geometry3d/OrderedRotationAngles\";\nexport * from \"./geometry3d/Plane3d\";\nexport * from \"./geometry3d/Plane3dByOriginAndUnitNormal\";\nexport * from \"./geometry3d/Plane3dByOriginAndVectors\";\nexport * from \"./geometry3d/Point2dArrayCarrier\";\nexport * from \"./geometry3d/Point2dVector2d\";\nexport * from \"./geometry3d/Point3dVector3d\";\nexport * from \"./geometry3d/PointHelpers\";\nexport * from \"./geometry3d/Point3dArrayCarrier\";\nexport * from \"./geometry3d/PolylineOps\";\nexport * from \"./geometry3d/PolygonOps\";\nexport * from \"./geometry3d/Range\";\nexport * from \"./geometry3d/Ray2d\";\nexport * from \"./geometry3d/Ray3d\";\nexport * from \"./geometry3d/Segment1d\";\nexport * from \"./geometry3d/Transform\";\nexport * from \"./geometry3d/UVSurfaceOps\";\nexport * from \"./geometry3d/XYZProps\";\nexport * from \"./geometry3d/YawPitchRollAngles\";\n\nexport * from \"./Geometry\";\nexport * from \"./Constant\";\nexport * from \"./clipping/BooleanClipFactory\";\nexport * from \"./clipping/ClipPlane\";\nexport * from \"./clipping/ConvexClipPlaneSet\";\nexport * from \"./clipping/UnionOfConvexClipPlaneSets\";\nexport * from \"./clipping/ClipPrimitive\";\nexport * from \"./clipping/ClipVector\";\nexport * from \"./clipping/ClipUtils\";\nexport * from \"./numerics/ConvexPolygon2d\";\nexport * from \"./geometry4d/PlaneByOriginAndVectors4d\";\nexport * from \"./geometry4d/Point4d\";\nexport * from \"./geometry4d/Matrix4d\";\nexport * from \"./geometry4d/Map4d\";\nexport * from \"./geometry4d/MomentData\";\nexport * from \"./numerics/BezierPolynomials\";\nexport * from \"./numerics/ClusterableArray\";\nexport * from \"./numerics/Complex\";\nexport * from \"./numerics/ConvexPolygon2d\";\nexport * from \"./numerics/PascalCoefficients\";\nexport * from \"./numerics/Quadrature\";\nexport * from \"./numerics/Range1dArray\";\nexport * from \"./numerics/SmallSystem\";\nexport * from \"./numerics/TriDiagonalSystem\";\n\nexport * from \"./curve/Arc3d\";\nexport * from \"./curve/ConstructCurveBetweenCurves\";\nexport * from \"./curve/CoordinateXYZ\";\nexport * from \"./curve/CurveTypes\";\nexport * from \"./curve/CurveChainWithDistanceIndex\";\nexport * from \"./curve/CurveExtendMode\";\nexport * from \"./curve/CurveCollection\";\nexport * from \"./curve/CurveCurve\";\nexport * from \"./curve/CurveLocationDetail\";\nexport * from \"./curve/CurveFactory\";\nexport * from \"./curve/CurveOps\";\nexport * from \"./curve/CurvePrimitive\";\nexport * from \"./curve/CurveProcessor\";\nexport * from \"./curve/GeometryQuery\";\nexport * from \"./curve/LineSegment3d\";\nexport * from \"./curve/LineString3d\";\nexport * from \"./curve/Loop\";\nexport * from \"./curve/OffsetOptions\";\nexport * from \"./curve/ParityRegion\";\nexport * from \"./curve/Path\";\nexport * from \"./curve/RegionMomentsXY\";\nexport * from \"./curve/RegionOps\";\nexport * from \"./curve/PointString3d\";\nexport * from \"./curve/ProxyCurve\";\nexport * from \"./curve/StrokeOptions\";\nexport * from \"./curve/spiral/TransitionSpiral3d\";\nexport * from \"./curve/spiral/IntegratedSpiral3d\";\nexport * from \"./curve/spiral/DirectSpiral3d\";\nexport * from \"./curve/UnionRegion\";\nexport * from \"./curve/Query/StrokeCountMap\";\nexport * from \"./solid/Box\";\nexport * from \"./solid/Cone\";\nexport * from \"./solid/LinearSweep\";\nexport * from \"./solid/RotationalSweep\";\nexport * from \"./solid/RuledSweep\";\nexport * from \"./solid/SolidPrimitive\";\nexport * from \"./solid/Sphere\";\nexport * from \"./solid/SweepContour\";\nexport * from \"./solid/TorusPipe\";\nexport * from \"./bspline/AkimaCurve3d\";\nexport * from \"./bspline/Bezier1dNd\";\nexport * from \"./bspline/BezierCurveBase\";\nexport * from \"./bspline/BezierCurve3d\";\nexport * from \"./bspline/BezierCurve3dH\";\nexport * from \"./bspline/BSplineCurve\";\nexport * from \"./bspline/BSplineCurveOps\";\nexport * from \"./bspline/BSpline1dNd\";\nexport * from \"./bspline/BSplineCurve3dH\";\nexport * from \"./bspline/BSplineSurface\";\nexport * from \"./bspline/InterpolationCurve3d\";\nexport * from \"./bspline/KnotVector\";\nexport * from \"./polyface/AuxData\";\nexport * from \"./polyface/BoxTopology\";\nexport * from \"./polyface/FacetFaceData\";\nexport * from \"./polyface/Polyface\";\nexport * from \"./polyface/FacetLocationDetail\";\nexport * from \"./polyface/IndexedEdgeMatcher\";\nexport * from \"./polyface/IndexedPolyfaceVisitor\";\nexport * from \"./polyface/IndexedPolyfaceWalker\";\nexport * from \"./polyface/multiclip/GriddedRaggedRange2dSet\";\nexport * from \"./polyface/multiclip/GriddedRaggedRange2dSetWithOverflow\";\nexport * from \"./polyface/PolyfaceBuilder\";\nexport * from \"./polyface/PolyfaceData\";\nexport * from \"./polyface/PolyfaceQuery\";\nexport * from \"./polyface/PolyfaceClip\";\nexport * from \"./polyface/RangeTree/Point3dArrayRangeTreeContext\";\nexport * from \"./polyface/RangeTree/LineString3dRangeTreeContext\";\nexport * from \"./polyface/RangeTree/PolyfaceRangeTreeContext\";\nexport * from \"./polyface/TaggedNumericData\";\nexport * from \"./topology/SpaceTriangulation\";\nexport * from \"./serialization/IModelJsonSchema\";\nexport * from \"./serialization/DeepCompare\";\nexport * from \"./serialization/GeometrySamples\";\nexport * from \"./serialization/SerializationHelpers\";\nexport { BentleyGeometryFlatBuffer } from \"./serialization/BentleyGeometryFlatBuffer\";\n"]}
@@ -142,15 +142,26 @@ export declare class EllipticalArcApproximationOptions {
142
142
  * Circular or elliptic arc.
143
143
  * * The angle to point equation is:
144
144
  * * `X = center + cos(theta) * vector0 + sin(theta) * vector90`
145
- * * When the two vectors are perpendicular and have equal length, it is a true circle.
146
- * * Non-perpendicular vectors are always elliptic.
147
- * * Vectors of unequal length are always elliptic.
148
- * * To create an ellipse in the common "major and minor axis" form of an ellipse:
149
- * * vector0 is the vector from the center to the major axis extreme.
150
- * * vector90 is the vector from the center to the minor axis extreme.
145
+ * * The arc's `sweep` determines the range of theta values (angles). In particular:
146
+ * * The point at `theta = n*360` degrees is `center + vector0` for any integer n.
147
+ * * The point at `theta = 90 + n*360` degrees is `center + vector90` for any integer n.
148
+ * * The arc's `sweep` _together with_ `vector0` and `vector90` determine the arc's orientation:
149
+ * * If `sweep.startDegrees < sweep.endDegrees`, the arc's orientation is counterclockwise with respect to its
150
+ * `perpendicularVector` (i.e., looking at the arc from the head of this vector).
151
+ * * Similarly, if `sweep.startDegrees > sweep.endDegrees`, the arc's orientation is clockwise with respect to
152
+ * its `perpendicularVector`.
153
+ * * The arc's orientation is _always_ counterclockwise with respect to its `binormalVector`.
154
+ * * When `vector0` and `vector90` are perpendicular and have equal length, the arc is circular.
155
+ * * When they are non-perpendicular, the arc is always elliptic.
156
+ * * When they have unequal length, the arc is always elliptic.
157
+ * * To create an ellipse in standard major-minor axis form:
158
+ * * `vector0` is the vector from the center to the major axis extreme.
159
+ * * `vector90` is the vector from the center to the minor axis extreme.
151
160
  * * Note that constructing these vectors to the extreme points makes them perpendicular.
152
- * * The method toScaledMatrix3d() can be called to convert the unrestricted vector0, vector90 to perpendicular form.
153
- * * The unrestricted form is much easier to work with for common calculations: stroking, projection to 2d, intersection with plane.
161
+ * * The method [[Arc3d.toScaledMatrix3d]] can be called to convert an arc with unrestricted `vector0` and `vector90`
162
+ * to an arc in standard major-minor axis form.
163
+ * * The unrestricted form is much easier to work with for common calculations: stroking, projection to 2d,
164
+ * intersection with plane.
154
165
  * @public
155
166
  */
156
167
  export declare class Arc3d extends CurvePrimitive implements BeJSONFunctions {
@@ -170,49 +181,54 @@ export declare class Arc3d extends CurvePrimitive implements BeJSONFunctions {
170
181
  /** Read/write the center. Getter returns clone. */
171
182
  get center(): Point3d;
172
183
  set center(center: XYAndZ);
173
- /** Read property for (reference to) center. */
184
+ /** Read property for (reference to) the arc center. */
174
185
  get centerRef(): Point3d;
175
- /** Read property for (clone of) vector0. */
186
+ /**
187
+ * Read property for (clone of) the x-column of the arc matrix.
188
+ * * This vector determines the point on the arc corresponding to angles n*360 degrees.
189
+ */
176
190
  get vector0(): Vector3d;
177
- /** Read property for (clone of) vector90. */
191
+ /**
192
+ * Read property for (clone of) the y-column of the arc matrix.
193
+ * * This vector determines the point on the arc corresponding to angles 90 + n*360 degrees.
194
+ */
178
195
  get vector90(): Vector3d;
179
196
  /**
180
197
  * Compute an arc binormal vector with arbitrary length.
181
- * * The arc parameterization is counter-clockwise with respect to this vector.
198
+ * * The arc parameterization is counterclockwise with respect to this vector.
182
199
  * * This vector is parallel to [[perpendicularVector]] and possibly opposite.
183
200
  */
184
201
  binormalVector(result?: Vector3d): Vector3d;
185
202
  /**
186
- * Read property for (clone of) plane normal, with arbitrary length.
187
- * * Does not take arc sweep direction into account. See also [[binormalVector]].
203
+ * Read property for (clone of) the z-column of the arc matrix.
204
+ * * This vector is nominally the normalized cross product: `vector0 x vector90`.
205
+ * * To compute a vector with respect to which the arc sweep is counterclockwise, use [[binormalVector]].
188
206
  */
189
207
  get perpendicularVector(): Vector3d;
190
- /** Read property for (clone of) matrix of vector0, vector90, unit normal. */
208
+ /** Return a clone of the arc matrix. */
191
209
  matrixClone(): Matrix3d;
192
- /** Read property for (reference to) matrix of vector0, vector90, unit normal. */
210
+ /** Read property for (reference to) the arc matrix. */
193
211
  get matrixRef(): Matrix3d;
194
212
  /** Read/write the sweep. Getter returns reference. */
195
213
  get sweep(): AngleSweep;
196
214
  set sweep(value: AngleSweep);
197
215
  /** An Arc3d extends along its complete elliptic arc. */
198
216
  get isExtensibleFractionSpace(): boolean;
217
+ /** Constructor. Captures the inputs. */
199
218
  private constructor();
200
- /**
201
- * Return a clone of the arc, with transform applied.
202
- * @param transform
203
- */
219
+ /** Return a clone of the arc, with transform applied. */
204
220
  cloneTransformed(transform: Transform): Arc3d;
205
221
  /**
206
222
  * Redefine the arc with (captured references to) given data.
207
223
  * @param center arc center.
208
- * @param matrix matrix with columns vector0, vector 90, and their unit cross product.
224
+ * @param matrix matrix with columns vector0, vector90, and their unit cross product.
209
225
  * @param sweep angle sweep.
210
226
  */
211
227
  setRefs(center: Point3d, matrix: Matrix3d, sweep: AngleSweep): void;
212
228
  /**
213
229
  * Redefine the arc with (clones of) given data.
214
230
  * @param center arc center.
215
- * @param matrix matrix with columns vector0, vector 90, and their unit cross product.
231
+ * @param matrix matrix with columns vector0, vector90, and their unit cross product.
216
232
  * @param sweep angle sweep.
217
233
  */
218
234
  set(center: Point3d, matrix: Matrix3d, sweep: AngleSweep | undefined): void;
@@ -223,7 +239,7 @@ export declare class Arc3d extends CurvePrimitive implements BeJSONFunctions {
223
239
  /**
224
240
  * Create an arc, capturing references to center, matrix and sweep.
225
241
  * @param center center point.
226
- * @param matrix matrix with columns vector0, vector90, and unit cross product.
242
+ * @param matrix matrix with columns vector0, vector90, and their unit cross product.
227
243
  * @param sweep sweep limits.
228
244
  * @param result optional preallocated result.
229
245
  */
@@ -231,23 +247,24 @@ export declare class Arc3d extends CurvePrimitive implements BeJSONFunctions {
231
247
  /**
232
248
  * Create an arc from center, x column to be scaled, and y column to be scaled.
233
249
  * @param center center of ellipse.
234
- * @param matrix matrix whose x and y columns are scaled by radius0 and radius90.
235
- * @param radius0 radius in x direction.
236
- * @param radius90 radius in y direction.
250
+ * @param matrix the x-column and y-column of this matrix are scaled by `radius0` and `radius90` to define the
251
+ * arc's `vector0` and `vector90`.
252
+ * @param radius0 radius along `vector0`.
253
+ * @param radius90 radius along `vector90`.
237
254
  * @param sweep sweep limits.
238
255
  * @param result optional preallocated result.
239
256
  */
240
257
  static createScaledXYColumns(center: Point3d | undefined, matrix: Matrix3d, radius0: number, radius90: number, sweep?: AngleSweep, result?: Arc3d): Arc3d;
241
258
  /**
242
- * Create a (full circular) arc from center, normal and radius.
243
- * @param center center of ellipse. If undefined, center at 000.
259
+ * Create a full circle from center, normal and radius.
260
+ * @param center center of circle. If undefined, use 000.
244
261
  * @param normal normal vector.
245
- * @param radius radius in x direction.
262
+ * @param radius radius of the circle.
246
263
  * @param result optional preallocated result.
247
264
  */
248
265
  static createCenterNormalRadius(center: Point3d | undefined, normal: Vector3d, radius: number, result?: Arc3d): Arc3d;
249
266
  /**
250
- * Create an arc by center with vectors to points at 0 and 90 degrees in parameter space.
267
+ * Create an elliptical arc by center with vectors to points at 0 and 90 degrees in parameter space.
251
268
  * @param center arc center.
252
269
  * @param vector0 vector to 0 degrees (commonly major axis).
253
270
  * @param vector90 vector to 90 degree point (commonly minor axis).
@@ -386,8 +403,13 @@ export declare class Arc3d extends CurvePrimitive implements BeJSONFunctions {
386
403
  * Uses quadrature.
387
404
  */
388
405
  curveLength(): number;
389
- /** Gauss point quadrature count for evaluating curve length. (The number of intervals is adjusted to the arc sweep). */
406
+ /**
407
+ * Gauss point quadrature count for evaluating curve length. (The number of intervals is adjusted to the arc sweep).
408
+ * @deprecated in 5.0. Use correct spelling quadratureGaussCount.
409
+ */
390
410
  static readonly quadratureGuassCount = 5;
411
+ /** Gauss point quadrature count for evaluating curve length. (The number of intervals is adjusted to the arc sweep). */
412
+ static readonly quadratureGaussCount = 5;
391
413
  /** In quadrature for arc length, use this interval (divided by quickEccentricity). */
392
414
  static readonly quadratureIntervalAngleDegrees = 10;
393
415
  /**