@itwin/core-geometry 5.2.0-dev.8 → 5.2.1

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 (800) hide show
  1. package/CHANGELOG.md +46 -1
  2. package/lib/cjs/Constant.js.map +1 -1
  3. package/lib/cjs/Geometry.d.ts +30 -10
  4. package/lib/cjs/Geometry.d.ts.map +1 -1
  5. package/lib/cjs/Geometry.js +74 -10
  6. package/lib/cjs/Geometry.js.map +1 -1
  7. package/lib/cjs/bspline/AkimaCurve3d.d.ts +19 -6
  8. package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
  9. package/lib/cjs/bspline/AkimaCurve3d.js +21 -5
  10. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  11. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  12. package/lib/cjs/bspline/BSplineCurve.d.ts +3 -3
  13. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  14. package/lib/cjs/bspline/BSplineCurve.js +6 -6
  15. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  16. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  17. package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
  18. package/lib/cjs/bspline/BSplineCurveOps.js +1 -1
  19. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  20. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  21. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  22. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  23. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  24. package/lib/cjs/bspline/BezierCurveBase.d.ts +2 -2
  25. package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
  26. package/lib/cjs/bspline/BezierCurveBase.js +4 -6
  27. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  28. package/lib/cjs/bspline/InterpolationCurve3d.d.ts +27 -17
  29. package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
  30. package/lib/cjs/bspline/InterpolationCurve3d.js +17 -7
  31. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  32. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  33. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  34. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  35. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  36. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  37. package/lib/cjs/clipping/ClipPlane.d.ts +19 -6
  38. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  39. package/lib/cjs/clipping/ClipPlane.js +17 -2
  40. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  41. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  42. package/lib/cjs/clipping/ClipUtils.d.ts +14 -1
  43. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  44. package/lib/cjs/clipping/ClipUtils.js +21 -3
  45. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  46. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  47. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +14 -11
  48. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  49. package/lib/cjs/clipping/ConvexClipPlaneSet.js +23 -16
  50. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  51. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
  52. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  53. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +22 -5
  54. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  55. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  56. package/lib/cjs/core-geometry.js.map +1 -1
  57. package/lib/cjs/curve/Arc3d.d.ts +27 -17
  58. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  59. package/lib/cjs/curve/Arc3d.js +66 -42
  60. package/lib/cjs/curve/Arc3d.js.map +1 -1
  61. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  62. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  63. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  64. package/lib/cjs/curve/CurveCollection.d.ts +1 -0
  65. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  66. package/lib/cjs/curve/CurveCollection.js +1 -0
  67. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  68. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  69. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  70. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  71. package/lib/cjs/curve/CurveLocationDetail.d.ts +8 -7
  72. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  73. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  74. package/lib/cjs/curve/CurveOps.d.ts +48 -1
  75. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  76. package/lib/cjs/curve/CurveOps.js +94 -3
  77. package/lib/cjs/curve/CurveOps.js.map +1 -1
  78. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  79. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  80. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  81. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  82. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  83. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  84. package/lib/cjs/curve/LineString3d.d.ts +4 -4
  85. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  86. package/lib/cjs/curve/LineString3d.js +8 -8
  87. package/lib/cjs/curve/LineString3d.js.map +1 -1
  88. package/lib/cjs/curve/Loop.js.map +1 -1
  89. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  90. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  91. package/lib/cjs/curve/Path.js.map +1 -1
  92. package/lib/cjs/curve/PointString3d.js.map +1 -1
  93. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  94. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
  95. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  96. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  97. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  98. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  99. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +51 -12
  100. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  101. package/lib/cjs/curve/Query/PlanarSubdivision.js +106 -83
  102. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  103. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  104. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  105. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  106. package/lib/cjs/curve/RegionOps.d.ts +49 -25
  107. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  108. package/lib/cjs/curve/RegionOps.js +79 -39
  109. package/lib/cjs/curve/RegionOps.js.map +1 -1
  110. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  111. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +8 -8
  112. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  113. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  114. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  115. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  116. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  117. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  118. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  119. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  120. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  121. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  122. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  123. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
  124. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  125. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +104 -93
  126. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  127. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  128. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  129. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  130. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  131. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  132. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +4 -4
  133. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  134. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +21 -18
  135. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  136. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  137. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  138. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  139. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +30 -50
  140. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  141. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  142. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  143. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  144. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  145. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  146. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  147. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  148. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  149. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +2 -2
  150. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  151. package/lib/cjs/curve/spiral/DirectSpiral3d.js +6 -2
  152. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  153. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
  154. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  155. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +6 -2
  156. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  157. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  158. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  159. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  160. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  161. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +5 -1
  162. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  163. package/lib/cjs/curve/spiral/TransitionSpiral3d.js +0 -3
  164. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  165. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  166. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  167. package/lib/cjs/geometry3d/AngleSweep.d.ts +6 -2
  168. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  169. package/lib/cjs/geometry3d/AngleSweep.js +12 -3
  170. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  171. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  172. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  173. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  174. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  175. package/lib/cjs/geometry3d/FrameBuilder.d.ts +2 -1
  176. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  177. package/lib/cjs/geometry3d/FrameBuilder.js +14 -18
  178. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  179. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  180. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  181. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  182. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  183. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +2 -1
  184. package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
  185. package/lib/cjs/geometry3d/GrowableXYArray.js +2 -1
  186. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  187. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +2 -1
  188. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  189. package/lib/cjs/geometry3d/GrowableXYZArray.js +2 -1
  190. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  191. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  192. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  193. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +9 -16
  194. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  195. package/lib/cjs/geometry3d/IndexedXYZCollection.js +3 -3
  196. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  197. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  198. package/lib/cjs/geometry3d/Matrix3d.d.ts +1 -1
  199. package/lib/cjs/geometry3d/Matrix3d.js +1 -1
  200. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  201. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  202. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  203. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  204. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  205. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  206. package/lib/cjs/geometry3d/Point2dVector2d.d.ts +18 -2
  207. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  208. package/lib/cjs/geometry3d/Point2dVector2d.js +37 -4
  209. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  210. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  211. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  212. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  213. package/lib/cjs/geometry3d/Point3dVector3d.js +1 -0
  214. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  215. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  216. package/lib/cjs/geometry3d/PointStreaming.d.ts +8 -0
  217. package/lib/cjs/geometry3d/PointStreaming.d.ts.map +1 -1
  218. package/lib/cjs/geometry3d/PointStreaming.js +18 -2
  219. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  220. package/lib/cjs/geometry3d/PolygonOps.d.ts +18 -9
  221. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  222. package/lib/cjs/geometry3d/PolygonOps.js +53 -26
  223. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  224. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
  225. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  226. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
  227. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  228. package/lib/cjs/geometry3d/PolylineOps.d.ts +14 -3
  229. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  230. package/lib/cjs/geometry3d/PolylineOps.js +20 -4
  231. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  232. package/lib/cjs/geometry3d/Range.d.ts +34 -32
  233. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  234. package/lib/cjs/geometry3d/Range.js +28 -21
  235. package/lib/cjs/geometry3d/Range.js.map +1 -1
  236. package/lib/cjs/geometry3d/Ray2d.d.ts +16 -6
  237. package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
  238. package/lib/cjs/geometry3d/Ray2d.js +28 -4
  239. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  240. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  241. package/lib/cjs/geometry3d/Ray3d.js +3 -4
  242. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  243. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  244. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  245. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  246. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  247. package/lib/cjs/geometry3d/Transform.js +1 -1
  248. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  249. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  250. package/lib/cjs/geometry3d/XYZProps.d.ts +12 -1
  251. package/lib/cjs/geometry3d/XYZProps.d.ts.map +1 -1
  252. package/lib/cjs/geometry3d/XYZProps.js +17 -2
  253. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  254. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  255. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  256. package/lib/cjs/geometry4d/Matrix4d.d.ts +16 -0
  257. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  258. package/lib/cjs/geometry4d/Matrix4d.js +26 -0
  259. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  260. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  261. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  262. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  263. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  264. package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
  265. package/lib/cjs/numerics/BezierPolynomials.js +5 -9
  266. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  267. package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
  268. package/lib/cjs/numerics/ClusterableArray.js +2 -2
  269. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  270. package/lib/cjs/numerics/Complex.js.map +1 -1
  271. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  272. package/lib/cjs/numerics/Newton.js.map +1 -1
  273. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  274. package/lib/cjs/numerics/PolarData.js.map +1 -1
  275. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  276. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  277. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  278. package/lib/cjs/numerics/SmallSystem.d.ts +13 -7
  279. package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
  280. package/lib/cjs/numerics/SmallSystem.js +13 -7
  281. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  282. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  283. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  284. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  285. package/lib/cjs/polyface/AuxData.js.map +1 -1
  286. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  287. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  288. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  289. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  290. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  291. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  292. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  293. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  294. package/lib/cjs/polyface/Polyface.d.ts +1 -3
  295. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  296. package/lib/cjs/polyface/Polyface.js +2 -6
  297. package/lib/cjs/polyface/Polyface.js.map +1 -1
  298. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +25 -6
  299. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  300. package/lib/cjs/polyface/PolyfaceBuilder.js +59 -8
  301. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  302. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  303. package/lib/cjs/polyface/PolyfaceData.d.ts +2 -0
  304. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  305. package/lib/cjs/polyface/PolyfaceData.js +7 -3
  306. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  307. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  308. package/lib/cjs/polyface/PolyfaceQuery.js +8 -10
  309. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  310. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  311. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  312. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  313. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
  314. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
  315. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
  316. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  317. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
  318. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
  319. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
  320. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  321. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
  322. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  323. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +9 -12
  324. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  325. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
  326. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  327. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
  328. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  329. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  330. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  331. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  332. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  333. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  334. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  335. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  336. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  337. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  338. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  339. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  340. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  341. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  342. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  343. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  344. package/lib/cjs/serialization/DeepCompare.js +1 -1
  345. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  346. package/lib/cjs/serialization/GeometrySamples.d.ts +2 -1
  347. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  348. package/lib/cjs/serialization/GeometrySamples.js +2 -1
  349. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  350. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  351. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  352. package/lib/cjs/solid/Box.js.map +1 -1
  353. package/lib/cjs/solid/Cone.js.map +1 -1
  354. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  355. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  356. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  357. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  358. package/lib/cjs/solid/Sphere.js.map +1 -1
  359. package/lib/cjs/solid/SweepContour.js.map +1 -1
  360. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  361. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  362. package/lib/cjs/topology/Graph.d.ts +38 -12
  363. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  364. package/lib/cjs/topology/Graph.js +91 -23
  365. package/lib/cjs/topology/Graph.js.map +1 -1
  366. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
  367. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
  368. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
  369. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  370. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +20 -11
  371. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  372. package/lib/cjs/topology/HalfEdgeGraphSearch.js +43 -39
  373. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  374. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  375. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  376. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  377. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  378. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  379. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  380. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  381. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  382. package/lib/cjs/topology/MaskManager.js.map +1 -1
  383. package/lib/cjs/topology/Merging.d.ts +22 -11
  384. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  385. package/lib/cjs/topology/Merging.js +31 -21
  386. package/lib/cjs/topology/Merging.js.map +1 -1
  387. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  388. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  389. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  390. package/lib/cjs/topology/Triangulation.d.ts +13 -11
  391. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  392. package/lib/cjs/topology/Triangulation.js +40 -36
  393. package/lib/cjs/topology/Triangulation.js.map +1 -1
  394. package/lib/cjs/topology/Voronoi.d.ts +195 -0
  395. package/lib/cjs/topology/Voronoi.d.ts.map +1 -0
  396. package/lib/cjs/topology/Voronoi.js +700 -0
  397. package/lib/cjs/topology/Voronoi.js.map +1 -0
  398. package/lib/cjs/topology/XYParitySearchContext.d.ts +1 -1
  399. package/lib/cjs/topology/XYParitySearchContext.d.ts.map +1 -1
  400. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  401. package/lib/esm/Constant.js.map +1 -1
  402. package/lib/esm/Geometry.d.ts +30 -10
  403. package/lib/esm/Geometry.d.ts.map +1 -1
  404. package/lib/esm/Geometry.js +74 -10
  405. package/lib/esm/Geometry.js.map +1 -1
  406. package/lib/esm/bspline/AkimaCurve3d.d.ts +19 -6
  407. package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
  408. package/lib/esm/bspline/AkimaCurve3d.js +21 -5
  409. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  410. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  411. package/lib/esm/bspline/BSplineCurve.d.ts +3 -3
  412. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  413. package/lib/esm/bspline/BSplineCurve.js +6 -6
  414. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  415. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  416. package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
  417. package/lib/esm/bspline/BSplineCurveOps.js +1 -1
  418. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  419. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  420. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  421. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  422. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  423. package/lib/esm/bspline/BezierCurveBase.d.ts +2 -2
  424. package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
  425. package/lib/esm/bspline/BezierCurveBase.js +4 -6
  426. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  427. package/lib/esm/bspline/InterpolationCurve3d.d.ts +27 -17
  428. package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
  429. package/lib/esm/bspline/InterpolationCurve3d.js +17 -7
  430. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  431. package/lib/esm/bspline/KnotVector.js.map +1 -1
  432. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  433. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  434. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  435. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  436. package/lib/esm/clipping/ClipPlane.d.ts +19 -6
  437. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  438. package/lib/esm/clipping/ClipPlane.js +17 -2
  439. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  440. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  441. package/lib/esm/clipping/ClipUtils.d.ts +14 -1
  442. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  443. package/lib/esm/clipping/ClipUtils.js +21 -3
  444. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  445. package/lib/esm/clipping/ClipVector.js.map +1 -1
  446. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +14 -11
  447. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  448. package/lib/esm/clipping/ConvexClipPlaneSet.js +23 -16
  449. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  450. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
  451. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  452. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +22 -5
  453. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  454. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  455. package/lib/esm/core-geometry.js.map +1 -1
  456. package/lib/esm/curve/Arc3d.d.ts +27 -17
  457. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  458. package/lib/esm/curve/Arc3d.js +66 -42
  459. package/lib/esm/curve/Arc3d.js.map +1 -1
  460. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  461. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  462. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  463. package/lib/esm/curve/CurveCollection.d.ts +1 -0
  464. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  465. package/lib/esm/curve/CurveCollection.js +1 -0
  466. package/lib/esm/curve/CurveCollection.js.map +1 -1
  467. package/lib/esm/curve/CurveCurve.js.map +1 -1
  468. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  469. package/lib/esm/curve/CurveFactory.js.map +1 -1
  470. package/lib/esm/curve/CurveLocationDetail.d.ts +8 -7
  471. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  472. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  473. package/lib/esm/curve/CurveOps.d.ts +48 -1
  474. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  475. package/lib/esm/curve/CurveOps.js +95 -4
  476. package/lib/esm/curve/CurveOps.js.map +1 -1
  477. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  478. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  479. package/lib/esm/curve/CurveTypes.js.map +1 -1
  480. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  481. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  482. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  483. package/lib/esm/curve/LineString3d.d.ts +4 -4
  484. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  485. package/lib/esm/curve/LineString3d.js +8 -8
  486. package/lib/esm/curve/LineString3d.js.map +1 -1
  487. package/lib/esm/curve/Loop.js.map +1 -1
  488. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  489. package/lib/esm/curve/ParityRegion.js.map +1 -1
  490. package/lib/esm/curve/Path.js.map +1 -1
  491. package/lib/esm/curve/PointString3d.js.map +1 -1
  492. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  493. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
  494. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  495. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  496. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  497. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  498. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +51 -12
  499. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  500. package/lib/esm/curve/Query/PlanarSubdivision.js +106 -83
  501. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  502. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  503. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  504. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  505. package/lib/esm/curve/RegionOps.d.ts +49 -25
  506. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  507. package/lib/esm/curve/RegionOps.js +77 -37
  508. package/lib/esm/curve/RegionOps.js.map +1 -1
  509. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  510. package/lib/esm/curve/RegionOpsClassificationSweeps.js +8 -8
  511. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  512. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  513. package/lib/esm/curve/UnionRegion.js.map +1 -1
  514. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  515. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  516. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  517. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  518. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  519. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  520. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  521. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  522. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
  523. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  524. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +104 -93
  525. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  526. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  527. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  528. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  529. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  530. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  531. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +4 -4
  532. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  533. package/lib/esm/curve/internalContexts/MultiChainCollector.js +21 -18
  534. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  535. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  536. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  537. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  538. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +30 -50
  539. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  540. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  541. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  542. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  543. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  544. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  545. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  546. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  547. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  548. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +2 -2
  549. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  550. package/lib/esm/curve/spiral/DirectSpiral3d.js +6 -2
  551. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  552. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
  553. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  554. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +6 -2
  555. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  556. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  557. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  558. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  559. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  560. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +5 -1
  561. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  562. package/lib/esm/curve/spiral/TransitionSpiral3d.js +0 -3
  563. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  564. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  565. package/lib/esm/geometry3d/Angle.js.map +1 -1
  566. package/lib/esm/geometry3d/AngleSweep.d.ts +6 -2
  567. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  568. package/lib/esm/geometry3d/AngleSweep.js +12 -3
  569. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  570. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  571. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  572. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  573. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  574. package/lib/esm/geometry3d/FrameBuilder.d.ts +2 -1
  575. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  576. package/lib/esm/geometry3d/FrameBuilder.js +14 -18
  577. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  578. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  579. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  580. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  581. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  582. package/lib/esm/geometry3d/GrowableXYArray.d.ts +2 -1
  583. package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
  584. package/lib/esm/geometry3d/GrowableXYArray.js +2 -1
  585. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  586. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +2 -1
  587. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  588. package/lib/esm/geometry3d/GrowableXYZArray.js +2 -1
  589. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  590. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  591. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  592. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +9 -16
  593. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  594. package/lib/esm/geometry3d/IndexedXYZCollection.js +3 -3
  595. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  596. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  597. package/lib/esm/geometry3d/Matrix3d.d.ts +1 -1
  598. package/lib/esm/geometry3d/Matrix3d.js +1 -1
  599. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  600. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  601. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  602. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  603. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  604. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  605. package/lib/esm/geometry3d/Point2dVector2d.d.ts +18 -2
  606. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  607. package/lib/esm/geometry3d/Point2dVector2d.js +37 -4
  608. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  609. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  610. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  611. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  612. package/lib/esm/geometry3d/Point3dVector3d.js +1 -0
  613. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  614. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  615. package/lib/esm/geometry3d/PointStreaming.d.ts +8 -0
  616. package/lib/esm/geometry3d/PointStreaming.d.ts.map +1 -1
  617. package/lib/esm/geometry3d/PointStreaming.js +18 -2
  618. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  619. package/lib/esm/geometry3d/PolygonOps.d.ts +18 -9
  620. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  621. package/lib/esm/geometry3d/PolygonOps.js +53 -26
  622. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  623. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
  624. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  625. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
  626. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  627. package/lib/esm/geometry3d/PolylineOps.d.ts +14 -3
  628. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  629. package/lib/esm/geometry3d/PolylineOps.js +20 -4
  630. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  631. package/lib/esm/geometry3d/Range.d.ts +34 -32
  632. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  633. package/lib/esm/geometry3d/Range.js +28 -21
  634. package/lib/esm/geometry3d/Range.js.map +1 -1
  635. package/lib/esm/geometry3d/Ray2d.d.ts +16 -6
  636. package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
  637. package/lib/esm/geometry3d/Ray2d.js +28 -4
  638. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  639. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  640. package/lib/esm/geometry3d/Ray3d.js +3 -4
  641. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  642. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  643. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  644. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  645. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  646. package/lib/esm/geometry3d/Transform.js +1 -1
  647. package/lib/esm/geometry3d/Transform.js.map +1 -1
  648. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  649. package/lib/esm/geometry3d/XYZProps.d.ts +12 -1
  650. package/lib/esm/geometry3d/XYZProps.d.ts.map +1 -1
  651. package/lib/esm/geometry3d/XYZProps.js +16 -1
  652. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  653. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  654. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  655. package/lib/esm/geometry4d/Matrix4d.d.ts +16 -0
  656. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  657. package/lib/esm/geometry4d/Matrix4d.js +26 -0
  658. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  659. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  660. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  661. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  662. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  663. package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
  664. package/lib/esm/numerics/BezierPolynomials.js +5 -9
  665. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  666. package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
  667. package/lib/esm/numerics/ClusterableArray.js +2 -2
  668. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  669. package/lib/esm/numerics/Complex.js.map +1 -1
  670. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  671. package/lib/esm/numerics/Newton.js.map +1 -1
  672. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  673. package/lib/esm/numerics/PolarData.js.map +1 -1
  674. package/lib/esm/numerics/Polynomials.js.map +1 -1
  675. package/lib/esm/numerics/Quadrature.js.map +1 -1
  676. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  677. package/lib/esm/numerics/SmallSystem.d.ts +13 -7
  678. package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
  679. package/lib/esm/numerics/SmallSystem.js +13 -7
  680. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  681. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  682. package/lib/esm/numerics/UnionFind.js.map +1 -1
  683. package/lib/esm/numerics/UsageSums.js.map +1 -1
  684. package/lib/esm/polyface/AuxData.js.map +1 -1
  685. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  686. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  687. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  688. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  689. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  690. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  691. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  692. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  693. package/lib/esm/polyface/Polyface.d.ts +1 -3
  694. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  695. package/lib/esm/polyface/Polyface.js +2 -6
  696. package/lib/esm/polyface/Polyface.js.map +1 -1
  697. package/lib/esm/polyface/PolyfaceBuilder.d.ts +25 -6
  698. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  699. package/lib/esm/polyface/PolyfaceBuilder.js +59 -8
  700. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  701. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  702. package/lib/esm/polyface/PolyfaceData.d.ts +2 -0
  703. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  704. package/lib/esm/polyface/PolyfaceData.js +7 -3
  705. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  706. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  707. package/lib/esm/polyface/PolyfaceQuery.js +8 -10
  708. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  709. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  710. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  711. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  712. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
  713. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
  714. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
  715. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  716. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
  717. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
  718. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
  719. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  720. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
  721. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  722. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +9 -12
  723. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  724. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
  725. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  726. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
  727. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  728. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  729. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  730. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  731. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  732. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  733. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  734. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  735. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  736. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  737. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  738. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  739. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  740. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  741. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  742. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  743. package/lib/esm/serialization/DeepCompare.js +1 -1
  744. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  745. package/lib/esm/serialization/GeometrySamples.d.ts +2 -1
  746. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  747. package/lib/esm/serialization/GeometrySamples.js +2 -1
  748. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  749. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  750. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  751. package/lib/esm/solid/Box.js.map +1 -1
  752. package/lib/esm/solid/Cone.js.map +1 -1
  753. package/lib/esm/solid/LinearSweep.js.map +1 -1
  754. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  755. package/lib/esm/solid/RuledSweep.js.map +1 -1
  756. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  757. package/lib/esm/solid/Sphere.js.map +1 -1
  758. package/lib/esm/solid/SweepContour.js.map +1 -1
  759. package/lib/esm/solid/TorusPipe.js.map +1 -1
  760. package/lib/esm/topology/ChainMerge.js.map +1 -1
  761. package/lib/esm/topology/Graph.d.ts +38 -12
  762. package/lib/esm/topology/Graph.d.ts.map +1 -1
  763. package/lib/esm/topology/Graph.js +92 -24
  764. package/lib/esm/topology/Graph.js.map +1 -1
  765. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
  766. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
  767. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
  768. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  769. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +20 -11
  770. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  771. package/lib/esm/topology/HalfEdgeGraphSearch.js +43 -39
  772. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  773. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  774. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  775. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  776. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  777. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  778. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  779. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  780. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  781. package/lib/esm/topology/MaskManager.js.map +1 -1
  782. package/lib/esm/topology/Merging.d.ts +22 -11
  783. package/lib/esm/topology/Merging.d.ts.map +1 -1
  784. package/lib/esm/topology/Merging.js +32 -22
  785. package/lib/esm/topology/Merging.js.map +1 -1
  786. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  787. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  788. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  789. package/lib/esm/topology/Triangulation.d.ts +13 -11
  790. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  791. package/lib/esm/topology/Triangulation.js +40 -36
  792. package/lib/esm/topology/Triangulation.js.map +1 -1
  793. package/lib/esm/topology/Voronoi.d.ts +195 -0
  794. package/lib/esm/topology/Voronoi.d.ts.map +1 -0
  795. package/lib/esm/topology/Voronoi.js +696 -0
  796. package/lib/esm/topology/Voronoi.js.map +1 -0
  797. package/lib/esm/topology/XYParitySearchContext.d.ts +1 -1
  798. package/lib/esm/topology/XYParitySearchContext.d.ts.map +1 -1
  799. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  800. package/package.json +3 -3
