@itwin/core-geometry 4.2.0-dev.3 → 4.2.0-dev.31

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 (462) hide show
  1. package/CHANGELOG.md +69 -1
  2. package/lib/cjs/Geometry.d.ts +2 -2
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js.map +1 -1
  5. package/lib/cjs/clipping/AlternatingConvexClipTree.d.ts +4 -3
  6. package/lib/cjs/clipping/AlternatingConvexClipTree.d.ts.map +1 -1
  7. package/lib/cjs/clipping/AlternatingConvexClipTree.js +1 -1
  8. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  9. package/lib/cjs/clipping/BooleanClipNode.d.ts +4 -3
  10. package/lib/cjs/clipping/BooleanClipNode.d.ts.map +1 -1
  11. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  12. package/lib/cjs/clipping/ClipPlane.d.ts +12 -8
  13. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  14. package/lib/cjs/clipping/ClipPlane.js +5 -3
  15. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  16. package/lib/cjs/clipping/ClipUtils.d.ts +27 -9
  17. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  18. package/lib/cjs/clipping/ClipUtils.js +84 -3
  19. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  20. package/lib/cjs/clipping/ClipVector.d.ts +6 -5
  21. package/lib/cjs/clipping/ClipVector.d.ts.map +1 -1
  22. package/lib/cjs/clipping/ClipVector.js +1 -1
  23. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  24. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +6 -4
  25. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  26. package/lib/cjs/clipping/ConvexClipPlaneSet.js +3 -2
  27. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  28. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +4 -3
  29. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  30. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +2 -2
  31. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  32. package/lib/cjs/core-geometry.d.ts +1 -3
  33. package/lib/cjs/core-geometry.d.ts.map +1 -1
  34. package/lib/cjs/core-geometry.js +1 -3
  35. package/lib/cjs/core-geometry.js.map +1 -1
  36. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  37. package/lib/cjs/curve/Arc3d.js +4 -4
  38. package/lib/cjs/curve/Arc3d.js.map +1 -1
  39. package/lib/cjs/curve/CoordinateXYZ.d.ts +15 -15
  40. package/lib/cjs/curve/CoordinateXYZ.d.ts.map +1 -1
  41. package/lib/cjs/curve/CoordinateXYZ.js +15 -15
  42. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  43. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +1 -1
  44. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  45. package/lib/cjs/curve/CurveCollection.d.ts +20 -20
  46. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  47. package/lib/cjs/curve/CurveCollection.js +21 -23
  48. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  49. package/lib/cjs/curve/CurveCurve.d.ts +41 -26
  50. package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
  51. package/lib/cjs/curve/CurveCurve.js +73 -40
  52. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  53. package/lib/cjs/curve/CurveFactory.d.ts +1 -1
  54. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  55. package/lib/cjs/curve/CurveLocationDetail.d.ts +12 -1
  56. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  57. package/lib/cjs/curve/CurveLocationDetail.js +13 -2
  58. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  59. package/lib/cjs/curve/CurveOps.d.ts +1 -1
  60. package/lib/cjs/curve/CurveOps.js.map +1 -1
  61. package/lib/cjs/curve/CurveProcessor.d.ts +1 -1
  62. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  63. package/lib/cjs/curve/CurveTypes.d.ts +19 -0
  64. package/lib/cjs/curve/CurveTypes.d.ts.map +1 -0
  65. package/lib/cjs/curve/{CurveChain.js → CurveTypes.js} +1 -1
  66. package/lib/cjs/curve/CurveTypes.js.map +1 -0
  67. package/lib/cjs/curve/CurveWireMomentsXYZ.d.ts +1 -1
  68. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  69. package/lib/cjs/curve/ParityRegion.d.ts +3 -3
  70. package/lib/cjs/curve/ParityRegion.d.ts.map +1 -1
  71. package/lib/cjs/curve/ParityRegion.js +2 -2
  72. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  73. package/lib/cjs/curve/Path.d.ts +1 -1
  74. package/lib/cjs/curve/Path.d.ts.map +1 -1
  75. package/lib/cjs/curve/Path.js +1 -1
  76. package/lib/cjs/curve/Path.js.map +1 -1
  77. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts +3 -2
  78. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  79. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +2 -2
  80. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  81. package/lib/cjs/curve/Query/CurveSplitContext.d.ts +1 -1
  82. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  83. package/lib/cjs/curve/Query/CylindricalRange.d.ts +1 -1
  84. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  85. package/lib/cjs/curve/Query/InOutTests.d.ts +1 -1
  86. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  87. package/lib/cjs/curve/Query/StrokeCountChain.d.ts +1 -1
  88. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  89. package/lib/cjs/curve/RegionOps.d.ts +54 -5
  90. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  91. package/lib/cjs/curve/RegionOps.js +154 -3
  92. package/lib/cjs/curve/RegionOps.js.map +1 -1
  93. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +1 -1
  94. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  95. package/lib/cjs/curve/StrokeOptions.d.ts +20 -11
  96. package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
  97. package/lib/cjs/curve/StrokeOptions.js +22 -11
  98. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  99. package/lib/cjs/curve/UnionRegion.d.ts +3 -3
  100. package/lib/cjs/curve/UnionRegion.d.ts.map +1 -1
  101. package/lib/cjs/curve/UnionRegion.js +3 -3
  102. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  103. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +225 -0
  104. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -0
  105. package/lib/cjs/curve/{CurveCurveCloseApproachXY.js → internalContexts/CurveCurveCloseApproachXY.js} +249 -189
  106. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -0
  107. package/lib/{esm/curve → cjs/curve/internalContexts}/CurveCurveIntersectXY.d.ts +14 -27
  108. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -0
  109. package/lib/cjs/curve/{CurveCurveIntersectXY.js → internalContexts/CurveCurveIntersectXY.js} +31 -42
  110. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -0
  111. package/lib/cjs/curve/{CurveCurveIntersectXYZ.d.ts → internalContexts/CurveCurveIntersectXYZ.d.ts} +11 -12
  112. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -0
  113. package/lib/cjs/curve/{CurveCurveIntersectXYZ.js → internalContexts/CurveCurveIntersectXYZ.js} +12 -14
  114. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -0
  115. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +1 -1
  116. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  117. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts +1 -0
  118. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  119. package/lib/cjs/geometry3d/BarycentricTriangle.js +1 -0
  120. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  121. package/lib/cjs/geometry3d/FrameBuilder.d.ts +57 -36
  122. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  123. package/lib/cjs/geometry3d/FrameBuilder.js +99 -74
  124. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  125. package/lib/cjs/geometry3d/GeometryHandler.d.ts +3 -10
  126. package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
  127. package/lib/cjs/geometry3d/GeometryHandler.js +2 -6
  128. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  129. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +0 -8
  130. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  131. package/lib/cjs/geometry3d/GrowableXYZArray.js +0 -16
  132. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  133. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +4 -4
  134. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  135. package/lib/cjs/geometry3d/IndexedXYZCollection.js +12 -0
  136. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  137. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  138. package/lib/cjs/geometry3d/Matrix3d.js +3 -6
  139. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  140. package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  141. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  142. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -2
  143. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  144. package/lib/cjs/geometry3d/Point3dVector3d.js +0 -1
  145. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  146. package/lib/cjs/geometry3d/PolygonOps.d.ts +2 -2
  147. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  148. package/lib/cjs/geometry3d/PolygonOps.js +2 -3
  149. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  150. package/lib/cjs/geometry3d/Range.d.ts +1 -1
  151. package/lib/cjs/geometry3d/Range.js +1 -1
  152. package/lib/cjs/geometry3d/Range.js.map +1 -1
  153. package/lib/cjs/geometry3d/Ray3d.d.ts +3 -1
  154. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  155. package/lib/cjs/geometry3d/Ray3d.js +4 -3
  156. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  157. package/lib/cjs/geometry3d/ReusableObjectCache.d.ts +2 -1
  158. package/lib/cjs/geometry3d/ReusableObjectCache.d.ts.map +1 -1
  159. package/lib/cjs/geometry3d/ReusableObjectCache.js +1 -1
  160. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  161. package/lib/cjs/geometry3d/SortablePolygon.d.ts +1 -1
  162. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  163. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  164. package/lib/cjs/geometry3d/Transform.js +4 -6
  165. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  166. package/lib/cjs/geometry3d/YawPitchRollAngles.js +1 -1
  167. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  168. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  169. package/lib/cjs/geometry4d/Matrix4d.js +4 -2
  170. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  171. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  172. package/lib/cjs/numerics/Polynomials.d.ts +2 -2
  173. package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
  174. package/lib/cjs/numerics/Polynomials.js +2 -2
  175. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  176. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +18 -6
  177. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  178. package/lib/cjs/polyface/PolyfaceBuilder.js +48 -15
  179. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  180. package/lib/cjs/polyface/PolyfaceClip.d.ts +16 -7
  181. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  182. package/lib/cjs/polyface/PolyfaceClip.js +38 -7
  183. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  184. package/lib/cjs/polyface/PolyfaceData.d.ts +5 -39
  185. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  186. package/lib/cjs/polyface/PolyfaceData.js +7 -41
  187. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  188. package/lib/cjs/polyface/PolyfaceQuery.d.ts +10 -8
  189. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  190. package/lib/cjs/polyface/PolyfaceQuery.js +64 -18
  191. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  192. package/lib/cjs/serialization/GeometrySamples.d.ts +6 -0
  193. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  194. package/lib/cjs/serialization/GeometrySamples.js +61 -1
  195. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  196. package/lib/cjs/solid/LinearSweep.d.ts +1 -1
  197. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  198. package/lib/cjs/solid/RotationalSweep.d.ts +1 -1
  199. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  200. package/lib/cjs/solid/RuledSweep.d.ts +1 -1
  201. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  202. package/lib/cjs/solid/SweepContour.d.ts +35 -26
  203. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  204. package/lib/cjs/solid/SweepContour.js +84 -100
  205. package/lib/cjs/solid/SweepContour.js.map +1 -1
  206. package/lib/cjs/topology/Graph.d.ts +29 -11
  207. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  208. package/lib/cjs/topology/Graph.js +45 -26
  209. package/lib/cjs/topology/Graph.js.map +1 -1
  210. package/lib/cjs/topology/HalfEdgeMarkSet.d.ts +2 -2
  211. package/lib/cjs/topology/HalfEdgeMarkSet.d.ts.map +1 -1
  212. package/lib/cjs/topology/HalfEdgeMarkSet.js +4 -4
  213. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  214. package/lib/cjs/topology/Merging.d.ts +3 -0
  215. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  216. package/lib/cjs/topology/Merging.js +19 -5
  217. package/lib/cjs/topology/Merging.js.map +1 -1
  218. package/lib/cjs/topology/Triangulation.d.ts +15 -7
  219. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  220. package/lib/cjs/topology/Triangulation.js +89 -47
  221. package/lib/cjs/topology/Triangulation.js.map +1 -1
  222. package/lib/esm/Geometry.d.ts +2 -2
  223. package/lib/esm/Geometry.d.ts.map +1 -1
  224. package/lib/esm/Geometry.js.map +1 -1
  225. package/lib/esm/clipping/AlternatingConvexClipTree.d.ts +4 -3
  226. package/lib/esm/clipping/AlternatingConvexClipTree.d.ts.map +1 -1
  227. package/lib/esm/clipping/AlternatingConvexClipTree.js +1 -1
  228. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  229. package/lib/esm/clipping/BooleanClipNode.d.ts +4 -3
  230. package/lib/esm/clipping/BooleanClipNode.d.ts.map +1 -1
  231. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  232. package/lib/esm/clipping/ClipPlane.d.ts +12 -8
  233. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  234. package/lib/esm/clipping/ClipPlane.js +5 -3
  235. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  236. package/lib/esm/clipping/ClipUtils.d.ts +27 -9
  237. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  238. package/lib/esm/clipping/ClipUtils.js +84 -3
  239. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  240. package/lib/esm/clipping/ClipVector.d.ts +6 -5
  241. package/lib/esm/clipping/ClipVector.d.ts.map +1 -1
  242. package/lib/esm/clipping/ClipVector.js +1 -1
  243. package/lib/esm/clipping/ClipVector.js.map +1 -1
  244. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +6 -4
  245. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  246. package/lib/esm/clipping/ConvexClipPlaneSet.js +3 -2
  247. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  248. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +4 -3
  249. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  250. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +2 -2
  251. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  252. package/lib/esm/core-geometry.d.ts +1 -3
  253. package/lib/esm/core-geometry.d.ts.map +1 -1
  254. package/lib/esm/core-geometry.js +1 -3
  255. package/lib/esm/core-geometry.js.map +1 -1
  256. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  257. package/lib/esm/curve/Arc3d.js +4 -4
  258. package/lib/esm/curve/Arc3d.js.map +1 -1
  259. package/lib/esm/curve/CoordinateXYZ.d.ts +15 -15
  260. package/lib/esm/curve/CoordinateXYZ.d.ts.map +1 -1
  261. package/lib/esm/curve/CoordinateXYZ.js +15 -15
  262. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  263. package/lib/esm/curve/CurveChainWithDistanceIndex.js +1 -1
  264. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  265. package/lib/esm/curve/CurveCollection.d.ts +20 -20
  266. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  267. package/lib/esm/curve/CurveCollection.js +20 -21
  268. package/lib/esm/curve/CurveCollection.js.map +1 -1
  269. package/lib/esm/curve/CurveCurve.d.ts +41 -26
  270. package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
  271. package/lib/esm/curve/CurveCurve.js +73 -40
  272. package/lib/esm/curve/CurveCurve.js.map +1 -1
  273. package/lib/esm/curve/CurveFactory.d.ts +1 -1
  274. package/lib/esm/curve/CurveFactory.js.map +1 -1
  275. package/lib/esm/curve/CurveLocationDetail.d.ts +12 -1
  276. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  277. package/lib/esm/curve/CurveLocationDetail.js +11 -1
  278. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  279. package/lib/esm/curve/CurveOps.d.ts +1 -1
  280. package/lib/esm/curve/CurveOps.js.map +1 -1
  281. package/lib/esm/curve/CurveProcessor.d.ts +1 -1
  282. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  283. package/lib/esm/curve/CurveTypes.d.ts +19 -0
  284. package/lib/esm/curve/CurveTypes.d.ts.map +1 -0
  285. package/lib/esm/curve/{CurveChain.js → CurveTypes.js} +1 -1
  286. package/lib/esm/curve/CurveTypes.js.map +1 -0
  287. package/lib/esm/curve/CurveWireMomentsXYZ.d.ts +1 -1
  288. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  289. package/lib/esm/curve/ParityRegion.d.ts +3 -3
  290. package/lib/esm/curve/ParityRegion.d.ts.map +1 -1
  291. package/lib/esm/curve/ParityRegion.js +2 -2
  292. package/lib/esm/curve/ParityRegion.js.map +1 -1
  293. package/lib/esm/curve/Path.d.ts +1 -1
  294. package/lib/esm/curve/Path.d.ts.map +1 -1
  295. package/lib/esm/curve/Path.js +1 -1
  296. package/lib/esm/curve/Path.js.map +1 -1
  297. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts +3 -2
  298. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  299. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +1 -1
  300. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  301. package/lib/esm/curve/Query/CurveSplitContext.d.ts +1 -1
  302. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  303. package/lib/esm/curve/Query/CylindricalRange.d.ts +1 -1
  304. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  305. package/lib/esm/curve/Query/InOutTests.d.ts +1 -1
  306. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  307. package/lib/esm/curve/Query/StrokeCountChain.d.ts +1 -1
  308. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  309. package/lib/esm/curve/RegionOps.d.ts +54 -5
  310. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  311. package/lib/esm/curve/RegionOps.js +153 -3
  312. package/lib/esm/curve/RegionOps.js.map +1 -1
  313. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +1 -1
  314. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  315. package/lib/esm/curve/StrokeOptions.d.ts +20 -11
  316. package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
  317. package/lib/esm/curve/StrokeOptions.js +22 -11
  318. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  319. package/lib/esm/curve/UnionRegion.d.ts +3 -3
  320. package/lib/esm/curve/UnionRegion.d.ts.map +1 -1
  321. package/lib/esm/curve/UnionRegion.js +3 -3
  322. package/lib/esm/curve/UnionRegion.js.map +1 -1
  323. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +225 -0
  324. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -0
  325. package/lib/esm/curve/{CurveCurveCloseApproachXY.js → internalContexts/CurveCurveCloseApproachXY.js} +249 -189
  326. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -0
  327. package/lib/{cjs/curve → esm/curve/internalContexts}/CurveCurveIntersectXY.d.ts +14 -27
  328. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -0
  329. package/lib/esm/curve/{CurveCurveIntersectXY.js → internalContexts/CurveCurveIntersectXY.js} +30 -40
  330. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -0
  331. package/lib/esm/curve/{CurveCurveIntersectXYZ.d.ts → internalContexts/CurveCurveIntersectXYZ.d.ts} +11 -12
  332. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -0
  333. package/lib/esm/curve/{CurveCurveIntersectXYZ.js → internalContexts/CurveCurveIntersectXYZ.js} +11 -13
  334. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -0
  335. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +1 -1
  336. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  337. package/lib/esm/geometry3d/BarycentricTriangle.d.ts +1 -0
  338. package/lib/esm/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  339. package/lib/esm/geometry3d/BarycentricTriangle.js +1 -0
  340. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  341. package/lib/esm/geometry3d/FrameBuilder.d.ts +57 -36
  342. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  343. package/lib/esm/geometry3d/FrameBuilder.js +99 -74
  344. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  345. package/lib/esm/geometry3d/GeometryHandler.d.ts +3 -10
  346. package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
  347. package/lib/esm/geometry3d/GeometryHandler.js +2 -6
  348. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  349. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +0 -8
  350. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  351. package/lib/esm/geometry3d/GrowableXYZArray.js +0 -16
  352. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  353. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +4 -4
  354. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  355. package/lib/esm/geometry3d/IndexedXYZCollection.js +12 -0
  356. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  357. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  358. package/lib/esm/geometry3d/Matrix3d.js +3 -6
  359. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  360. package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  361. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  362. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -2
  363. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  364. package/lib/esm/geometry3d/Point3dVector3d.js +0 -1
  365. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  366. package/lib/esm/geometry3d/PolygonOps.d.ts +2 -2
  367. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  368. package/lib/esm/geometry3d/PolygonOps.js +2 -3
  369. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  370. package/lib/esm/geometry3d/Range.d.ts +1 -1
  371. package/lib/esm/geometry3d/Range.js +1 -1
  372. package/lib/esm/geometry3d/Range.js.map +1 -1
  373. package/lib/esm/geometry3d/Ray3d.d.ts +3 -1
  374. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  375. package/lib/esm/geometry3d/Ray3d.js +4 -3
  376. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  377. package/lib/esm/geometry3d/ReusableObjectCache.d.ts +2 -1
  378. package/lib/esm/geometry3d/ReusableObjectCache.d.ts.map +1 -1
  379. package/lib/esm/geometry3d/ReusableObjectCache.js +1 -1
  380. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  381. package/lib/esm/geometry3d/SortablePolygon.d.ts +1 -1
  382. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  383. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  384. package/lib/esm/geometry3d/Transform.js +4 -6
  385. package/lib/esm/geometry3d/Transform.js.map +1 -1
  386. package/lib/esm/geometry3d/YawPitchRollAngles.js +1 -1
  387. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  388. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  389. package/lib/esm/geometry4d/Matrix4d.js +4 -2
  390. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  391. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  392. package/lib/esm/numerics/Polynomials.d.ts +2 -2
  393. package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
  394. package/lib/esm/numerics/Polynomials.js +2 -2
  395. package/lib/esm/numerics/Polynomials.js.map +1 -1
  396. package/lib/esm/polyface/PolyfaceBuilder.d.ts +18 -6
  397. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  398. package/lib/esm/polyface/PolyfaceBuilder.js +48 -15
  399. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  400. package/lib/esm/polyface/PolyfaceClip.d.ts +16 -7
  401. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  402. package/lib/esm/polyface/PolyfaceClip.js +38 -7
  403. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  404. package/lib/esm/polyface/PolyfaceData.d.ts +5 -39
  405. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  406. package/lib/esm/polyface/PolyfaceData.js +7 -41
  407. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  408. package/lib/esm/polyface/PolyfaceQuery.d.ts +10 -8
  409. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  410. package/lib/esm/polyface/PolyfaceQuery.js +64 -18
  411. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  412. package/lib/esm/serialization/GeometrySamples.d.ts +6 -0
  413. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  414. package/lib/esm/serialization/GeometrySamples.js +61 -1
  415. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  416. package/lib/esm/solid/LinearSweep.d.ts +1 -1
  417. package/lib/esm/solid/LinearSweep.js.map +1 -1
  418. package/lib/esm/solid/RotationalSweep.d.ts +1 -1
  419. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  420. package/lib/esm/solid/RuledSweep.d.ts +1 -1
  421. package/lib/esm/solid/RuledSweep.js.map +1 -1
  422. package/lib/esm/solid/SweepContour.d.ts +35 -26
  423. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  424. package/lib/esm/solid/SweepContour.js +84 -100
  425. package/lib/esm/solid/SweepContour.js.map +1 -1
  426. package/lib/esm/topology/Graph.d.ts +29 -11
  427. package/lib/esm/topology/Graph.d.ts.map +1 -1
  428. package/lib/esm/topology/Graph.js +45 -26
  429. package/lib/esm/topology/Graph.js.map +1 -1
  430. package/lib/esm/topology/HalfEdgeMarkSet.d.ts +2 -2
  431. package/lib/esm/topology/HalfEdgeMarkSet.d.ts.map +1 -1
  432. package/lib/esm/topology/HalfEdgeMarkSet.js +2 -2
  433. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  434. package/lib/esm/topology/Merging.d.ts +3 -0
  435. package/lib/esm/topology/Merging.d.ts.map +1 -1
  436. package/lib/esm/topology/Merging.js +19 -5
  437. package/lib/esm/topology/Merging.js.map +1 -1
  438. package/lib/esm/topology/Triangulation.d.ts +15 -7
  439. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  440. package/lib/esm/topology/Triangulation.js +89 -47
  441. package/lib/esm/topology/Triangulation.js.map +1 -1
  442. package/package.json +4 -4
  443. package/lib/cjs/curve/CurveChain.d.ts +0 -17
  444. package/lib/cjs/curve/CurveChain.d.ts.map +0 -1
  445. package/lib/cjs/curve/CurveChain.js.map +0 -1
  446. package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts +0 -164
  447. package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts.map +0 -1
  448. package/lib/cjs/curve/CurveCurveCloseApproachXY.js.map +0 -1
  449. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +0 -1
  450. package/lib/cjs/curve/CurveCurveIntersectXY.js.map +0 -1
  451. package/lib/cjs/curve/CurveCurveIntersectXYZ.d.ts.map +0 -1
  452. package/lib/cjs/curve/CurveCurveIntersectXYZ.js.map +0 -1
  453. package/lib/esm/curve/CurveChain.d.ts +0 -17
  454. package/lib/esm/curve/CurveChain.d.ts.map +0 -1
  455. package/lib/esm/curve/CurveChain.js.map +0 -1
  456. package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts +0 -164
  457. package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts.map +0 -1
  458. package/lib/esm/curve/CurveCurveCloseApproachXY.js.map +0 -1
  459. package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +0 -1
  460. package/lib/esm/curve/CurveCurveIntersectXY.js.map +0 -1
  461. package/lib/esm/curve/CurveCurveIntersectXYZ.d.ts.map +0 -1
  462. package/lib/esm/curve/CurveCurveIntersectXYZ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"StrokeCountChain.js","sourceRoot":"","sources":["../../../../src/curve/Query/StrokeCountChain.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range1d } from \"../../geometry3d/Range\";\r\nimport { AnyCurve } from \"../CurveChain\";\r\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { ParityRegion } from \"../ParityRegion\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\nimport { StrokeCountMap } from \"./StrokeCountMap\";\r\n\r\n// cspell:word remapa\r\n/**\r\n * abstract methods for callbacks during sweeps of collections of StrokeCount Structures.\r\n * * A set of StrokeCountMaps are to be visited multiple times.\r\n * * The logic that controls the sweep is as below.\r\n * * The callback object controls the number of sweeps and can adapt its action to the respective sweeps.\r\n * * Note that a \"false\" from cb.startPass() terminates passes for this chainIndex and primitiveIndex, but all others exit the whole sequence.\r\n * * This logic occurs 2 or three levels deep\r\n * * outer level is \"chains\". Simple swept path or loops have only one outer; parity regions have one outer per loop of the parity region\r\n * * second level is primitive within chain.\r\n * * If the primitives in a set are \"single component\", second level is lowest.\r\n * * startSweep() and endSweep() calls are two parameters, with undefined componentIndex\r\n * * If the primitives in a set are multi-component, there is a third level looping through corresponding components.\r\n * `\r\n * if (!cb.startSweeps (chainIndex, primitiveIndex, componentIndex))\r\n * return false;\r\n * for (let pass = 0;cb.startPass (pass); pass++){\r\n * for (each map in working set)\r\n * if (!cb.visit (pass, map)) return false;\r\n * if (!cb.endPass ()) return false;\r\n * }\r\n * }\r\n * if (!cb.endSweeps (chainIndex, primitiveIndex, componentIndex)) return false;\r\n * return true;\r\n * `\r\n * @internal\r\n */\r\nexport abstract class StrokeCountMapMultipassVisitor {\r\n /**\r\n * called to announce the beginning of one or more sweeps through related StrokeCountMap's\r\n * @param chainIndex index of loop or path within the various contours.\r\n * @param primitiveIndex index of primitive within the loop or path.\r\n * @param componentIndex optional component index.\r\n * @returns the number of sweeps to perform.\r\n */\r\n public startSweeps(_chainIndex: number, _primitiveIndex: number, _componentIndex?: number): boolean { return true; }\r\n /**\r\n * announce the beginning of a sweep pass.\r\n * @param pass the index (0,1...) for this sweep pass.\r\n * @return true to execute this pass. false to break from the pass loop (next method called is endSweeps)\r\n */\r\n public abstract startPass(pass: number): boolean;\r\n public abstract visit(pass: number, map: StrokeCountMap): boolean;\r\n /**\r\n * announce the end of a pass\r\n * @param pass the index (0,1...) for this sweep pass.\r\n * @return true to continue the sweeps.\r\n */\r\n\r\n public abstract endPass(pass: number): boolean;\r\n /**\r\n * announce the end of handling for particular chainIndex and primitiveIndex;\r\n * @return true to continue outer loops.\r\n */\r\n public endSweeps(_chainIndex: number, _primitiveIndex: number, _componentIndex?: number): boolean { return true; }\r\n\r\n}\r\n/**\r\n * * pass 1: determine max numStroke\r\n * * pass 2: impose max numStroke\r\n * @internal\r\n */\r\nexport class StrokeCountMapVisitorApplyMaxCount extends StrokeCountMapMultipassVisitor {\r\n public myMap: StrokeCountMap;\r\n public constructor() {\r\n super();\r\n this.myMap = StrokeCountMap.createWithComponentIndex();\r\n }\r\n /** set up for a pass through corresponding maps. */\r\n public startPass(pass: number): boolean {\r\n if (pass === 0) {\r\n this.myMap.numStroke = 0;\r\n return true;\r\n } else if (pass === 1) {\r\n // nothing to change == numStroke will be applied to each primitive.\r\n return true;\r\n }\r\n // all other pass numbers are rejected ...\r\n return false;\r\n }\r\n /** visit one of the set of corresponding maps. */\r\n public visit(pass: number, map: StrokeCountMap): boolean {\r\n if (pass === 0) {\r\n if (map.numStroke > this.myMap.numStroke)\r\n this.myMap.numStroke = map.numStroke;\r\n return true;\r\n } else if (pass === 1) {\r\n // apply the max from prior pass\r\n map.numStroke = this.myMap.numStroke;\r\n return true;\r\n }\r\n // no other pass values should happen -- canceled by startPass.\r\n return false;\r\n }\r\n\r\n public endPass(_pass: number): boolean { return true; }\r\n}\r\n/**\r\n * * pass 1: determine max curveLength among maps presented.\r\n * * pass 2: set the a0 and a1 values to 0 and that max distance\r\n * @internal\r\n */\r\nexport class StrokeCountMapVisitorApplyMaxCurveLength extends StrokeCountMapMultipassVisitor {\r\n public maxCurveLength: number;\r\n public constructor() {\r\n super();\r\n this.maxCurveLength = 0.0;\r\n }\r\n /** set up for a pass through corresponding maps. */\r\n public startPass(pass: number): boolean {\r\n if (pass === 0) {\r\n this.maxCurveLength = 0;\r\n return true;\r\n } else if (pass === 1) {\r\n // nothing to change == numStroke will be applied to each primitive.\r\n return true;\r\n }\r\n // all other pass numbers are rejected ...\r\n return false;\r\n }\r\n /** visit one of the set of corresponding maps. */\r\n public visit(pass: number, map: StrokeCountMap): boolean {\r\n if (pass === 0) {\r\n this.maxCurveLength = Geometry.maxXY(map.curveLength, this.maxCurveLength);\r\n return true;\r\n } else if (pass === 1) {\r\n // apply the max from prior pass\r\n map.a0 = 0.0;\r\n map.a1 = this.maxCurveLength;\r\n return true;\r\n }\r\n // no other pass values should happen -- canceled by startPass.\r\n return false;\r\n }\r\n\r\n public endPass(_pass: number): boolean { return true; }\r\n}\r\n/**\r\n * class `StrokeCountChain` contains:\r\n * * `maps` = an array of `StrokeCountMap`\r\n * * `parent` = parent CurveCollection.\r\n *\r\n * An instance is normally created with either a `Path` or `Loop` as the parent.\r\n */\r\nexport class StrokeCountChain {\r\n public maps: StrokeCountMap[];\r\n public parent?: CurveCollection;\r\n /**\r\n * options are used (with different purposes) at two times:\r\n * * When the StrokeCountChain is created, the options affect the stroke counts. This is just creating markup, not actual strokes.\r\n * * When actual stroking happens, the options control creation of parameters and tangents.\r\n */\r\n public options?: StrokeOptions;\r\n\r\n private constructor(parent?: CurveCollection, options?: StrokeOptions) {\r\n this.parent = parent;\r\n this.maps = [];\r\n this.options = options;\r\n }\r\n public static createForCurveChain(chain: CurveChain, options?: StrokeOptions): StrokeCountChain {\r\n const result = new StrokeCountChain(chain, options);\r\n result.parent = chain;\r\n // A chain can only contain primitives !!!!\r\n for (const p of chain.children) {\r\n p.computeAndAttachRecursiveStrokeCounts(options);\r\n if (p.strokeData)\r\n result.maps.push(p.strokeData);\r\n }\r\n return result;\r\n }\r\n public getStrokes(): LineString3d {\r\n const ls = LineString3d.create();\r\n if (this.options) {\r\n if (this.options.needNormals || this.options.needParams) {\r\n ls.ensureEmptyFractions();\r\n ls.ensureEmptyDerivatives();\r\n ls.ensureEmptyUVParams();\r\n }\r\n }\r\n for (const m of this.maps) {\r\n if (m.primitive)\r\n m.primitive.addMappedStrokesToLineString3D(m, ls);\r\n }\r\n return ls;\r\n\r\n }\r\n /** internal form of */\r\n private static applySummed01LimitsWithinArray(maps: StrokeCountMap[], incomingSum: number): number {\r\n let movingSum = incomingSum;\r\n for (const m of maps) {\r\n m.a0 += movingSum;\r\n if (m.componentData) {\r\n m.a1 = this.applySummed01LimitsWithinArray(m.componentData, m.a0);\r\n } else {\r\n m.a1 += movingSum;\r\n }\r\n movingSum = m.a1;\r\n }\r\n return movingSum;\r\n }\r\n /**\r\n * walk the maps in the array.\r\n * * in maps with no component data\r\n * * increment map.a0 and map.a1 by the incoming distance a0\r\n * * in maps with component data:\r\n * * recurse through the component array.\r\n * * increment map.a0 by the incoming a0.\r\n * * returned a1 from the componentData array becomes a1\r\n * @returns upper value of a1 in final map.\r\n * @param maps\r\n * @param incomingSum lower value to add to a0 for first map.\r\n */\r\n public applySummed01Limits(incomingSum: number): number {\r\n return StrokeCountChain.applySummed01LimitsWithinArray(this.maps, incomingSum);\r\n }\r\n}\r\n\r\n/**\r\n * class `StrokeCountSection`\\\r\n * * contains an array of `StrokeCountChain`.\r\n * * Hence it is the internal node level of a (1-level-deep) tree of `StrokeCountChain`\r\n * @internal\r\n */\r\nexport class StrokeCountSection {\r\n public chains: StrokeCountChain[];\r\n public parent?: CurveCollection;\r\n private constructor(parent?: CurveCollection) { this.parent = parent; this.chains = []; }\r\n /**\r\n * construct array of arrays of `StrokeCountMap`s\r\n * @param parent\r\n */\r\n public static createForParityRegionOrChain(parent: CurveCollection, options?: StrokeOptions): StrokeCountSection {\r\n const result = new StrokeCountSection(parent);\r\n if (parent instanceof ParityRegion) {\r\n for (const child of parent.children) {\r\n const p = StrokeCountChain.createForCurveChain(child, options);\r\n result.chains.push(p);\r\n }\r\n } else if (parent instanceof CurveChain) {\r\n result.chains.push(StrokeCountChain.createForCurveChain(parent, options));\r\n }\r\n return result;\r\n }\r\n /** test if all sections have the same structure. */\r\n public static areSectionsCompatible(sections: StrokeCountSection[], enforceCounts: boolean): boolean {\r\n if (sections.length < 2)\r\n return true; // hm.. don't know if that is useful, but nothing to check here.\r\n const numChains = sections[0].chains.length;\r\n for (let i = 1; i < sections.length; i++) {\r\n // first level: must match number of paths or loops\r\n if (sections[i].chains.length !== numChains)\r\n return false;\r\n // second level: must have same number of primitives in each path or loop\r\n for (let j = 0; j < sections[0].chains.length; j++) {\r\n const numPrimitive = sections[0].chains[j].maps.length;\r\n if (sections[i].chains[j].maps.length !== numPrimitive)\r\n return false;\r\n for (let k = 0; k < numPrimitive; k++) {\r\n if (!sections[0].chains[j].maps[k].isCompatibleComponentStructure(sections[i].chains[j].maps[k], enforceCounts))\r\n return false;\r\n }\r\n }\r\n\r\n }\r\n return true;\r\n }\r\n\r\n /** Within each section, sweep accumulate curveLength field, recording entry and exit sum in each map.\r\n * * In expected use, (a0,a1) are (0,a) where a is the (previously computed) max length among corresponding maps up and down the section arrays.\r\n */\r\n public static remapa0a1WithinEachChain(sections: StrokeCountSection[]) {\r\n for (const section of sections) {\r\n for (const chain of section.chains) {\r\n chain.applySummed01Limits(0.0);\r\n }\r\n }\r\n }\r\n\r\n private static applyMultipassVisitorCallbackNoComponents(sections: StrokeCountSection[], chainIndex: number, primitiveIndex: number,\r\n componentIndex: number | undefined, callback: StrokeCountMapMultipassVisitor) {\r\n const numSection = sections.length;\r\n if (!callback.startSweeps(chainIndex, primitiveIndex, componentIndex)) return false;\r\n if (componentIndex === undefined) {\r\n // there are corresponding primitives directly at the section, chain, primitive index:\r\n for (let pass = 0; ; pass++) {\r\n if (!callback.startPass(pass))\r\n break;\r\n for (let sectionIndex = 0; sectionIndex < numSection; sectionIndex++)\r\n if (!callback.visit(pass, sections[sectionIndex].chains[chainIndex].maps[primitiveIndex]))\r\n return false;\r\n if (!callback.endPass(pass))\r\n return false;\r\n }\r\n } else {\r\n // there are corresponding primitives at the section, chain, primitive,componentIndex\r\n // there are corresponding primitives directly at the section, chain, primitive index:\r\n for (let pass = 0; ; pass++) {\r\n if (!callback.startPass(pass))\r\n break;\r\n for (let sectionIndex = 0; sectionIndex < numSection; sectionIndex++)\r\n if (!callback.visit(pass, sections[sectionIndex].chains[chainIndex].maps[primitiveIndex].componentData![componentIndex]))\r\n return false;\r\n if (!callback.endPass(pass))\r\n return false;\r\n }\r\n\r\n }\r\n if (!callback.endSweeps(chainIndex, primitiveIndex, componentIndex)) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Walk through the sections, emitting callbacks delimiting groups of corresponding primitives.\r\n * @param sections array of sections (possibly a single path or loop at each section, or possibly a set of parity loops.)\r\n * @param callback object to be notified during the traversal\r\n */\r\n public static runMultiPassVisitorAtCorrespondingPrimitives(sections: StrokeCountSection[], callback: StrokeCountMapMultipassVisitor): boolean {\r\n const numChainPerSection = sections[0].chains.length;\r\n for (let chainIndex = 0; chainIndex < numChainPerSection; chainIndex++) {\r\n const numPrimitive = sections[0].chains[chainIndex].maps.length;\r\n for (let primitiveIndex = 0; primitiveIndex < numPrimitive; primitiveIndex++) {\r\n if (sections[0].chains[chainIndex].maps[primitiveIndex].componentData) {\r\n const numComponent = sections[0].chains[chainIndex].maps[primitiveIndex]!.componentData!.length;\r\n for (let i = 0; i < numComponent; i++)\r\n if (!this.applyMultipassVisitorCallbackNoComponents(sections, chainIndex, primitiveIndex, i, callback))\r\n return false;\r\n\r\n } else {\r\n if (!this.applyMultipassVisitorCallbackNoComponents(sections, chainIndex, primitiveIndex, undefined, callback))\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * * Confirm that all sections in the array have the same structure.\r\n * * Within each corresponding set of entries, apply the max count to all.\r\n * @param sections array of per-section stroke count entries\r\n */\r\n public static enforceStrokeCountCompatibility(sections: StrokeCountSection[]): boolean {\r\n\r\n if (sections.length < 2)\r\n return true;\r\n if (!StrokeCountSection.areSectionsCompatible(sections, false))\r\n return false;\r\n const visitor = new StrokeCountMapVisitorApplyMaxCount();\r\n this.runMultiPassVisitorAtCorrespondingPrimitives(sections, visitor);\r\n return true;\r\n\r\n }\r\n /**\r\n * * Confirm that all sections in the array have the same structure.\r\n * * Within each corresponding set of entries up and down the sections, set curveLength as the maximum of the respective curve lengths.\r\n * * Along each section, sum curveLengths (which were just reset) to get consistent along-chain parameters\r\n * @param sections array of per-section stroke count entries\r\n */\r\n public static enforceCompatibleDistanceSums(sections: StrokeCountSection[]): boolean {\r\n\r\n if (sections.length < 2)\r\n return true;\r\n if (!StrokeCountSection.areSectionsCompatible(sections, false))\r\n return false;\r\n const visitor = new StrokeCountMapVisitorApplyMaxCurveLength();\r\n this.runMultiPassVisitorAtCorrespondingPrimitives(sections, visitor);\r\n this.remapa0a1WithinEachChain(sections);\r\n return true;\r\n\r\n }\r\n\r\n /**\r\n * Return stroked form of the section.\r\n */\r\n public getStrokes(): AnyCurve {\r\n if (this.chains.length === 1) {\r\n return this.chains[0].getStrokes();\r\n } else {\r\n const region = ParityRegion.create();\r\n for (const c of this.chains) {\r\n const strokes = c.getStrokes();\r\n if (strokes instanceof LineString3d)\r\n region.tryAddChild(Loop.create(strokes));\r\n }\r\n return region;\r\n }\r\n }\r\n /**\r\n * Given two compatible stroke sets (as returned by getStrokes) extend a range\r\n * with the distances between corresponding points.\r\n * * Each set of strokes may be:\r\n * * linestring\r\n * * ParityRegion\r\n * * CurveChain (Loop or Path)\r\n * @param strokeA first set of strokes\r\n * @param strokeB second set of strokes\r\n * @param rangeToExtend caller-allocated range to be extended.\r\n * @returns true if structures are compatible.\r\n */\r\n public static extendDistanceRangeBetweenStrokes(strokeA: AnyCurve, strokeB: AnyCurve, rangeToExtend: Range1d): boolean {\r\n if (strokeA instanceof LineString3d) {\r\n if (strokeB instanceof LineString3d) {\r\n if (strokeA.numPoints() === strokeB.numPoints()) {\r\n const n = strokeA.numPoints();\r\n const pointA = Point3d.create();\r\n const pointB = Point3d.create();\r\n const allPointA = strokeA.packedPoints;\r\n const allPointB = strokeB.packedPoints;\r\n\r\n for (let i = 0; i < n; i++) {\r\n allPointA.getPoint3dAtCheckedPointIndex(i, pointA);\r\n allPointB.getPoint3dAtCheckedPointIndex(i, pointB);\r\n rangeToExtend.extendX(pointA.distance(pointB));\r\n }\r\n return true;\r\n }\r\n }\r\n } else if (strokeA instanceof ParityRegion) {\r\n if (strokeB instanceof ParityRegion) {\r\n const childrenA = strokeA.children;\r\n const childrenB = strokeB.children;\r\n const n = childrenA.length;\r\n if (n === childrenB.length) {\r\n for (let i = 0; i < n; i++) {\r\n if (!this.extendDistanceRangeBetweenStrokes(childrenA[i], childrenB[i], rangeToExtend))\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n } else if (strokeA instanceof CurveChain) {\r\n if (strokeB instanceof CurveChain) {\r\n const childrenA = strokeA.children;\r\n const childrenB = strokeB.children;\r\n const n = childrenA.length;\r\n if (n === childrenB.length) {\r\n for (let i = 0; i < n; i++) {\r\n if (!this.extendDistanceRangeBetweenStrokes(childrenA[i], childrenB[i], rangeToExtend))\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"StrokeCountChain.js","sourceRoot":"","sources":["../../../../src/curve/Query/StrokeCountChain.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range1d } from \"../../geometry3d/Range\";\r\nimport { AnyCurve } from \"../CurveTypes\";\r\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { ParityRegion } from \"../ParityRegion\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\nimport { StrokeCountMap } from \"./StrokeCountMap\";\r\n\r\n// cspell:word remapa\r\n/**\r\n * abstract methods for callbacks during sweeps of collections of StrokeCount Structures.\r\n * * A set of StrokeCountMaps are to be visited multiple times.\r\n * * The logic that controls the sweep is as below.\r\n * * The callback object controls the number of sweeps and can adapt its action to the respective sweeps.\r\n * * Note that a \"false\" from cb.startPass() terminates passes for this chainIndex and primitiveIndex, but all others exit the whole sequence.\r\n * * This logic occurs 2 or three levels deep\r\n * * outer level is \"chains\". Simple swept path or loops have only one outer; parity regions have one outer per loop of the parity region\r\n * * second level is primitive within chain.\r\n * * If the primitives in a set are \"single component\", second level is lowest.\r\n * * startSweep() and endSweep() calls are two parameters, with undefined componentIndex\r\n * * If the primitives in a set are multi-component, there is a third level looping through corresponding components.\r\n * `\r\n * if (!cb.startSweeps (chainIndex, primitiveIndex, componentIndex))\r\n * return false;\r\n * for (let pass = 0;cb.startPass (pass); pass++){\r\n * for (each map in working set)\r\n * if (!cb.visit (pass, map)) return false;\r\n * if (!cb.endPass ()) return false;\r\n * }\r\n * }\r\n * if (!cb.endSweeps (chainIndex, primitiveIndex, componentIndex)) return false;\r\n * return true;\r\n * `\r\n * @internal\r\n */\r\nexport abstract class StrokeCountMapMultipassVisitor {\r\n /**\r\n * called to announce the beginning of one or more sweeps through related StrokeCountMap's\r\n * @param chainIndex index of loop or path within the various contours.\r\n * @param primitiveIndex index of primitive within the loop or path.\r\n * @param componentIndex optional component index.\r\n * @returns the number of sweeps to perform.\r\n */\r\n public startSweeps(_chainIndex: number, _primitiveIndex: number, _componentIndex?: number): boolean { return true; }\r\n /**\r\n * announce the beginning of a sweep pass.\r\n * @param pass the index (0,1...) for this sweep pass.\r\n * @return true to execute this pass. false to break from the pass loop (next method called is endSweeps)\r\n */\r\n public abstract startPass(pass: number): boolean;\r\n public abstract visit(pass: number, map: StrokeCountMap): boolean;\r\n /**\r\n * announce the end of a pass\r\n * @param pass the index (0,1...) for this sweep pass.\r\n * @return true to continue the sweeps.\r\n */\r\n\r\n public abstract endPass(pass: number): boolean;\r\n /**\r\n * announce the end of handling for particular chainIndex and primitiveIndex;\r\n * @return true to continue outer loops.\r\n */\r\n public endSweeps(_chainIndex: number, _primitiveIndex: number, _componentIndex?: number): boolean { return true; }\r\n\r\n}\r\n/**\r\n * * pass 1: determine max numStroke\r\n * * pass 2: impose max numStroke\r\n * @internal\r\n */\r\nexport class StrokeCountMapVisitorApplyMaxCount extends StrokeCountMapMultipassVisitor {\r\n public myMap: StrokeCountMap;\r\n public constructor() {\r\n super();\r\n this.myMap = StrokeCountMap.createWithComponentIndex();\r\n }\r\n /** set up for a pass through corresponding maps. */\r\n public startPass(pass: number): boolean {\r\n if (pass === 0) {\r\n this.myMap.numStroke = 0;\r\n return true;\r\n } else if (pass === 1) {\r\n // nothing to change == numStroke will be applied to each primitive.\r\n return true;\r\n }\r\n // all other pass numbers are rejected ...\r\n return false;\r\n }\r\n /** visit one of the set of corresponding maps. */\r\n public visit(pass: number, map: StrokeCountMap): boolean {\r\n if (pass === 0) {\r\n if (map.numStroke > this.myMap.numStroke)\r\n this.myMap.numStroke = map.numStroke;\r\n return true;\r\n } else if (pass === 1) {\r\n // apply the max from prior pass\r\n map.numStroke = this.myMap.numStroke;\r\n return true;\r\n }\r\n // no other pass values should happen -- canceled by startPass.\r\n return false;\r\n }\r\n\r\n public endPass(_pass: number): boolean { return true; }\r\n}\r\n/**\r\n * * pass 1: determine max curveLength among maps presented.\r\n * * pass 2: set the a0 and a1 values to 0 and that max distance\r\n * @internal\r\n */\r\nexport class StrokeCountMapVisitorApplyMaxCurveLength extends StrokeCountMapMultipassVisitor {\r\n public maxCurveLength: number;\r\n public constructor() {\r\n super();\r\n this.maxCurveLength = 0.0;\r\n }\r\n /** set up for a pass through corresponding maps. */\r\n public startPass(pass: number): boolean {\r\n if (pass === 0) {\r\n this.maxCurveLength = 0;\r\n return true;\r\n } else if (pass === 1) {\r\n // nothing to change == numStroke will be applied to each primitive.\r\n return true;\r\n }\r\n // all other pass numbers are rejected ...\r\n return false;\r\n }\r\n /** visit one of the set of corresponding maps. */\r\n public visit(pass: number, map: StrokeCountMap): boolean {\r\n if (pass === 0) {\r\n this.maxCurveLength = Geometry.maxXY(map.curveLength, this.maxCurveLength);\r\n return true;\r\n } else if (pass === 1) {\r\n // apply the max from prior pass\r\n map.a0 = 0.0;\r\n map.a1 = this.maxCurveLength;\r\n return true;\r\n }\r\n // no other pass values should happen -- canceled by startPass.\r\n return false;\r\n }\r\n\r\n public endPass(_pass: number): boolean { return true; }\r\n}\r\n/**\r\n * class `StrokeCountChain` contains:\r\n * * `maps` = an array of `StrokeCountMap`\r\n * * `parent` = parent CurveCollection.\r\n *\r\n * An instance is normally created with either a `Path` or `Loop` as the parent.\r\n */\r\nexport class StrokeCountChain {\r\n public maps: StrokeCountMap[];\r\n public parent?: CurveCollection;\r\n /**\r\n * options are used (with different purposes) at two times:\r\n * * When the StrokeCountChain is created, the options affect the stroke counts. This is just creating markup, not actual strokes.\r\n * * When actual stroking happens, the options control creation of parameters and tangents.\r\n */\r\n public options?: StrokeOptions;\r\n\r\n private constructor(parent?: CurveCollection, options?: StrokeOptions) {\r\n this.parent = parent;\r\n this.maps = [];\r\n this.options = options;\r\n }\r\n public static createForCurveChain(chain: CurveChain, options?: StrokeOptions): StrokeCountChain {\r\n const result = new StrokeCountChain(chain, options);\r\n result.parent = chain;\r\n // A chain can only contain primitives !!!!\r\n for (const p of chain.children) {\r\n p.computeAndAttachRecursiveStrokeCounts(options);\r\n if (p.strokeData)\r\n result.maps.push(p.strokeData);\r\n }\r\n return result;\r\n }\r\n public getStrokes(): LineString3d {\r\n const ls = LineString3d.create();\r\n if (this.options) {\r\n if (this.options.needNormals || this.options.needParams) {\r\n ls.ensureEmptyFractions();\r\n ls.ensureEmptyDerivatives();\r\n ls.ensureEmptyUVParams();\r\n }\r\n }\r\n for (const m of this.maps) {\r\n if (m.primitive)\r\n m.primitive.addMappedStrokesToLineString3D(m, ls);\r\n }\r\n return ls;\r\n\r\n }\r\n /** internal form of */\r\n private static applySummed01LimitsWithinArray(maps: StrokeCountMap[], incomingSum: number): number {\r\n let movingSum = incomingSum;\r\n for (const m of maps) {\r\n m.a0 += movingSum;\r\n if (m.componentData) {\r\n m.a1 = this.applySummed01LimitsWithinArray(m.componentData, m.a0);\r\n } else {\r\n m.a1 += movingSum;\r\n }\r\n movingSum = m.a1;\r\n }\r\n return movingSum;\r\n }\r\n /**\r\n * walk the maps in the array.\r\n * * in maps with no component data\r\n * * increment map.a0 and map.a1 by the incoming distance a0\r\n * * in maps with component data:\r\n * * recurse through the component array.\r\n * * increment map.a0 by the incoming a0.\r\n * * returned a1 from the componentData array becomes a1\r\n * @returns upper value of a1 in final map.\r\n * @param maps\r\n * @param incomingSum lower value to add to a0 for first map.\r\n */\r\n public applySummed01Limits(incomingSum: number): number {\r\n return StrokeCountChain.applySummed01LimitsWithinArray(this.maps, incomingSum);\r\n }\r\n}\r\n\r\n/**\r\n * class `StrokeCountSection`\\\r\n * * contains an array of `StrokeCountChain`.\r\n * * Hence it is the internal node level of a (1-level-deep) tree of `StrokeCountChain`\r\n * @internal\r\n */\r\nexport class StrokeCountSection {\r\n public chains: StrokeCountChain[];\r\n public parent?: CurveCollection;\r\n private constructor(parent?: CurveCollection) { this.parent = parent; this.chains = []; }\r\n /**\r\n * construct array of arrays of `StrokeCountMap`s\r\n * @param parent\r\n */\r\n public static createForParityRegionOrChain(parent: CurveCollection, options?: StrokeOptions): StrokeCountSection {\r\n const result = new StrokeCountSection(parent);\r\n if (parent instanceof ParityRegion) {\r\n for (const child of parent.children) {\r\n const p = StrokeCountChain.createForCurveChain(child, options);\r\n result.chains.push(p);\r\n }\r\n } else if (parent instanceof CurveChain) {\r\n result.chains.push(StrokeCountChain.createForCurveChain(parent, options));\r\n }\r\n return result;\r\n }\r\n /** test if all sections have the same structure. */\r\n public static areSectionsCompatible(sections: StrokeCountSection[], enforceCounts: boolean): boolean {\r\n if (sections.length < 2)\r\n return true; // hm.. don't know if that is useful, but nothing to check here.\r\n const numChains = sections[0].chains.length;\r\n for (let i = 1; i < sections.length; i++) {\r\n // first level: must match number of paths or loops\r\n if (sections[i].chains.length !== numChains)\r\n return false;\r\n // second level: must have same number of primitives in each path or loop\r\n for (let j = 0; j < sections[0].chains.length; j++) {\r\n const numPrimitive = sections[0].chains[j].maps.length;\r\n if (sections[i].chains[j].maps.length !== numPrimitive)\r\n return false;\r\n for (let k = 0; k < numPrimitive; k++) {\r\n if (!sections[0].chains[j].maps[k].isCompatibleComponentStructure(sections[i].chains[j].maps[k], enforceCounts))\r\n return false;\r\n }\r\n }\r\n\r\n }\r\n return true;\r\n }\r\n\r\n /** Within each section, sweep accumulate curveLength field, recording entry and exit sum in each map.\r\n * * In expected use, (a0,a1) are (0,a) where a is the (previously computed) max length among corresponding maps up and down the section arrays.\r\n */\r\n public static remapa0a1WithinEachChain(sections: StrokeCountSection[]) {\r\n for (const section of sections) {\r\n for (const chain of section.chains) {\r\n chain.applySummed01Limits(0.0);\r\n }\r\n }\r\n }\r\n\r\n private static applyMultipassVisitorCallbackNoComponents(sections: StrokeCountSection[], chainIndex: number, primitiveIndex: number,\r\n componentIndex: number | undefined, callback: StrokeCountMapMultipassVisitor) {\r\n const numSection = sections.length;\r\n if (!callback.startSweeps(chainIndex, primitiveIndex, componentIndex)) return false;\r\n if (componentIndex === undefined) {\r\n // there are corresponding primitives directly at the section, chain, primitive index:\r\n for (let pass = 0; ; pass++) {\r\n if (!callback.startPass(pass))\r\n break;\r\n for (let sectionIndex = 0; sectionIndex < numSection; sectionIndex++)\r\n if (!callback.visit(pass, sections[sectionIndex].chains[chainIndex].maps[primitiveIndex]))\r\n return false;\r\n if (!callback.endPass(pass))\r\n return false;\r\n }\r\n } else {\r\n // there are corresponding primitives at the section, chain, primitive,componentIndex\r\n // there are corresponding primitives directly at the section, chain, primitive index:\r\n for (let pass = 0; ; pass++) {\r\n if (!callback.startPass(pass))\r\n break;\r\n for (let sectionIndex = 0; sectionIndex < numSection; sectionIndex++)\r\n if (!callback.visit(pass, sections[sectionIndex].chains[chainIndex].maps[primitiveIndex].componentData![componentIndex]))\r\n return false;\r\n if (!callback.endPass(pass))\r\n return false;\r\n }\r\n\r\n }\r\n if (!callback.endSweeps(chainIndex, primitiveIndex, componentIndex)) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Walk through the sections, emitting callbacks delimiting groups of corresponding primitives.\r\n * @param sections array of sections (possibly a single path or loop at each section, or possibly a set of parity loops.)\r\n * @param callback object to be notified during the traversal\r\n */\r\n public static runMultiPassVisitorAtCorrespondingPrimitives(sections: StrokeCountSection[], callback: StrokeCountMapMultipassVisitor): boolean {\r\n const numChainPerSection = sections[0].chains.length;\r\n for (let chainIndex = 0; chainIndex < numChainPerSection; chainIndex++) {\r\n const numPrimitive = sections[0].chains[chainIndex].maps.length;\r\n for (let primitiveIndex = 0; primitiveIndex < numPrimitive; primitiveIndex++) {\r\n if (sections[0].chains[chainIndex].maps[primitiveIndex].componentData) {\r\n const numComponent = sections[0].chains[chainIndex].maps[primitiveIndex]!.componentData!.length;\r\n for (let i = 0; i < numComponent; i++)\r\n if (!this.applyMultipassVisitorCallbackNoComponents(sections, chainIndex, primitiveIndex, i, callback))\r\n return false;\r\n\r\n } else {\r\n if (!this.applyMultipassVisitorCallbackNoComponents(sections, chainIndex, primitiveIndex, undefined, callback))\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * * Confirm that all sections in the array have the same structure.\r\n * * Within each corresponding set of entries, apply the max count to all.\r\n * @param sections array of per-section stroke count entries\r\n */\r\n public static enforceStrokeCountCompatibility(sections: StrokeCountSection[]): boolean {\r\n\r\n if (sections.length < 2)\r\n return true;\r\n if (!StrokeCountSection.areSectionsCompatible(sections, false))\r\n return false;\r\n const visitor = new StrokeCountMapVisitorApplyMaxCount();\r\n this.runMultiPassVisitorAtCorrespondingPrimitives(sections, visitor);\r\n return true;\r\n\r\n }\r\n /**\r\n * * Confirm that all sections in the array have the same structure.\r\n * * Within each corresponding set of entries up and down the sections, set curveLength as the maximum of the respective curve lengths.\r\n * * Along each section, sum curveLengths (which were just reset) to get consistent along-chain parameters\r\n * @param sections array of per-section stroke count entries\r\n */\r\n public static enforceCompatibleDistanceSums(sections: StrokeCountSection[]): boolean {\r\n\r\n if (sections.length < 2)\r\n return true;\r\n if (!StrokeCountSection.areSectionsCompatible(sections, false))\r\n return false;\r\n const visitor = new StrokeCountMapVisitorApplyMaxCurveLength();\r\n this.runMultiPassVisitorAtCorrespondingPrimitives(sections, visitor);\r\n this.remapa0a1WithinEachChain(sections);\r\n return true;\r\n\r\n }\r\n\r\n /**\r\n * Return stroked form of the section.\r\n */\r\n public getStrokes(): AnyCurve {\r\n if (this.chains.length === 1) {\r\n return this.chains[0].getStrokes();\r\n } else {\r\n const region = ParityRegion.create();\r\n for (const c of this.chains) {\r\n const strokes = c.getStrokes();\r\n if (strokes instanceof LineString3d)\r\n region.tryAddChild(Loop.create(strokes));\r\n }\r\n return region;\r\n }\r\n }\r\n /**\r\n * Given two compatible stroke sets (as returned by getStrokes) extend a range\r\n * with the distances between corresponding points.\r\n * * Each set of strokes may be:\r\n * * linestring\r\n * * ParityRegion\r\n * * CurveChain (Loop or Path)\r\n * @param strokeA first set of strokes\r\n * @param strokeB second set of strokes\r\n * @param rangeToExtend caller-allocated range to be extended.\r\n * @returns true if structures are compatible.\r\n */\r\n public static extendDistanceRangeBetweenStrokes(strokeA: AnyCurve, strokeB: AnyCurve, rangeToExtend: Range1d): boolean {\r\n if (strokeA instanceof LineString3d) {\r\n if (strokeB instanceof LineString3d) {\r\n if (strokeA.numPoints() === strokeB.numPoints()) {\r\n const n = strokeA.numPoints();\r\n const pointA = Point3d.create();\r\n const pointB = Point3d.create();\r\n const allPointA = strokeA.packedPoints;\r\n const allPointB = strokeB.packedPoints;\r\n\r\n for (let i = 0; i < n; i++) {\r\n allPointA.getPoint3dAtCheckedPointIndex(i, pointA);\r\n allPointB.getPoint3dAtCheckedPointIndex(i, pointB);\r\n rangeToExtend.extendX(pointA.distance(pointB));\r\n }\r\n return true;\r\n }\r\n }\r\n } else if (strokeA instanceof ParityRegion) {\r\n if (strokeB instanceof ParityRegion) {\r\n const childrenA = strokeA.children;\r\n const childrenB = strokeB.children;\r\n const n = childrenA.length;\r\n if (n === childrenB.length) {\r\n for (let i = 0; i < n; i++) {\r\n if (!this.extendDistanceRangeBetweenStrokes(childrenA[i], childrenB[i], rangeToExtend))\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n } else if (strokeA instanceof CurveChain) {\r\n if (strokeB instanceof CurveChain) {\r\n const childrenA = strokeA.children;\r\n const childrenB = strokeB.children;\r\n const n = childrenA.length;\r\n if (n === childrenB.length) {\r\n for (let i = 0; i < n; i++) {\r\n if (!this.extendDistanceRangeBetweenStrokes(childrenA[i], childrenB[i], rangeToExtend))\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
