@itwin/core-geometry 5.2.0-dev.8 → 5.3.0-dev.2

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 (438) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/lib/cjs/Geometry.d.ts +30 -10
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +74 -10
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/AkimaCurve3d.d.ts +19 -6
  7. package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
  8. package/lib/cjs/bspline/AkimaCurve3d.js +21 -5
  9. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  10. package/lib/cjs/bspline/BSplineCurve.d.ts +3 -3
  11. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  12. package/lib/cjs/bspline/BSplineCurve.js +6 -6
  13. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  14. package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
  15. package/lib/cjs/bspline/BSplineCurveOps.js +1 -1
  16. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  17. package/lib/cjs/bspline/BezierCurveBase.d.ts +2 -2
  18. package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
  19. package/lib/cjs/bspline/BezierCurveBase.js +4 -6
  20. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  21. package/lib/cjs/bspline/InterpolationCurve3d.d.ts +27 -17
  22. package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
  23. package/lib/cjs/bspline/InterpolationCurve3d.js +17 -7
  24. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  25. package/lib/cjs/clipping/ClipPlane.d.ts +19 -6
  26. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  27. package/lib/cjs/clipping/ClipPlane.js +17 -2
  28. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  29. package/lib/cjs/clipping/ClipUtils.d.ts +14 -1
  30. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  31. package/lib/cjs/clipping/ClipUtils.js +21 -3
  32. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  33. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +14 -11
  34. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  35. package/lib/cjs/clipping/ConvexClipPlaneSet.js +23 -16
  36. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  37. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
  38. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  39. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +22 -5
  40. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  41. package/lib/cjs/curve/Arc3d.d.ts +27 -17
  42. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  43. package/lib/cjs/curve/Arc3d.js +61 -35
  44. package/lib/cjs/curve/Arc3d.js.map +1 -1
  45. package/lib/cjs/curve/CurveCollection.d.ts +1 -0
  46. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  47. package/lib/cjs/curve/CurveCollection.js +1 -0
  48. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  49. package/lib/cjs/curve/CurveLocationDetail.d.ts +8 -7
  50. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  51. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  52. package/lib/cjs/curve/CurveOps.d.ts +51 -1
  53. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  54. package/lib/cjs/curve/CurveOps.js +97 -3
  55. package/lib/cjs/curve/CurveOps.js.map +1 -1
  56. package/lib/cjs/curve/LineString3d.d.ts +4 -4
  57. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  58. package/lib/cjs/curve/LineString3d.js +8 -8
  59. package/lib/cjs/curve/LineString3d.js.map +1 -1
  60. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
  61. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  62. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +6 -2
  63. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  64. package/lib/cjs/curve/Query/PlanarSubdivision.js +12 -7
  65. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  66. package/lib/cjs/curve/RegionOps.d.ts +9 -4
  67. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  68. package/lib/cjs/curve/RegionOps.js +10 -5
  69. package/lib/cjs/curve/RegionOps.js.map +1 -1
  70. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  71. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +2 -1
  72. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  73. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +4 -4
  74. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  75. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +21 -18
  76. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  77. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  78. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +30 -50
  79. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  80. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +2 -2
  81. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  82. package/lib/cjs/curve/spiral/DirectSpiral3d.js +6 -2
  83. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  84. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
  85. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  86. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +6 -2
  87. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  88. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +5 -1
  89. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  90. package/lib/cjs/curve/spiral/TransitionSpiral3d.js +0 -3
  91. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  92. package/lib/cjs/geometry3d/AngleSweep.d.ts +6 -2
  93. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  94. package/lib/cjs/geometry3d/AngleSweep.js +12 -3
  95. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  96. package/lib/cjs/geometry3d/FrameBuilder.d.ts +2 -1
  97. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  98. package/lib/cjs/geometry3d/FrameBuilder.js +14 -18
  99. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  100. package/lib/cjs/geometry3d/Matrix3d.d.ts +1 -1
  101. package/lib/cjs/geometry3d/Matrix3d.js +1 -1
  102. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  103. package/lib/cjs/geometry3d/Point2dVector2d.d.ts +18 -2
  104. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  105. package/lib/cjs/geometry3d/Point2dVector2d.js +37 -4
  106. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  107. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  108. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  109. package/lib/cjs/geometry3d/Point3dVector3d.js +1 -0
  110. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  111. package/lib/cjs/geometry3d/PointStreaming.d.ts +8 -0
  112. package/lib/cjs/geometry3d/PointStreaming.d.ts.map +1 -1
  113. package/lib/cjs/geometry3d/PointStreaming.js +18 -2
  114. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  115. package/lib/cjs/geometry3d/PolygonOps.d.ts +18 -9
  116. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  117. package/lib/cjs/geometry3d/PolygonOps.js +53 -26
  118. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  119. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
  120. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  121. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
  122. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  123. package/lib/cjs/geometry3d/PolylineOps.d.ts +14 -3
  124. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  125. package/lib/cjs/geometry3d/PolylineOps.js +20 -4
  126. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  127. package/lib/cjs/geometry3d/Range.d.ts +34 -32
  128. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  129. package/lib/cjs/geometry3d/Range.js +28 -21
  130. package/lib/cjs/geometry3d/Range.js.map +1 -1
  131. package/lib/cjs/geometry3d/Ray2d.d.ts +16 -6
  132. package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
  133. package/lib/cjs/geometry3d/Ray2d.js +28 -4
  134. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  135. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  136. package/lib/cjs/geometry3d/Ray3d.js +3 -4
  137. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  138. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  139. package/lib/cjs/geometry3d/Transform.js +1 -1
  140. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  141. package/lib/cjs/geometry3d/XYZProps.d.ts +12 -1
  142. package/lib/cjs/geometry3d/XYZProps.d.ts.map +1 -1
  143. package/lib/cjs/geometry3d/XYZProps.js +17 -2
  144. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  145. package/lib/cjs/geometry4d/Matrix4d.d.ts +16 -0
  146. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  147. package/lib/cjs/geometry4d/Matrix4d.js +26 -0
  148. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  149. package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
  150. package/lib/cjs/numerics/BezierPolynomials.js +5 -9
  151. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  152. package/lib/cjs/numerics/SmallSystem.d.ts +13 -7
  153. package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
  154. package/lib/cjs/numerics/SmallSystem.js +13 -7
  155. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  156. package/lib/cjs/polyface/Polyface.d.ts +1 -3
  157. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  158. package/lib/cjs/polyface/Polyface.js +2 -6
  159. package/lib/cjs/polyface/Polyface.js.map +1 -1
  160. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +25 -6
  161. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  162. package/lib/cjs/polyface/PolyfaceBuilder.js +59 -8
  163. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  164. package/lib/cjs/polyface/PolyfaceData.d.ts +2 -0
  165. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  166. package/lib/cjs/polyface/PolyfaceData.js +7 -3
  167. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  168. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  169. package/lib/cjs/polyface/PolyfaceQuery.js +8 -10
  170. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  171. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
  172. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
  173. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
  174. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  175. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
  176. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
  177. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
  178. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  179. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
  180. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  181. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +9 -12
  182. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  183. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
  184. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  185. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
  186. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  187. package/lib/cjs/serialization/DeepCompare.js +1 -1
  188. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  189. package/lib/cjs/serialization/GeometrySamples.d.ts +2 -1
  190. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  191. package/lib/cjs/serialization/GeometrySamples.js +2 -1
  192. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  193. package/lib/cjs/topology/Graph.d.ts +38 -12
  194. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  195. package/lib/cjs/topology/Graph.js +91 -23
  196. package/lib/cjs/topology/Graph.js.map +1 -1
  197. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
  198. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
  199. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
  200. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  201. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +20 -11
  202. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  203. package/lib/cjs/topology/HalfEdgeGraphSearch.js +43 -39
  204. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  205. package/lib/cjs/topology/Merging.d.ts +7 -4
  206. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  207. package/lib/cjs/topology/Merging.js +16 -11
  208. package/lib/cjs/topology/Merging.js.map +1 -1
  209. package/lib/cjs/topology/Triangulation.d.ts +13 -11
  210. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  211. package/lib/cjs/topology/Triangulation.js +40 -36
  212. package/lib/cjs/topology/Triangulation.js.map +1 -1
  213. package/lib/cjs/topology/Voronoi.d.ts +195 -0
  214. package/lib/cjs/topology/Voronoi.d.ts.map +1 -0
  215. package/lib/cjs/topology/Voronoi.js +700 -0
  216. package/lib/cjs/topology/Voronoi.js.map +1 -0
  217. package/lib/cjs/topology/XYParitySearchContext.d.ts +1 -1
  218. package/lib/cjs/topology/XYParitySearchContext.d.ts.map +1 -1
  219. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  220. package/lib/esm/Geometry.d.ts +30 -10
  221. package/lib/esm/Geometry.d.ts.map +1 -1
  222. package/lib/esm/Geometry.js +74 -10
  223. package/lib/esm/Geometry.js.map +1 -1
  224. package/lib/esm/bspline/AkimaCurve3d.d.ts +19 -6
  225. package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
  226. package/lib/esm/bspline/AkimaCurve3d.js +21 -5
  227. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  228. package/lib/esm/bspline/BSplineCurve.d.ts +3 -3
  229. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  230. package/lib/esm/bspline/BSplineCurve.js +6 -6
  231. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  232. package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
  233. package/lib/esm/bspline/BSplineCurveOps.js +1 -1
  234. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  235. package/lib/esm/bspline/BezierCurveBase.d.ts +2 -2
  236. package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
  237. package/lib/esm/bspline/BezierCurveBase.js +4 -6
  238. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  239. package/lib/esm/bspline/InterpolationCurve3d.d.ts +27 -17
  240. package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
  241. package/lib/esm/bspline/InterpolationCurve3d.js +17 -7
  242. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  243. package/lib/esm/clipping/ClipPlane.d.ts +19 -6
  244. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  245. package/lib/esm/clipping/ClipPlane.js +17 -2
  246. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  247. package/lib/esm/clipping/ClipUtils.d.ts +14 -1
  248. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  249. package/lib/esm/clipping/ClipUtils.js +21 -3
  250. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  251. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +14 -11
  252. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  253. package/lib/esm/clipping/ConvexClipPlaneSet.js +23 -16
  254. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  255. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
  256. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  257. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +22 -5
  258. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  259. package/lib/esm/curve/Arc3d.d.ts +27 -17
  260. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  261. package/lib/esm/curve/Arc3d.js +61 -35
  262. package/lib/esm/curve/Arc3d.js.map +1 -1
  263. package/lib/esm/curve/CurveCollection.d.ts +1 -0
  264. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  265. package/lib/esm/curve/CurveCollection.js +1 -0
  266. package/lib/esm/curve/CurveCollection.js.map +1 -1
  267. package/lib/esm/curve/CurveLocationDetail.d.ts +8 -7
  268. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  269. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  270. package/lib/esm/curve/CurveOps.d.ts +51 -1
  271. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  272. package/lib/esm/curve/CurveOps.js +98 -4
  273. package/lib/esm/curve/CurveOps.js.map +1 -1
  274. package/lib/esm/curve/LineString3d.d.ts +4 -4
  275. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  276. package/lib/esm/curve/LineString3d.js +8 -8
  277. package/lib/esm/curve/LineString3d.js.map +1 -1
  278. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
  279. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  280. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +6 -2
  281. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  282. package/lib/esm/curve/Query/PlanarSubdivision.js +12 -7
  283. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  284. package/lib/esm/curve/RegionOps.d.ts +9 -4
  285. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  286. package/lib/esm/curve/RegionOps.js +10 -5
  287. package/lib/esm/curve/RegionOps.js.map +1 -1
  288. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  289. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +2 -1
  290. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  291. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +4 -4
  292. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  293. package/lib/esm/curve/internalContexts/MultiChainCollector.js +21 -18
  294. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  295. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  296. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +30 -50
  297. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  298. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +2 -2
  299. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  300. package/lib/esm/curve/spiral/DirectSpiral3d.js +6 -2
  301. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  302. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
  303. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  304. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +6 -2
  305. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  306. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +5 -1
  307. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  308. package/lib/esm/curve/spiral/TransitionSpiral3d.js +0 -3
  309. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  310. package/lib/esm/geometry3d/AngleSweep.d.ts +6 -2
  311. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  312. package/lib/esm/geometry3d/AngleSweep.js +12 -3
  313. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  314. package/lib/esm/geometry3d/FrameBuilder.d.ts +2 -1
  315. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  316. package/lib/esm/geometry3d/FrameBuilder.js +14 -18
  317. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  318. package/lib/esm/geometry3d/Matrix3d.d.ts +1 -1
  319. package/lib/esm/geometry3d/Matrix3d.js +1 -1
  320. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  321. package/lib/esm/geometry3d/Point2dVector2d.d.ts +18 -2
  322. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  323. package/lib/esm/geometry3d/Point2dVector2d.js +37 -4
  324. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  325. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  326. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  327. package/lib/esm/geometry3d/Point3dVector3d.js +1 -0
  328. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  329. package/lib/esm/geometry3d/PointStreaming.d.ts +8 -0
  330. package/lib/esm/geometry3d/PointStreaming.d.ts.map +1 -1
  331. package/lib/esm/geometry3d/PointStreaming.js +18 -2
  332. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  333. package/lib/esm/geometry3d/PolygonOps.d.ts +18 -9
  334. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  335. package/lib/esm/geometry3d/PolygonOps.js +53 -26
  336. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  337. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
  338. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  339. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
  340. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  341. package/lib/esm/geometry3d/PolylineOps.d.ts +14 -3
  342. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  343. package/lib/esm/geometry3d/PolylineOps.js +20 -4
  344. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  345. package/lib/esm/geometry3d/Range.d.ts +34 -32
  346. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  347. package/lib/esm/geometry3d/Range.js +28 -21
  348. package/lib/esm/geometry3d/Range.js.map +1 -1
  349. package/lib/esm/geometry3d/Ray2d.d.ts +16 -6
  350. package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
  351. package/lib/esm/geometry3d/Ray2d.js +28 -4
  352. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  353. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  354. package/lib/esm/geometry3d/Ray3d.js +3 -4
  355. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  356. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  357. package/lib/esm/geometry3d/Transform.js +1 -1
  358. package/lib/esm/geometry3d/Transform.js.map +1 -1
  359. package/lib/esm/geometry3d/XYZProps.d.ts +12 -1
  360. package/lib/esm/geometry3d/XYZProps.d.ts.map +1 -1
  361. package/lib/esm/geometry3d/XYZProps.js +16 -1
  362. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  363. package/lib/esm/geometry4d/Matrix4d.d.ts +16 -0
  364. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  365. package/lib/esm/geometry4d/Matrix4d.js +26 -0
  366. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  367. package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
  368. package/lib/esm/numerics/BezierPolynomials.js +5 -9
  369. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  370. package/lib/esm/numerics/SmallSystem.d.ts +13 -7
  371. package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
  372. package/lib/esm/numerics/SmallSystem.js +13 -7
  373. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  374. package/lib/esm/polyface/Polyface.d.ts +1 -3
  375. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  376. package/lib/esm/polyface/Polyface.js +2 -6
  377. package/lib/esm/polyface/Polyface.js.map +1 -1
  378. package/lib/esm/polyface/PolyfaceBuilder.d.ts +25 -6
  379. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  380. package/lib/esm/polyface/PolyfaceBuilder.js +59 -8
  381. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  382. package/lib/esm/polyface/PolyfaceData.d.ts +2 -0
  383. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  384. package/lib/esm/polyface/PolyfaceData.js +7 -3
  385. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  386. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  387. package/lib/esm/polyface/PolyfaceQuery.js +8 -10
  388. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  389. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
  390. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
  391. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
  392. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  393. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
  394. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
  395. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
  396. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  397. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
  398. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  399. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +9 -12
  400. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  401. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
  402. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  403. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
  404. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  405. package/lib/esm/serialization/DeepCompare.js +1 -1
  406. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  407. package/lib/esm/serialization/GeometrySamples.d.ts +2 -1
  408. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  409. package/lib/esm/serialization/GeometrySamples.js +2 -1
  410. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  411. package/lib/esm/topology/Graph.d.ts +38 -12
  412. package/lib/esm/topology/Graph.d.ts.map +1 -1
  413. package/lib/esm/topology/Graph.js +92 -24
  414. package/lib/esm/topology/Graph.js.map +1 -1
  415. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
  416. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
  417. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
  418. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  419. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +20 -11
  420. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  421. package/lib/esm/topology/HalfEdgeGraphSearch.js +43 -39
  422. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  423. package/lib/esm/topology/Merging.d.ts +7 -4
  424. package/lib/esm/topology/Merging.d.ts.map +1 -1
  425. package/lib/esm/topology/Merging.js +17 -12
  426. package/lib/esm/topology/Merging.js.map +1 -1
  427. package/lib/esm/topology/Triangulation.d.ts +13 -11
  428. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  429. package/lib/esm/topology/Triangulation.js +40 -36
  430. package/lib/esm/topology/Triangulation.js.map +1 -1
  431. package/lib/esm/topology/Voronoi.d.ts +195 -0
  432. package/lib/esm/topology/Voronoi.d.ts.map +1 -0
  433. package/lib/esm/topology/Voronoi.js +696 -0
  434. package/lib/esm/topology/Voronoi.js.map +1 -0
  435. package/lib/esm/topology/XYParitySearchContext.d.ts +1 -1
  436. package/lib/esm/topology/XYParitySearchContext.d.ts.map +1 -1
  437. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  438. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"Merging.js","sourceRoot":"","sources":["../../../src/topology/Merging.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { MultiLineStringDataVariant } from \"../geometry3d/IndexedXYZCollection\";\nimport { Range3d } from \"../geometry3d/Range\";\nimport { XAndY } from \"../geometry3d/XYZProps\";\nimport { ClusterableArray } from \"../numerics/ClusterableArray\";\nimport { SmallSystem } from \"../numerics/SmallSystem\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { HalfEdgePriorityQueueWithPartnerArray } from \"./HalfEdgePriorityQueue\";\nimport { RegularizationContext } from \"./RegularizeFace\";\nimport { Triangulator } from \"./Triangulation\";\n\n// cspell:word XYUV\n\nexport class GraphSplitData {\n public numUpEdge = 0;\n public numIntersectionTest = 0;\n public numSplit = 0;\n public numPopOut = 0;\n public numA0B0 = 0;\n public numA0B1 = 0;\n public constructor() {\n }\n}\n/**\n * Structure for data used when sorting outbound edges \"around a node\"\n */\nexport class VertexNeighborhoodSortData {\n public index: number;\n public radiusOfCurvature: number;\n public node: HalfEdge;\n public radians?: number;\n public constructor(index: number, key: number, node: HalfEdge, radians?: number) {\n this.index = index;\n this.radiusOfCurvature = key;\n this.node = node;\n this.radians = radians;\n }\n}\n\n/** Function signature for announcing a vertex neighborhood during sorting. */\nexport type AnnounceVertexNeighborhoodSortData = (data: VertexNeighborhoodSortData[]) => any;\n/**\n * * Assorted methods used in algorithms on HalfEdgeGraph.\n * @internal\n */\nexport class HalfEdgeGraphOps {\n\n /** Compare function for sorting with primary y compare, secondary x compare. */\n public static compareNodesYXUp(a: HalfEdge, b: HalfEdge) {\n // Check y's\n // if (!Geometry.isSameCoordinate(a.y, b.y))\n if (a.y < b.y)\n return -1;\n else if (a.y > b.y)\n return 1;\n // Check x's\n // if (!Geometry.isSameCoordinate(a.x, b.x))\n if (a.x < b.x)\n return -1;\n else if (a.x > b.x)\n return 1;\n return 0;\n }\n\n /** Return true if nodeB (a) is lower than both its neighbors and (b) inflects as a downward peak (rather than an upward trough) */\n public static isDownPeak(nodeB: HalfEdge) {\n const nodeA = nodeB.facePredecessor;\n const nodeC = nodeB.faceSuccessor;\n return this.compareNodesYXUp(nodeB, nodeA) < 0\n && this.compareNodesYXUp(nodeB, nodeC) < 0\n && this.crossProductToTargets(nodeB, nodeA, nodeC) > 0;\n }\n\n /** return the cross product of vectors from base to targetA and base to targetB\n * @param base base vertex of both vectors.\n * @param targetA target vertex of first vector\n * @param targetB target vertex of second vector\n */\n public static crossProductToTargets(base: HalfEdge, targetA: HalfEdge, targetB: HalfEdge): number {\n return Geometry.crossProductXYXY(targetA.x - base.x, targetA.y - base.y, targetB.x - base.x, targetB.y - base.y);\n }\n\n // ---------------------------------------------------------------------------------------------------------------------\n // ----------------------------------------------------------------------------------------------------------------------\n\n public static graphRange(graph: HalfEdgeGraph): Range3d {\n const range = Range3d.create();\n for (const node of graph.allHalfEdges) {\n range.extendXYZ(node.x, node.y, node.z);\n }\n return range;\n }\n /** Returns an array of all nodes (both ends) of edges created from segments. */\n public static segmentArrayToGraphEdges(segments: LineSegment3d[], returnGraph: HalfEdgeGraph, mask: HalfEdgeMask): HalfEdge[] {\n const result = [];\n let idxCounter = 0;\n\n // Push the endpoints of each segment onto arr[] in the form {(x, y, theta), Node}\n for (const segment of segments) {\n\n const node0 = returnGraph.createEdgeXYZXYZ(\n segment.point0Ref.x, segment.point0Ref.y, segment.point0Ref.z,\n idxCounter,\n segment.point1Ref.x, segment.point1Ref.y, segment.point1Ref.z,\n idxCounter + 1);\n\n const node1 = node0.edgeMate;\n idxCounter += 2;\n\n node0.setMaskAroundFace(mask); // Original given coordinates must be part of boundary\n result.push(node0);\n result.push(node1);\n }\n\n return result;\n }\n\n /**\n * * Visit all nodes in `graph`.\n * * invoke `pinch(node, vertexPredecessor)`\n * * this leaves the graph as isolated edges.\n * @param graph graph to modify\n */\n public static isolateAllEdges(graph: HalfEdgeGraph) {\n for (const nodeA of graph.allHalfEdges) {\n const nodeB = nodeA.vertexPredecessor;\n HalfEdge.pinch(nodeA, nodeB);\n }\n }\n /**\n * Compute convexity of a sector of a super-face.\n * @param base node whose edge is to be tested for removal\n * @param ignore edges with this mask (on either side) are ignored for the purposes of computing convexity\n * @param barrier edges with this mask (on either side) will not be removed\n * @param signedAreaTol optional signed area tolerance to use in test for parallel vectors\n * @return whether removing the edge at base would create a convex sector in the super-face\n */\n private static isSectorConvexAfterEdgeRemoval(base: HalfEdge, ignore: HalfEdgeMask, barrier: HalfEdgeMask, signedAreaTol: number = 0): boolean {\n let vs = base;\n do { // loop ccw around vertex looking for a super-face predecessor\n if (vs.isMaskSet(barrier) || vs.edgeMate.isMaskSet(barrier))\n break;\n vs = vs.vertexSuccessor;\n } while (vs !== base && vs.isMaskSet(ignore));\n if (vs === base)\n return false;\n let vp = base;\n do { // loop cw around vertex looking for a super-face successor\n if (vp.isMaskSet(barrier) || vp.edgeMate.isMaskSet(barrier))\n break;\n vp = vp.vertexPredecessor;\n } while (vp !== base && vp.isMaskSet(ignore));\n if (vp === base)\n return false;\n return HalfEdge.isSectorConvex(vs.edgeMate, base, vp.faceSuccessor, signedAreaTol);\n }\n /**\n * Mask edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to examine and mark\n * @param mark the mask used to mark (both sides of) removable edges\n * @param barrier edges with this mask (on either side) will not be marked. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return number of edges masked (half the number of HalfEdges masked)\n */\n public static markRemovableEdgesToExpandConvexFaces(graph: HalfEdgeGraph, mark: HalfEdgeMask, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): number {\n if (HalfEdgeMask.NULL_MASK === mark)\n return 0;\n const visit = graph.grabMask(true);\n let numMarked = 0;\n for (const node of graph.allHalfEdges) {\n if (!node.isMaskSet(visit)) {\n if (!node.isMaskSet(barrier) && !node.edgeMate.isMaskSet(barrier)) {\n // tol based on areas of *original* faces on each side of the edge to be removed\n const signedAreaTol = Geometry.smallMetricDistanceSquared * (node.signedFaceArea() + node.edgeMate.signedFaceArea());\n if (this.isSectorConvexAfterEdgeRemoval(node, mark, barrier, signedAreaTol) && this.isSectorConvexAfterEdgeRemoval(node.edgeMate, mark, barrier, signedAreaTol)) {\n node.setMaskAroundEdge(mark);\n ++numMarked;\n }\n }\n }\n node.setMaskAroundEdge(visit);\n }\n graph.dropMask(visit);\n return numMarked;\n }\n /**\n * Collect edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to examine\n * @param barrier edges with this mask (on either side) will not be collected. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return one HalfEdge per removable edge\n */\n public static collectRemovableEdgesToExpandConvexFaces(graph: HalfEdgeGraph, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): HalfEdge[] | undefined {\n const removable: HalfEdge[] = [];\n const mark = graph.grabMask(true);\n if (0 < this.markRemovableEdgesToExpandConvexFaces(graph, mark, barrier)) {\n const visited = graph.grabMask(true);\n for (const node of graph.allHalfEdges) {\n if (node.isMaskSet(mark) && !node.isMaskSet(visited)) {\n node.setMaskAroundEdge(visited);\n removable.push(node);\n }\n }\n graph.dropMask(visited);\n }\n graph.dropMask(mark);\n return removable;\n }\n\n /**\n * Remove edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to modify\n * @param barrier edges with this mask (on either side) will not be removed. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return number of edges deleted\n */\n public static expandConvexFaces(graph: HalfEdgeGraph, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): number {\n const mark = graph.grabMask(true);\n const numRemovedEdges = this.markRemovableEdgesToExpandConvexFaces(graph, mark, barrier);\n if (numRemovedEdges > 0) {\n const numYankedEdges = 0.5 * graph.yankAndDeleteEdges((node: HalfEdge) => node.getMask(mark));\n assert(numYankedEdges === numRemovedEdges);\n }\n graph.dropMask(mark);\n return numRemovedEdges;\n }\n\n /**\n * Test desired faces for convexity.\n * @param graph graph to examine\n * @param avoid faces with this mask will not be examined. Defaults to HalfEdgeMask.EXTERIOR.\n * @return whether every face in the graph is convex\n */\n public static isEveryFaceConvex(graph: HalfEdgeGraph, avoid: HalfEdgeMask = HalfEdgeMask.EXTERIOR): boolean {\n const allFaces = graph.collectFaceLoops();\n for (const node of allFaces) {\n if (node.isMaskedAroundFace(avoid))\n continue;\n if (!node.isFaceConvex())\n return false;\n }\n return true;\n }\n}\n\n/**\n * Note: this class uses hardcoded micrometer coordinate/cluster tolerance throughout.\n * @internal\n */\nexport class HalfEdgeGraphMerge {\n // return kC such that all angles k are equal, with kA <= k < kC <= kB.\n // * Assume: angles k are stored at extra data index 0.\n // * Note that the usual case (when angle at kA is not repeated) is kA+1 === kC\n public static getCommonThetaEndIndex(clusters: ClusterableArray, order: Uint32Array, kA: number, kB: number): number {\n let kC = kA + 1;\n const thetaA = clusters.getExtraData(order[kA], 0);\n while (kC < kB) {\n const thetaB = clusters.getExtraData(order[kC], 0);\n if (!Angle.isAlmostEqualRadiansAllowPeriodShift(thetaA, thetaB)) {\n return kC;\n }\n kC++;\n }\n return kC;\n }\n private static _announceVertexNeighborhoodFunction?: AnnounceVertexNeighborhoodSortData;\n /**\n * public property setter for a function to be called with sorted edge data around a vertex.\n */\n public static set announceVertexNeighborhoodFunction(func: AnnounceVertexNeighborhoodSortData | undefined) { this._announceVertexNeighborhoodFunction = func; }\n private static doAnnounceVertexNeighborhood(clusters: ClusterableArray, order: Uint32Array, allNodes: HalfEdge[], k0: number, k1: number) {\n if (this._announceVertexNeighborhoodFunction) {\n const sortData: VertexNeighborhoodSortData[] = [];\n // build and share the entire vertex order\n for (let k = k0; k < k1; k++) {\n const index = clusters.getExtraData(order[k], 1);\n const theta = clusters.getExtraData(order[k], 0);\n const node = allNodes[index];\n const signedDistance = this.curvatureSortKey(node);\n sortData.push(new VertexNeighborhoodSortData(order[k], signedDistance, node, theta));\n }\n this._announceVertexNeighborhoodFunction(sortData);\n }\n\n }\n // assumptions about cluster array:\n // * data order is: x,y,theta,nodeIndex\n // * theta and nodeIndex are the \"extra\" data.\n // * only want to do anything here when curves are present.\n // * k0<=k<k1 are around a vertex\n // * These are sorted by theta.\n private static secondarySortAroundVertex(clusters: ClusterableArray, order: Uint32Array, allNodes: HalfEdge[], k0: number, k1: number) {\n const sortData: VertexNeighborhoodSortData[] = [];\n\n for (let k = k0; k < k1;) {\n const kB = this.getCommonThetaEndIndex(clusters, order, k, k1);\n if (k + 1 < kB) {\n sortData.length = 0;\n for (let kA = k; kA < kB; kA++) {\n const index = clusters.getExtraData(order[kA], 1);\n const node = allNodes[index];\n const signedDistance = this.curvatureSortKey(node);\n sortData.push(new VertexNeighborhoodSortData(order[kA], signedDistance, node));\n }\n sortData.sort((a: VertexNeighborhoodSortData, b: VertexNeighborhoodSortData) => (a.radiusOfCurvature - b.radiusOfCurvature));\n for (let i = 0; i < sortData.length; i++) {\n order[k + i] = sortData[i].index;\n }\n }\n k = kB;\n }\n }\n /** Return the sort key for sorting by curvature.\n * * This is the signed distance from the curve at the edge start, to center of curvature.\n * * NOTE: Currently does not account for higher derivatives in the case of higher-than-tangent match.\n */\n public static curvatureSortKey(node: HalfEdge): number {\n const cld = node.edgeTag as CurveLocationDetail;\n if (cld !== undefined) {\n const fraction = cld.fraction;\n const curve = cld.curve;\n if (curve) {\n let radius = curve.fractionToSignedXYRadiusOfCurvature(fraction);\n if (node.sortData !== undefined && node.sortData < 0)\n radius = -radius;\n return radius;\n }\n }\n return 0.0;\n }\n /** Whether the HalfEdge is part of a null face, as marked by [[clusterAndMergeXYTheta]]. */\n public static isNullFace(node: HalfEdge): boolean {\n return node.isMaskSet(HalfEdgeMask.NULL_FACE) && node.faceSuccessor.isMaskSet(HalfEdgeMask.NULL_FACE) && node === node.faceSuccessor.faceSuccessor;\n }\n /** Simplest merge algorithm:\n * * collect array of (x,y,theta) at all nodes\n * * lexical sort of the array.\n * * twist all vertices together.\n * * This effectively creates valid face loops for a planar subdivision if there are no edge crossings.\n * * If there are edge crossings, the graph can be a (highly complicated) Klein bottle topology.\n * * Mask.NULL_FACE is cleared throughout and applied within null faces.\n */\n public static clusterAndMergeXYTheta(graph: HalfEdgeGraph, outboundRadiansFunction?: (he: HalfEdge) => number) {\n const allNodes = graph.allHalfEdges;\n const numNodes = allNodes.length;\n graph.clearMask(HalfEdgeMask.NULL_FACE);\n const clusters = new ClusterableArray(2, 2, numNodes); // data order: x,y,theta,nodeIndex. But theta is not set in first round.\n for (let i = 0; i < numNodes; i++) {\n const nodeA = allNodes[i];\n const xA = nodeA.x;\n const yA = nodeA.y;\n HalfEdge.pinch(nodeA, nodeA.vertexSuccessor); // pull it out of its current vertex loop.\n clusters.addDirect(xA, yA, 0.0, i);\n }\n const clusterTol = Geometry.smallMetricDistance;\n const order = clusters.clusterIndicesLexical(clusterTol);\n let k0 = 0;\n const numK = order.length;\n for (let k1 = 0; k1 < numK; k1++) {\n if (order[k1] === ClusterableArray.clusterTerminator) {\n // nodes identified in order[k0]..order[k1-1] are at a vertex cluster; equate their xy\n if (k1 > k0) {\n const iA = clusters.getExtraData(order[k0], 1);\n const nodeA0 = allNodes[iA];\n for (let k = k0 + 1; k < k1; k++) {\n const iB = clusters.getExtraData(order[k], 1);\n const nodeB = allNodes[iB];\n nodeB.x = nodeA0.x;\n nodeB.y = nodeA0.y;\n }\n }\n k0 = k1 + 1;\n }\n }\n // NOW\n // 1) There are identical coordinates at all nodes around each vertex loop.\n // 2) Hence ready do sort (at each vertex) by theta.\n\n // insert theta as extra data in the sort table . . .\n for (const clusterTableIndex of order) {\n if (clusterTableIndex !== ClusterableArray.clusterTerminator) {\n const nodeA = allNodes[clusterTableIndex];\n const nodeB = nodeA.faceSuccessor;\n let getPrecomputedRadians = outboundRadiansFunction;\n if (getPrecomputedRadians) {\n // Recompute theta when edge geometry is completely determined by the vertices, which may have been perturbed by clustering.\n const detail = nodeA.edgeTag as CurveLocationDetail;\n if (undefined === detail || undefined === detail.curve || detail.curve instanceof LineSegment3d)\n getPrecomputedRadians = undefined;\n }\n let radians = getPrecomputedRadians ? getPrecomputedRadians(nodeA) : Math.atan2(nodeB.y - nodeA.y, nodeB.x - nodeA.x);\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, -Math.PI))\n radians = Math.PI;\n clusters.setExtraData(clusterTableIndex, 0, radians);\n }\n }\n clusters.sortSubsetsBySingleKey(order, 2);\n const unmatchedNullFaceNodes: HalfEdge[] = [];\n k0 = 0;\n let thetaA, thetaB;\n // GeometryCoreTestIO.consoleLog(\"START VERTEX LINKS\");\n\n // now pinch each neighboring pair together\n for (let k1 = 0; k1 < numK; k1++) {\n if (order[k1] === ClusterableArray.clusterTerminator) {\n // nodes identified in order[k0]..order[k1-1] are properly sorted around a vertex.\n if (k1 > k0) {\n // const xy = clusters.getPoint2d(order[k0]);\n // GeometryCoreTestIO.consoleLog({ k0, k1, x: xy.x, y: xy.y });\n if (k1 > k0 + 1)\n this.secondarySortAroundVertex(clusters, order, allNodes, k0, k1);\n this.doAnnounceVertexNeighborhood(clusters, order, allNodes, k0, k1);\n const iA = clusters.getExtraData(order[k0], 1);\n thetaA = clusters.getExtraData(order[k0], 0);\n const nodeA0 = allNodes[iA];\n let nodeA = nodeA0;\n for (let k = k0 + 1; k < k1; k++) {\n const iB = clusters.getExtraData(order[k], 1);\n thetaB = clusters.getExtraData(order[k], 0);\n const nodeB = allNodes[iB];\n if (nodeA.isMaskSet(HalfEdgeMask.NULL_FACE)) {\n // nope, this edge was flagged and pinched from the other end.\n const j = unmatchedNullFaceNodes.findIndex((node: HalfEdge) => nodeA === node);\n if (j >= 0) {\n unmatchedNullFaceNodes[j] = unmatchedNullFaceNodes[unmatchedNullFaceNodes.length - 1];\n unmatchedNullFaceNodes.pop();\n }\n nodeA = nodeB;\n thetaA = thetaB;\n } else if (nodeB.isMaskSet(HalfEdgeMask.NULL_FACE)) {\n const j = unmatchedNullFaceNodes.findIndex((node: HalfEdge) => nodeB === node);\n if (j >= 0) {\n unmatchedNullFaceNodes[j] = unmatchedNullFaceNodes[unmatchedNullFaceNodes.length - 1];\n unmatchedNullFaceNodes.pop();\n }\n // NO leave nodeA and thetaA ignore nodeB -- later step will get the outside of its banana.\n } else {\n HalfEdge.pinch(nodeA, nodeB);\n\n // Detect null face using the heuristic:\n // * near vertex angles are same (periodic, toleranced)\n // * far vertex is clustered (exactly equal)\n // * near vertex curvatures are same (toleranced)\n // Note that near vertex is already clustered.\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(thetaA, thetaB)) {\n const nodeA1 = nodeA.faceSuccessor;\n const nodeB1 = nodeB.edgeMate;\n if (nodeA1.isEqualXY(nodeB1)) {\n const cA = this.curvatureSortKey(nodeA);\n const cB = this.curvatureSortKey(nodeB);\n if (Geometry.isSameCoordinate(cA, cB, clusterTol)) { // rule out banana\n HalfEdge.pinch(nodeA1, nodeB1);\n nodeA.setMask(HalfEdgeMask.NULL_FACE);\n nodeB1.setMask(HalfEdgeMask.NULL_FACE);\n unmatchedNullFaceNodes.push(nodeB1);\n }\n }\n }\n nodeA = nodeB;\n thetaA = thetaB;\n }\n }\n }\n k0 = k1 + 1;\n }\n }\n }\n\n private static buildVerticalSweepPriorityQueue(graph: HalfEdgeGraph): HalfEdgePriorityQueueWithPartnerArray {\n const sweepHeap = new HalfEdgePriorityQueueWithPartnerArray();\n for (const p of graph.allHalfEdges) {\n\n if (HalfEdgeGraphOps.compareNodesYXUp(p, p.faceSuccessor) < 0) {\n sweepHeap.priorityQueue.push(p);\n }\n }\n return sweepHeap;\n }\n\n private static computeIntersectionFractionsOnEdges(nodeA0: HalfEdge, nodeB0: HalfEdge, tol: number = Geometry.smallMetricDistance): { f0: XAndY, f1?: XAndY} | undefined {\n const nodeA1 = nodeA0.faceSuccessor;\n const aDir = { x: nodeA1.x - nodeA0.x, y: nodeA1.y - nodeA0.y };\n const nodeB1 = nodeB0.faceSuccessor;\n const bDir = { x: nodeB1.x - nodeB0.x, y: nodeB1.y - nodeB0.y };\n let fractions = SmallSystem.lineSegmentXYUVIntersectionUnbounded(nodeA0, aDir, nodeB0, bDir, tol);\n if (fractions) {\n const snapFractionToSegment = (fraction: number, segStart: XAndY, segEnd: XAndY): number => {\n const x = Geometry.interpolate(segStart.x, fraction, segEnd.x);\n const y = Geometry.interpolate(segStart.y, fraction, segEnd.y);\n if (Geometry.isSameCoordinateXY(x, y, segStart.x, segStart.y, tol))\n return 0.0;\n if (Geometry.isSameCoordinateXY(x, y, segEnd.x, segEnd.y, tol))\n return 1.0;\n return fraction;\n };\n fractions.f0.x = snapFractionToSegment(fractions.f0.x, nodeA0, nodeA1);\n fractions.f0.y = snapFractionToSegment(fractions.f0.y, nodeB0, nodeB1);\n if (fractions.f1) {\n fractions.f1.x = snapFractionToSegment(fractions.f1.x, nodeA0, nodeA1);\n fractions.f1.y = snapFractionToSegment(fractions.f1.y, nodeB0, nodeB1);\n }\n if (fractions.f1 && !(Geometry.isIn01(fractions.f1.x) && Geometry.isIn01(fractions.f1.y)))\n fractions.f1 = undefined; // overlap ends beyond a segment; downgrade to simple intersection\n if (!(Geometry.isIn01(fractions.f0.x) && Geometry.isIn01(fractions.f0.y))) {\n if (fractions.f1) {\n fractions.f0 = fractions.f1; // overlap starts beyond a segment; downgrade to simple intersection\n fractions.f1 = undefined;\n } else\n fractions = undefined; // intersection/overlap is outside both segments\n }\n }\n return fractions;\n }\n /**\n * Split edges at intersections.\n * * This is a large operation.\n * @param graph\n */\n public static splitIntersectingEdges(graph: HalfEdgeGraph): GraphSplitData {\n const data = new GraphSplitData();\n const sweepHeap = this.buildVerticalSweepPriorityQueue(graph);\n let nodeA0, nodeB1;\n const smallFraction = 1.0e-8;\n const largeFraction = 1.0 - smallFraction;\n let i;\n let nodeB0;\n const distTol = Geometry.smallMetricDistance;\n while (undefined !== (nodeA0 = sweepHeap.priorityQueue.pop())) {\n data.numUpEdge++;\n const n0 = sweepHeap.activeEdges.length;\n sweepHeap.removeArrayMembersWithY1Below(nodeA0.y - distTol);\n data.numPopOut += n0 - sweepHeap.activeEdges.length;\n for (i = 0; i < sweepHeap.activeEdges.length; i++) {\n nodeB0 = sweepHeap.activeEdges[i];\n nodeB1 = nodeB0.faceSuccessor;\n if (Geometry.isSameCoordinateXY(nodeA0.x, nodeA0.y, nodeB0.x, nodeB0.y, distTol)) {\n data.numA0B0++;\n } else if (Geometry.isSameCoordinateXY(nodeB1.x, nodeB1.y, nodeA0.x, nodeA0.y, distTol)) {\n data.numA0B1++;\n } else {\n data.numIntersectionTest++;\n const fractions = this.computeIntersectionFractionsOnEdges(nodeA0, nodeB0, distTol);\n if (fractions) {\n const splitAndPush = (node: HalfEdge, fraction?: number): void => {\n if (fraction !== undefined && fraction > smallFraction && fraction < largeFraction) {\n const newNode = graph.splitEdgeAtFraction(node, fraction);\n sweepHeap.priorityQueue.push(newNode); // will be popped as a nodeA0 later\n data.numSplit++;\n }\n };\n splitAndPush(nodeA0, fractions.f0.x);\n splitAndPush(nodeA0, fractions.f1?.x);\n splitAndPush(nodeB0, fractions.f0.y);\n splitAndPush(nodeB0, fractions.f1?.y);\n // existing nodeA0 and its shortened edge remain for further intersections\n }\n }\n }\n sweepHeap.activeEdges.push(nodeA0);\n }\n return data;\n }\n\n /**\n * Returns a graph structure formed from the given LineSegment array\n *\n * * Find all intersections among segments, and split them if necessary\n * * Record endpoints of every segment in the form X, Y, Theta; This information is stored as a new node and sorted to match up\n * vertices.\n * * For vertices that match up, pinch the nodes to create vertex loops, which in closed objects, will also eventually form face\n * loops\n */\n public static formGraphFromSegments(lineSegments: LineSegment3d[]): HalfEdgeGraph {\n // Structure of an index of the array: { xyTheta: Point3d, node: Node }\n const graph = new HalfEdgeGraph();\n HalfEdgeGraphOps.segmentArrayToGraphEdges(lineSegments, graph, HalfEdgeMask.BOUNDARY_EDGE);\n this.splitIntersectingEdges(graph);\n this.clusterAndMergeXYTheta(graph);\n return graph;\n }\n\n /**\n * * Input is random linestrings, not necessarily loops\n * * Graph gets full splitEdges, regularize (optional), and triangulate.\n * @returns graph, or undefined if bad data.\n */\n public static formGraphFromChains(chains: MultiLineStringDataVariant, regularize: boolean = true, mask: HalfEdgeMask = HalfEdgeMask.PRIMARY_EDGE): HalfEdgeGraph | undefined {\n if (chains.length < 1)\n return undefined;\n const graph = new HalfEdgeGraph();\n const chainSeeds = Triangulator.directCreateChainsFromCoordinates(graph, chains);\n for (const seed of chainSeeds)\n seed.setMaskAroundFace(mask);\n\n this.splitIntersectingEdges(graph);\n this.clusterAndMergeXYTheta(graph);\n if (regularize) {\n const context = new RegularizationContext(graph);\n context.regularizeGraph(true, true);\n }\n return graph;\n }\n\n}\n"]}