@@ -8,20 +8,28 @@ import { ParityRegion } from "../ParityRegion";
8
8
  */
9
9
  export declare class PlanarSubdivision {
10
10
  /**
11
- * Create a graph from an array of curves, and an array of the curves' precomputed intersections.
12
- * Z-coordinates are ignored.
11
+ * Create a graph from curves and precomputed intersections.
12
+ * * Z-coordinates are ignored.
13
+ * @param primitives input curves
14
+ * @param allPairs array of curve-curve xy-intersections
15
+ * @param mergeTolerance optional distance tolerance for clustering vertices. Default value is [[Geometry.smallMetricDistance]].
13
16
  */
14
17
  static assembleHalfEdgeGraph(primitives: CurvePrimitive[], allPairs: CurveLocationDetailPair[], mergeTolerance?: number): HalfEdgeGraph;
15
18
  /**
16
- * Create a pair of mated half edges referencing an interval of a primitive.
17
- * * no action if start and end points are identical.
19
+ * Filter for trivial curve fragment: fast computation if line segment; otherwise clip, flatten, and measure.
20
+ * * Different metrics are employed for expedience.
21
+ */
22
+ private static isCurveTrivialXY;
23
+ /**
24
+ * Create a pair of mated half edges referencing a non-trivial interval of a primitive.
18
25
  * @param graph containing graph
19
26
  * @param p the curve
20
27
  * @param point0 start point
21
28
  * @param fraction0 starting fraction
22
29
  * @param point1 end point
23
30
  * @param fraction1 end fraction
24
- * @returns end point and fraction, or start point and fraction if no action
31
+ * @param mergeTolerance optional maximum xy-length of a trivial edge
32
+ * @returns end point and fraction
25
33
  */
26
34
  private static addHalfEdge;
27
35
  /**
@@ -39,23 +47,54 @@ export declare class PlanarSubdivision {
39
47
  /**
40
48
  * Create a [[Loop]] for the given face or super face.
41
49
  * @param face a node in the face loop, or an array of HalfEdges that comprise a loop (e.g., a super face).
42
- * @param announce optional callback invoked on each edge/curve of the face/Loop.
43
- * @param compress whether to consolidate adjacent curves in the output Loop (default `false`).
44
- * If `announce` is provided, no compression is performed, as edges and curves would no longer be in 1-1 correspondence.
50
+ * @param options bundle of options.
51
+ * @returns the Loop, or `undefined` if it is not closed within xy-tolerance.
45
52
  */
46
- static createLoopInFace(face: HalfEdge | HalfEdge[], announce?: (he: HalfEdge, curve: CurvePrimitive, loop: Loop) => void, compress?: boolean): Loop | undefined;
53
+ static createLoopInFace(face: HalfEdge | HalfEdge[], options?: PlanarSubdivision.CreateRegionInFaceOptions): Loop | undefined;
47
54
  /**
48
55
  * Create a [[Loop]] or [[ParityRegion]] for the given face.
49
56
  * * A ParityRegion is created for a split-washer type face by removing bridge edges.
50
57
  * @param face a node in the face loop.
51
- * @param bridgeMask mask preset on bridge edges (default is `HalfEdgeMask.BRIDGE_EDGE`).
52
- * @param visitMask mask to use for visiting edges in the face loop (default is `HalfEdgeMask.VISITED`).
58
+ * @param options bundle of options.
59
+ * @returns the Loop or ParityRegion, or `undefined` if one could not be computed.
53
60
  */
54
- static createLoopOrParityRegionInFace(face: HalfEdge, bridgeMask?: HalfEdgeMask, visitMask?: HalfEdgeMask): Loop | ParityRegion | undefined;
61
+ static createLoopOrParityRegionInFace(face: HalfEdge, options?: PlanarSubdivision.CreateRegionInFaceOptions): Loop | ParityRegion | undefined;
55
62
  /** Return true if there are only two edges in the face loop, and their start curvatures are the same. */
56
63
  private static isNullFace;
57
64
  /** Look across edge mates (possibly several) for a non-null mate face. */
58
65
  private static getNonNullEdgeMate;
59
66
  static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance?: number): SignedLoops[];
