@itwin/core-geometry 5.0.0-dev.99 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/lib/cjs/Geometry.d.ts +15 -4
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +17 -3
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/BSpline1dNd.d.ts +1 -1
  7. package/lib/cjs/bspline/BSpline1dNd.js +1 -1
  8. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineSurface.d.ts +4 -3
  10. package/lib/cjs/bspline/BSplineSurface.d.ts.map +1 -1
  11. package/lib/cjs/bspline/BSplineSurface.js +6 -5
  12. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  13. package/lib/cjs/clipping/ClipPlane.d.ts +7 -5
  14. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  15. package/lib/cjs/clipping/ClipPlane.js +9 -5
  16. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  17. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  18. package/lib/cjs/clipping/ClipUtils.js +5 -3
  19. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  20. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  21. package/lib/cjs/clipping/ConvexClipPlaneSet.js +12 -23
  22. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  23. package/lib/cjs/core-geometry.d.ts +1 -0
  24. package/lib/cjs/core-geometry.d.ts.map +1 -1
  25. package/lib/cjs/core-geometry.js +1 -0
  26. package/lib/cjs/core-geometry.js.map +1 -1
  27. package/lib/cjs/curve/Arc3d.d.ts +56 -32
  28. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  29. package/lib/cjs/curve/Arc3d.js +91 -36
  30. package/lib/cjs/curve/Arc3d.js.map +1 -1
  31. package/lib/cjs/curve/CurveCollection.d.ts +2 -0
  32. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  33. package/lib/cjs/curve/CurveCollection.js +14 -0
  34. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  35. package/lib/cjs/curve/CurveExtendMode.d.ts +13 -5
  36. package/lib/cjs/curve/CurveExtendMode.d.ts.map +1 -1
  37. package/lib/cjs/curve/CurveExtendMode.js +19 -15
  38. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  39. package/lib/cjs/curve/CurveLocationDetail.d.ts +1 -1
  40. package/lib/cjs/curve/CurveLocationDetail.js +1 -1
  41. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  42. package/lib/cjs/curve/CurvePrimitive.d.ts +67 -8
  43. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  44. package/lib/cjs/curve/CurvePrimitive.js +59 -6
  45. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  46. package/lib/cjs/curve/CurveTypes.d.ts +1 -1
  47. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  48. package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
  49. package/lib/cjs/curve/LineSegment3d.js +1 -0
  50. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  51. package/lib/cjs/curve/LineString3d.d.ts +8 -7
  52. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  53. package/lib/cjs/curve/LineString3d.js +25 -22
  54. package/lib/cjs/curve/LineString3d.js.map +1 -1
  55. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  56. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +10 -5
  57. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  58. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  59. package/lib/cjs/curve/Query/PlanarSubdivision.js +7 -2
  60. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  61. package/lib/cjs/curve/RegionMomentsXY.d.ts +15 -21
  62. package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
  63. package/lib/cjs/curve/RegionMomentsXY.js +38 -58
  64. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  65. package/lib/cjs/curve/RegionOps.d.ts +70 -38
  66. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  67. package/lib/cjs/curve/RegionOps.js +115 -45
  68. package/lib/cjs/curve/RegionOps.js.map +1 -1
  69. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +12 -13
  70. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  71. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +23 -23
  72. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  73. package/lib/cjs/curve/StrokeOptions.d.ts +1 -1
  74. package/lib/cjs/curve/StrokeOptions.js +1 -1
  75. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  76. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts +71 -0
  77. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -0
  78. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js +181 -0
  79. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -0
  80. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +21 -5
  81. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  82. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +42 -17
  83. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  84. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  85. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +36 -12
  86. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  87. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +5 -3
  88. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +1 -1
  89. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js +5 -3
  90. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  91. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.d.ts +14 -0
  92. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.d.ts.map +1 -0
  93. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js +34 -0
  94. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -0
  95. package/lib/cjs/geometry3d/AngleSweep.d.ts +25 -18
  96. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  97. package/lib/cjs/geometry3d/AngleSweep.js +39 -25
  98. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  99. package/lib/cjs/geometry3d/GeometryHandler.d.ts +15 -16
  100. package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
  101. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  102. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
  103. package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
  104. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  105. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +7 -2
  106. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  107. package/lib/cjs/geometry3d/GrowableXYZArray.js +20 -2
  108. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  109. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +2 -1
  110. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  111. package/lib/cjs/geometry3d/IndexedXYZCollection.js +7 -3
  112. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  113. package/lib/cjs/geometry3d/Matrix3d.d.ts +10 -11
  114. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  115. package/lib/cjs/geometry3d/Matrix3d.js +11 -12
  116. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  117. package/lib/cjs/geometry3d/Plane3d.d.ts +2 -0
  118. package/lib/cjs/geometry3d/Plane3d.d.ts.map +1 -1
  119. package/lib/cjs/geometry3d/Plane3d.js +6 -1
  120. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  121. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  122. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  123. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  124. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  125. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  126. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  127. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  128. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  129. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +4 -4
  130. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  131. package/lib/cjs/geometry3d/Point3dVector3d.js +6 -6
  132. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  133. package/lib/cjs/geometry3d/PointHelpers.d.ts +7 -7
  134. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  135. package/lib/cjs/geometry3d/PointHelpers.js +66 -26
  136. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  137. package/lib/cjs/geometry3d/PolygonOps.d.ts +57 -9
  138. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  139. package/lib/cjs/geometry3d/PolygonOps.js +57 -17
  140. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  141. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  142. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  143. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  144. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  145. package/lib/cjs/geometry3d/PolylineOps.d.ts +5 -4
  146. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  147. package/lib/cjs/geometry3d/PolylineOps.js +5 -4
  148. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  149. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  150. package/lib/cjs/geometry3d/Ray3d.js +11 -23
  151. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  152. package/lib/cjs/geometry3d/Transform.d.ts +21 -2
  153. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  154. package/lib/cjs/geometry3d/Transform.js +32 -13
  155. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  156. package/lib/cjs/geometry4d/Matrix4d.d.ts +7 -7
  157. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  158. package/lib/cjs/geometry4d/Matrix4d.js +9 -9
  159. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  160. package/lib/cjs/geometry4d/MomentData.d.ts +32 -34
  161. package/lib/cjs/geometry4d/MomentData.d.ts.map +1 -1
  162. package/lib/cjs/geometry4d/MomentData.js +56 -57
  163. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  164. package/lib/cjs/geometry4d/Point4d.d.ts +8 -5
  165. package/lib/cjs/geometry4d/Point4d.d.ts.map +1 -1
  166. package/lib/cjs/geometry4d/Point4d.js +27 -16
  167. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  168. package/lib/cjs/polyface/FacetOrientation.d.ts +1 -1
  169. package/lib/cjs/polyface/FacetOrientation.js +2 -2
  170. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  171. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts +55 -40
  172. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  173. package/lib/cjs/polyface/IndexedEdgeMatcher.js +83 -75
  174. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  175. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  176. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  177. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +47 -38
  178. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  179. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  180. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  181. package/lib/cjs/polyface/IndexedPolyfaceWalker.js +47 -32
  182. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  183. package/lib/cjs/polyface/Polyface.d.ts +19 -5
  184. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  185. package/lib/cjs/polyface/Polyface.js +18 -2
  186. package/lib/cjs/polyface/Polyface.js.map +1 -1
  187. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +1 -1
  188. package/lib/cjs/polyface/PolyfaceBuilder.js +3 -3
  189. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  190. package/lib/cjs/polyface/PolyfaceClip.d.ts +19 -18
  191. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  192. package/lib/cjs/polyface/PolyfaceClip.js +39 -42
  193. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  194. package/lib/cjs/polyface/PolyfaceData.d.ts +1 -1
  195. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  196. package/lib/cjs/polyface/PolyfaceData.js +3 -1
  197. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  198. package/lib/cjs/polyface/PolyfaceQuery.d.ts +119 -78
  199. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  200. package/lib/cjs/polyface/PolyfaceQuery.js +315 -231
  201. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  202. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  203. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  204. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +3 -3
  205. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  206. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  207. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  208. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  209. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  210. package/lib/cjs/serialization/GeometrySamples.d.ts +1 -1
  211. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  212. package/lib/cjs/serialization/GeometrySamples.js +1 -1
  213. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  214. package/lib/cjs/serialization/IModelJsonSchema.d.ts +3 -3
  215. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  216. package/lib/cjs/topology/ChainMerge.d.ts +1 -1
  217. package/lib/cjs/topology/ChainMerge.js +1 -1
  218. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  219. package/lib/cjs/topology/Triangulation.d.ts +3 -3
  220. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  221. package/lib/cjs/topology/Triangulation.js +7 -7
  222. package/lib/cjs/topology/Triangulation.js.map +1 -1
  223. package/lib/esm/Geometry.d.ts +15 -4
  224. package/lib/esm/Geometry.d.ts.map +1 -1
  225. package/lib/esm/Geometry.js +17 -3
  226. package/lib/esm/Geometry.js.map +1 -1
  227. package/lib/esm/bspline/BSpline1dNd.d.ts +1 -1
  228. package/lib/esm/bspline/BSpline1dNd.js +1 -1
  229. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  230. package/lib/esm/bspline/BSplineSurface.d.ts +4 -3
  231. package/lib/esm/bspline/BSplineSurface.d.ts.map +1 -1
  232. package/lib/esm/bspline/BSplineSurface.js +6 -5
  233. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  234. package/lib/esm/clipping/ClipPlane.d.ts +7 -5
  235. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  236. package/lib/esm/clipping/ClipPlane.js +9 -5
  237. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  238. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  239. package/lib/esm/clipping/ClipUtils.js +5 -3
  240. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  241. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  242. package/lib/esm/clipping/ConvexClipPlaneSet.js +12 -23
  243. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  244. package/lib/esm/core-geometry.d.ts +1 -0
  245. package/lib/esm/core-geometry.d.ts.map +1 -1
  246. package/lib/esm/core-geometry.js +1 -0
  247. package/lib/esm/core-geometry.js.map +1 -1
  248. package/lib/esm/curve/Arc3d.d.ts +56 -32
  249. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  250. package/lib/esm/curve/Arc3d.js +91 -36
  251. package/lib/esm/curve/Arc3d.js.map +1 -1
  252. package/lib/esm/curve/CurveCollection.d.ts +2 -0
  253. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  254. package/lib/esm/curve/CurveCollection.js +14 -0
  255. package/lib/esm/curve/CurveCollection.js.map +1 -1
  256. package/lib/esm/curve/CurveExtendMode.d.ts +13 -5
  257. package/lib/esm/curve/CurveExtendMode.d.ts.map +1 -1
  258. package/lib/esm/curve/CurveExtendMode.js +19 -15
  259. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  260. package/lib/esm/curve/CurveLocationDetail.d.ts +1 -1
  261. package/lib/esm/curve/CurveLocationDetail.js +1 -1
  262. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  263. package/lib/esm/curve/CurvePrimitive.d.ts +67 -8
  264. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  265. package/lib/esm/curve/CurvePrimitive.js +59 -6
  266. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  267. package/lib/esm/curve/CurveTypes.d.ts +1 -1
  268. package/lib/esm/curve/CurveTypes.js.map +1 -1
  269. package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
  270. package/lib/esm/curve/LineSegment3d.js +1 -0
  271. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  272. package/lib/esm/curve/LineString3d.d.ts +8 -7
  273. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  274. package/lib/esm/curve/LineString3d.js +25 -22
  275. package/lib/esm/curve/LineString3d.js.map +1 -1
  276. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  277. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +10 -5
  278. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  279. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  280. package/lib/esm/curve/Query/PlanarSubdivision.js +7 -2
  281. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  282. package/lib/esm/curve/RegionMomentsXY.d.ts +15 -21
  283. package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
  284. package/lib/esm/curve/RegionMomentsXY.js +38 -58
  285. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  286. package/lib/esm/curve/RegionOps.d.ts +70 -38
  287. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  288. package/lib/esm/curve/RegionOps.js +116 -46
  289. package/lib/esm/curve/RegionOps.js.map +1 -1
  290. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +12 -13
  291. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  292. package/lib/esm/curve/RegionOpsClassificationSweeps.js +23 -23
  293. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  294. package/lib/esm/curve/StrokeOptions.d.ts +1 -1
  295. package/lib/esm/curve/StrokeOptions.js +1 -1
  296. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  297. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts +71 -0
  298. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -0
  299. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js +177 -0
  300. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -0
  301. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +21 -5
  302. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  303. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +42 -17
  304. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  305. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  306. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +36 -12
  307. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  308. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +5 -3
  309. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +1 -1
  310. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js +5 -3
  311. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  312. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.d.ts +14 -0
  313. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.d.ts.map +1 -0
  314. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js +30 -0
  315. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -0
  316. package/lib/esm/geometry3d/AngleSweep.d.ts +25 -18
  317. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  318. package/lib/esm/geometry3d/AngleSweep.js +39 -25
  319. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  320. package/lib/esm/geometry3d/GeometryHandler.d.ts +15 -16
  321. package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
  322. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  323. package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
  324. package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
  325. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  326. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +7 -2
  327. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  328. package/lib/esm/geometry3d/GrowableXYZArray.js +20 -2
  329. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  330. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +2 -1
  331. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  332. package/lib/esm/geometry3d/IndexedXYZCollection.js +7 -3
  333. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  334. package/lib/esm/geometry3d/Matrix3d.d.ts +10 -11
  335. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  336. package/lib/esm/geometry3d/Matrix3d.js +11 -12
  337. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  338. package/lib/esm/geometry3d/Plane3d.d.ts +2 -0
  339. package/lib/esm/geometry3d/Plane3d.d.ts.map +1 -1
  340. package/lib/esm/geometry3d/Plane3d.js +6 -1
  341. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  342. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  343. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  344. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  345. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  346. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  347. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  348. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  349. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  350. package/lib/esm/geometry3d/Point3dVector3d.d.ts +4 -4
  351. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  352. package/lib/esm/geometry3d/Point3dVector3d.js +6 -6
  353. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  354. package/lib/esm/geometry3d/PointHelpers.d.ts +7 -7
  355. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  356. package/lib/esm/geometry3d/PointHelpers.js +66 -26
  357. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  358. package/lib/esm/geometry3d/PolygonOps.d.ts +57 -9
  359. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  360. package/lib/esm/geometry3d/PolygonOps.js +57 -17
  361. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  362. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  363. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  364. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  365. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  366. package/lib/esm/geometry3d/PolylineOps.d.ts +5 -4
  367. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  368. package/lib/esm/geometry3d/PolylineOps.js +5 -4
  369. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  370. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  371. package/lib/esm/geometry3d/Ray3d.js +11 -23
  372. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  373. package/lib/esm/geometry3d/Transform.d.ts +21 -2
  374. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  375. package/lib/esm/geometry3d/Transform.js +32 -13
  376. package/lib/esm/geometry3d/Transform.js.map +1 -1
  377. package/lib/esm/geometry4d/Matrix4d.d.ts +7 -7
  378. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  379. package/lib/esm/geometry4d/Matrix4d.js +9 -9
  380. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  381. package/lib/esm/geometry4d/MomentData.d.ts +32 -34
  382. package/lib/esm/geometry4d/MomentData.d.ts.map +1 -1
  383. package/lib/esm/geometry4d/MomentData.js +56 -57
  384. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  385. package/lib/esm/geometry4d/Point4d.d.ts +8 -5
  386. package/lib/esm/geometry4d/Point4d.d.ts.map +1 -1
  387. package/lib/esm/geometry4d/Point4d.js +27 -16
  388. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  389. package/lib/esm/polyface/FacetOrientation.d.ts +1 -1
  390. package/lib/esm/polyface/FacetOrientation.js +2 -2
  391. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  392. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts +55 -40
  393. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  394. package/lib/esm/polyface/IndexedEdgeMatcher.js +83 -75
  395. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  396. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  397. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  398. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +47 -38
  399. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  400. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  401. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  402. package/lib/esm/polyface/IndexedPolyfaceWalker.js +47 -32
  403. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  404. package/lib/esm/polyface/Polyface.d.ts +19 -5
  405. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  406. package/lib/esm/polyface/Polyface.js +18 -2
  407. package/lib/esm/polyface/Polyface.js.map +1 -1
  408. package/lib/esm/polyface/PolyfaceBuilder.d.ts +1 -1
  409. package/lib/esm/polyface/PolyfaceBuilder.js +3 -3
  410. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  411. package/lib/esm/polyface/PolyfaceClip.d.ts +19 -18
  412. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  413. package/lib/esm/polyface/PolyfaceClip.js +39 -42
  414. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  415. package/lib/esm/polyface/PolyfaceData.d.ts +1 -1
  416. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  417. package/lib/esm/polyface/PolyfaceData.js +3 -1
  418. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  419. package/lib/esm/polyface/PolyfaceQuery.d.ts +119 -78
  420. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  421. package/lib/esm/polyface/PolyfaceQuery.js +316 -232
  422. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  423. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  424. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  425. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +3 -3
  426. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  427. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  428. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  429. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  430. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  431. package/lib/esm/serialization/GeometrySamples.d.ts +1 -1
  432. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  433. package/lib/esm/serialization/GeometrySamples.js +1 -1
  434. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  435. package/lib/esm/serialization/IModelJsonSchema.d.ts +3 -3
  436. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  437. package/lib/esm/topology/ChainMerge.d.ts +1 -1
  438. package/lib/esm/topology/ChainMerge.js +1 -1
  439. package/lib/esm/topology/ChainMerge.js.map +1 -1
  440. package/lib/esm/topology/Triangulation.d.ts +3 -3
  441. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  442. package/lib/esm/topology/Triangulation.js +7 -7
  443. package/lib/esm/topology/Triangulation.js.map +1 -1
  444. package/package.json +3 -3