1
+ {"version":3,"file":"Merging.js","sourceRoot":"","sources":["../../../src/topology/Merging.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { MultiLineStringDataVariant } from \"../geometry3d/IndexedXYZCollection\";\nimport { Range2d, Range3d } from \"../geometry3d/Range\";\nimport { XAndY } from \"../geometry3d/XYZProps\";\nimport { ClusterableArray } from \"../numerics/ClusterableArray\";\nimport { SmallSystem } from \"../numerics/SmallSystem\";\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { HalfEdgePriorityQueueWithPartnerArray } from \"./HalfEdgePriorityQueue\";\nimport { RegularizationContext } from \"./RegularizeFace\";\nimport { Triangulator } from \"./Triangulation\";\n\n// cspell:word XYUV\n\nexport class GraphSplitData {\n public numUpEdge = 0;\n public numIntersectionTest = 0;\n public numSplit = 0;\n public numPopOut = 0;\n public numA0B0 = 0;\n public numA0B1 = 0;\n public constructor() {\n }\n}\n/**\n * Structure for data used when sorting outbound edges \"around a node\"\n */\nexport class VertexNeighborhoodSortData {\n public index: number;\n public radiusOfCurvature: number;\n public node: HalfEdge;\n public radians?: number;\n public constructor(index: number, key: number, node: HalfEdge, radians?: number) {\n this.index = index;\n this.radiusOfCurvature = key;\n this.node = node;\n this.radians = radians;\n }\n}\n\n/** Function signature for announcing a vertex neighborhood during sorting. */\nexport type AnnounceVertexNeighborhoodSortData = (data: VertexNeighborhoodSortData[]) => any;\n/**\n * * Assorted methods used in algorithms on HalfEdgeGraph.\n * @internal\n */\nexport class HalfEdgeGraphOps {\n\n /** Compare function for sorting with primary y compare, secondary x compare. */\n public static compareNodesYXUp(a: HalfEdge, b: HalfEdge) {\n // Check y's\n // if (!Geometry.isSameCoordinate(a.y, b.y))\n if (a.y < b.y)\n return -1;\n else if (a.y > b.y)\n return 1;\n // Check x's\n // if (!Geometry.isSameCoordinate(a.x, b.x))\n if (a.x < b.x)\n return -1;\n else if (a.x > b.x)\n return 1;\n return 0;\n }\n\n /** Return true if nodeB (a) is lower than both its neighbors and (b) inflects as a downward peak (rather than an upward trough) */\n public static isDownPeak(nodeB: HalfEdge) {\n const nodeA = nodeB.facePredecessor;\n const nodeC = nodeB.faceSuccessor;\n return this.compareNodesYXUp(nodeB, nodeA) < 0\n && this.compareNodesYXUp(nodeB, nodeC) < 0\n && this.crossProductToTargets(nodeB, nodeA, nodeC) > 0;\n }\n\n /** return the cross product of vectors from base to targetA and base to targetB\n * @param base base vertex of both vectors.\n * @param targetA target vertex of first vector\n * @param targetB target vertex of second vector\n */\n public static crossProductToTargets(base: HalfEdge, targetA: HalfEdge, targetB: HalfEdge): number {\n return Geometry.crossProductXYXY(targetA.x - base.x, targetA.y - base.y, targetB.x - base.x, targetB.y - base.y);\n }\n\n /** Compute the range of the graph's vertices. */\n public static graphRange(graph: Readonly<HalfEdgeGraph>): Range3d {\n const range = Range3d.create();\n for (const node of graph.allHalfEdges) {\n range.extendXYZ(node.x, node.y, node.z);\n }\n return range;\n }\n /** Compute the xy-range of the graph's vertices. */\n public static graphRangeXY(graph: Readonly<HalfEdgeGraph>): Range2d {\n const range = Range2d.createNull();\n for (const node of graph.allHalfEdges) {\n range.extendXY(node.x, node.y);\n }\n return range;\n }\n\n /** Returns an array of all nodes (both ends) of edges created from segments. */\n public static segmentArrayToGraphEdges(segments: LineSegment3d[], returnGraph: HalfEdgeGraph, mask: HalfEdgeMask): HalfEdge[] {\n const result = [];\n let idxCounter = 0;\n\n // Push the endpoints of each segment onto arr[] in the form {(x, y, theta), Node}\n for (const segment of segments) {\n\n const node0 = returnGraph.createEdgeXYZXYZ(\n segment.point0Ref.x, segment.point0Ref.y, segment.point0Ref.z,\n idxCounter,\n segment.point1Ref.x, segment.point1Ref.y, segment.point1Ref.z,\n idxCounter + 1);\n\n const node1 = node0.edgeMate;\n idxCounter += 2;\n\n node0.setMaskAroundFace(mask); // Original given coordinates must be part of boundary\n result.push(node0);\n result.push(node1);\n }\n\n return result;\n }\n\n /**\n * * Visit all nodes in `graph`.\n * * invoke `pinch(node, vertexPredecessor)`\n * * this leaves the graph as isolated edges.\n * @param graph graph to modify\n */\n public static isolateAllEdges(graph: HalfEdgeGraph) {\n for (const nodeA of graph.allHalfEdges) {\n const nodeB = nodeA.vertexPredecessor;\n HalfEdge.pinch(nodeA, nodeB);\n }\n }\n /**\n * Compute convexity of a sector of a super-face.\n * @param base node whose edge is to be tested for removal\n * @param ignore edges with this mask (on either side) are ignored for the purposes of computing convexity\n * @param barrier edges with this mask (on either side) will not be removed\n * @param signedAreaTol optional signed area tolerance to use in test for parallel vectors\n * @return whether removing the edge at base would create a convex sector in the super-face\n */\n private static isSectorConvexAfterEdgeRemoval(base: HalfEdge, ignore: HalfEdgeMask, barrier: HalfEdgeMask, signedAreaTol: number = 0): boolean {\n let vs = base;\n do { // loop ccw around vertex looking for a super-face predecessor\n if (vs.isMaskSet(barrier) || vs.edgeMate.isMaskSet(barrier))\n break;\n vs = vs.vertexSuccessor;\n } while (vs !== base && vs.isMaskSet(ignore));\n if (vs === base)\n return false;\n let vp = base;\n do { // loop cw around vertex looking for a super-face successor\n if (vp.isMaskSet(barrier) || vp.edgeMate.isMaskSet(barrier))\n break;\n vp = vp.vertexPredecessor;\n } while (vp !== base && vp.isMaskSet(ignore));\n if (vp === base)\n return false;\n return HalfEdge.isSectorConvex(vs.edgeMate, base, vp.faceSuccessor, signedAreaTol);\n }\n /**\n * Mask edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to examine and mark\n * @param mark the mask used to mark (both sides of) removable edges\n * @param barrier edges with this mask (on either side) will not be marked. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return number of edges masked (half the number of HalfEdges masked)\n */\n public static markRemovableEdgesToExpandConvexFaces(graph: HalfEdgeGraph, mark: HalfEdgeMask, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): number {\n if (HalfEdgeMask.NULL_MASK === mark)\n return 0;\n const visit = graph.grabMask(true);\n let numMarked = 0;\n for (const node of graph.allHalfEdges) {\n if (!node.isMaskSet(visit)) {\n if (!node.isMaskSet(barrier) && !node.edgeMate.isMaskSet(barrier)) {\n // tol based on areas of *original* faces on each side of the edge to be removed\n const signedAreaTol = Geometry.smallMetricDistanceSquared * (node.signedFaceArea() + node.edgeMate.signedFaceArea());\n if (this.isSectorConvexAfterEdgeRemoval(node, mark, barrier, signedAreaTol) && this.isSectorConvexAfterEdgeRemoval(node.edgeMate, mark, barrier, signedAreaTol)) {\n node.setMaskAroundEdge(mark);\n ++numMarked;\n }\n }\n }\n node.setMaskAroundEdge(visit);\n }\n graph.dropMask(visit);\n return numMarked;\n }\n /**\n * Collect edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to examine\n * @param barrier edges with this mask (on either side) will not be collected. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return one HalfEdge per removable edge\n */\n public static collectRemovableEdgesToExpandConvexFaces(graph: HalfEdgeGraph, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): HalfEdge[] | undefined {\n const removable: HalfEdge[] = [];\n const mark = graph.grabMask(true);\n if (0 < this.markRemovableEdgesToExpandConvexFaces(graph, mark, barrier)) {\n const visited = graph.grabMask(true);\n for (const node of graph.allHalfEdges) {\n if (node.isMaskSet(mark) && !node.isMaskSet(visited)) {\n node.setMaskAroundEdge(visited);\n removable.push(node);\n }\n }\n graph.dropMask(visited);\n }\n graph.dropMask(mark);\n return removable;\n }\n\n /**\n * Remove edges between faces if the union of the faces is convex.\n * Uses a greedy algorithm with no regard to quality of resulting convex faces.\n * Best results when input faces are convex.\n * @param graph graph to modify\n * @param barrier edges with this mask (on either side) will not be removed. Defaults to HalfEdgeMask.BOUNDARY_EDGE.\n * @return number of edges deleted\n */\n public static expandConvexFaces(graph: HalfEdgeGraph, barrier: HalfEdgeMask = HalfEdgeMask.BOUNDARY_EDGE): number {\n const mark = graph.grabMask(true);\n const numRemovedEdges = this.markRemovableEdgesToExpandConvexFaces(graph, mark, barrier);\n if (numRemovedEdges > 0) {\n const numYankedEdges = 0.5 * graph.yankAndDeleteEdges((node: HalfEdge) => node.getMask(mark));\n assert(numYankedEdges === numRemovedEdges);\n }\n graph.dropMask(mark);\n return numRemovedEdges;\n }\n\n /**\n * Test desired faces for convexity.\n * @param graph graph to examine\n * @param avoid faces with this mask will not be examined. Defaults to HalfEdgeMask.EXTERIOR.\n * @return whether every face in the graph is convex\n */\n public static isEveryFaceConvex(graph: HalfEdgeGraph, avoid: HalfEdgeMask = HalfEdgeMask.EXTERIOR): boolean {\n const allFaces = graph.collectFaceLoops();\n for (const node of allFaces) {\n if (node.isMaskedAroundFace(avoid))\n continue;\n if (!node.isFaceConvex())\n return false;\n }\n return true;\n }\n}\n\n/**\n * Note: this class uses hardcoded micrometer coordinate/cluster tolerance throughout.\n * @internal\n */\nexport class HalfEdgeGraphMerge {\n // return kC such that all angles k are equal, with kA <= k < kC <= kB.\n // * Assume: angles k are stored at extra data index 0.\n // * Note that the usual case (when angle at kA is not repeated) is kA+1 === kC\n public static getCommonThetaEndIndex(clusters: ClusterableArray, order: Uint32Array, kA: number, kB: number): number {\n let kC = kA + 1;\n const thetaA = clusters.getExtraData(order[kA], 0);\n while (kC < kB) {\n const thetaB = clusters.getExtraData(order[kC], 0);\n if (!Angle.isAlmostEqualRadiansAllowPeriodShift(thetaA, thetaB)) {\n return kC;\n }\n kC++;\n }\n return kC;\n }\n private static _announceVertexNeighborhoodFunction?: AnnounceVertexNeighborhoodSortData;\n /**\n * public property setter for a function to be called with sorted edge data around a vertex.\n */\n public static set announceVertexNeighborhoodFunction(func: AnnounceVertexNeighborhoodSortData | undefined) { this._announceVertexNeighborhoodFunction = func; }\n private static doAnnounceVertexNeighborhood(clusters: ClusterableArray, order: Uint32Array, allNodes: HalfEdge[], k0: number, k1: number) {\n if (this._announceVertexNeighborhoodFunction) {\n const sortData: VertexNeighborhoodSortData[] = [];\n // build and share the entire vertex order\n for (let k = k0; k < k1; k++) {\n const index = clusters.getExtraData(order[k], 1);\n const theta = clusters.getExtraData(order[k], 0);\n const node = allNodes[index];\n const signedDistance = this.curvatureSortKey(node);\n sortData.push(new VertexNeighborhoodSortData(order[k], signedDistance, node, theta));\n }\n this._announceVertexNeighborhoodFunction(sortData);\n }\n\n }\n // assumptions about cluster array:\n // * data order is: x,y,theta,nodeIndex\n // * theta and nodeIndex are the \"extra\" data.\n // * only want to do anything here when curves are present.\n // * k0<=k<k1 are around a vertex\n // * These are sorted by theta.\n private static secondarySortAroundVertex(clusters: ClusterableArray, order: Uint32Array, allNodes: HalfEdge[], k0: number, k1: number) {\n const sortData: VertexNeighborhoodSortData[] = [];\n\n for (let k = k0; k < k1;) {\n const kB = this.getCommonThetaEndIndex(clusters, order, k, k1);\n if (k + 1 < kB) {\n sortData.length = 0;\n for (let kA = k; kA < kB; kA++) {\n const index = clusters.getExtraData(order[kA], 1);\n const node = allNodes[index];\n const signedDistance = this.curvatureSortKey(node);\n sortData.push(new VertexNeighborhoodSortData(order[kA], signedDistance, node));\n }\n sortData.sort((a: VertexNeighborhoodSortData, b: VertexNeighborhoodSortData) => (a.radiusOfCurvature - b.radiusOfCurvature));\n for (let i = 0; i < sortData.length; i++) {\n order[k + i] = sortData[i].index;\n }\n }\n k = kB;\n }\n }\n /** Return the sort key for sorting by curvature.\n * * This is the signed distance from the curve at the edge start, to center of curvature.\n * * NOTE: Currently does not account for higher derivatives in the case of higher-than-tangent match.\n */\n public static curvatureSortKey(node: HalfEdge): number {\n const cld = node.edgeTag as CurveLocationDetail;\n if (cld !== undefined) {\n const fraction = cld.fraction;\n const curve = cld.curve;\n if (curve) {\n let radius = curve.fractionToSignedXYRadiusOfCurvature(fraction);\n if (node.sortData !== undefined && node.sortData < 0)\n radius = -radius;\n return radius;\n }\n }\n return 0.0;\n }\n /** Whether the HalfEdge is part of a null face, as marked by [[clusterAndMergeXYTheta]]. */\n public static isNullFace(node: HalfEdge): boolean {\n return node.isMaskSet(HalfEdgeMask.NULL_FACE) && node.faceSuccessor.isMaskSet(HalfEdgeMask.NULL_FACE) && node === node.faceSuccessor.faceSuccessor;\n }\n /** Simplest merge algorithm:\n * * collect array of (x,y,theta) at all nodes\n * * lexical sort of the array.\n * * twist all vertices together.\n * * This effectively creates valid face loops for a planar subdivision if there are no edge crossings.\n * * If there are edge crossings, the graph can be a (highly complicated) Klein bottle topology.\n * * Mask.NULL_FACE is cleared throughout and applied within null faces.\n */\n public static clusterAndMergeXYTheta(\n graph: HalfEdgeGraph,\n outboundRadiansFunction?: (he: HalfEdge) => number,\n clusterTol: number = Geometry.smallMetricDistance,\n ) {\n const allNodes = graph.allHalfEdges;\n const numNodes = allNodes.length;\n graph.clearMask(HalfEdgeMask.NULL_FACE);\n const clusters = new ClusterableArray(2, 2, numNodes); // data order: x,y,theta,nodeIndex. But theta is not set in first round.\n for (let i = 0; i < numNodes; i++) {\n const nodeA = allNodes[i];\n const xA = nodeA.x;\n const yA = nodeA.y;\n HalfEdge.pinch(nodeA, nodeA.vertexSuccessor); // pull it out of its current vertex loop.\n clusters.addDirect(xA, yA, 0.0, i);\n }\n const order = clusters.clusterIndicesLexical(clusterTol);\n let k0 = 0;\n const numK = order.length;\n for (let k1 = 0; k1 < numK; k1++) {\n if (order[k1] === ClusterableArray.clusterTerminator) {\n // nodes identified in order[k0]..order[k1-1] are at a vertex cluster; equate their xy\n if (k1 > k0) {\n const iA = clusters.getExtraData(order[k0], 1);\n const nodeA0 = allNodes[iA];\n for (let k = k0 + 1; k < k1; k++) {\n const iB = clusters.getExtraData(order[k], 1);\n const nodeB = allNodes[iB];\n nodeB.x = nodeA0.x;\n nodeB.y = nodeA0.y;\n }\n }\n k0 = k1 + 1;\n }\n }\n // NOW\n // 1) There are identical coordinates at all nodes around each vertex loop.\n // 2) Hence ready do sort (at each vertex) by theta.\n\n // insert theta as extra data in the sort table . . .\n for (const clusterTableIndex of order) {\n if (clusterTableIndex !== ClusterableArray.clusterTerminator) {\n const nodeA = allNodes[clusterTableIndex];\n const nodeB = nodeA.faceSuccessor;\n let getPrecomputedRadians = outboundRadiansFunction;\n if (getPrecomputedRadians) {\n // Recompute theta when edge geometry is completely determined by the vertices, which may have been perturbed by clustering.\n const detail = nodeA.edgeTag as CurveLocationDetail;\n if (undefined === detail || undefined === detail.curve || detail.curve instanceof LineSegment3d)\n getPrecomputedRadians = undefined;\n }\n let radians = getPrecomputedRadians ? getPrecomputedRadians(nodeA) : Math.atan2(nodeB.y - nodeA.y, nodeB.x - nodeA.x);\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, -Math.PI))\n radians = Math.PI;\n clusters.setExtraData(clusterTableIndex, 0, radians);\n }\n }\n clusters.sortSubsetsBySingleKey(order, 2);\n const unmatchedNullFaceNodes: HalfEdge[] = [];\n k0 = 0;\n let thetaA, thetaB;\n // GeometryCoreTestIO.consoleLog(\"START VERTEX LINKS\");\n\n // now pinch each neighboring pair together\n for (let k1 = 0; k1 < numK; k1++) {\n if (order[k1] === ClusterableArray.clusterTerminator) {\n // nodes identified in order[k0]..order[k1-1] are properly sorted around a vertex.\n if (k1 > k0) {\n // const xy = clusters.getPoint2d(order[k0]);\n // GeometryCoreTestIO.consoleLog({ k0, k1, x: xy.x, y: xy.y });\n if (k1 > k0 + 1)\n this.secondarySortAroundVertex(clusters, order, allNodes, k0, k1);\n this.doAnnounceVertexNeighborhood(clusters, order, allNodes, k0, k1);\n const iA = clusters.getExtraData(order[k0], 1);\n thetaA = clusters.getExtraData(order[k0], 0);\n const nodeA0 = allNodes[iA];\n let nodeA = nodeA0;\n for (let k = k0 + 1; k < k1; k++) {\n const iB = clusters.getExtraData(order[k], 1);\n thetaB = clusters.getExtraData(order[k], 0);\n const nodeB = allNodes[iB];\n if (nodeA.isMaskSet(HalfEdgeMask.NULL_FACE)) {\n // nope, this edge was flagged and pinched from the other end.\n const j = unmatchedNullFaceNodes.findIndex((node: HalfEdge) => nodeA === node);\n if (j >= 0) {\n unmatchedNullFaceNodes[j] = unmatchedNullFaceNodes[unmatchedNullFaceNodes.length - 1];\n unmatchedNullFaceNodes.pop();\n }\n nodeA = nodeB;\n thetaA = thetaB;\n } else if (nodeB.isMaskSet(HalfEdgeMask.NULL_FACE)) {\n const j = unmatchedNullFaceNodes.findIndex((node: HalfEdge) => nodeB === node);\n if (j >= 0) {\n unmatchedNullFaceNodes[j] = unmatchedNullFaceNodes[unmatchedNullFaceNodes.length - 1];\n unmatchedNullFaceNodes.pop();\n }\n // NO leave nodeA and thetaA ignore nodeB -- later step will get the outside of its banana.\n } else {\n HalfEdge.pinch(nodeA, nodeB);\n\n // Detect null face using the heuristic:\n // * near vertex angles are same (periodic, toleranced)\n // * far vertex is clustered (exactly equal)\n // * near vertex curvatures are same (toleranced)\n // Note that near vertex is already clustered.\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(thetaA, thetaB)) {\n const nodeA1 = nodeA.faceSuccessor;\n const nodeB1 = nodeB.edgeMate;\n if (nodeA1.isEqualXY(nodeB1)) {\n const cA = this.curvatureSortKey(nodeA);\n const cB = this.curvatureSortKey(nodeB);\n if (Geometry.isSameCoordinate(cA, cB, clusterTol)) { // rule out banana\n HalfEdge.pinch(nodeA1, nodeB1);\n nodeA.setMask(HalfEdgeMask.NULL_FACE);\n nodeB1.setMask(HalfEdgeMask.NULL_FACE);\n unmatchedNullFaceNodes.push(nodeB1);\n }\n }\n }\n nodeA = nodeB;\n thetaA = thetaB;\n }\n }\n }\n k0 = k1 + 1;\n }\n }\n }\n\n private static buildVerticalSweepPriorityQueue(graph: HalfEdgeGraph): HalfEdgePriorityQueueWithPartnerArray {\n const sweepHeap = new HalfEdgePriorityQueueWithPartnerArray();\n for (const p of graph.allHalfEdges) {\n\n if (HalfEdgeGraphOps.compareNodesYXUp(p, p.faceSuccessor) < 0) {\n sweepHeap.priorityQueue.push(p);\n }\n }\n return sweepHeap;\n }\n\n private static computeIntersectionFractionsOnEdges(nodeA0: HalfEdge, nodeB0: HalfEdge, tol: number = Geometry.smallMetricDistance): { f0: XAndY, f1?: XAndY} | undefined {\n const nodeA1 = nodeA0.faceSuccessor;\n const aDir = { x: nodeA1.x - nodeA0.x, y: nodeA1.y - nodeA0.y };\n const nodeB1 = nodeB0.faceSuccessor;\n const bDir = { x: nodeB1.x - nodeB0.x, y: nodeB1.y - nodeB0.y };\n let fractions = SmallSystem.lineSegmentXYUVIntersectionUnbounded(nodeA0, aDir, nodeB0, bDir, tol);\n if (fractions) {\n const snapFractionToSegment = (fraction: number, segStart: XAndY, segEnd: XAndY): number => {\n const x = Geometry.interpolate(segStart.x, fraction, segEnd.x);\n const y = Geometry.interpolate(segStart.y, fraction, segEnd.y);\n if (Geometry.isSameCoordinateXY(x, y, segStart.x, segStart.y, tol))\n return 0.0;\n if (Geometry.isSameCoordinateXY(x, y, segEnd.x, segEnd.y, tol))\n return 1.0;\n return fraction;\n };\n fractions.f0.x = snapFractionToSegment(fractions.f0.x, nodeA0, nodeA1);\n fractions.f0.y = snapFractionToSegment(fractions.f0.y, nodeB0, nodeB1);\n if (fractions.f1) {\n fractions.f1.x = snapFractionToSegment(fractions.f1.x, nodeA0, nodeA1);\n fractions.f1.y = snapFractionToSegment(fractions.f1.y, nodeB0, nodeB1);\n }\n if (fractions.f1 && !(Geometry.isIn01(fractions.f1.x) && Geometry.isIn01(fractions.f1.y)))\n fractions.f1 = undefined; // overlap ends beyond a segment; downgrade to simple intersection\n if (!(Geometry.isIn01(fractions.f0.x) && Geometry.isIn01(fractions.f0.y))) {\n if (fractions.f1) {\n fractions.f0 = fractions.f1; // overlap starts beyond a segment; downgrade to simple intersection\n fractions.f1 = undefined;\n } else\n fractions = undefined; // intersection/overlap is outside both segments\n }\n }\n return fractions;\n }\n /**\n * Split edges at intersections.\n * * This is a large operation.\n * @param graph\n */\n public static splitIntersectingEdges(graph: HalfEdgeGraph, distanceTol: number = Geometry.smallMetricDistance, fractionTol: number = 1.0e-8): GraphSplitData {\n const data = new GraphSplitData();\n const sweepHeap = this.buildVerticalSweepPriorityQueue(graph);\n let nodeA0, nodeB1;\n const smallFraction = fractionTol;\n const largeFraction = 1.0 - smallFraction;\n let i;\n let nodeB0;\n while (undefined !== (nodeA0 = sweepHeap.priorityQueue.pop())) {\n data.numUpEdge++;\n const n0 = sweepHeap.activeEdges.length;\n sweepHeap.removeArrayMembersWithY1Below(nodeA0.y - distanceTol);\n data.numPopOut += n0 - sweepHeap.activeEdges.length;\n for (i = 0; i < sweepHeap.activeEdges.length; i++) {\n nodeB0 = sweepHeap.activeEdges[i];\n nodeB1 = nodeB0.faceSuccessor;\n if (Geometry.isSameCoordinateXY(nodeA0.x, nodeA0.y, nodeB0.x, nodeB0.y, distanceTol)) {\n data.numA0B0++;\n } else if (Geometry.isSameCoordinateXY(nodeB1.x, nodeB1.y, nodeA0.x, nodeA0.y, distanceTol)) {\n data.numA0B1++;\n } else {\n data.numIntersectionTest++;\n const fractions = this.computeIntersectionFractionsOnEdges(nodeA0, nodeB0, distanceTol);\n if (fractions) {\n const splitAndPush = (node: HalfEdge, fraction?: number): void => {\n if (fraction !== undefined && fraction > smallFraction && fraction < largeFraction) {\n const newNode = graph.splitEdgeAtFraction(node, fraction);\n sweepHeap.priorityQueue.push(newNode); // will be popped as a nodeA0 later\n data.numSplit++;\n }\n };\n splitAndPush(nodeA0, fractions.f0.x);\n splitAndPush(nodeA0, fractions.f1?.x);\n splitAndPush(nodeB0, fractions.f0.y);\n splitAndPush(nodeB0, fractions.f1?.y);\n // existing nodeA0 and its shortened edge remain for further intersections\n }\n }\n }\n sweepHeap.activeEdges.push(nodeA0);\n }\n return data;\n }\n\n /**\n * Returns a graph structure formed from the given LineSegment array\n *\n * * Find all intersections among segments, and split them if necessary\n * * Record endpoints of every segment in the form X, Y, Theta; This information is stored as a new node and sorted to match up\n * vertices.\n * * For vertices that match up, pinch the nodes to create vertex loops, which in closed objects, will also eventually form face\n * loops\n */\n public static formGraphFromSegments(lineSegments: LineSegment3d[]): HalfEdgeGraph {\n // Structure of an index of the array: { xyTheta: Point3d, node: Node }\n const graph = new HalfEdgeGraph();\n HalfEdgeGraphOps.segmentArrayToGraphEdges(lineSegments, graph, HalfEdgeMask.BOUNDARY_EDGE);\n this.splitIntersectingEdges(graph);\n this.clusterAndMergeXYTheta(graph);\n return graph;\n }\n\n /**\n * * Input is random linestrings, not necessarily loops\n * * Graph gets full splitEdges, regularize (optional), and triangulate.\n * @returns graph, or undefined if bad data.\n */\n public static formGraphFromChains(chains: MultiLineStringDataVariant, regularize: boolean = true, mask: HalfEdgeMask = HalfEdgeMask.PRIMARY_EDGE): HalfEdgeGraph | undefined {\n if (chains.length < 1)\n return undefined;\n const graph = new HalfEdgeGraph();\n const chainSeeds = Triangulator.directCreateChainsFromCoordinates(graph, chains);\n for (const seed of chainSeeds)\n seed.setMaskAroundFace(mask);\n\n this.splitIntersectingEdges(graph);\n this.clusterAndMergeXYTheta(graph);\n if (regularize) {\n const context = new RegularizationContext(graph);\n context.regularizeGraph(true, true);\n }\n return graph;\n }\n\n}\n"]}
@@ -5,6 +5,7 @@ import { MarkedEdgeSet } from "./HalfEdgeMarkSet";
5
5
  import { InsertedVertexZOptions } from "./InsertAndRetriangulateContext";