60
67
  }
68
+ /**
69
+ * @internal
70
+ */
71
+ export declare namespace PlanarSubdivision {
72
+ /** Options bundle for [[PlanarSubdivision.createLoopInFace]] and [[PlanarSubdivision.createLoopOrParityRegionInFace]]. */
73
+ interface CreateRegionInFaceOptions {
74
+ /**
75
+ * Optional callback invoked on each `edge` before its `curve` is added to `loop`.
76
+ * * Note that if a [[ParityRegion]] is being constructed, `curve` and `loop` may subsequently be reversed.
77
+ */
78
+ announceEdge?: (edge: HalfEdge, curve: CurvePrimitive, loop: Loop) => void;
79
+ /**
80
+ * Whether to consolidate adjacent curves in an output [[Loop]]. Default value is `false`.
81
+ * * If `announce` is defined, no compression is performed, as edges and curves would no longer be in 1-1 correspondence.
82
+ */
83
+ compress?: boolean;
84
+ /** Absolute xy-distance for confirming a returned Loop is closed. Default value is [[Geometry.smallMetricDistance]]. */
85
+ closureTol?: number;
86
+ /**
87
+ * Mask preset on bridge edges. Default value is `HalfEdgeMask.BRIDGE_EDGE`.
88
+ * * This mask is used to distinguish a split-washer type face, which can result in a [[ParityRegion]].
89
+ */
90
+ bridgeMask?: HalfEdgeMask;
91
+ /** Mask to use for visiting edges when creating a [[ParityRegion]] from a split-washer type face. Default value is `HalfEdgeMask.VISITED`. */
92
+ visitMask?: HalfEdgeMask;
93
+ /**
94
+ * Optional z-coordinate for the result region.
95
+ * * If undefined, graph z-coordinates are used, but this may result in a non-planar region if the graph is not planar!
96
+ */
97
+ z?: number;
98
+ }
99
+ }
61
100
  //# sourceMappingURL=PlanarSubdivision.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarSubdivision.d.ts","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI7E,OAAO,EAAuB,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,EAAE,IAAI,EAAsB,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyE/C;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;OAGG;WACW,qBAAqB,CACjC,UAAU,EAAE,cAAc,EAAE,EAC5B,QAAQ,EAAE,uBAAuB,EAAE,EACnC,cAAc,GAAE,MAAqC,GACpD,aAAa;IA0ChB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAwB1B;;;;;;OAMG;WACW,iBAAiB,CAC7B,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,GAAE,MAAgB,EAAE,YAAY,CAAC,EAAE,OAAO,GAC7F,MAAM;IAeT,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAUtC,kDAAkD;IAClD,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAShC;;;;;;OAMG;WACW,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,QAAQ,GAAE,OAAe,GAAG,IAAI,GAAG,SAAS;IAyB9K;;;;;;OAMG;WACW,8BAA8B,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,GAAE,YAAuC,EAAE,SAAS,GAAE,YAAmC,GAAG,IAAI,GAAG,YAAY,GAAG,SAAS;IAiClM,yGAAyG;IACzG,OAAO,CAAC,MAAM,CAAC,UAAU;IAWzB,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,kBAAkB;WAWnB,oCAAoC,CAAC,KAAK,EAAE,aAAa,EAAE,iBAAiB,GAAE,MAAgB,GAAG,WAAW,EAAE;CAmC7H"}