@@ -5,6 +5,7 @@
5
5
  /** @packageDocumentation
6
6
  * @module Curve
7
7
  */
8
+ import { Geometry } from "../../Geometry";
8
9
  import { NullGeometryHandler } from "../../geometry3d/GeometryHandler";
9
10
  import { PolylineCompressionContext } from "../../geometry3d/PolylineCompressionByEdgeOffset";
10
11
  import { PolylineOps } from "../../geometry3d/PolylineOps";
@@ -54,7 +55,14 @@ export class ConsolidateAdjacentCurvePrimitivesContext extends NullGeometryHandl
54
55
  break;
55
56
  }
56
57
  }
57
- if (points.length > 1) {
58
+ if (points.length <= 1) {
59
+ g.children[numAccept++] = basePrimitive;
60
+ }
61
+ else if (this._options.disableLinearCompression) {
62
+ const pointsDeduped = PolylineOps.compressShortEdges(points, Geometry.smallFloatingPoint); // remove only exact duplicate interior points
63
+ g.children[numAccept++] = LineString3d.createPoints(pointsDeduped);
64
+ }
65
+ else { // compress points
58
66
  const compressedPointsA = PolylineOps.compressShortEdges(points, this._options.duplicatePointTolerance);
59
67
  const compressedPointsB = PolylineOps.compressByPerpendicularDistance(compressedPointsA, this._options.colinearPointTolerance);
60
68
  if (i0 === 0 && i1 === numOriginal) {
@@ -72,9 +80,6 @@ export class ConsolidateAdjacentCurvePrimitivesContext extends NullGeometryHandl
72
80
  g.children[numAccept++] = LineString3d.createPoints(compressedPointsB);
73
81
  }
74
82
  }
75
- else {
76
- g.children[numAccept++] = basePrimitive;
77
- }
78
83
  i0 = i1;
79
84
  }
80
85
  else if (this._options.consolidateCompatibleArcs && basePrimitive instanceof Arc3d) {
@@ -84,7 +89,7 @@ export class ConsolidateAdjacentCurvePrimitivesContext extends NullGeometryHandl
84
89
  const nextPrimitive = g.children[i0];
85
90
  if (!(nextPrimitive instanceof Arc3d))
86
91
  break;
87
- if (!CurveFactory.appendToArcInPlace(basePrimitive, nextPrimitive))
92
+ if (!CurveFactory.appendToArcInPlace(basePrimitive, nextPrimitive)) // TODO: use this._options.duplicatePointTolerance
88
93
  break;
89
94
  }
90
95
  // i0 has already advanced