@@ -1,17 +1,19 @@
1
+ import { GrowableXYZArray } from "../geometry3d/GrowableXYZArray";
1
2
  import { IndexedXYZCollection } from "../geometry3d/IndexedXYZCollection";
2
3
  import { Point3d } from "../geometry3d/Point3dVector3d";
3
4
  import { Range3d } from "../geometry3d/Range";
4
5
  import { Transform } from "../geometry3d/Transform";
5
6
  import { MomentData } from "../geometry4d/MomentData";
6
- import { Polyface } from "../polyface/Polyface";
7
+ import { IndexedPolyface, Polyface } from "../polyface/Polyface";
7
8
  import { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from "../topology/Graph";
8
9
  import { MultiLineStringDataVariant } from "../topology/Triangulation";
9
- import { AnyCurve, AnyRegion } from "./CurveChain";
10
- import { BagOfCurves, ConsolidateAdjacentCurvePrimitivesOptions, CurveChain, CurveCollection } from "./CurveCollection";
10
+ import { AnyCurve, AnyRegion } from "./CurveTypes";
11
+ import { BagOfCurves, CurveChain, CurveCollection } from "./CurveCollection";
11
12
  import { CurvePrimitive } from "./CurvePrimitive";
12
13
  import { Loop, SignedLoops } from "./Loop";
13
14
  import { JointOptions, OffsetOptions } from "./OffsetOptions";
14
15
  import { Path } from "./Path";
16
+ import { StrokeOptions } from "./StrokeOptions";
15
17
  /**
16
18
  * Possible return types from [[splitToPathsBetweenBreaks]], [[collectInsideAndOutsideOffsets]] and
17
19
  * [[collectChains]].
@@ -65,8 +67,6 @@ export declare class RegionOps {
65
67
  static computeXYAreaTolerance(range: Range3d, distanceTolerance?: number): number;
66
68
  /**
67
69
  * Return an xy area for a loop, parity region, or union region.
68
- * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with
69
- * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`
70
70
  * @param root any Loop, ParityRegion, or UnionRegion.
71
71
  */
72
72
  static computeXYArea(root: AnyRegion): number | undefined;
@@ -345,5 +345,54 @@ export declare class RegionOps {
345
345
  * @param worldToLocal transform to apply to data before computing its range
346
346
  */
347
347
  static curveArrayRange(data: any, worldToLocal?: Transform): Range3d;
348
+ /**
349
+ * Triangulate a stroked Loop or ParityRegion and return the graph.
350
+ * @param polygons polygons obtained by stroking a Loop or ParityRegion, z-coordinates ignored.
351
+ * @returns triangulated graph
352
+ */
353
+ private static triangulateStrokedRegionComponent;
354
+ /** Stroke a Loop or ParityRegion */
355
+ private static strokeRegionComponent;
356
+ /**
357
+ * Triangulate a Loop or ParityRegion and return the graph.
358
+ * @param component region, z-coordinates ignored
359
+ * @param options how to stroke loops
360
+ * @returns triangulated graph
361
+ */
362
+ private static triangulateRegionComponent;
363
+ /**
364
+ * Facet the region according to stroke options.
365
+ * @param region a closed xy-planar region, possibly with holes.
366
+ * * The z-coordinates of the region are ignored. Caller is responsible for rotating the region into plane local coordinates beforehand, and reversing the rotation afterwards.
367
+ * * For best results, `UnionRegion` input should consist of non-overlapping children.
368
+ * Caller can ensure this by passing in `region = RegionOps.regionBooleanXY(unionRegion, undefined, RegionBinaryOpType.Union)`.
369
+ * * For best results, `ParityRegion` input should be correctly oriented (holes have opposite orientation to their containing loop).
370
+ * Caller can ensure this for non-intersecting loops by passing in `region = RegionOps.sortOuterAndHoleLoopsXY(loops)`.
371
+ * @param options primarily how to stroke the region boundary, but also how to facet the region interior.
372
+ * * By default, a triangulation is returned, but if `options.maximizeConvexFacets === true`, edges between coplanar triangles are removed to return maximally convex facets.
373
+ * @returns facets for the region, or undefined if facetting failed
374
+ */
375
+ static facetRegionXY(region: AnyRegion, options?: StrokeOptions): IndexedPolyface | undefined;
376
+ /**
377
+ * Decompose a polygon with optional holes into an array of convex polygons.
378
+ * @param polygon polygon and hole loops, e.g., as returned by [[CurveCollection.cloneStroked]] on a Loop or ParityRegion. All z-coordinates are ignored.
379
+ * @param maximize whether to return maximally convex polygons. If false, triangles are returned.
380
+ * @returns array of convex polygons, or undefined if triangulation failed
381
+ */
382
+ static convexDecomposePolygonXY(polygon: MultiLineStringDataVariant, maximize?: boolean): GrowableXYZArray[] | undefined;
383
+ }
384
+ /**
385
+ * * Options to control method `RegionOps.consolidateAdjacentPrimitives`
386
+ * @public
387
+ */
388
+ export declare class ConsolidateAdjacentCurvePrimitivesOptions {
389
+ /** True to consolidated linear geometry (e.g. separate LineSegment3d and LineString3d) into LineString3d */
390
+ consolidateLinearGeometry: boolean;
391
+ /** True to consolidate contiguous arcs */
392
+ consolidateCompatibleArcs: boolean;
393
+ /** Tolerance for collapsing identical points */
394
+ duplicatePointTolerance: number;
395
+ /** Tolerance for removing interior colinear points. */
396
+ colinearPointTolerance: number;
348
397
  }
349
398
  //# sourceMappingURL=RegionOps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RegionOps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RegionOps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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"}
@@ -7,9 +7,10 @@
7
7
  */
8
8
  import { Geometry } from "../Geometry";
9
9
  import { GrowableXYZArray } from "../geometry3d/GrowableXYZArray";
10
- import { IndexedXYZCollection } from "../geometry3d/IndexedXYZCollection";
10
+ import { IndexedReadWriteXYZCollection, IndexedXYZCollection } from "../geometry3d/IndexedXYZCollection";
11
11
  import { Point3dArrayCarrier } from "../geometry3d/Point3dArrayCarrier";
12
12
  import { Point3d } from "../geometry3d/Point3dVector3d";
13
+ import { PolygonOps } from "../geometry3d/PolygonOps";
13
14
  import { PolylineCompressionContext } from "../geometry3d/PolylineCompressionByEdgeOffset";
14
15
  import { Range3d } from "../geometry3d/Range";
15
16
  import { SortablePolygon } from "../geometry3d/SortablePolygon";
@@ -18,6 +19,7 @@ import { MomentData } from "../geometry4d/MomentData";
18
19
  import { PolyfaceBuilder } from "../polyface/PolyfaceBuilder";
19
20
  import { HalfEdgeMask } from "../topology/Graph";
20
21
  import { HalfEdgeGraphSearch } from "../topology/HalfEdgeGraphSearch";
22
+ import { HalfEdgeGraphOps } from "../topology/Merging";
21
23
  import { Triangulator } from "../topology/Triangulation";
22
24
  import { BagOfCurves, CurveChain, CurveCollection } from "./CurveCollection";
23
25
  import { CurveCurve } from "./CurveCurve";
@@ -90,8 +92,6 @@ export class RegionOps {
90
92
  }
91
93
  /**
92
94
  * Return an xy area for a loop, parity region, or union region.
93
- * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with
94
- * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`
95
95
  * @param root any Loop, ParityRegion, or UnionRegion.
96
96
  */
97
97
  static computeXYArea(root) {
@@ -244,6 +244,8 @@ export class RegionOps {
244
244
  * to connect interior loops to exterior loops.
245
245
  */
246
246
  static regionBooleanXY(loopsA, loopsB, operation, mergeTolerance = Geometry.smallMetricDistance) {
247
+ // Always return UnionRegion for now. But keep return type as AnyRegion:
248
+ // in the future, we might return the *simplest* region type.
247
249
  const result = UnionRegion.create();
248
250
  const context = RegionBooleanContext.create(RegionGroupOpType.Union, RegionGroupOpType.Union);
249
251
  context.addMembers(loopsA, loopsB);
@@ -673,6 +675,138 @@ export class RegionOps {
673
675
  }
674
676
  return range;
675
677
  }
678
+ /**
679
+ * Triangulate a stroked Loop or ParityRegion and return the graph.
680
+ * @param polygons polygons obtained by stroking a Loop or ParityRegion, z-coordinates ignored.
681
+ * @returns triangulated graph
682
+ */
683
+ static triangulateStrokedRegionComponent(polygons) {
684
+ let graph;
685
+ if (Array.isArray(polygons)) {
686
+ if (polygons.length === 0)
687
+ return undefined;
688
+ const firstEntry = polygons[0];
689
+ if (Point3d.isAnyImmediatePointType(firstEntry)) {
690
+ graph = Triangulator.createTriangulatedGraphFromSingleLoop(polygons);
691
+ }
692
+ else if (polygons.length > 1) {
693
+ let writablePolygons;
694
+ if (firstEntry instanceof IndexedReadWriteXYZCollection) {
695
+ writablePolygons = polygons;
696
+ }
697
+ else {
698
+ writablePolygons = [];
699
+ for (const polygon of polygons)
700
+ writablePolygons.push(GrowableXYZArray.create(polygon));
701
+ }
702
+ const sortedPolygons = PolygonOps.sortOuterAndHoleLoopsXY(writablePolygons);
703
+ if (sortedPolygons.length === 1) { // below requires exactly one outer loop!
704
+ if (graph = Triangulator.createTriangulatedGraphFromLoops(sortedPolygons[0]))
705
+ Triangulator.flipTriangles(graph);
706
+ }
707
+ }
708
+ else {
709
+ graph = Triangulator.createTriangulatedGraphFromSingleLoop(firstEntry);
710
+ }
711
+ }
712
+ else {
713
+ graph = Triangulator.createTriangulatedGraphFromSingleLoop(polygons);
714
+ }
715
+ if (!graph) {
716
+ // Last resort: try full merge. Conveniently, multiple polygons are processed with parity logic.
717
+ if (graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(polygons, [], (inA, _inB) => inA)) {
718
+ if (Triangulator.triangulateAllPositiveAreaFaces(graph))
719
+ Triangulator.flipTriangles(graph);
720
+ }
721
+ }
722
+ return graph;
723
+ }
724
+ /** Stroke a Loop or ParityRegion */
725
+ static strokeRegionComponent(component, options) {
726
+ const strokedComponent = component.cloneStroked(options);
727
+ // package the stroked region as polygons
728
+ const polygons = [];
729
+ if (strokedComponent instanceof Loop) {
730
+ if (strokedComponent.children.length > 0 && strokedComponent.children[0] instanceof LineString3d)
731
+ polygons.push(strokedComponent.children[0].packedPoints); // expect only 1
732
+ }
733
+ else if (strokedComponent instanceof ParityRegion) {
734
+ for (const strokedLoop of strokedComponent.children) {
735
+ if (strokedLoop.children.length > 0 && strokedLoop.children[0] instanceof LineString3d)
736
+ polygons.push(strokedLoop.children[0].packedPoints); // expect only 1
737
+ }
738
+ }
739
+ return polygons;
740
+ }
741
+ /**
742
+ * Triangulate a Loop or ParityRegion and return the graph.
743
+ * @param component region, z-coordinates ignored
744
+ * @param options how to stroke loops
745
+ * @returns triangulated graph
746
+ */
747
+ static triangulateRegionComponent(component, options) {
748
+ const polygons = this.strokeRegionComponent(component, options);
749
+ return this.triangulateStrokedRegionComponent(polygons);
750
+ }
751
+ /**
752
+ * Facet the region according to stroke options.
753
+ * @param region a closed xy-planar region, possibly with holes.
754
+ * * The z-coordinates of the region are ignored. Caller is responsible for rotating the region into plane local coordinates beforehand, and reversing the rotation afterwards.
755
+ * * For best results, `UnionRegion` input should consist of non-overlapping children.
756
+ * Caller can ensure this by passing in `region = RegionOps.regionBooleanXY(unionRegion, undefined, RegionBinaryOpType.Union)`.
757
+ * * For best results, `ParityRegion` input should be correctly oriented (holes have opposite orientation to their containing loop).
758
+ * Caller can ensure this for non-intersecting loops by passing in `region = RegionOps.sortOuterAndHoleLoopsXY(loops)`.
759
+ * @param options primarily how to stroke the region boundary, but also how to facet the region interior.
760
+ * * By default, a triangulation is returned, but if `options.maximizeConvexFacets === true`, edges between coplanar triangles are removed to return maximally convex facets.
761
+ * @returns facets for the region, or undefined if facetting failed
762
+ */
763
+ static facetRegionXY(region, options) {
764
+ let graph;
765
+ if (region instanceof UnionRegion) {
766
+ for (const child of region.children) {
767
+ const childGraph = RegionOps.triangulateRegionComponent(child, options);
768
+ if (childGraph) {
769
+ if (!graph) {
770
+ graph = childGraph;
771
+ }
772
+ else {
773
+ // Graph concatenation without edge splits, clustering, and merge. We assume disjoint children so that at worst,
774
+ // components will have unshared adjacent exterior edges that remain after expandConvexFaces. Note that calling
775
+ // clusterAndMergeXYTheta here can create non-manifold topology!
776
+ graph.allHalfEdges.push(...childGraph.allHalfEdges);
777
+ }
778
+ }
779
+ }
780
+ }
781
+ else {
782
+ graph = this.triangulateRegionComponent(region, options);
783
+ }
784
+ if (!graph)
785
+ return undefined;
786
+ if (options?.maximizeConvexFacets)
787
+ HalfEdgeGraphOps.expandConvexFaces(graph);
788
+ return PolyfaceBuilder.graphToPolyface(graph, options);
789
+ }
790
+ /**
791
+ * Decompose a polygon with optional holes into an array of convex polygons.
792
+ * @param polygon polygon and hole loops, e.g., as returned by [[CurveCollection.cloneStroked]] on a Loop or ParityRegion. All z-coordinates are ignored.
793
+ * @param maximize whether to return maximally convex polygons. If false, triangles are returned.
794
+ * @returns array of convex polygons, or undefined if triangulation failed
795
+ */
796
+ static convexDecomposePolygonXY(polygon, maximize = true) {
797
+ const graph = RegionOps.triangulateStrokedRegionComponent(polygon);
798
+ if (!graph)
799
+ return undefined;
800
+ if (maximize)
801
+ HalfEdgeGraphOps.expandConvexFaces(graph);
802
+ const convexPolygons = [];
803
+ graph.announceFaceLoops((_graph, seed) => {
804
+ if (!seed.isMaskSet(HalfEdgeMask.EXTERIOR))
805
+ convexPolygons.push(GrowableXYZArray.create(seed.collectAroundFace((node) => { return node.getPoint3d(); })));
806
+ return true;
807
+ });
808
+ return convexPolygons;
809
+ }
676
810
  }
677
811
  /** @internal */
678
812
  function pushToInOnOutArrays(curve, select, arrayNegative, array0, arrayPositive) {
@@ -683,4 +817,20 @@ function pushToInOnOutArrays(curve, select, arrayNegative, array0, arrayPositive
683
817
  else
684
818
  array0.push(curve);
685
819
  }
820
+ /**
821
+ * * Options to control method `RegionOps.consolidateAdjacentPrimitives`
822
+ * @public
823
+ */
824
+ export class ConsolidateAdjacentCurvePrimitivesOptions {
825
+ constructor() {
826
+ /** True to consolidated linear geometry (e.g. separate LineSegment3d and LineString3d) into LineString3d */
827
+ this.consolidateLinearGeometry = true;
828
+ /** True to consolidate contiguous arcs */
829
+ this.consolidateCompatibleArcs = true;
830
+ /** Tolerance for collapsing identical points */
831
+ this.duplicatePointTolerance = Geometry.smallMetricDistance;
832
+ /** Tolerance for removing interior colinear points. */
833
+ this.colinearPointTolerance = Geometry.smallMetricDistance;
834
+ }
835
+ }
686
836
  //# sourceMappingURL=RegionOps.js.map