1
+ {"version":3,"file":"PlanarSubdivision.d.ts","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI7E,OAAO,EAAuB,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,EAAE,IAAI,EAAsB,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA6F/C;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;WACW,qBAAqB,CACjC,UAAU,EAAE,cAAc,EAAE,EAC5B,QAAQ,EAAE,uBAAuB,EAAE,EACnC,cAAc,GAAE,MAAqC,GACpD,aAAa;IA4ChB;;;MAGE;IACF,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAwB1B;;;;;;OAMG;WACW,iBAAiB,CAC7B,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,GAAE,MAAgB,EAAE,YAAY,CAAC,EAAE,OAAO,GAC7F,MAAM;IAeT,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAUtC,kDAAkD;IAClD,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAYhC;;;;;OAKG;WACW,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,yBAAyB,GAAG,IAAI,GAAG,SAAS;IAwBpI;;;;;;OAMG;WACW,8BAA8B,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,yBAAyB,GAAG,IAAI,GAAG,YAAY,GAAG,SAAS;IAqCpJ,yGAAyG;IACzG,OAAO,CAAC,MAAM,CAAC,UAAU;IAWzB,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,kBAAkB;WAWnB,oCAAoC,CAAC,KAAK,EAAE,aAAa,EAAE,iBAAiB,GAAE,MAAgB,GAAG,WAAW,EAAE;CAkC7H;AAED;;EAEE;AACF,yBAAiB,iBAAiB,CAAC;IACjC,0HAA0H;IAC1H,UAAiB,yBAAyB;QACxC;;;WAGG;QACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;QAC3E;;;WAGG;QACH,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,wHAAwH;QACxH,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;WAGG;QACH,UAAU,CAAC,EAAE,YAAY,CAAC;QAC1B,8IAA8I;QAC9I,SAAS,CAAC,EAAE,YAAY,CAAC;QACzB;;;WAGG;QACH,CAAC,CAAC,EAAE,MAAM,CAAC;KACZ;CACF"}
@@ -4,6 +4,7 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { assert } from "@itwin/core-bentley";
6
6
  import { Geometry } from "../../Geometry";
7
+ import { Transform } from "../../geometry3d/Transform";
7
8
  import { HalfEdgeGraph, HalfEdgeMask } from "../../topology/Graph";
8
9
  import { HalfEdgeGraphSearch } from "../../topology/HalfEdgeGraphSearch";
9
10
  import { HalfEdgeGraphMerge } from "../../topology/Merging";
@@ -18,6 +19,25 @@ import { RegionGroupMember, RegionGroupOpType } from "../RegionOpsClassification
18
19
  /** @packageDocumentation
19
20
  * @module Curve
20
21
  */
22
+ function computeSortAngle(curve, fraction, reverse) {
23
+ const ray = curve.fractionToPointAndDerivative(fraction);
24
+ const s = reverse ? -1.0 : 1.0;
25
+ return Math.atan2(s * ray.direction.y, s * ray.direction.x);
26
+ }
27
+ function getFractionOnCurve(pair, curve) {
28
+ if (pair.detailA.curve === curve)
29
+ return pair.detailA.fraction;
30
+ if (pair.detailB.curve === curve)
31
+ return pair.detailB.fraction;
32
+ return undefined;
33
+ }
34
+ function getDetailOnCurve(pair, curve) {
35
+ if (pair.detailA.curve === curve)
36
+ return pair.detailA;
37
+ if (pair.detailB.curve === curve)
38
+ return pair.detailB;
39
+ return undefined;
40
+ }
21
41
  class MapCurvePrimitiveToCurveLocationDetailPairArray {
22
42
  primitiveToPair = new Map();
23
43
  // index assigned to this primitive (for debugging)
@@ -80,8 +100,11 @@ class MapCurvePrimitiveToCurveLocationDetailPairArray {
80
100
  */
81
101
  export class PlanarSubdivision {
82
102
  /**
83
- * Create a graph from an array of curves, and an array of the curves' precomputed intersections.
84
- * Z-coordinates are ignored.
103
+ * Create a graph from curves and precomputed intersections.
104
+ * * Z-coordinates are ignored.
105
+ * @param primitives input curves
106
+ * @param allPairs array of curve-curve xy-intersections
107
+ * @param mergeTolerance optional distance tolerance for clustering vertices. Default value is [[Geometry.smallMetricDistance]].
85
108
  */
86
109
  static assembleHalfEdgeGraph(primitives, allPairs, mergeTolerance = Geometry.smallMetricDistance) {
87
110
  // map from key CurvePrimitive to CurveLocationDetailPair
@@ -122,35 +145,50 @@ export class PlanarSubdivision {
122
145
  }
123
146
  this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);
124
147
  }
125
- HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he) => he.sortAngle);
148
+ // every edge got its sortAngle defined by addHalfEdge
149
+ HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he) => he.sortAngle ?? 0, mergeTolerance);
126
150
  return graph;
127
151
  }
128
152
  /**
129
- * Create a pair of mated half edges referencing an interval of a primitive.
130
- * * no action if start and end points are identical.
153
+ * Filter for trivial curve fragment: fast computation if line segment; otherwise clip, flatten, and measure.
154
+ * * Different metrics are employed for expedience.
155
+ */
156
+ static isCurveTrivialXY(p, point0, fraction0, point1, fraction1, mergeTolerance) {
157
+ if (Geometry.isSmallRelative(fraction0 - fraction1))
158
+ return true;
159
+ if (!(p instanceof LineSegment3d)) {
160
+ const p0 = p.clonePartialCurve(fraction0, fraction1);
161
+ if (p0?.tryTransformInPlace(Transform.createRowValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0))) // flatten
162
+ return p0.curveLength() <= mergeTolerance; // Euclidean
163
+ }
164
+ return point0.isAlmostEqualXY(point1, mergeTolerance); // Manhattan
165
+ }
166
+ /**
167
+ * Create a pair of mated half edges referencing a non-trivial interval of a primitive.
131
168
  * @param graph containing graph
132
169
  * @param p the curve
133
170
  * @param point0 start point
134
171
  * @param fraction0 starting fraction
135
172
  * @param point1 end point
136
173
  * @param fraction1 end fraction
137
- * @returns end point and fraction, or start point and fraction if no action
174
+ * @param mergeTolerance optional maximum xy-length of a trivial edge
175
+ * @returns end point and fraction
138
176
  */
139
177
  static addHalfEdge(graph, p, point0, fraction0, point1, fraction1, mergeTolerance = Geometry.smallMetricDistance) {
140
- if (point0.isAlmostEqualXY(point1, mergeTolerance))
141
- return { point: point0, fraction: fraction0 };
142
- const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);
143
- if (p.parent && p.parent instanceof RegionGroupMember && p.parent.parentGroup.groupOpType === RegionGroupOpType.NonBounding)
144
- halfEdge.setMaskAroundEdge(HalfEdgeMask.BRIDGE_EDGE);
145
- const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);
146
- const mate = halfEdge.edgeMate;
147
- halfEdge.edgeTag = detail01;
148
- halfEdge.sortData = 1.0;
149
- mate.edgeTag = detail01;
150
- mate.sortData = -1.0;
151
- halfEdge.sortAngle = sortAngle(p, fraction0, false);
152
- mate.sortAngle = sortAngle(p, fraction1, true);
153
- return { point: point1, fraction: fraction1 };
178
+ if (!this.isCurveTrivialXY(p, point0, fraction0, point1, fraction1, mergeTolerance)) {
179
+ const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);
180
+ if (p.parent && p.parent instanceof RegionGroupMember && p.parent.parentGroup.groupOpType === RegionGroupOpType.NonBounding)
181
+ halfEdge.setMaskAroundEdge(HalfEdgeMask.BRIDGE_EDGE);
182
+ const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);
183
+ const mate = halfEdge.edgeMate;
184
+ halfEdge.edgeTag = detail01;
185
+ halfEdge.sortData = 1.0;
186
+ mate.edgeTag = detail01;
187
+ mate.sortData = -1.0;
188
+ halfEdge.sortAngle = computeSortAngle(p, fraction0, false);
189
+ mate.sortAngle = computeSortAngle(p, fraction1, true);
190
+ }
191
+ return { point: point1, fraction: fraction1 }; // where the next curve fragment starts
154
192
  }
155
193
  /**
156
194
  * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative,
@@ -186,30 +224,31 @@ export class PlanarSubdivision {
186
224
  return undefined;
187
225
  }
188
226
  /** Create the geometry for a topological edge. */