@@ -1 +1 @@
1
- {"version":3,"file":"ConsolidateAdjacentPrimitivesContext.js","sourceRoot":"","sources":["../../../../src/curve/Query/ConsolidateAdjacentPrimitivesContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { NullGeometryHandler } from \"../../geometry3d/GeometryHandler\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { PolylineCompressionContext } from \"../../geometry3d/PolylineCompressionByEdgeOffset\";\nimport { PolylineOps } from \"../../geometry3d/PolylineOps\";\nimport { Arc3d } from \"../Arc3d\";\nimport { CurveChain } from \"../CurveCollection\";\nimport { CurveFactory } from \"../CurveFactory\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop } from \"../Loop\";\nimport { ParityRegion } from \"../ParityRegion\";\nimport { Path } from \"../Path\";\nimport { ConsolidateAdjacentCurvePrimitivesOptions } from \"../RegionOps\";\nimport { UnionRegion } from \"../UnionRegion\";\n\n/**\n * * Implementation class for ConsolidateAdjacentCurvePrimitives.\n *\n * @internal\n */\nexport class ConsolidateAdjacentCurvePrimitivesContext extends NullGeometryHandler {\n private _options: ConsolidateAdjacentCurvePrimitivesOptions;\n public constructor(options?: ConsolidateAdjacentCurvePrimitivesOptions) {\n super();\n this._options = options ? options : new ConsolidateAdjacentCurvePrimitivesOptions();\n }\n /** look for adjacent compatible primitives in a path or loop. */\n public handleCurveChain(g: CurveChain) {\n const children = g.children;\n const numOriginal = children.length;\n const points: Point3d[] = [];\n let numAccept = 0;\n // i0 <=i < i1 is a range of child indices.\n // numAccept is the number of children accepted (contiguously at front of children)\n for (let i0 = 0; i0 < numOriginal;) {\n const basePrimitive = g.children[i0];\n if (this._options.consolidateLinearGeometry && (basePrimitive instanceof LineSegment3d || basePrimitive instanceof LineString3d)) {\n points.length = 0;\n let i1 = i0;\n // on exit, i1 is beyond the block of linear primitives . ..\n for (; i1 < g.children.length; i1++) {\n const nextPrimitive = g.children[i1];\n if (nextPrimitive instanceof LineSegment3d) {\n points.push(nextPrimitive.startPoint());\n points.push(nextPrimitive.endPoint());\n } else if (nextPrimitive instanceof LineString3d) {\n const source = nextPrimitive.packedPoints;\n for (let k = 0; k < source.length; k++) {\n points.push(source.getPoint3dAtUncheckedPointIndex(k));\n }\n } else {\n break;\n }\n }\n if (points.length > 1) {\n const compressedPointsA = PolylineOps.compressShortEdges(points, this._options.duplicatePointTolerance);\n const compressedPointsB = PolylineOps.compressByPerpendicularDistance(compressedPointsA, this._options.colinearPointTolerance);\n if (i0 === 0 && i1 === numOriginal) {\n // points is the entire curve, and the curve is closed. Maybe the first and last segments are colinear.\n PolylineCompressionContext.compressColinearWrapInPlace(compressedPointsB, this._options.duplicatePointTolerance, this._options.colinearPointTolerance);\n }\n if (compressedPointsB.length < 2) {\n // Collapsed to a point? Make a single point linestring\n g.children[numAccept++] = LineString3d.create(compressedPointsB[0]);\n } else if (compressedPointsB.length === 2) {\n g.children[numAccept++] = LineSegment3d.create(compressedPointsB[0], compressedPointsB[1]);\n } else {\n g.children[numAccept++] = LineString3d.createPoints(compressedPointsB);\n }\n } else {\n g.children[numAccept++] = basePrimitive;\n }\n i0 = i1;\n } else if (this._options.consolidateCompatibleArcs && basePrimitive instanceof Arc3d) {\n // subsume subsequent arcs into basePrimitive.\n // always accept base primitive.\n for (; ++i0 < g.children.length;) {\n const nextPrimitive = g.children[i0];\n if (!(nextPrimitive instanceof Arc3d))\n break;\n if (!CurveFactory.appendToArcInPlace(basePrimitive, nextPrimitive))\n break;\n }\n // i0 has already advanced\n g.children[numAccept++] = basePrimitive; // which has been extended 0 or more times.\n } else {\n g.children[numAccept++] = basePrimitive;\n i0++;\n }\n }\n g.children.length = numAccept;\n }\n\n public override handlePath(g: Path): any { return this.handleCurveChain(g); }\n public override handleLoop(g: Loop): any { return this.handleCurveChain(g); }\n public override handleParityRegion(g: ParityRegion): any {\n for (const child of g.children)\n child.dispatchToGeometryHandler(this);\n }\n public override handleUnionRegion(g: UnionRegion): any {\n for (const child of g.children)\n child.dispatchToGeometryHandler(this);\n }\n}\n"]}
1
+ {"version":3,"file":"ConsolidateAdjacentPrimitivesContext.js","sourceRoot":"","sources":["../../../../src/curve/Query/ConsolidateAdjacentPrimitivesContext.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,yCAAyC,EAAE,MAAM,cAAc,CAAC;AAGzE;;;;GAIG;AACH,MAAM,OAAO,yCAA0C,SAAQ,mBAAmB;IACxE,QAAQ,CAA4C;IAC5D,YAAmB,OAAmD;QACpE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,yCAAyC,EAAE,CAAC;IACtF,CAAC;IACD,iEAAiE;IAC1D,gBAAgB,CAAC,CAAa;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC5B,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;QACpC,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,2CAA2C;QAC3C,mFAAmF;QACnF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,WAAW,GAAG,CAAC;YACnC,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,yBAAyB,IAAI,CAAC,aAAa,YAAY,aAAa,IAAI,aAAa,YAAY,YAAY,CAAC,EAAE,CAAC;gBACjI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,IAAI,EAAE,GAAG,EAAE,CAAC;gBACZ,6DAA6D;gBAC7D,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;oBACpC,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACrC,IAAI,aAAa,YAAY,aAAa,EAAE,CAAC;wBAC3C,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;wBACxC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACxC,CAAC;yBAAM,IAAI,aAAa,YAAY,YAAY,EAAE,CAAC;wBACjD,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC;wBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;4BACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC;wBACzD,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACvB,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC;gBAC1C,CAAC;qBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC;oBAClD,MAAM,aAAa,GAAG,WAAW,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,8CAA8C;oBACzI,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;gBACrE,CAAC;qBAAM,CAAC,CAAC,kBAAkB;oBACzB,MAAM,iBAAiB,GAAG,WAAW,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;oBACxG,MAAM,iBAAiB,GAAG,WAAW,CAAC,+BAA+B,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;oBAC/H,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;wBACnC,yGAAyG;wBACzG,0BAA0B,CAAC,2BAA2B,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;oBACzJ,CAAC;oBACD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACjC,wDAAwD;wBACxD,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;oBACtE,CAAC;yBAAM,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC1C,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7F,CAAC;yBAAM,CAAC;wBACN,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;oBACzE,CAAC;gBACH,CAAC;gBACD,EAAE,GAAG,EAAE,CAAC;YACV,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,yBAAyB,IAAI,aAAa,YAAY,KAAK,EAAE,CAAC;gBACrF,8CAA8C;gBAC9C,gCAAgC;gBAChC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACjC,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACrC,IAAI,CAAC,CAAC,aAAa,YAAY,KAAK,CAAC;wBACnC,MAAM;oBACR,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,kDAAkD;wBACpH,MAAM;gBACV,CAAC;gBACD,0BAA0B;gBAC1B,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,2CAA2C;YACtF,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC;gBACxC,EAAE,EAAE,CAAC;YACP,CAAC;QACH,CAAC;QACD,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;IAChC,CAAC;IAEe,UAAU,CAAC,CAAO,IAAS,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,UAAU,CAAC,CAAO,IAAS,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,kBAAkB,CAAC,CAAe;QAChD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ;YAC5B,KAAK,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACe,iBAAiB,CAAC,CAAc;QAC9C,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ;YAC5B,KAAK,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { Geometry } from \"../../Geometry\";\nimport { NullGeometryHandler } from \"../../geometry3d/GeometryHandler\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { PolylineCompressionContext } from \"../../geometry3d/PolylineCompressionByEdgeOffset\";\nimport { PolylineOps } from \"../../geometry3d/PolylineOps\";\nimport { Arc3d } from \"../Arc3d\";\nimport { CurveChain } from \"../CurveCollection\";\nimport { CurveFactory } from \"../CurveFactory\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop } from \"../Loop\";\nimport { ParityRegion } from \"../ParityRegion\";\nimport { Path } from \"../Path\";\nimport { ConsolidateAdjacentCurvePrimitivesOptions } from \"../RegionOps\";\nimport { UnionRegion } from \"../UnionRegion\";\n\n/**\n * * Implementation class for ConsolidateAdjacentCurvePrimitives.\n *\n * @internal\n */\nexport class ConsolidateAdjacentCurvePrimitivesContext extends NullGeometryHandler {\n private _options: ConsolidateAdjacentCurvePrimitivesOptions;\n public constructor(options?: ConsolidateAdjacentCurvePrimitivesOptions) {\n super();\n this._options = options ? options : new ConsolidateAdjacentCurvePrimitivesOptions();\n }\n /** look for adjacent compatible primitives in a path or loop. */\n public handleCurveChain(g: CurveChain) {\n const children = g.children;\n const numOriginal = children.length;\n const points: Point3d[] = [];\n let numAccept = 0;\n // i0 <=i < i1 is a range of child indices.\n // numAccept is the number of children accepted (contiguously at front of children)\n for (let i0 = 0; i0 < numOriginal;) {\n const basePrimitive = g.children[i0];\n if (this._options.consolidateLinearGeometry && (basePrimitive instanceof LineSegment3d || basePrimitive instanceof LineString3d)) {\n points.length = 0;\n let i1 = i0;\n // on exit, i1 is beyond the block of linear primitives . ..\n for (; i1 < g.children.length; i1++) {\n const nextPrimitive = g.children[i1];\n if (nextPrimitive instanceof LineSegment3d) {\n points.push(nextPrimitive.startPoint());\n points.push(nextPrimitive.endPoint());\n } else if (nextPrimitive instanceof LineString3d) {\n const source = nextPrimitive.packedPoints;\n for (let k = 0; k < source.length; k++) {\n points.push(source.getPoint3dAtUncheckedPointIndex(k));\n }\n } else {\n break;\n }\n }\n if (points.length <= 1) {\n g.children[numAccept++] = basePrimitive;\n } else if (this._options.disableLinearCompression) {\n const pointsDeduped = PolylineOps.compressShortEdges(points, Geometry.smallFloatingPoint); // remove only exact duplicate interior points\n g.children[numAccept++] = LineString3d.createPoints(pointsDeduped);\n } else { // compress points\n const compressedPointsA = PolylineOps.compressShortEdges(points, this._options.duplicatePointTolerance);\n const compressedPointsB = PolylineOps.compressByPerpendicularDistance(compressedPointsA, this._options.colinearPointTolerance);\n if (i0 === 0 && i1 === numOriginal) {\n // points is the entire curve, and the curve is closed. Maybe the first and last segments are colinear.\n PolylineCompressionContext.compressColinearWrapInPlace(compressedPointsB, this._options.duplicatePointTolerance, this._options.colinearPointTolerance);\n }\n if (compressedPointsB.length < 2) {\n // Collapsed to a point? Make a single point linestring\n g.children[numAccept++] = LineString3d.create(compressedPointsB[0]);\n } else if (compressedPointsB.length === 2) {\n g.children[numAccept++] = LineSegment3d.create(compressedPointsB[0], compressedPointsB[1]);\n } else {\n g.children[numAccept++] = LineString3d.createPoints(compressedPointsB);\n }\n }\n i0 = i1;\n } else if (this._options.consolidateCompatibleArcs && basePrimitive instanceof Arc3d) {\n // subsume subsequent arcs into basePrimitive.\n // always accept base primitive.\n for (; ++i0 < g.children.length;) {\n const nextPrimitive = g.children[i0];\n if (!(nextPrimitive instanceof Arc3d))\n break;\n if (!CurveFactory.appendToArcInPlace(basePrimitive, nextPrimitive)) // TODO: use this._options.duplicatePointTolerance\n break;\n }\n // i0 has already advanced\n g.children[numAccept++] = basePrimitive; // which has been extended 0 or more times.\n } else {\n g.children[numAccept++] = basePrimitive;\n i0++;\n }\n }\n g.children.length = numAccept;\n }\n\n public override handlePath(g: Path): any { return this.handleCurveChain(g); }\n public override handleLoop(g: Loop): any { return this.handleCurveChain(g); }\n public override handleParityRegion(g: ParityRegion): any {\n for (const child of g.children)\n child.dispatchToGeometryHandler(this);\n }\n public override handleUnionRegion(g: UnionRegion): any {\n for (const child of g.children)\n child.dispatchToGeometryHandler(this);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarSubdivision.d.ts","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI/D,OAAO,EAAuB,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAsB,WAAW,EAAE,MAAM,SAAS,CAAC;AA2DhE;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,gIAAgI;WAClH,qBAAqB,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,EAAE,cAAc,GAAE,MAAqC,GAAG,aAAa;IAmC5K;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAc1B;;;;;OAKG;WACW,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,GAAE,MAAgB,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM;WAezH,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAC/C,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAsB7E,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB,OAAO,CAAC,MAAM,CAAC,eAAe;WAWhB,oCAAoC,CAAC,KAAK,EAAE,aAAa,EAAE,iBAAiB,GAAE,MAAgB,GAAG,WAAW,EAAE;CAkC7H"}
1
+ {"version":3,"file":"PlanarSubdivision.d.ts","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI/D,OAAO,EAAuB,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAsB,WAAW,EAAE,MAAM,SAAS,CAAC;AAgEhE;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,gIAAgI;WAClH,qBAAqB,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,EAAE,cAAc,GAAE,MAAqC,GAAG,aAAa;IAmC5K;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAc1B;;;;;OAKG;WACW,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,GAAE,MAAgB,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM;WAezH,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAC/C,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAsB7E,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB,OAAO,CAAC,MAAM,CAAC,eAAe;WAWhB,oCAAoC,CAAC,KAAK,EAAE,aAAa,EAAE,iBAAiB,GAAE,MAAgB,GAAG,WAAW,EAAE;CAkC7H"}
@@ -48,13 +48,18 @@ class MapCurvePrimitiveToCurveLocationDetailPairArray {
48
48
  if (primitiveB)
49
49
  this.insertPrimitiveToPair(primitiveB, pair);
50
50
  }
51
- /** Split closed missing primitives in half and add new intersection pairs */
51
+ /**
52
+ * Split closed missing primitives in half and add new intersection pairs.
53
+ * * When bridge edges aren't included in the primitives array, a closed primitive with no intersections will not be
54
+ * added to the graph because it isn't in the `primitiveToPair` map. By splitting such a missing primitive in two, we
55
+ * introduce two intersections for each half, which allows the primitive to be represented in the map.
56
+ */
52
57
  splitAndAppendMissingClosedPrimitives(primitives, tolerance = Geometry.smallMetricDistance) {
53
58
  for (const p of primitives) {
54
59
  let closedCurveSplitCandidate = false;
55
60
  if (p instanceof Arc3d)
56
61
  closedCurveSplitCandidate = p.sweep.isFullCircle;
57
- else if (!(p instanceof LineSegment3d) && !(p instanceof LineString3d))
62
+ else if (!(p instanceof LineSegment3d) && !(p instanceof LineString3d)) // TODO: probably should do this for all types. Lots of spline-type primitives can be closed.
58
63
  closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);
59
64
  if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {
60
65
  const p0 = p.clonePartialCurve(0.0, 0.5);
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.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*--------------------------------------------------------------------------------------------*/\nimport { Geometry } from \"../../Geometry\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { HalfEdge, HalfEdgeGraph } from \"../../topology/Graph\";\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\nimport { Arc3d } from \"../Arc3d\";\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\nimport { RegionOps } from \"../RegionOps\";\n\n/** @packageDocumentation\n * @module Curve\n */\n\nclass MapCurvePrimitiveToCurveLocationDetailPairArray {\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\n // index assigned to this primitive (for debugging)\n public primitiveToIndex = new Map<CurvePrimitive, number>();\n private _numIndexedPrimitives: number = 0;\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\n if (primitive !== undefined) {\n const index = this.primitiveToIndex.get(primitive);\n if (index === undefined) {\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\n }\n }\n }\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\n if (primitive) {\n const priorPairs = this.primitiveToPair.get(primitive);\n this.assignPrimitiveIndex(primitive);\n if (!priorPairs) {\n this.primitiveToPair.set(primitive, [pair]);\n } else {\n priorPairs.push(pair);\n }\n }\n }\n public insertPair(pair: CurveLocationDetailPair) {\n const primitiveA = pair.detailA.curve;\n if (primitiveA)\n this.insertPrimitiveToPair(primitiveA, pair);\n const primitiveB = pair.detailB.curve;\n if (primitiveB)\n this.insertPrimitiveToPair(primitiveB, pair);\n }\n /** Split closed missing primitives in half and add new intersection pairs */\n public splitAndAppendMissingClosedPrimitives(primitives: CurvePrimitive[], tolerance: number = Geometry.smallMetricDistance) {\n for (const p of primitives) {\n let closedCurveSplitCandidate = false;\n if (p instanceof Arc3d)\n closedCurveSplitCandidate = p.sweep.isFullCircle;\n else if (!(p instanceof LineSegment3d) && !(p instanceof LineString3d))\n closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);\n if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {\n const p0 = p.clonePartialCurve(0.0, 0.5);\n const p1 = p.clonePartialCurve(0.5, 1.0);\n if (p0 && p1) {\n this.insertPair(CurveLocationDetailPair.createCapture(CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0), CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0)));\n this.insertPair(CurveLocationDetailPair.createCapture(CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0), CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0)));\n }\n }\n }\n }\n}\n\n/**\n * @internal\n */\nexport class PlanarSubdivision {\n /** Create a graph from an array of curves, and an array of the curves' precomputed intersections. Z-coordinates are ignored. */\n public static assembleHalfEdgeGraph(primitives: CurvePrimitive[], allPairs: CurveLocationDetailPair[], mergeTolerance: number = Geometry.smallMetricDistance): HalfEdgeGraph {\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray(); // map from key CurvePrimitive to CurveLocationDetailPair.\n for (const pair of allPairs)\n detailByPrimitive.insertPair(pair);\n if (primitives.length > detailByPrimitive.primitiveToPair.size)\n detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance); // otherwise, these single-primitive loops are missing from the graph\n const graph = new HalfEdgeGraph();\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\n const p = entry[0];\n // convert each interval intersection into two isolated intersections\n const details = entry[1].reduce((accumulator: CurveLocationDetailPair[], detailPair) => {\n if (!detailPair.detailA.hasFraction1)\n return [...accumulator, detailPair];\n const detail = getDetailOnCurve(detailPair, p)!;\n const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);\n const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1!, detail.point1!);\n return [...accumulator, CurveLocationDetailPair.createCapture(detail0, detail0), CurveLocationDetailPair.createCapture(detail1, detail1)];\n }, []);\n // lexical sort on p intersection fraction\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\n const fractionA = getFractionOnCurve(pairA, p)!;\n const fractionB = getFractionOnCurve(pairB, p)!;\n return fractionA - fractionB;\n });\n let last = {point: p.startPoint(), fraction: 0.0};\n for (const detailPair of details) {\n const detail = getDetailOnCurve(detailPair, p)!;\n const detailFraction = Geometry.restrictToInterval(detail.fraction, 0, 1); // truncate fraction, but don't snap point; clustering happens later\n last = this.addHalfEdge(graph, p, last.point, last.fraction, detail.point, detailFraction, mergeTolerance);\n }\n this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);\n }\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle!);\n return graph;\n }\n /**\n * Create a pair of mated half edges referencing an interval of a primitive\n * * no action if start and end points are identical.\n * @param graph containing graph.\n * @param p the curve\n * @param point0 start point\n * @param fraction0 starting fraction\n * @param point1 end point\n * @param fraction1 end fraction\n * @returns end point and fraction, or start point and fraction if no action\n */\n private static addHalfEdge(graph: HalfEdgeGraph, p: CurvePrimitive, point0: Point3d, fraction0: number, point1: Point3d, fraction1: number, mergeTolerance: number = Geometry.smallMetricDistance): {point: Point3d, fraction: number} {\n if (point0.isAlmostEqualXY(point1, mergeTolerance))\n return {point: point0, fraction: fraction0};\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\n const mate = halfEdge.edgeMate;\n halfEdge.edgeTag = detail01;\n halfEdge.sortData = 1.0;\n mate.edgeTag = detail01;\n mate.sortData = -1.0;\n halfEdge.sortAngle = sortAngle(p, fraction0, false);\n mate.sortAngle = sortAngle(p, fraction1, true);\n return {point: point1, fraction: fraction1};\n }\n /**\n * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative, or sliver loops.\n * @param zeroAreaTolerance absolute area tolerance for sliver face detection\n * @param isSliverFace whether the loop is known a priori (e.g., via topology) to have zero area\n * @returns the area (forced to zero if within tolerance)\n */\n public static collectSignedLoop(loop: Loop, outLoops: SignedLoops, zeroAreaTolerance: number = 1.0e-10, isSliverFace?: boolean): number{\n let area = isSliverFace ? 0.0 : RegionOps.computeXYArea(loop);\n if (area === undefined)\n area = 0;\n if (Math.abs(area) < zeroAreaTolerance)\n area = 0.0;\n (loop as any).computedAreaInPlanarSubdivision = area;\n if (area > 0)\n outLoops.positiveAreaLoops.push(loop);\n else if (area < 0)\n outLoops.negativeAreaLoops.push(loop);\n else\n outLoops.slivers.push(loop);\n return area;\n }\n public static createLoopInFace(faceSeed: HalfEdge,\n announce?: (he: HalfEdge, curve: CurvePrimitive, loop: Loop) => void): Loop {\n let he = faceSeed;\n const loop = Loop.create();\n do {\n const detail = he.edgeTag as CurveLocationDetail;\n if (detail) {\n let curve;\n if (he.sortData! > 0)\n curve = detail.curve!.clonePartialCurve(detail.fraction, detail.fraction1!);\n else\n curve = detail.curve!.clonePartialCurve(detail.fraction1!, detail.fraction);\n if (curve) {\n if (announce !== undefined)\n announce(he, curve, loop);\n loop.tryAddChild(curve);\n }\n }\n he = he.faceSuccessor;\n } while (he !== faceSeed);\n return loop;\n }\n // Return true if there are only two edges in the face loop, and their start curvatures are the same.\n private static isNullFace(he: HalfEdge): boolean {\n const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);\n let faceIsBanana = false;\n if (faceHasTwoEdges) {\n const c0 = HalfEdgeGraphMerge.curvatureSortKey(he);\n const c1 = HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);\n if (!Geometry.isSameCoordinate(c0, c1)) // default tol!\n faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...\n }\n return faceHasTwoEdges && !faceIsBanana;\n }\n // Look across edge mates (possibly several) for a nonnull mate face.\n private static nonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\n if (this.isNullFace (e))\n return undefined;\n let e1 = e.edgeMate;\n while (this.isNullFace(e1)){\n e1 = e1.faceSuccessor.edgeMate;\n if (e1 === e)\n return undefined;\n }\n return e1;\n }\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\n const result: SignedLoops[] = [];\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\n for (const faceSeeds of q) {\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\n const edges: LoopCurveLoopCurve[] = [];\n for (const faceSeed of faceSeeds) {\n const isNullFace = this.isNullFace(faceSeed);\n const loop = this.createLoopInFace(faceSeed, (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\n if (!isNullFace) {\n const mate = this.nonNullEdgeMate(graph, he);\n if (mate !== undefined) {\n const e = edgeMap.get(mate);\n if (e === undefined) {\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\n edgeMap.set(he, e1);\n } else if (e instanceof LoopCurveLoopCurve) {\n e.setB(loopC, curveC);\n edges.push(e);\n edgeMap.delete(mate);\n }\n }\n }\n });\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance, isNullFace);\n }\n componentAreas.edges = edges;\n result.push(componentAreas);\n edgeMap.clear();\n }\n return result;\n }\n}\n\nfunction sortAngle(curve: CurvePrimitive, fraction: number, reverse: boolean): number {\n const ray = curve.fractionToPointAndDerivative(fraction);\n const s = reverse ? -1.0 : 1.0;\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\n}\n\nfunction getFractionOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): number | undefined {\n if (pair.detailA.curve === curve)\n return pair.detailA.fraction;\n if (pair.detailB.curve === curve)\n return pair.detailB.fraction;\n return undefined;\n}\nfunction getDetailOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail | undefined {\n if (pair.detailA.curve === curve)\n return pair.detailA;\n if (pair.detailB.curve === curve)\n return pair.detailB;\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.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*--------------------------------------------------------------------------------------------*/\nimport { Geometry } from \"../../Geometry\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { HalfEdge, HalfEdgeGraph } from \"../../topology/Graph\";\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\nimport { Arc3d } from \"../Arc3d\";\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\nimport { RegionOps } from \"../RegionOps\";\n\n/** @packageDocumentation\n * @module Curve\n */\n\nclass MapCurvePrimitiveToCurveLocationDetailPairArray {\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\n // index assigned to this primitive (for debugging)\n public primitiveToIndex = new Map<CurvePrimitive, number>();\n private _numIndexedPrimitives: number = 0;\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\n if (primitive !== undefined) {\n const index = this.primitiveToIndex.get(primitive);\n if (index === undefined) {\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\n }\n }\n }\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\n if (primitive) {\n const priorPairs = this.primitiveToPair.get(primitive);\n this.assignPrimitiveIndex(primitive);\n if (!priorPairs) {\n this.primitiveToPair.set(primitive, [pair]);\n } else {\n priorPairs.push(pair);\n }\n }\n }\n public insertPair(pair: CurveLocationDetailPair) {\n const primitiveA = pair.detailA.curve;\n if (primitiveA)\n this.insertPrimitiveToPair(primitiveA, pair);\n const primitiveB = pair.detailB.curve;\n if (primitiveB)\n this.insertPrimitiveToPair(primitiveB, pair);\n }\n /**\n * Split closed missing primitives in half and add new intersection pairs.\n * * When bridge edges aren't included in the primitives array, a closed primitive with no intersections will not be\n * added to the graph because it isn't in the `primitiveToPair` map. By splitting such a missing primitive in two, we\n * introduce two intersections for each half, which allows the primitive to be represented in the map.\n */\n public splitAndAppendMissingClosedPrimitives(primitives: CurvePrimitive[], tolerance: number = Geometry.smallMetricDistance) {\n for (const p of primitives) {\n let closedCurveSplitCandidate = false;\n if (p instanceof Arc3d)\n closedCurveSplitCandidate = p.sweep.isFullCircle;\n else if (!(p instanceof LineSegment3d) && !(p instanceof LineString3d)) // TODO: probably should do this for all types. Lots of spline-type primitives can be closed.\n closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);\n if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {\n const p0 = p.clonePartialCurve(0.0, 0.5);\n const p1 = p.clonePartialCurve(0.5, 1.0);\n if (p0 && p1) {\n this.insertPair(CurveLocationDetailPair.createCapture(CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0), CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0)));\n this.insertPair(CurveLocationDetailPair.createCapture(CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0), CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0)));\n }\n }\n }\n }\n}\n\n/**\n * @internal\n */\nexport class PlanarSubdivision {\n /** Create a graph from an array of curves, and an array of the curves' precomputed intersections. Z-coordinates are ignored. */\n public static assembleHalfEdgeGraph(primitives: CurvePrimitive[], allPairs: CurveLocationDetailPair[], mergeTolerance: number = Geometry.smallMetricDistance): HalfEdgeGraph {\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray(); // map from key CurvePrimitive to CurveLocationDetailPair.\n for (const pair of allPairs)\n detailByPrimitive.insertPair(pair);\n if (primitives.length > detailByPrimitive.primitiveToPair.size)\n detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance); // otherwise, these single-primitive loops are missing from the graph\n const graph = new HalfEdgeGraph();\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\n const p = entry[0];\n // convert each interval intersection into two isolated intersections\n const details = entry[1].reduce((accumulator: CurveLocationDetailPair[], detailPair) => {\n if (!detailPair.detailA.hasFraction1)\n return [...accumulator, detailPair];\n const detail = getDetailOnCurve(detailPair, p)!;\n const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);\n const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1!, detail.point1!);\n return [...accumulator, CurveLocationDetailPair.createCapture(detail0, detail0), CurveLocationDetailPair.createCapture(detail1, detail1)];\n }, []);\n // lexical sort on p intersection fraction\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\n const fractionA = getFractionOnCurve(pairA, p)!;\n const fractionB = getFractionOnCurve(pairB, p)!;\n return fractionA - fractionB;\n });\n let last = {point: p.startPoint(), fraction: 0.0};\n for (const detailPair of details) {\n const detail = getDetailOnCurve(detailPair, p)!;\n const detailFraction = Geometry.restrictToInterval(detail.fraction, 0, 1); // truncate fraction, but don't snap point; clustering happens later\n last = this.addHalfEdge(graph, p, last.point, last.fraction, detail.point, detailFraction, mergeTolerance);\n }\n this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);\n }\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle!);\n return graph;\n }\n /**\n * Create a pair of mated half edges referencing an interval of a primitive\n * * no action if start and end points are identical.\n * @param graph containing graph.\n * @param p the curve\n * @param point0 start point\n * @param fraction0 starting fraction\n * @param point1 end point\n * @param fraction1 end fraction\n * @returns end point and fraction, or start point and fraction if no action\n */\n private static addHalfEdge(graph: HalfEdgeGraph, p: CurvePrimitive, point0: Point3d, fraction0: number, point1: Point3d, fraction1: number, mergeTolerance: number = Geometry.smallMetricDistance): {point: Point3d, fraction: number} {\n if (point0.isAlmostEqualXY(point1, mergeTolerance))\n return {point: point0, fraction: fraction0};\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\n const mate = halfEdge.edgeMate;\n halfEdge.edgeTag = detail01;\n halfEdge.sortData = 1.0;\n mate.edgeTag = detail01;\n mate.sortData = -1.0;\n halfEdge.sortAngle = sortAngle(p, fraction0, false);\n mate.sortAngle = sortAngle(p, fraction1, true);\n return {point: point1, fraction: fraction1};\n }\n /**\n * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative, or sliver loops.\n * @param zeroAreaTolerance absolute area tolerance for sliver face detection\n * @param isSliverFace whether the loop is known a priori (e.g., via topology) to have zero area\n * @returns the area (forced to zero if within tolerance)\n */\n public static collectSignedLoop(loop: Loop, outLoops: SignedLoops, zeroAreaTolerance: number = 1.0e-10, isSliverFace?: boolean): number{\n let area = isSliverFace ? 0.0 : RegionOps.computeXYArea(loop);\n if (area === undefined)\n area = 0;\n if (Math.abs(area) < zeroAreaTolerance)\n area = 0.0;\n (loop as any).computedAreaInPlanarSubdivision = area;\n if (area > 0)\n outLoops.positiveAreaLoops.push(loop);\n else if (area < 0)\n outLoops.negativeAreaLoops.push(loop);\n else\n outLoops.slivers.push(loop);\n return area;\n }\n public static createLoopInFace(faceSeed: HalfEdge,\n announce?: (he: HalfEdge, curve: CurvePrimitive, loop: Loop) => void): Loop {\n let he = faceSeed;\n const loop = Loop.create();\n do {\n const detail = he.edgeTag as CurveLocationDetail;\n if (detail) {\n let curve;\n if (he.sortData! > 0)\n curve = detail.curve!.clonePartialCurve(detail.fraction, detail.fraction1!);\n else\n curve = detail.curve!.clonePartialCurve(detail.fraction1!, detail.fraction);\n if (curve) {\n if (announce !== undefined)\n announce(he, curve, loop);\n loop.tryAddChild(curve);\n }\n }\n he = he.faceSuccessor;\n } while (he !== faceSeed);\n return loop;\n }\n // Return true if there are only two edges in the face loop, and their start curvatures are the same.\n private static isNullFace(he: HalfEdge): boolean {\n const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);\n let faceIsBanana = false;\n if (faceHasTwoEdges) {\n const c0 = HalfEdgeGraphMerge.curvatureSortKey(he);\n const c1 = HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);\n if (!Geometry.isSameCoordinate(c0, c1)) // default tol!\n faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...\n }\n return faceHasTwoEdges && !faceIsBanana;\n }\n // Look across edge mates (possibly several) for a nonnull mate face.\n private static nonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\n if (this.isNullFace (e))\n return undefined;\n let e1 = e.edgeMate;\n while (this.isNullFace(e1)){\n e1 = e1.faceSuccessor.edgeMate;\n if (e1 === e)\n return undefined;\n }\n return e1;\n }\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\n const result: SignedLoops[] = [];\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\n for (const faceSeeds of q) {\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\n const edges: LoopCurveLoopCurve[] = [];\n for (const faceSeed of faceSeeds) {\n const isNullFace = this.isNullFace(faceSeed);\n const loop = this.createLoopInFace(faceSeed, (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\n if (!isNullFace) {\n const mate = this.nonNullEdgeMate(graph, he);\n if (mate !== undefined) {\n const e = edgeMap.get(mate);\n if (e === undefined) {\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\n edgeMap.set(he, e1);\n } else if (e instanceof LoopCurveLoopCurve) {\n e.setB(loopC, curveC);\n edges.push(e);\n edgeMap.delete(mate);\n }\n }\n }\n });\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance, isNullFace);\n }\n componentAreas.edges = edges;\n result.push(componentAreas);\n edgeMap.clear();\n }\n return result;\n }\n}\n\nfunction sortAngle(curve: CurvePrimitive, fraction: number, reverse: boolean): number {\n const ray = curve.fractionToPointAndDerivative(fraction);\n const s = reverse ? -1.0 : 1.0;\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\n}\n\nfunction getFractionOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): number | undefined {\n if (pair.detailA.curve === curve)\n return pair.detailA.fraction;\n if (pair.detailB.curve === curve)\n return pair.detailB.fraction;\n return undefined;\n}\nfunction getDetailOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail | undefined {\n if (pair.detailA.curve === curve)\n return pair.detailA;\n if (pair.detailB.curve === curve)\n return pair.detailB;\n return undefined;\n}\n"]}
@@ -21,41 +21,35 @@ export declare class RegionMomentsXY extends NullGeometryHandler {
21
21
  private _activeMomentData?;
22
22
  private _point0;
23
23
  private _point1;
24
- /** Accumulate (independent) integrations over
25
- * * origin to chord of the arc.
26
- * * origin to the "cap" between the chord and arc.
24
+ /**
25
+ * Accumulate (independent) integrations over:
26
+ * * The area between the arc and the chord connecting its endpoints.
27
+ * * The triangle with vertices: origin, arc start, arc end.
27
28
  */
28
29
  handleArc3d(arc: Arc3d): void;
29
- /** Accumulate integrals over the (triangular) areas from the origin to each line segment */
30
+ /** Accumulate integrals over the (triangular) areas from the origin to each line segment. */
30
31
  handleLineString3d(ls: LineString3d): void;
31
- /** Accumulate integrals over the (triangular) area from the origin to this line segment */
32
+ /** Accumulate integrals over the (triangular) area from the origin to this line segment. */
32
33
  handleLineSegment3d(segment: LineSegment3d): void;
33
34
  /** Accumulate integrals from origin to all primitives in the chain. */
34
35
  handleLoop(loop: Loop): MomentData | undefined;
35
- /**
36
- * ASSUMPTIONS FOR ORIENTATION AND CONTAINMENT ISSUES
37
- * * Largest area is outer
38
- * * All others are interior (and not overlapping)
39
- * Hence
40
- * * Outer area sign must be positive -- negate all integrations as needed
41
- * * Outer area signs must be positive -- negate all integrations as needed
42
- * @param region
43
- */
36
+ private handleAnyRegion;
37
+ /** Accumulate integrals from origin to the components of the parity region. */
44
38
  handleParityRegion(region: ParityRegion): MomentData | undefined;
45
- /** Accumulate (as simple addition) products over each component of the union region. */
39
+ /** Accumulate integrals from origin to the components of the union region. */
46
40
  handleUnionRegion(region: UnionRegion): MomentData | undefined;
47
41
  private _strokeOptions?;
48
42
  private getStrokeOptions;
49
- /** Single curve primitive (not loop . . .).
50
- * * stroke the curve
51
- * * accumulate stroke array.
43
+ /**
44
+ * Handle a single curve primitive (not loop).
45
+ * * Stroke the curve and accumulate stroke array.
52
46
  */
53
47
  handleCurvePrimitive(cp: CurvePrimitive): void;
54
- /** handle strongly typed BSplineCurve3d as generic curve primitive */
48
+ /** Handle strongly typed BSplineCurve3d as generic curve primitive. */
55
49
  handleBSplineCurve3d(g: BSplineCurve3d): void;
56
- /** handle strongly typed BSplineCurve3dH as generic curve primitive */
50
+ /** Handle strongly typed BSplineCurve3dH as generic curve primitive. */
57
51
  handleBSplineCurve3dH(g: BSplineCurve3dH): void;
58
- /** handle strongly typed TransitionSpiral as generic curve primitive */
52
+ /** Handle strongly typed TransitionSpiral as generic curve primitive. */
59
53
  handleTransitionSpiral(g: TransitionSpiral3d): void;
60
54
  }
61
55
  //# sourceMappingURL=RegionMomentsXY.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RegionMomentsXY.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionMomentsXY.ts"],"names":[],"mappings":"AAKA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,mBAAmB;IACtD,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAoB;IAEnC;;;OAGG;IACa,WAAW,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI;IAgC7C,4FAA4F;IAC5E,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAI1D,2FAA2F;IAC3E,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMjE,uEAAuE;IACvD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS;IAQ9D;;;;;;;;OAQG;IACa,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS;IAgChF,wFAAwF;IACxE,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS;IAY9E,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACI,oBAAoB,CAAC,EAAE,EAAE,cAAc;IAM9C,wEAAwE;IACxD,oBAAoB,CAAC,CAAC,EAAE,cAAc;IACtD,yEAAyE;IACzD,qBAAqB,CAAC,CAAC,EAAE,eAAe;IACxD,0EAA0E;IAC1D,sBAAsB,CAAC,CAAC,EAAE,kBAAkB;CAE7D"}
1
+ {"version":3,"file":"RegionMomentsXY.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionMomentsXY.ts"],"names":[],"mappings":"AAKA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,mBAAmB;IACtD,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAoB;IACnC;;;;OAIG;IACa,WAAW,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI;IAgC7C,6FAA6F;IAC7E,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAI1D,4FAA4F;IAC5E,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMjE,uEAAuE;IACvD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS;IAQ9D,OAAO,CAAC,eAAe;IAiBvB,+EAA+E;IAC/D,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS;IAGhF,8EAA8E;IAC9D,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS;IAG9E,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACI,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI;IAMrD,yEAAyE;IACzD,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI;IAG7D,0EAA0E;IAC1D,qBAAqB,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI;IAG/D,0EAA0E;IAC1D,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,GAAG,IAAI;CAGpE"}
@@ -8,6 +8,7 @@ import { Point3d } from "../geometry3d/Point3dVector3d";
8
8
  import { MomentData } from "../geometry4d/MomentData";