6
6
  /**
7
7
  * Static methods for triangulating polygons and points.
8
+ * * Tolerances and tolerance usage are currently inconsistent, and not exposed to callers.
8
9
  * * @internal
9
10
  */
10
11
  export declare class Triangulator {
@@ -39,13 +40,12 @@ export declare class Triangulator {
39
40
  */
40
41
  static flipTrianglesInEdgeSet(graph: HalfEdgeGraph, edgeSet: MarkedEdgeSet): number;
41
42
  /**
42
- * Create a graph from an xy-triangulation of the given points.
43
+ * Create a graph from an xy-triangulation of the given points. The triangulation is Delaunay.
43
44
  * * The outer boundary of the graph is the xy-convex hull of the points; it is marked `HalfEdgeMask.EXTERIOR`.
44
- * @param points the points to triangulate
45
+ * @param points the points to triangulate.
45
46
  * @param zRule optional rule for updating the z-coordinate of an existing vertex when an xy-duplicate point is
46
47
  * inserted into the graph. Default is `InsertedVertexZOptions.ReplaceIfLarger`.
47
- * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is
48
- * `Geometry.smallMetricDistance`.
48
+ * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is `Geometry.smallMetricDistance`.
49
49
  */
50
50
  static createTriangulatedGraphFromPoints(points: Point3d[], zRule?: InsertedVertexZOptions, pointTolerance?: number): HalfEdgeGraph | undefined;
51
51
  /**
@@ -68,12 +68,14 @@ export declare class Triangulator {
68
68
  * * A random node is checked for each face; if it has the `HalfEdgeMask.EXTERIOR` mask, the face is ignored.
69
69
  * @param useLocalCoords whether to transform each face into local coords before triangulating.
70
70
  * This is useful if the graph has z-coordinates.
71
+ * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio.
72
+ * Ignored if `useLocalCoords` is true, in which case flipping is not performed to avoid out-of-plane effects.
71
73
  * @returns whether all indicated faces were triangulated successfully
72
74
  * @see [[triangulateAllPositiveAreaFaces]]
73
75
  */
74
- static triangulateAllInteriorFaces(graph: HalfEdgeGraph, useLocalCoords?: boolean): boolean;
76
+ static triangulateAllInteriorFaces(graph: HalfEdgeGraph, useLocalCoords?: boolean, noFlips?: boolean): boolean;
75
77
  /**
76
- * Triangulate the polygon made up of by a series of points.
78
+ * Triangulate the polygon made up of by a series of points. The triangulation is Delaunay.
77
79
  * * The loop may be either CCW or CW -- CCW order will be used for triangles.
78
80
  * * To triangulate a polygon with holes, use createTriangulatedGraphFromLoops.
79
81
  */
@@ -139,14 +141,15 @@ export declare class Triangulator {
139
141
  /**
140
142
  * Perform 0, 1, or more edge flips to improve aspect ratio just behind an ear that was just cut.
141
143
  * @param ear the triangle corner which just served as the ear node.
142
- * @returns the node at the back corner after flipping."appropriately positioned" node for the usual advance to ear.faceSuccessor.edgeMate.faceSuccessor.
144
+ * @returns the node at the back corner after flipping, "appropriately positioned" for the usual advance to `ear.faceSuccessor.edgeMate.faceSuccessor`.
143
145
  */
144
146
  private static doPostCutFlips;
145
147
  /**
146
148
  * Main ear slicing loop which triangulates the face starting at `ear`.
147
149
  * @param graph containing graph to receive new edges
148
150
  * @param ear sector at which to start triangulation of the containing face.
149
- * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio. Pass true if your graph isn't planar.
151
+ * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio.
152
+ * Pass true if your graph isn't planar; otherwise, an edge can be flipped out of plane if the neighboring triangle is non-coplanar.
150
153
  */
151
154
  private static triangulateSingleFace;
152
155
  /** @internal */
@@ -202,7 +205,7 @@ export declare class Triangulator {
202
205
  private static findHoleBridge;
203
206
  private static getLeftmost;
204
207
  /**
205
- * Check if a point lies within a triangle.
208
+ * Check if a point lies within or on a triangle.
206
209
  * * In other words, the areas of the 3 triangles formed by an edge of abc and p all have zero or positive area.
207
210
  */
208
211
  private static pointInTriangle;
@@ -213,8 +216,7 @@ export declare class Triangulator {
213
216
  * (This originates in classic earcut code.)
214
217
  */
215
218
  private static signedCWTriangleArea;
216
- /** signed area of a triangle, with small positive corrected to zero by relTol
217
- */
219
+ /** signed area of a triangle, with small positive corrected to zero by relTol */
218
220
  private static signedTolerancedCCWTriangleArea;
219
221
  /** check if two points are equal */
220
222
  private static isAlmostEqualXAndYXY;
@@ -1 +1 @@
1
- {"version":3,"file":"Triangulation.d.ts","sourceRoot":"","sources":["../../../src/topology/Triangulation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Triangulation.d.ts","sourceRoot":"","sources":["../../../src/topology/Triangulation.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ import { MarkedEdgeSet } from "./HalfEdgeMarkSet";
19
19
  import { InsertAndRetriangulateContext, InsertedVertexZOptions } from "./InsertAndRetriangulateContext";
20
20
  /**
21
21
  * Static methods for triangulating polygons and points.
22
+ * * Tolerances and tolerance usage are currently inconsistent, and not exposed to callers.
22
23
  * * @internal
23
24
  */
24
25
  export class Triangulator {
@@ -147,13 +148,12 @@ export class Triangulator {
147
148
  return numFlip;
148
149
  }
149
150
  /**
150
- * Create a graph from an xy-triangulation of the given points.
151
+ * Create a graph from an xy-triangulation of the given points. The triangulation is Delaunay.
151
152
  * * The outer boundary of the graph is the xy-convex hull of the points; it is marked `HalfEdgeMask.EXTERIOR`.
152
- * @param points the points to triangulate
153
+ * @param points the points to triangulate.
153
154
  * @param zRule optional rule for updating the z-coordinate of an existing vertex when an xy-duplicate point is
154
155
  * inserted into the graph. Default is `InsertedVertexZOptions.ReplaceIfLarger`.
155
- * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is
156
- * `Geometry.smallMetricDistance`.
156
+ * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is `Geometry.smallMetricDistance`.
157
157
  */
158
158
  static createTriangulatedGraphFromPoints(points, zRule = InsertedVertexZOptions.ReplaceIfLarger, pointTolerance = Geometry.smallMetricDistance) {
159
159
  if (points.length < 3)
@@ -253,12 +253,15 @@ export class Triangulator {
253
253
  * * A random node is checked for each face; if it has the `HalfEdgeMask.EXTERIOR` mask, the face is ignored.
254
254
  * @param useLocalCoords whether to transform each face into local coords before triangulating.
255
255
  * This is useful if the graph has z-coordinates.
256
+ * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio.
257
+ * Ignored if `useLocalCoords` is true, in which case flipping is not performed to avoid out-of-plane effects.
256
258
  * @returns whether all indicated faces were triangulated successfully
257
259
  * @see [[triangulateAllPositiveAreaFaces]]
258
260
  */
259
- static triangulateAllInteriorFaces(graph, useLocalCoords) {
261
+ static triangulateAllInteriorFaces(graph, useLocalCoords, noFlips) {
260
262
  const seeds = graph.collectFaceLoops();
261
263
  const visited = useLocalCoords ? graph.grabMask() : HalfEdgeMask.NULL_MASK;
264
+ noFlips = useLocalCoords || noFlips; // don't flip if using local coords
262
265
  let localToWorld;
263
266
  let nodes;
264
267
  let nodeCount = 0;
@@ -273,8 +276,7 @@ export class Triangulator {
273
276
  localToWorld = this._workTransform = FrameBuilder.createRightHandedLocalToWorld(nodes, this._workTransform);
274
277
  localToWorld?.multiplyInversePoint3dArrayInPlace(nodes);
275
278
  }
276
- // don't flip triangles if using local coords; an edge of this face can be flipped out of plane if the neighboring triangle is non-coplanar.
277
- if (!Triangulator.triangulateSingleFace(graph, face, useLocalCoords))
279
+ if (!Triangulator.triangulateSingleFace(graph, face, noFlips))
278
280
  numFail++;
279
281
  if (localToWorld && nodes) {
280
282
  for (let iNewNode = nodeCount; iNewNode < graph.countNodes(); ++iNewNode)
@@ -287,7 +289,7 @@ export class Triangulator {
287
289
  return numFail === 0;
288
290
  }
289
291
  /**
290
- * Triangulate the polygon made up of by a series of points.
292
+ * Triangulate the polygon made up of by a series of points. The triangulation is Delaunay.
291
293
  * * The loop may be either CCW or CW -- CCW order will be used for triangles.
292
294
  * * To triangulate a polygon with holes, use createTriangulatedGraphFromLoops.
293
295
  */
@@ -472,31 +474,32 @@ export class Triangulator {
472
474
  /**
473
475
  * Perform 0, 1, or more edge flips to improve aspect ratio just behind an ear that was just cut.
474
476
  * @param ear the triangle corner which just served as the ear node.
475
- * @returns the node at the back corner after flipping."appropriately positioned" node for the usual advance to ear.faceSuccessor.edgeMate.faceSuccessor.
477
+ * @returns the node at the back corner after flipping, "appropriately positioned" for the usual advance to `ear.faceSuccessor.edgeMate.faceSuccessor`.
476
478
  */
477
479
  static doPostCutFlips(ear) {
478
- // B is the ear -- inside a (probably newly created) triangle ABC
479
- // CA is the recently added cut edge.
480
- // AB is the candidate to be flipped.
481
- // triangle B1 A1 D is on the other side of AB
482
- // The condition for flipping is:
483
- // ! both triangles must be TRIANGULATED_NODE_MASK
484
- // ! circumcircle condition flags D as in the circle of ABC
485
- // after flip, node A moves to the vertex of D, and is the effective "ear", with the cap edge C A1
486
- // after flip, consider the A1 D (whose nodes are A1 and flipped A!!!)
480
+ // B0 is at the ear vertex, inside ear triangle T = A0 B0 C.
481
+ // C is the recently cut edge added to form the ear cap.
482
+ // A0/B1 is the quad diagonal edge candidate to be flipped.
483
+ // Triangle T' = B1 A1 D1 is on the other side of the quad diagonal.
484
+ // The conditions for flipping are:
485
+ // * both triangles T, T' must be masked with TRIANGULATED_FACE
486
+ // * the Delaunay circumcircle condition flags the vertex at D1 as in the circumcircle of T
487
+ // After flip, node A0 becomes D1.vertexSuccessor, and is the effective "ear", with (same) cap edge C.
488
+ // The next quad diagonal edge candidate to consider in the loop is A1/D0.
487
489
  //
488
- // * *
489
- // . C0| . / |
490
- // . | . C0 /B1|
491
- // . | . /v |
492
- // . ^| . / |
493
- // . A0 ----> B0| . / ^|
494
- // *=======================* --> * A1 / B0*
495
- // \ A1 <---- B1/ \ / /
496
- // \ / \ / /
497
- // \ / \ ^/ D1/
498
- // \ D1 / \A0/ /
499
- // * *
490
+ // * *
491
+ // . C| . / |
492
+ // . | . C/B1|
493
+ // . | . / |
494
+ // . | . / |
495
+ // . A0 ----> B0| . / |
496
+ // *=====================* --> * A1 / B0 *
497
+ // \ A1 <---- B1 / \ / /
498
+ // \ / \ / /
499
+ // \ / \ / /
500
+ // \ / \ A0/D1/
501
+ // D0 \D1/ D0 \/ /
502
+ // * *
500
503
  let b0 = ear;
501
504
  let a0 = b0.facePredecessor;
502
505
  let b1 = a0.edgeMate;
@@ -510,6 +513,7 @@ export class Triangulator {
510
513
  b0 = a0;
511
514
  a0 = b0.facePredecessor;
512
515
  b1 = a0.edgeMate;
516
+ // Move to next quad with diagonal a0/b1
513
517
  }
514
518
  return b0;
515
519
  }
@@ -517,7 +521,8 @@ export class Triangulator {
517
521
  * Main ear slicing loop which triangulates the face starting at `ear`.
518
522
  * @param graph containing graph to receive new edges
519
523
  * @param ear sector at which to start triangulation of the containing face.
520
- * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio. Pass true if your graph isn't planar.
524
+ * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio.
525
+ * Pass true if your graph isn't planar; otherwise, an edge can be flipped out of plane if the neighboring triangle is non-coplanar.
521
526
  */
522
527
  static triangulateSingleFace(graph, ear, noFlips = false) {
523
528
  if (!ear) {
@@ -545,7 +550,7 @@ export class Triangulator {
545
550
  // The earcut algorithm does not support self intersections, however we do handle the re-entrant triangle
546
551
  // case by pinching a bridge/hole into existence when vertices i and i+3 live in the same face loop, but not
547
552
  // the same vertex loop. Earcut whittles larger faces down into triangles, so this is the only case needed.
548
- if (Geometry.isAlmostEqualXAndY(next2, pred) && !next2.findAroundVertex(pred)) {
553
+ if (Triangulator.isAlmostEqualXAndYXY(next2, pred.x, pred.y) && !next2.findAroundVertex(pred)) {
549
554
  const next3 = next2.faceSuccessor;
550
555
  const hasBridgeEdgeOrHoleInside = this.nodeInTriangle(pred, ear, next, next3);
551
556
  if (hasBridgeEdgeOrHoleInside) {
@@ -628,7 +633,7 @@ export class Triangulator {
628
633
  static findAroundOrAtVertex(a, b) {
629
634
  if (a.findAroundVertex(b))
630
635
  return true;
631
- return Geometry.isAlmostEqualXAndY(a, b);
636
+ return Triangulator.isAlmostEqualXAndYXY(a, b.x, b.y);
632
637
  }
633
638
  // for reuse over all calls to isEar ....
634
639
  static _edgeInterval = Range1d.createNull();
@@ -795,7 +800,7 @@ export class Triangulator {
795
800
  return leftmost;
796
801
  }
797
802
  /**
798
- * Check if a point lies within a triangle.
803
+ * Check if a point lies within or on a triangle.
799
804
  * * In other words, the areas of the 3 triangles formed by an edge of abc and p all have zero or positive area.
800
805
  */
801
806
  static pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
@@ -816,8 +821,7 @@ export class Triangulator {
816
821
  static signedCWTriangleArea(p, q, r) {
817
822
  return 0.5 * ((q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y));
818
823
  }
819
- /** signed area of a triangle, with small positive corrected to zero by relTol
820
- */
824
+ /** signed area of a triangle, with small positive corrected to zero by relTol */
821
825
  static signedTolerancedCCWTriangleArea(p, q, r, relTol = 1.0e-12) {
822
826
  const ux = q.x - p.x;
823
827
  const uy = q.y - p.y;