189
- static createCurveInEdge(edge) {
227
+ static createCurveInEdge(edge, z) {
228
+ let result;
190
229
  const info = this.extractGeometryFromEdge(edge);
191
- if (info) {
192
- if (info.reversed)
193
- return info.detail.curve.clonePartialCurve(info.detail.fraction1, info.detail.fraction);
194
- return info.detail.curve.clonePartialCurve(info.detail.fraction, info.detail.fraction1);
230
+ if (info && info.detail.curve && info.detail.fraction1) {
231
+ const f0 = info.reversed ? info.detail.fraction1 : info.detail.fraction;
232
+ const f1 = info.reversed ? info.detail.fraction : info.detail.fraction1;
233
+ result = info.detail.curve.clonePartialCurve(f0, f1);
234
+ if (result && z !== undefined)
235
+ result.tryTransformInPlace(Transform.createRowValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, z));
195
236
  }
196
- return undefined;
237
+ return result;
197
238
  }
198
239
  /**
199
240
  * Create a [[Loop]] for the given face or super face.
200
241
  * @param face a node in the face loop, or an array of HalfEdges that comprise a loop (e.g., a super face).
201
- * @param announce optional callback invoked on each edge/curve of the face/Loop.
202
- * @param compress whether to consolidate adjacent curves in the output Loop (default `false`).
203
- * If `announce` is provided, no compression is performed, as edges and curves would no longer be in 1-1 correspondence.
242
+ * @param options bundle of options.
243
+ * @returns the Loop, or `undefined` if it is not closed within xy-tolerance.
204
244
  */
205
- static createLoopInFace(face, announce, compress = false) {
206
- if (announce)
207
- compress = false;
245
+ static createLoopInFace(face, options) {
246
+ const consolidate = options?.announceEdge ? false : options?.compress ?? false; // can't compress if announcing
208
247
  const loop = Loop.create();
209
- const addEdgeCurve = (he) => {
210
- const curve = this.createCurveInEdge(he);
248
+ const addEdgeCurve = (edge) => {
249
+ const curve = this.createCurveInEdge(edge, options?.z);
211
250
  if (curve) {
212
- announce?.(he, curve, loop);
251
+ options?.announceEdge?.(edge, curve, loop);
213
252
  loop.tryAddChild(curve);
214
253
  }
215
254
  };
@@ -217,29 +256,33 @@ export class PlanarSubdivision {
217
256
  face.forEach(addEdgeCurve);
218
257
  else
219
258
  face.announceEdgesInFace(addEdgeCurve);
220
- if (compress) {
221
- const options = new ConsolidateAdjacentCurvePrimitivesOptions();
222
- options.consolidateLoopSeam = true;
223
- RegionOps.consolidateAdjacentPrimitives(loop, options);
259
+ if (consolidate) {
260
+ const consolidateOptions = new ConsolidateAdjacentCurvePrimitivesOptions();
261
+ consolidateOptions.consolidateLoopSeam = true;
262
+ RegionOps.consolidateAdjacentPrimitives(loop, consolidateOptions);
224
263
  }
225
- if (loop.isPhysicallyClosedCurve(undefined, true))
264
+ if (loop.isPhysicallyClosedCurve(options?.closureTol, true))
226
265
  return loop;
227
- assert(false, "createLoopInFace: face is not physically closed");
266
+ assert(() => false, "face is not physically closed");
228
267
  return undefined;
229
268
  }
230
269
  /**
231
270
  * Create a [[Loop]] or [[ParityRegion]] for the given face.
232
271
  * * A ParityRegion is created for a split-washer type face by removing bridge edges.
233
272
  * @param face a node in the face loop.
234
- * @param bridgeMask mask preset on bridge edges (default is `HalfEdgeMask.BRIDGE_EDGE`).
235
- * @param visitMask mask to use for visiting edges in the face loop (default is `HalfEdgeMask.VISITED`).
273
+ * @param options bundle of options.
274
+ * @returns the Loop or ParityRegion, or `undefined` if one could not be computed.
236
275
  */
237
- static createLoopOrParityRegionInFace(face, bridgeMask = HalfEdgeMask.BRIDGE_EDGE, visitMask = HalfEdgeMask.VISITED) {
276
+ static createLoopOrParityRegionInFace(face, options) {
238
277
  let region;
239
- if (face.isSplitWasherFace(bridgeMask)) {
278
+ const visitMask = options?.visitMask ?? HalfEdgeMask.VISITED;
279
+ const bridgeMask = options?.bridgeMask ?? HalfEdgeMask.BRIDGE_EDGE;
280
+ let startBridgeEdge;
281
+ // is it a split-washer face?
282
+ if (face.isSplitWasherFace(bridgeMask) && (startBridgeEdge = face.findMaskAroundFace(bridgeMask, true))) {
240
283
  const loops = [];
241
284
  const loopEdges = [];
242
- const bridgeStack = [face.findMaskAroundFace(bridgeMask, true)];
285
+ const bridgeStack = [startBridgeEdge];
243
286
  const announceEdge = (he) => { he.setMask(visitMask); loopEdges.push(he); };
244
287
  const announceBridge = (he) => { if (!he.isMaskSet(visitMask))
245
288
  bridgeStack.push(he); };
@@ -253,7 +296,7 @@ export class PlanarSubdivision {
253
296
  continue;
254
297
  loopEdges.length = 0;
255
298
  if (loopSeed.announceEdgesInSuperFace(bridgeMask, announceEdge, announceBridge)) {
256
- const loop = this.createLoopInFace(loopEdges, undefined, true);
299
+ const loop = this.createLoopInFace(loopEdges, options);
257
300
  if (loop) {
258
301
  loops.push(loop);
259
302
  continue;
@@ -265,7 +308,7 @@ export class PlanarSubdivision {
265
308
  region = RegionOps.simplifyRegion(region);
266
309
  }
267
310
  else {
268
- region = this.createLoopInFace(face, undefined, true);
311
+ region = this.createLoopInFace(face, options);
269
312
  }
270
313
  return (region && (region instanceof Loop || region instanceof ParityRegion)) ? region : undefined;
271
314
  }
@@ -302,24 +345,23 @@ export class PlanarSubdivision {
302
345
  const edges = [];
303
346
  for (const faceSeed of faceSeeds) {
304
347
  const isNullFace = this.isNullFace(faceSeed);
305
- const loop = this.createLoopInFace(faceSeed, (he, curveC, loopC) => {
306
- if (!isNullFace) {
307
- const mate = this.getNonNullEdgeMate(graph, he);
308
- if (mate !== undefined) {
309
- const e = edgeMap.get(mate);
310
- if (e === undefined) {
311
- // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge
312
- const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);
313
- edgeMap.set(he, e1);
314
- }
315
- else if (e instanceof LoopCurveLoopCurve) {
316
- e.setB(loopC, curveC);
317
- edges.push(e);
318
- edgeMap.delete(mate);
319
- }
348
+ const announceEdge = isNullFace ? undefined : (he, curveC, loopC) => {
349
+ const mate = this.getNonNullEdgeMate(graph, he);
350
+ if (mate !== undefined) {
351
+ const e = edgeMap.get(mate);
352
+ if (e === undefined) {
353
+ // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge
354
+ const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);
355
+ edgeMap.set(he, e1);
356
+ }
357
+ else if (e instanceof LoopCurveLoopCurve) {
358
+ e.setB(loopC, curveC);
359
+ edges.push(e);
360
+ edgeMap.delete(mate);
320
361
  }
321
362
  }
322
- });
363
+ };
364
+ const loop = this.createLoopInFace(faceSeed, { announceEdge });
323
365
  if (loop)
324
366
  this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance, isNullFace);
325
367
  }
@@ -330,23 +372,4 @@ export class PlanarSubdivision {
330
372
  return result;
331
373
  }
332
374
  }
333
- function sortAngle(curve, fraction, reverse) {
334
- const ray = curve.fractionToPointAndDerivative(fraction);
335
- const s = reverse ? -1.0 : 1.0;
336
- return Math.atan2(s * ray.direction.y, s * ray.direction.x);
337
- }
338
- function getFractionOnCurve(pair, curve) {
339
- if (pair.detailA.curve === curve)
340
- return pair.detailA.fraction;
341
- if (pair.detailB.curve === curve)
342
- return pair.detailB.fraction;
343
- return undefined;
344
- }
345
- function getDetailOnCurve(pair, curve) {
346
- if (pair.detailA.curve === curve)
347
- return pair.detailA;
348
- if (pair.detailB.curve === curve)
349
- return pair.detailB;
350
- return undefined;
351
- }
352
375
  //# sourceMappingURL=PlanarSubdivision.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAY,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAe,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,yCAAyC,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAExF;;GAEG;AAEH,MAAM,+CAA+C;IAC5C,eAAe,GAAG,IAAI,GAAG,EAA6C,CAAC;IAC9E,mDAAmD;IAC5C,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;IACpD,qBAAqB,GAAW,CAAC,CAAC;IACnC,oBAAoB,CAAC,SAAqC;QAC/D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IACM,qBAAqB,CAAC,SAAqC,EAAE,IAA6B;QAC/F,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IACM,UAAU,CAAC,IAA6B;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACtC,IAAI,UAAU;YACZ,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACtC,IAAI,UAAU;YACZ,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD;;;;;OAKG;IACI,qCAAqC,CAC1C,UAA4B,EAAE,YAAoB,QAAQ,CAAC,mBAAmB;QAE9E,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,yBAAyB,GAAG,KAAK,CAAC;YACtC,IAAI,CAAC,YAAY,KAAK;gBACpB,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;iBAC9C,IAAI,CAAC,CAAC,CAAC,YAAY,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,YAAY,CAAC,EAAE,6FAA6F;gBACnK,yBAAyB,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;YACtF,IAAI,yBAAyB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,MAAM,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzC,MAAM,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;oBACb,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,aAAa,CACnD,mBAAmB,CAAC,4BAA4B,CAAC,EAAE,EAAE,GAAG,CAAC,EACzD,mBAAmB,CAAC,4BAA4B,CAAC,EAAE,EAAE,GAAG,CAAC,CAC1D,CAAC,CAAC;oBACH,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,aAAa,CACnD,mBAAmB,CAAC,4BAA4B,CAAC,EAAE,EAAE,GAAG,CAAC,EACzD,mBAAmB,CAAC,4BAA4B,CAAC,EAAE,EAAE,GAAG,CAAC,CAC1D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAC5B;;;OAGG;IACI,MAAM,CAAC,qBAAqB,CACjC,UAA4B,EAC5B,QAAmC,EACnC,iBAAyB,QAAQ,CAAC,mBAAmB;QAErD,yDAAyD;QACzD,MAAM,iBAAiB,GAAG,IAAI,+CAA+C,EAAE,CAAC;QAChF,KAAK,MAAM,IAAI,IAAI,QAAQ;YACzB,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,MAAM,GAAG,iBAAiB,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC/D,qEAAqE;YACrE,iBAAiB,CAAC,qCAAqC,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,MAAM,KAAK,IAAI,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;YAChE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,qEAAqE;YACrE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAsC,EAAE,UAAU,EAAE,EAAE;gBACrF,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY;oBAClC,OAAO,CAAC,GAAG,WAAW,EAAE,UAAU,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAE,CAAC;gBAChD,MAAM,OAAO,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/F,MAAM,OAAO,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,CAAC,EAAE,MAAM,CAAC,SAAU,EAAE,MAAM,CAAC,MAAO,CAAC,CAAC;gBACnG,OAAO;oBACL,GAAG,WAAW;oBACd,uBAAuB,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC;oBACvD,uBAAuB,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC;iBACxD,CAAC;YACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACP,0CAA0C;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,KAA8B,EAAE,KAA8B,EAAE,EAAE;gBAC9E,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAE,CAAC;gBAChD,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAE,CAAC;gBAChD,OAAO,SAAS,GAAG,SAAS,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YACpD,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAE,CAAC;gBAChD,MAAM,cAAc,GAAG,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,oEAAoE;gBAC/I,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;YAC7G,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3F,CAAC;QACD,kBAAkB,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC,EAAY,EAAE,EAAE,CAAC,EAAE,CAAC,SAAU,CAAC,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;;;;;OAUG;IACK,MAAM,CAAC,WAAW,CACxB,KAAoB,EACpB,CAAiB,EACjB,MAAe,EACf,SAAiB,EACjB,MAAe,EACf,SAAiB,EACjB,iBAAyB,QAAQ,CAAC,mBAAmB;QAErD,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC;YAChD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,YAAY,iBAAiB,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,KAAK,iBAAiB,CAAC,WAAW;YACzH,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,oCAAoC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACnG,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/B,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;QAC5B,QAAQ,CAAC,QAAQ,GAAG,GAAG,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC;QACrB,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAChD,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,iBAAiB,CAC7B,IAAU,EAAE,QAAqB,EAAE,oBAA4B,OAAO,EAAE,YAAsB;QAE9F,IAAI,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,IAAI,KAAK,SAAS;YACpB,IAAI,GAAG,CAAC,CAAC;QACX,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,iBAAiB;YACpC,IAAI,GAAG,GAAG,CAAC;QACZ,IAAY,CAAC,+BAA+B,GAAG,IAAI,CAAC;QACrD,IAAI,IAAI,GAAG,CAAC;YACV,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACnC,IAAI,IAAI,GAAG,CAAC;YACf,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YAEtC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sDAAsD;IAC9C,MAAM,CAAC,uBAAuB,CAAC,IAAc;QACnD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,YAAY,mBAAmB,EAAE,CAAC;YAC/F,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YAC5B,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACnC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,kDAAkD;IAC1C,MAAM,CAAC,iBAAiB,CAAC,IAAc;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,IAAI,CAAC,QAAQ;gBACf,OAAO,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5F,OAAO,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,gBAAgB,CAAC,IAA2B,EAAE,QAAoE,EAAE,WAAoB,KAAK;QACzJ,IAAI,QAAQ;YACV,QAAQ,GAAG,KAAK,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,CAAC,EAAY,EAAQ,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;;YAE3B,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,IAAI,yCAAyC,EAAE,CAAC;YAChE,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;YACnC,SAAS,CAAC,6BAA6B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,MAAM,CAAC,KAAK,EAAE,iDAAiD,CAAC,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,8BAA8B,CAAC,IAAc,EAAE,aAA2B,YAAY,CAAC,WAAW,EAAE,YAA0B,YAAY,CAAC,OAAO;QAC9J,IAAI,MAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAW,EAAE,CAAC;YACzB,MAAM,SAAS,GAAe,EAAE,CAAC;YACjC,MAAM,WAAW,GAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAE,CAAC,CAAC;YAC7E,MAAM,YAAY,GAAG,CAAC,EAAY,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,MAAM,cAAc,GAAG,CAAC,EAAY,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,MAA4B,CAAC;YACjC,OAAO,SAAS,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,uBAAuB;gBACtF,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC;wBAC/B,SAAS;oBACX,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;oBACrB,IAAI,QAAQ,CAAC,wBAAwB,CAAC,UAAU,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;wBAChF,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;wBAC/D,IAAI,IAAI,EAAE,CAAC;4BACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACjB,SAAS;wBACX,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,GAAG,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,YAAY,IAAI,IAAI,MAAM,YAAY,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,CAAC;IACD,yGAAyG;IACjG,MAAM,CAAC,UAAU,CAAC,EAAY;QACpC,MAAM,eAAe,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;QAChE,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1E,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,eAAe;gBACrD,YAAY,GAAG,IAAI,CAAC,CAAE,8EAA8E;QACxG,CAAC;QACD,OAAO,eAAe,IAAI,CAAC,YAAY,CAAC;IAC1C,CAAC;IACD,0EAA0E;IAClE,MAAM,CAAC,kBAAkB,CAAC,MAAqB,EAAE,CAAW;QAClE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC/B,IAAI,EAAE,KAAK,CAAC;gBACV,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACM,MAAM,CAAC,oCAAoC,CAAC,KAAoB,EAAE,oBAA4B,OAAO;QAC1G,MAAM,CAAC,GAAG,mBAAmB,CAAC,iDAAiD,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAClG,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;QACxD,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAgB,EAAE,iBAAiB,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAClG,MAAM,KAAK,GAAyB,EAAE,CAAC;YACvC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAY,EAAE,MAAsB,EAAE,KAAW,EAAE,EAAE;oBACjG,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBAChD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;4BACvB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;4BAC5B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gCACpB,oGAAoG;gCACpG,MAAM,EAAE,GAAG,IAAI,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gCACvE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;4BACtB,CAAC;iCAAM,IAAI,CAAC,YAAY,kBAAkB,EAAE,CAAC;gCAC3C,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gCACtB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gCACd,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;4BACvB,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,IAAI,IAAI;oBACN,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;YAChF,CAAC;YACD,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,SAAS,CAAC,KAAqB,EAAE,QAAgB,EAAE,OAAgB;IAC1E,MAAM,GAAG,GAAG,KAAK,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAA6B,EAAE,KAAqB;IAC9E,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC;AACD,SAAS,gBAAgB,CAAC,IAA6B,EAAE,KAAqB;IAC5E,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,OAAO,SAAS,CAAC;AACnB,CAAC","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 { assert } from \"@itwin/core-bentley\";\nimport { Geometry } from \"../../Geometry\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } 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 { AnyRegion } from \"../CurveTypes\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\nimport { ParityRegion } from \"../ParityRegion\";\nimport { ConsolidateAdjacentCurvePrimitivesOptions, RegionOps } from \"../RegionOps\";\nimport { RegionGroupMember, RegionGroupOpType } from \"../RegionOpsClassificationSweeps\";\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(\n primitives: CurvePrimitive[], tolerance: number = Geometry.smallMetricDistance,\n ): void {\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(\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0),\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0),\n ));\n this.insertPair(CurveLocationDetailPair.createCapture(\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0),\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0),\n ));\n }\n }\n }\n }\n}\n\n/**\n * @internal\n */\nexport class PlanarSubdivision {\n /**\n * Create a graph from an array of curves, and an array of the curves' precomputed intersections.\n * Z-coordinates are ignored.\n */\n public static assembleHalfEdgeGraph(\n primitives: CurvePrimitive[],\n allPairs: CurveLocationDetailPair[],\n mergeTolerance: number = Geometry.smallMetricDistance,\n ): HalfEdgeGraph {\n // map from key CurvePrimitive to CurveLocationDetailPair\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray();\n for (const pair of allPairs)\n detailByPrimitive.insertPair(pair);\n if (primitives.length > detailByPrimitive.primitiveToPair.size) {\n // otherwise, these single-primitive loops are missing from the graph\n detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance);\n }\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 [\n ...accumulator,\n CurveLocationDetailPair.createCapture(detail0, detail0),\n CurveLocationDetailPair.createCapture(detail1, detail1),\n ];\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(\n graph: HalfEdgeGraph,\n p: CurvePrimitive,\n point0: Point3d,\n fraction0: number,\n point1: Point3d,\n fraction1: number,\n mergeTolerance: number = Geometry.smallMetricDistance,\n ): { 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 if (p.parent && p.parent instanceof RegionGroupMember && p.parent.parentGroup.groupOpType === RegionGroupOpType.NonBounding)\n halfEdge.setMaskAroundEdge(HalfEdgeMask.BRIDGE_EDGE);\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,\n * 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(\n loop: Loop, outLoops: SignedLoops, zeroAreaTolerance: number = 1.0e-10, isSliverFace?: boolean,\n ): 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 /** Extract geometric info from a topological edge. */\n private static extractGeometryFromEdge(edge: HalfEdge): { detail: CurveLocationDetail, reversed: boolean } | undefined {\n if (edge.sortData !== undefined && edge.edgeTag && edge.edgeTag instanceof CurveLocationDetail) {\n const detail = edge.edgeTag;\n if (detail.curve && detail.fraction1 !== undefined) {\n const reversed = edge.sortData < 0;\n return { detail, reversed };\n }\n }\n return undefined;\n }\n /** Create the geometry for a topological edge. */\n private static createCurveInEdge(edge: HalfEdge): CurvePrimitive | undefined {\n const info = this.extractGeometryFromEdge(edge);\n if (info) {\n if (info.reversed)\n return info.detail.curve!.clonePartialCurve(info.detail.fraction1!, info.detail.fraction);\n return info.detail.curve!.clonePartialCurve(info.detail.fraction, info.detail.fraction1!);\n }\n return undefined;\n }\n /**\n * Create a [[Loop]] for the given face or super face.\n * @param face a node in the face loop, or an array of HalfEdges that comprise a loop (e.g., a super face).\n * @param announce optional callback invoked on each edge/curve of the face/Loop.\n * @param compress whether to consolidate adjacent curves in the output Loop (default `false`).\n * If `announce` is provided, no compression is performed, as edges and curves would no longer be in 1-1 correspondence.\n */\n public static createLoopInFace(face: HalfEdge | HalfEdge[], announce?: (he: HalfEdge, curve: CurvePrimitive, loop: Loop) => void, compress: boolean = false): Loop | undefined {\n if (announce)\n compress = false;\n const loop = Loop.create();\n const addEdgeCurve = (he: HalfEdge): void => {\n const curve = this.createCurveInEdge(he);\n if (curve) {\n announce?.(he, curve, loop);\n loop.tryAddChild(curve);\n }\n };\n if (Array.isArray(face))\n face.forEach(addEdgeCurve);\n else\n face.announceEdgesInFace(addEdgeCurve);\n if (compress) {\n const options = new ConsolidateAdjacentCurvePrimitivesOptions();\n options.consolidateLoopSeam = true;\n RegionOps.consolidateAdjacentPrimitives(loop, options);\n }\n if (loop.isPhysicallyClosedCurve(undefined, true))\n return loop;\n assert(false, \"createLoopInFace: face is not physically closed\");\n return undefined;\n }\n /**\n * Create a [[Loop]] or [[ParityRegion]] for the given face.\n * * A ParityRegion is created for a split-washer type face by removing bridge edges.\n * @param face a node in the face loop.\n * @param bridgeMask mask preset on bridge edges (default is `HalfEdgeMask.BRIDGE_EDGE`).\n * @param visitMask mask to use for visiting edges in the face loop (default is `HalfEdgeMask.VISITED`).\n */\n public static createLoopOrParityRegionInFace(face: HalfEdge, bridgeMask: HalfEdgeMask = HalfEdgeMask.BRIDGE_EDGE, visitMask: HalfEdgeMask = HalfEdgeMask.VISITED): Loop | ParityRegion | undefined {\n let region: AnyRegion | undefined;\n if (face.isSplitWasherFace(bridgeMask)) {\n const loops: Loop[] = [];\n const loopEdges: HalfEdge[] = [];\n const bridgeStack: HalfEdge[] = [face.findMaskAroundFace(bridgeMask, true)!];\n const announceEdge = (he: HalfEdge) => { he.setMask(visitMask); loopEdges.push(he); };\n const announceBridge = (he: HalfEdge) => { if (!he.isMaskSet(visitMask)) bridgeStack.push(he); };\n face.clearMaskAroundFace(visitMask);\n let bridge: HalfEdge | undefined;\n while (undefined !== (bridge = bridgeStack.pop())) {\n bridge.setMask(visitMask);\n const loopSeed = bridge.findMaskAroundFace(bridgeMask, false); // advance to next loop\n if (loopSeed) {\n if (loopSeed.isMaskSet(visitMask))\n continue;\n loopEdges.length = 0;\n if (loopSeed.announceEdgesInSuperFace(bridgeMask, announceEdge, announceBridge)) {\n const loop = this.createLoopInFace(loopEdges, undefined, true);\n if (loop) {\n loops.push(loop);\n continue;\n }\n }\n }\n }\n region = RegionOps.sortOuterAndHoleLoopsXY(loops);\n region = RegionOps.simplifyRegion(region);\n } else {\n region = this.createLoopInFace(face, undefined, true);\n }\n return (region && (region instanceof Loop || region instanceof ParityRegion)) ? region : undefined;\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 non-null mate face. */\n private static getNonNullEdgeMate(_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.getNonNullEdgeMate(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 if (loop)\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":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { AnyRegion } from \"../CurveTypes\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\r\nimport { ParityRegion } from \"../ParityRegion\";\r\nimport { ConsolidateAdjacentCurvePrimitivesOptions, RegionOps } from \"../RegionOps\";\r\nimport { RegionGroupMember, RegionGroupOpType } from \"../RegionOpsClassificationSweeps\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nfunction computeSortAngle(curve: CurvePrimitive, fraction: number, reverse: boolean): number {\r\n const ray = curve.fractionToPointAndDerivative(fraction);\r\n const s = reverse ? -1.0 : 1.0;\r\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\r\n}\r\nfunction getFractionOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): number | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA.fraction;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB.fraction;\r\n return undefined;\r\n}\r\nfunction getDetailOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB;\r\n return undefined;\r\n}\r\n\r\nclass MapCurvePrimitiveToCurveLocationDetailPairArray {\r\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\r\n // index assigned to this primitive (for debugging)\r\n public primitiveToIndex = new Map<CurvePrimitive, number>();\r\n private _numIndexedPrimitives: number = 0;\r\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\r\n if (primitive !== undefined) {\r\n const index = this.primitiveToIndex.get(primitive);\r\n if (index === undefined) {\r\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\r\n }\r\n }\r\n }\r\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\r\n if (primitive) {\r\n const priorPairs = this.primitiveToPair.get(primitive);\r\n this.assignPrimitiveIndex(primitive);\r\n if (!priorPairs) {\r\n this.primitiveToPair.set(primitive, [pair]);\r\n } else {\r\n priorPairs.push(pair);\r\n }\r\n }\r\n }\r\n public insertPair(pair: CurveLocationDetailPair) {\r\n const primitiveA = pair.detailA.curve;\r\n if (primitiveA)\r\n this.insertPrimitiveToPair(primitiveA, pair);\r\n const primitiveB = pair.detailB.curve;\r\n if (primitiveB)\r\n this.insertPrimitiveToPair(primitiveB, pair);\r\n }\r\n /**\r\n * Split closed missing primitives in half and add new intersection pairs.\r\n * * When bridge edges aren't included in the primitives array, a closed primitive with no intersections will not be\r\n * added to the graph because it isn't in the `primitiveToPair` map. By splitting such a missing primitive in two, we\r\n * introduce two intersections for each half, which allows the primitive to be represented in the map.\r\n */\r\n public splitAndAppendMissingClosedPrimitives(\r\n primitives: CurvePrimitive[], tolerance: number = Geometry.smallMetricDistance,\r\n ): void {\r\n for (const p of primitives) {\r\n let closedCurveSplitCandidate = false;\r\n if (p instanceof Arc3d)\r\n closedCurveSplitCandidate = p.sweep.isFullCircle;\r\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.\r\n closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);\r\n if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {\r\n const p0 = p.clonePartialCurve(0.0, 0.5);\r\n const p1 = p.clonePartialCurve(0.5, 1.0);\r\n if (p0 && p1) {\r\n this.insertPair(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0),\r\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0),\r\n ));\r\n this.insertPair(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0),\r\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0),\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class PlanarSubdivision {\r\n /**\r\n * Create a graph from curves and precomputed intersections.\r\n * * Z-coordinates are ignored.\r\n * @param primitives input curves\r\n * @param allPairs array of curve-curve xy-intersections\r\n * @param mergeTolerance optional distance tolerance for clustering vertices. Default value is [[Geometry.smallMetricDistance]].\r\n */\r\n public static assembleHalfEdgeGraph(\r\n primitives: CurvePrimitive[],\r\n allPairs: CurveLocationDetailPair[],\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): HalfEdgeGraph {\r\n // map from key CurvePrimitive to CurveLocationDetailPair\r\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray();\r\n for (const pair of allPairs)\r\n detailByPrimitive.insertPair(pair);\r\n if (primitives.length > detailByPrimitive.primitiveToPair.size) {\r\n // otherwise, these single-primitive loops are missing from the graph\r\n detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance);\r\n }\r\n const graph = new HalfEdgeGraph();\r\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\r\n const p = entry[0];\r\n // convert each interval intersection into two isolated intersections\r\n const details = entry[1].reduce((accumulator: CurveLocationDetailPair[], detailPair) => {\r\n if (!detailPair.detailA.hasFraction1)\r\n return [...accumulator, detailPair];\r\n const detail = getDetailOnCurve(detailPair, p)!;\r\n const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);\r\n const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1!, detail.point1!);\r\n return [\r\n ...accumulator,\r\n CurveLocationDetailPair.createCapture(detail0, detail0),\r\n CurveLocationDetailPair.createCapture(detail1, detail1),\r\n ];\r\n }, []);\r\n // lexical sort on p intersection fraction\r\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\r\n const fractionA = getFractionOnCurve(pairA, p)!;\r\n const fractionB = getFractionOnCurve(pairB, p)!;\r\n return fractionA - fractionB;\r\n });\r\n let last = { point: p.startPoint(), fraction: 0.0 };\r\n for (const detailPair of details) {\r\n const detail = getDetailOnCurve(detailPair, p)!;\r\n const detailFraction = Geometry.restrictToInterval(detail.fraction, 0, 1); // truncate fraction, but don't snap point; clustering happens later\r\n last = this.addHalfEdge(graph, p, last.point, last.fraction, detail.point, detailFraction, mergeTolerance);\r\n }\r\n this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);\r\n }\r\n // every edge got its sortAngle defined by addHalfEdge\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle ?? 0, mergeTolerance);\r\n return graph;\r\n }\r\n\r\n /**\r\n * Filter for trivial curve fragment: fast computation if line segment; otherwise clip, flatten, and measure.\r\n * * Different metrics are employed for expedience.\r\n */\r\n private static isCurveTrivialXY(p: CurvePrimitive, point0: Point3d, fraction0: number, point1: Point3d, fraction1: number, mergeTolerance: number): boolean {\r\n if (Geometry.isSmallRelative(fraction0 - fraction1))\r\n return true;\r\n if (!(p instanceof LineSegment3d)) {\r\n const p0 = p.clonePartialCurve(fraction0, fraction1);\r\n if (p0?.tryTransformInPlace(Transform.createRowValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0))) // flatten\r\n return p0.curveLength() <= mergeTolerance; // Euclidean\r\n }\r\n return point0.isAlmostEqualXY(point1, mergeTolerance); // Manhattan\r\n }\r\n\r\n /**\r\n * Create a pair of mated half edges referencing a non-trivial interval of a primitive.\r\n * @param graph containing graph\r\n * @param p the curve\r\n * @param point0 start point\r\n * @param fraction0 starting fraction\r\n * @param point1 end point\r\n * @param fraction1 end fraction\r\n * @param mergeTolerance optional maximum xy-length of a trivial edge\r\n * @returns end point and fraction\r\n */\r\n private static addHalfEdge(\r\n graph: HalfEdgeGraph,\r\n p: CurvePrimitive,\r\n point0: Point3d,\r\n fraction0: number,\r\n point1: Point3d,\r\n fraction1: number,\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): { point: Point3d, fraction: number } {\r\n if (!this.isCurveTrivialXY(p, point0, fraction0, point1, fraction1, mergeTolerance)) {\r\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\r\n if (p.parent && p.parent instanceof RegionGroupMember && p.parent.parentGroup.groupOpType === RegionGroupOpType.NonBounding)\r\n halfEdge.setMaskAroundEdge(HalfEdgeMask.BRIDGE_EDGE);\r\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\r\n const mate = halfEdge.edgeMate;\r\n halfEdge.edgeTag = detail01;\r\n halfEdge.sortData = 1.0;\r\n mate.edgeTag = detail01;\r\n mate.sortData = -1.0;\r\n halfEdge.sortAngle = computeSortAngle(p, fraction0, false);\r\n mate.sortAngle = computeSortAngle(p, fraction1, true);\r\n }\r\n return { point: point1, fraction: fraction1 }; // where the next curve fragment starts\r\n }\r\n /**\r\n * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative,\r\n * or sliver loops.\r\n * @param zeroAreaTolerance absolute area tolerance for sliver face detection\r\n * @param isSliverFace whether the loop is known a priori (e.g., via topology) to have zero area\r\n * @returns the area (forced to zero if within tolerance)\r\n */\r\n public static collectSignedLoop(\r\n loop: Loop, outLoops: SignedLoops, zeroAreaTolerance: number = 1.0e-10, isSliverFace?: boolean,\r\n ): number {\r\n let area = isSliverFace ? 0.0 : RegionOps.computeXYArea(loop);\r\n if (area === undefined)\r\n area = 0;\r\n if (Math.abs(area) < zeroAreaTolerance)\r\n area = 0.0;\r\n (loop as any).computedAreaInPlanarSubdivision = area;\r\n if (area > 0)\r\n outLoops.positiveAreaLoops.push(loop);\r\n else if (area < 0)\r\n outLoops.negativeAreaLoops.push(loop);\r\n else\r\n outLoops.slivers.push(loop);\r\n return area;\r\n }\r\n /** Extract geometric info from a topological edge. */\r\n private static extractGeometryFromEdge(edge: HalfEdge): { detail: CurveLocationDetail, reversed: boolean } | undefined {\r\n if (edge.sortData !== undefined && edge.edgeTag && edge.edgeTag instanceof CurveLocationDetail) {\r\n const detail = edge.edgeTag;\r\n if (detail.curve && detail.fraction1 !== undefined) {\r\n const reversed = edge.sortData < 0;\r\n return { detail, reversed };\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Create the geometry for a topological edge. */\r\n private static createCurveInEdge(edge: HalfEdge, z?: number): CurvePrimitive | undefined {\r\n let result: CurvePrimitive | undefined;\r\n const info = this.extractGeometryFromEdge(edge);\r\n if (info && info.detail.curve && info.detail.fraction1) {\r\n const f0 = info.reversed ? info.detail.fraction1 : info.detail.fraction;\r\n const f1 = info.reversed ? info.detail.fraction : info.detail.fraction1;\r\n result = info.detail.curve.clonePartialCurve(f0, f1);\r\n if (result && z !== undefined)\r\n result.tryTransformInPlace(Transform.createRowValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, z));\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a [[Loop]] for the given face or super face.\r\n * @param face a node in the face loop, or an array of HalfEdges that comprise a loop (e.g., a super face).\r\n * @param options bundle of options.\r\n * @returns the Loop, or `undefined` if it is not closed within xy-tolerance.\r\n */\r\n public static createLoopInFace(face: HalfEdge | HalfEdge[], options?: PlanarSubdivision.CreateRegionInFaceOptions): Loop | undefined {\r\n const consolidate = options?.announceEdge ? false : options?.compress ?? false; // can't compress if announcing\r\n const loop = Loop.create();\r\n const addEdgeCurve = (edge: HalfEdge): void => {\r\n const curve = this.createCurveInEdge(edge, options?.z);\r\n if (curve) {\r\n options?.announceEdge?.(edge, curve, loop);\r\n loop.tryAddChild(curve);\r\n }\r\n };\r\n if (Array.isArray(face))\r\n face.forEach(addEdgeCurve);\r\n else\r\n face.announceEdgesInFace(addEdgeCurve);\r\n if (consolidate) {\r\n const consolidateOptions = new ConsolidateAdjacentCurvePrimitivesOptions();\r\n consolidateOptions.consolidateLoopSeam = true;\r\n RegionOps.consolidateAdjacentPrimitives(loop, consolidateOptions);\r\n }\r\n if (loop.isPhysicallyClosedCurve(options?.closureTol, true))\r\n return loop;\r\n assert(() => false, \"face is not physically closed\");\r\n return undefined;\r\n }\r\n /**\r\n * Create a [[Loop]] or [[ParityRegion]] for the given face.\r\n * * A ParityRegion is created for a split-washer type face by removing bridge edges.\r\n * @param face a node in the face loop.\r\n * @param options bundle of options.\r\n * @returns the Loop or ParityRegion, or `undefined` if one could not be computed.\r\n */\r\n public static createLoopOrParityRegionInFace(face: HalfEdge, options?: PlanarSubdivision.CreateRegionInFaceOptions): Loop | ParityRegion | undefined {\r\n let region: AnyRegion | undefined;\r\n const visitMask = options?.visitMask ?? HalfEdgeMask.VISITED;\r\n const bridgeMask = options?.bridgeMask ?? HalfEdgeMask.BRIDGE_EDGE;\r\n let startBridgeEdge: HalfEdge | undefined;\r\n // is it a split-washer face?\r\n if (face.isSplitWasherFace(bridgeMask) && (startBridgeEdge = face.findMaskAroundFace(bridgeMask, true))) {\r\n const loops: Loop[] = [];\r\n const loopEdges: HalfEdge[] = [];\r\n const bridgeStack: HalfEdge[] = [startBridgeEdge];\r\n const announceEdge = (he: HalfEdge) => { he.setMask(visitMask); loopEdges.push(he); };\r\n const announceBridge = (he: HalfEdge) => { if (!he.isMaskSet(visitMask)) bridgeStack.push(he); };\r\n face.clearMaskAroundFace(visitMask);\r\n let bridge: HalfEdge | undefined;\r\n while (undefined !== (bridge = bridgeStack.pop())) {\r\n bridge.setMask(visitMask);\r\n const loopSeed = bridge.findMaskAroundFace(bridgeMask, false); // advance to next loop\r\n if (loopSeed) {\r\n if (loopSeed.isMaskSet(visitMask))\r\n continue;\r\n loopEdges.length = 0;\r\n if (loopSeed.announceEdgesInSuperFace(bridgeMask, announceEdge, announceBridge)) {\r\n const loop = this.createLoopInFace(loopEdges, options);\r\n if (loop) {\r\n loops.push(loop);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n region = RegionOps.sortOuterAndHoleLoopsXY(loops);\r\n region = RegionOps.simplifyRegion(region);\r\n } else {\r\n region = this.createLoopInFace(face, options);\r\n }\r\n return (region && (region instanceof Loop || region instanceof ParityRegion)) ? region : undefined;\r\n }\r\n /** Return true if there are only two edges in the face loop, and their start curvatures are the same. */\r\n private static isNullFace(he: HalfEdge): boolean {\r\n const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);\r\n let faceIsBanana = false;\r\n if (faceHasTwoEdges) {\r\n const c0 = HalfEdgeGraphMerge.curvatureSortKey(he);\r\n const c1 = HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);\r\n if (!Geometry.isSameCoordinate(c0, c1)) // default tol!\r\n faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...\r\n }\r\n return faceHasTwoEdges && !faceIsBanana;\r\n }\r\n /** Look across edge mates (possibly several) for a non-null mate face. */\r\n private static getNonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\r\n if (this.isNullFace(e))\r\n return undefined;\r\n let e1 = e.edgeMate;\r\n while (this.isNullFace(e1)) {\r\n e1 = e1.faceSuccessor.edgeMate;\r\n if (e1 === e)\r\n return undefined;\r\n }\r\n return e1;\r\n }\r\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\r\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\r\n const result: SignedLoops[] = [];\r\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\r\n for (const faceSeeds of q) {\r\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\r\n const edges: LoopCurveLoopCurve[] = [];\r\n for (const faceSeed of faceSeeds) {\r\n const isNullFace = this.isNullFace(faceSeed);\r\n const announceEdge = isNullFace ? undefined : (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\r\n const mate = this.getNonNullEdgeMate(graph, he);\r\n if (mate !== undefined) {\r\n const e = edgeMap.get(mate);\r\n if (e === undefined) {\r\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\r\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\r\n edgeMap.set(he, e1);\r\n } else if (e instanceof LoopCurveLoopCurve) {\r\n e.setB(loopC, curveC);\r\n edges.push(e);\r\n edgeMap.delete(mate);\r\n }\r\n }\r\n };\r\n const loop = this.createLoopInFace(faceSeed, { announceEdge });\r\n if (loop)\r\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance, isNullFace);\r\n }\r\n componentAreas.edges = edges;\r\n result.push(componentAreas);\r\n edgeMap.clear();\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n*/\r\nexport namespace PlanarSubdivision {\r\n /** Options bundle for [[PlanarSubdivision.createLoopInFace]] and [[PlanarSubdivision.createLoopOrParityRegionInFace]]. */\r\n export interface CreateRegionInFaceOptions {\r\n /**\r\n * Optional callback invoked on each `edge` before its `curve` is added to `loop`.\r\n * * Note that if a [[ParityRegion]] is being constructed, `curve` and `loop` may subsequently be reversed.\r\n */\r\n announceEdge?: (edge: HalfEdge, curve: CurvePrimitive, loop: Loop) => void;\r\n /**\r\n * Whether to consolidate adjacent curves in an output [[Loop]]. Default value is `false`.\r\n * * If `announce` is defined, no compression is performed, as edges and curves would no longer be in 1-1 correspondence.\r\n */\r\n compress?: boolean;\r\n /** Absolute xy-distance for confirming a returned Loop is closed. Default value is [[Geometry.smallMetricDistance]]. */\r\n closureTol?: number;\r\n /**\r\n * Mask preset on bridge edges. Default value is `HalfEdgeMask.BRIDGE_EDGE`.\r\n * * This mask is used to distinguish a split-washer type face, which can result in a [[ParityRegion]].\r\n */\r\n bridgeMask?: HalfEdgeMask;\r\n /** Mask to use for visiting edges when creating a [[ParityRegion]] from a split-washer type face. Default value is `HalfEdgeMask.VISITED`. */\r\n visitMask?: HalfEdgeMask;\r\n /**\r\n * Optional z-coordinate for the result region.\r\n * * If undefined, graph z-coordinates are used, but this may result in a non-planar region if the graph is not planar!\r\n */\r\n z?: number;\r\n }\r\n}"]}