9
9
  import { LineString3d } from "./LineString3d";
10
10
  import { Loop } from "./Loop";
11
+ import { RegionBinaryOpType, RegionOps } from "./RegionOps";
11
12
  import { StrokeOptions } from "./StrokeOptions";
12
13
  /**
13
14
  * Implementation class for computing XY area moments.
@@ -17,15 +18,15 @@ export class RegionMomentsXY extends NullGeometryHandler {
17
18
  _activeMomentData;
18
19
  _point0 = Point3d.create();
19
20
  _point1 = Point3d.create();
20
- /** Accumulate (independent) integrations over
21
- * * origin to chord of the arc.
22
- * * origin to the "cap" between the chord and arc.
21
+ /**
22
+ * Accumulate (independent) integrations over:
23
+ * * The area between the arc and the chord connecting its endpoints.
24
+ * * The triangle with vertices: origin, arc start, arc end.
23
25
  */
24
26
  handleArc3d(arc) {
25
27
  const momentData = this._activeMomentData;
26
28
  const sweepRadians = arc.sweep.sweepRadians;
27
29
  const alphaRadians = sweepRadians * 0.5;
28
- // from https://apps.dtic.mil/dtic/tr/fulltext/u2/274936.pdf page 71 for radius = 1
29
30
  let s = Math.sin(alphaRadians);
30
31
  let c = Math.cos(alphaRadians);
31
32
  let s1 = Math.sin(sweepRadians);
@@ -52,12 +53,12 @@ export class RegionMomentsXY extends NullGeometryHandler {
52
53
  const pointC = arc.fractionToPoint(1.0);
53
54
  momentData.accumulateTriangleMomentsXY(undefined, pointB, pointC);
54
55
  }
55
- /** Accumulate integrals over the (triangular) areas from the origin to each line segment */
56
+ /** Accumulate integrals over the (triangular) areas from the origin to each line segment. */
56
57
  handleLineString3d(ls) {
57
58
  const momentData = this._activeMomentData;
58
59
  momentData.accumulateTriangleToLineStringMomentsXY(undefined, ls.packedPoints);
59
60
  }
60
- /** Accumulate integrals over the (triangular) area from the origin to this line segment */
61
+ /** Accumulate integrals over the (triangular) area from the origin to this line segment. */
61
62
  handleLineSegment3d(segment) {
62
63
  const momentData = this._activeMomentData;
63
64
  segment.startPoint(this._point0);
@@ -73,50 +74,15 @@ export class RegionMomentsXY extends NullGeometryHandler {
73
74
  this._activeMomentData = undefined;
74
75
  return momentData;
75
76
  }
76
- /**
77
- * ASSUMPTIONS FOR ORIENTATION AND CONTAINMENT ISSUES
78
- * * Largest area is outer
79
- * * All others are interior (and not overlapping)
80
- * Hence
81
- * * Outer area sign must be positive -- negate all integrations as needed
82
- * * Outer area signs must be positive -- negate all integrations as needed
83
- * @param region
84
- */
85
- handleParityRegion(region) {
86
- const allChildMoments = [];
87
- let maxAbsArea = 0.0;
88
- let largestChildMoments;
89
- for (const child of region.children) {
90
- if (child instanceof Loop) {
91
- const childMoments = this.handleLoop(child);
92
- if (childMoments) {
93
- allChildMoments.push(childMoments);
94
- const q = Math.abs(childMoments.quantitySum);
95
- if (q > maxAbsArea) {
96
- maxAbsArea = q;
97
- largestChildMoments = childMoments;
98
- }
99
- }
100
- }
101
- }
102
- if (largestChildMoments) {
103
- const summedMoments = MomentData.create();
104
- const sign0 = largestChildMoments.signFactor(1.0);
105
- summedMoments.accumulateProducts(largestChildMoments, sign0);
106
- for (const childMoments of allChildMoments) {
107
- if (childMoments !== largestChildMoments) {
108
- const sign1 = childMoments.signFactor(-1.0);
109
- summedMoments.accumulateProducts(childMoments, sign1);
110
- }
111
- }
112
- return summedMoments;
113
- }
114
- return undefined;
115
- }
116
- /** Accumulate (as simple addition) products over each component of the union region. */
117
- handleUnionRegion(region) {
77
+ handleAnyRegion(region) {
78
+ // guarantee there is no overlapping children
79
+ const merged = RegionOps.regionBooleanXY(region, undefined, RegionBinaryOpType.Union);
80
+ if (!merged)
81
+ return undefined;
82
+ if (merged instanceof Loop)
83
+ return this.handleLoop(merged);
118
84
  const summedMoments = MomentData.create();
119
- for (const child of region.children) {
85
+ for (const child of merged.children) {
120
86
  const childMoments = child.dispatchToGeometryHandler(this);
121
87
  if (childMoments) {
122
88
  const sign0 = childMoments.signFactor(1.0);
@@ -125,6 +91,14 @@ export class RegionMomentsXY extends NullGeometryHandler {
125
91
  }
126
92
  return summedMoments;
127
93
  }
94
+ /** Accumulate integrals from origin to the components of the parity region. */
95
+ handleParityRegion(region) {
96
+ return this.handleAnyRegion(region);
97
+ }
98
+ /** Accumulate integrals from origin to the components of the union region. */
99
+ handleUnionRegion(region) {
100
+ return this.handleAnyRegion(region);
101
+ }
128
102
  _strokeOptions;
129
103
  getStrokeOptions() {
130
104
  if (this._strokeOptions)
@@ -135,9 +109,9 @@ export class RegionMomentsXY extends NullGeometryHandler {
135
109
  this._strokeOptions = options;
136
110
  return options;
137
111
  }
138
- /** Single curve primitive (not loop . . .).
139
- * * stroke the curve
140
- * * accumulate stroke array.
112
+ /**
113
+ * Handle a single curve primitive (not loop).
114
+ * * Stroke the curve and accumulate stroke array.
141
115
  */
142
116
  handleCurvePrimitive(cp) {
143
117
  const strokes = LineString3d.create();
@@ -145,11 +119,17 @@ export class RegionMomentsXY extends NullGeometryHandler {
145
119
  cp.emitStrokes(strokes, options);
146
120
  this.handleLineString3d(strokes);
147
121
  }
148
- /** handle strongly typed BSplineCurve3d as generic curve primitive */
149
- handleBSplineCurve3d(g) { return this.handleCurvePrimitive(g); }
150
- /** handle strongly typed BSplineCurve3dH as generic curve primitive */
151
- handleBSplineCurve3dH(g) { return this.handleCurvePrimitive(g); }
152
- /** handle strongly typed TransitionSpiral as generic curve primitive */
153
- handleTransitionSpiral(g) { return this.handleCurvePrimitive(g); }
122
+ /** Handle strongly typed BSplineCurve3d as generic curve primitive. */
123
+ handleBSplineCurve3d(g) {
124
+ this.handleCurvePrimitive(g);
125
+ }
126
+ /** Handle strongly typed BSplineCurve3dH as generic curve primitive. */
127
+ handleBSplineCurve3dH(g) {
128
+ this.handleCurvePrimitive(g);
129
+ }
130
+ /** Handle strongly typed TransitionSpiral as generic curve primitive. */
131
+ handleTransitionSpiral(g) {
132
+ this.handleCurvePrimitive(g);
133
+ }
154
134
  }
155
135
  //# sourceMappingURL=RegionMomentsXY.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RegionMomentsXY.js","sourceRoot":"","sources":["../../../src/curve/RegionMomentsXY.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 Curve\n */\n\n// import { Geometry, Angle, AngleSweep } from \"../Geometry\";\n\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { NullGeometryHandler } from \"../geometry3d/GeometryHandler\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { MomentData } from \"../geometry4d/MomentData\";\nimport { Arc3d } from \"./Arc3d\";\nimport { CurvePrimitive } from \"./CurvePrimitive\";\nimport { LineSegment3d } from \"./LineSegment3d\";\nimport { LineString3d } from \"./LineString3d\";\nimport { Loop } from \"./Loop\";\nimport { ParityRegion } from \"./ParityRegion\";\nimport { StrokeOptions } from \"./StrokeOptions\";\nimport { TransitionSpiral3d } from \"./spiral/TransitionSpiral3d\";\nimport { UnionRegion } from \"./UnionRegion\";\n\n/**\n * Implementation class for computing XY area moments.\n * @internal\n */\nexport class RegionMomentsXY extends NullGeometryHandler {\n private _activeMomentData?: MomentData;\n private _point0 = Point3d.create();\n private _point1 = Point3d.create();\n\n /** Accumulate (independent) integrations over\n * * origin to chord of the arc.\n * * origin to the \"cap\" between the chord and arc.\n */\n public override handleArc3d(arc: Arc3d): void {\n const momentData = this._activeMomentData!;\n const sweepRadians = arc.sweep.sweepRadians;\n const alphaRadians = sweepRadians * 0.5;\n // from https://apps.dtic.mil/dtic/tr/fulltext/u2/274936.pdf page 71 for radius = 1\n let s = Math.sin(alphaRadians);\n let c = Math.cos(alphaRadians);\n let s1 = Math.sin(sweepRadians);\n if (Angle.isFullCircleRadians(sweepRadians)) {\n s = 0.0;\n c = -1.0;\n s1 = 0.0;\n }\n const q = 2 * s * s * s * c / (alphaRadians - s * c);\n const s3 = s * s * s;\n const s6 = s3 * s3;\n const area = 0.5 * (sweepRadians - s1);\n const inertiaXX = 0.25 * area * (1.0 - q / 3.0);\n const inertiaYY1 = 0.25 * area * (1.0 + q);\n const inertiaYY = inertiaYY1 - 4.0 * s6 / (9.0 * area);\n const productXX = inertiaYY;\n const productYY = inertiaXX;\n const centerToCentroid = 4.0 * s * s * s / (3.0 * (sweepRadians - s1));\n const midRadians = arc.sweep.fractionToRadians(0.5);\n const centralPlane = arc.radiansToRotatedBasis(midRadians);\n const centroid = centralPlane.origin.plusScaled(centralPlane.vectorU, centerToCentroid);\n momentData.accumulateXYProductsInCentroidalFrame(productXX, 0.0, productYY, area, centroid, centralPlane.vectorU, centralPlane.vectorV);\n const pointB = arc.fractionToPoint(0.0);\n const pointC = arc.fractionToPoint(1.0);\n momentData.accumulateTriangleMomentsXY(undefined, pointB, pointC);\n }\n\n /** Accumulate integrals over the (triangular) areas from the origin to each line segment */\n public override handleLineString3d(ls: LineString3d): void {\n const momentData = this._activeMomentData!;\n momentData.accumulateTriangleToLineStringMomentsXY(undefined, ls.packedPoints);\n }\n /** Accumulate integrals over the (triangular) area from the origin to this line segment */\n public override handleLineSegment3d(segment: LineSegment3d): void {\n const momentData = this._activeMomentData!;\n segment.startPoint(this._point0);\n segment.endPoint(this._point1);\n momentData.accumulateTriangleMomentsXY(undefined, this._point0, this._point1);\n }\n /** Accumulate integrals from origin to all primitives in the chain. */\n public override handleLoop(loop: Loop): MomentData | undefined {\n const momentData = this._activeMomentData = MomentData.create();\n momentData.needOrigin = false;\n for (const child of loop.children)\n child.dispatchToGeometryHandler(this);\n this._activeMomentData = undefined;\n return momentData;\n }\n /**\n * ASSUMPTIONS FOR ORIENTATION AND CONTAINMENT ISSUES\n * * Largest area is outer\n * * All others are interior (and not overlapping)\n * Hence\n * * Outer area sign must be positive -- negate all integrations as needed\n * * Outer area signs must be positive -- negate all integrations as needed\n * @param region\n */\n public override handleParityRegion(region: ParityRegion): MomentData | undefined {\n const allChildMoments: MomentData[] = [];\n let maxAbsArea = 0.0;\n let largestChildMoments: MomentData | undefined;\n for (const child of region.children) {\n if (child instanceof Loop) {\n const childMoments = this.handleLoop(child);\n if (childMoments) {\n allChildMoments.push(childMoments);\n const q = Math.abs(childMoments.quantitySum);\n if (q > maxAbsArea) {\n maxAbsArea = q;\n largestChildMoments = childMoments;\n }\n\n }\n }\n }\n if (largestChildMoments) {\n const summedMoments = MomentData.create();\n const sign0 = largestChildMoments.signFactor(1.0);\n summedMoments.accumulateProducts(largestChildMoments, sign0);\n for (const childMoments of allChildMoments) {\n if (childMoments !== largestChildMoments) {\n const sign1 = childMoments.signFactor(-1.0);\n summedMoments.accumulateProducts(childMoments, sign1);\n }\n }\n return summedMoments;\n }\n return undefined;\n }\n /** Accumulate (as simple addition) products over each component of the union region. */\n public override handleUnionRegion(region: UnionRegion): MomentData | undefined {\n const summedMoments = MomentData.create();\n for (const child of region.children) {\n const childMoments = child.dispatchToGeometryHandler(this);\n if (childMoments) {\n const sign0 = childMoments.signFactor(1.0);\n summedMoments.accumulateProducts(childMoments, sign0);\n }\n }\n return summedMoments;\n }\n\n private _strokeOptions?: StrokeOptions;\n private getStrokeOptions(): StrokeOptions {\n if (this._strokeOptions)\n return this._strokeOptions;\n const options = StrokeOptions.createForCurves();\n // this is unusually fine for stroking, but appropriate for sum.\n options.angleTol = Angle.createDegrees(5.0);\n this._strokeOptions = options;\n return options;\n }\n /** Single curve primitive (not loop . . .).\n * * stroke the curve\n * * accumulate stroke array.\n */\n public handleCurvePrimitive(cp: CurvePrimitive) {\n const strokes = LineString3d.create();\n const options = this.getStrokeOptions();\n cp.emitStrokes(strokes, options);\n this.handleLineString3d(strokes);\n }\n /** handle strongly typed BSplineCurve3d as generic curve primitive */\n public override handleBSplineCurve3d(g: BSplineCurve3d) { return this.handleCurvePrimitive(g); }\n /** handle strongly typed BSplineCurve3dH as generic curve primitive */\n public override handleBSplineCurve3dH(g: BSplineCurve3dH) { return this.handleCurvePrimitive(g); }\n /** handle strongly typed TransitionSpiral as generic curve primitive */\n public override handleTransitionSpiral(g: TransitionSpiral3d) { return this.handleCurvePrimitive(g); }\n\n}\n"]}
1
+ {"version":3,"file":"RegionMomentsXY.js","sourceRoot":"","sources":["../../../src/curve/RegionMomentsXY.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 Curve\n */\n\n// import { Geometry, Angle, AngleSweep } from \"../Geometry\";\n\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { NullGeometryHandler } from \"../geometry3d/GeometryHandler\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { MomentData } from \"../geometry4d/MomentData\";\nimport { Arc3d } from \"./Arc3d\";\nimport { CurvePrimitive } from \"./CurvePrimitive\";\nimport { AnyRegion } from \"./CurveTypes\";\nimport { LineSegment3d } from \"./LineSegment3d\";\nimport { LineString3d } from \"./LineString3d\";\nimport { Loop } from \"./Loop\";\nimport { ParityRegion } from \"./ParityRegion\";\nimport { RegionBinaryOpType, RegionOps } from \"./RegionOps\";\nimport { TransitionSpiral3d } from \"./spiral/TransitionSpiral3d\";\nimport { StrokeOptions } from \"./StrokeOptions\";\nimport { UnionRegion } from \"./UnionRegion\";\n\n/**\n * Implementation class for computing XY area moments.\n * @internal\n */\nexport class RegionMomentsXY extends NullGeometryHandler {\n private _activeMomentData?: MomentData;\n private _point0 = Point3d.create();\n private _point1 = Point3d.create();\n /**\n * Accumulate (independent) integrations over:\n * * The area between the arc and the chord connecting its endpoints.\n * * The triangle with vertices: origin, arc start, arc end.\n */\n public override handleArc3d(arc: Arc3d): void {\n const momentData = this._activeMomentData!;\n const sweepRadians = arc.sweep.sweepRadians;\n const alphaRadians = sweepRadians * 0.5;\n let s = Math.sin(alphaRadians);\n let c = Math.cos(alphaRadians);\n let s1 = Math.sin(sweepRadians);\n if (Angle.isFullCircleRadians(sweepRadians)) {\n s = 0.0;\n c = -1.0;\n s1 = 0.0;\n }\n const q = 2 * s * s * s * c / (alphaRadians - s * c);\n const s3 = s * s * s;\n const s6 = s3 * s3;\n const area = 0.5 * (sweepRadians - s1);\n const inertiaXX = 0.25 * area * (1.0 - q / 3.0);\n const inertiaYY1 = 0.25 * area * (1.0 + q);\n const inertiaYY = inertiaYY1 - 4.0 * s6 / (9.0 * area);\n const productXX = inertiaYY;\n const productYY = inertiaXX;\n const centerToCentroid = 4.0 * s * s * s / (3.0 * (sweepRadians - s1));\n const midRadians = arc.sweep.fractionToRadians(0.5);\n const centralPlane = arc.radiansToRotatedBasis(midRadians);\n const centroid = centralPlane.origin.plusScaled(centralPlane.vectorU, centerToCentroid);\n momentData.accumulateXYProductsInCentroidalFrame(\n productXX, 0.0, productYY, area, centroid, centralPlane.vectorU, centralPlane.vectorV,\n );\n const pointB = arc.fractionToPoint(0.0);\n const pointC = arc.fractionToPoint(1.0);\n momentData.accumulateTriangleMomentsXY(undefined, pointB, pointC);\n }\n /** Accumulate integrals over the (triangular) areas from the origin to each line segment. */\n public override handleLineString3d(ls: LineString3d): void {\n const momentData = this._activeMomentData!;\n momentData.accumulateTriangleToLineStringMomentsXY(undefined, ls.packedPoints);\n }\n /** Accumulate integrals over the (triangular) area from the origin to this line segment. */\n public override handleLineSegment3d(segment: LineSegment3d): void {\n const momentData = this._activeMomentData!;\n segment.startPoint(this._point0);\n segment.endPoint(this._point1);\n momentData.accumulateTriangleMomentsXY(undefined, this._point0, this._point1);\n }\n /** Accumulate integrals from origin to all primitives in the chain. */\n public override handleLoop(loop: Loop): MomentData | undefined {\n const momentData = this._activeMomentData = MomentData.create();\n momentData.needOrigin = false;\n for (const child of loop.children)\n child.dispatchToGeometryHandler(this);\n this._activeMomentData = undefined;\n return momentData;\n }\n private handleAnyRegion(region: AnyRegion): MomentData | undefined {\n // guarantee there is no overlapping children\n const merged = RegionOps.regionBooleanXY(region, undefined, RegionBinaryOpType.Union);\n if (!merged)\n return undefined;\n if (merged instanceof Loop)\n return this.handleLoop(merged);\n const summedMoments = MomentData.create();\n for (const child of merged.children) {\n const childMoments = child.dispatchToGeometryHandler(this);\n if (childMoments) {\n const sign0 = childMoments.signFactor(1.0);\n summedMoments.accumulateProducts(childMoments, sign0);\n }\n }\n return summedMoments;\n }\n /** Accumulate integrals from origin to the components of the parity region. */\n public override handleParityRegion(region: ParityRegion): MomentData | undefined {\n return this.handleAnyRegion(region);\n }\n /** Accumulate integrals from origin to the components of the union region. */\n public override handleUnionRegion(region: UnionRegion): MomentData | undefined {\n return this.handleAnyRegion(region);\n }\n private _strokeOptions?: StrokeOptions;\n private getStrokeOptions(): StrokeOptions {\n if (this._strokeOptions)\n return this._strokeOptions;\n const options = StrokeOptions.createForCurves();\n // this is unusually fine for stroking, but appropriate for sum.\n options.angleTol = Angle.createDegrees(5.0);\n this._strokeOptions = options;\n return options;\n }\n /**\n * Handle a single curve primitive (not loop).\n * * Stroke the curve and accumulate stroke array.\n */\n public handleCurvePrimitive(cp: CurvePrimitive): void {\n const strokes = LineString3d.create();\n const options = this.getStrokeOptions();\n cp.emitStrokes(strokes, options);\n this.handleLineString3d(strokes);\n }\n /** Handle strongly typed BSplineCurve3d as generic curve primitive. */\n public override handleBSplineCurve3d(g: BSplineCurve3d): void {\n this.handleCurvePrimitive(g);\n }\n /** Handle strongly typed BSplineCurve3dH as generic curve primitive. */\n public override handleBSplineCurve3dH(g: BSplineCurve3dH): void {\n this.handleCurvePrimitive(g);\n }\n /** Handle strongly typed TransitionSpiral as generic curve primitive. */\n public override handleTransitionSpiral(g: TransitionSpiral3d): void {\n this.handleCurvePrimitive(g);\n }\n}\n"]}