@itwin/core-geometry 5.1.0-dev.4 → 5.1.0-dev.41

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 (470) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/lib/cjs/Geometry.d.ts +12 -4
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +13 -3
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/BSpline1dNd.d.ts +1 -1
  7. package/lib/cjs/bspline/BSpline1dNd.js +1 -1
  8. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  10. package/lib/cjs/bspline/BSplineCurve.js +7 -1
  11. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  12. package/lib/cjs/bspline/BSplineSurface.d.ts +4 -3
  13. package/lib/cjs/bspline/BSplineSurface.d.ts.map +1 -1
  14. package/lib/cjs/bspline/BSplineSurface.js +6 -5
  15. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  16. package/lib/cjs/clipping/ClipPlane.d.ts +7 -5
  17. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  18. package/lib/cjs/clipping/ClipPlane.js +9 -5
  19. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  20. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  21. package/lib/cjs/clipping/ClipUtils.js +5 -3
  22. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  23. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +1 -2
  24. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  25. package/lib/cjs/clipping/ConvexClipPlaneSet.js +13 -25
  26. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  27. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +1 -2
  28. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  29. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +1 -2
  30. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  31. package/lib/cjs/core-geometry.d.ts +1 -0
  32. package/lib/cjs/core-geometry.d.ts.map +1 -1
  33. package/lib/cjs/core-geometry.js +1 -0
  34. package/lib/cjs/core-geometry.js.map +1 -1
  35. package/lib/cjs/curve/Arc3d.d.ts +54 -32
  36. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  37. package/lib/cjs/curve/Arc3d.js +56 -37
  38. package/lib/cjs/curve/Arc3d.js.map +1 -1
  39. package/lib/cjs/curve/CurveCollection.d.ts +33 -1
  40. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  41. package/lib/cjs/curve/CurveCollection.js +79 -0
  42. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  43. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  44. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  45. package/lib/cjs/curve/CurveLocationDetail.d.ts +25 -25
  46. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  47. package/lib/cjs/curve/CurveLocationDetail.js +25 -25
  48. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  49. package/lib/cjs/curve/CurvePrimitive.d.ts +2 -2
  50. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  51. package/lib/cjs/curve/CurveTypes.d.ts +1 -1
  52. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  53. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  54. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +10 -5
  55. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  56. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +9 -5
  57. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  58. package/lib/cjs/curve/Query/PlanarSubdivision.js +27 -11
  59. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  60. package/lib/cjs/curve/RegionMomentsXY.d.ts +1 -0
  61. package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
  62. package/lib/cjs/curve/RegionMomentsXY.js +21 -39
  63. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  64. package/lib/cjs/curve/RegionOps.d.ts +55 -29
  65. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  66. package/lib/cjs/curve/RegionOps.js +96 -35
  67. package/lib/cjs/curve/RegionOps.js.map +1 -1
  68. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +27 -26
  69. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  70. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +70 -54
  71. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  72. package/lib/cjs/curve/StrokeOptions.d.ts +1 -1
  73. package/lib/cjs/curve/StrokeOptions.js +1 -1
  74. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  75. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  76. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +0 -1
  77. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  78. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +58 -32
  79. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  80. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  81. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +0 -1
  82. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  83. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.d.ts +14 -0
  84. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.d.ts.map +1 -0
  85. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js +34 -0
  86. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -0
  87. package/lib/cjs/geometry3d/AngleSweep.d.ts +24 -17
  88. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  89. package/lib/cjs/geometry3d/AngleSweep.js +31 -17
  90. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  91. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts +8 -7
  92. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  93. package/lib/cjs/geometry3d/CoincidentGeometryOps.js +19 -25
  94. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  95. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
  96. package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
  97. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  98. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +7 -2
  99. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  100. package/lib/cjs/geometry3d/GrowableXYZArray.js +20 -2
  101. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  102. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +2 -1
  103. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  104. package/lib/cjs/geometry3d/IndexedXYZCollection.js +7 -3
  105. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  106. package/lib/cjs/geometry3d/Plane3d.d.ts +2 -0
  107. package/lib/cjs/geometry3d/Plane3d.d.ts.map +1 -1
  108. package/lib/cjs/geometry3d/Plane3d.js +6 -1
  109. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  110. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  111. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  112. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  113. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  114. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  115. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  116. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  117. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  118. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  119. package/lib/cjs/geometry3d/Point2dVector2d.js +0 -2
  120. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  121. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +4 -4
  122. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  123. package/lib/cjs/geometry3d/Point3dVector3d.js +4 -5
  124. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  125. package/lib/cjs/geometry3d/PointHelpers.d.ts +7 -7
  126. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  127. package/lib/cjs/geometry3d/PointHelpers.js +66 -26
  128. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  129. package/lib/cjs/geometry3d/PolygonOps.d.ts +49 -2
  130. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  131. package/lib/cjs/geometry3d/PolygonOps.js +38 -2
  132. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  133. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  134. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  135. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  136. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  137. package/lib/cjs/geometry3d/PolylineOps.d.ts +5 -4
  138. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  139. package/lib/cjs/geometry3d/PolylineOps.js +5 -4
  140. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  141. package/lib/cjs/geometry3d/Range.d.ts +18 -10
  142. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  143. package/lib/cjs/geometry3d/Range.js +32 -10
  144. package/lib/cjs/geometry3d/Range.js.map +1 -1
  145. package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
  146. package/lib/cjs/geometry3d/Ray2d.js +0 -1
  147. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  148. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  149. package/lib/cjs/geometry3d/Ray3d.js +11 -23
  150. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  151. package/lib/cjs/geometry3d/Transform.d.ts +21 -2
  152. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  153. package/lib/cjs/geometry3d/Transform.js +32 -13
  154. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  155. package/lib/cjs/geometry4d/Point4d.d.ts +8 -5
  156. package/lib/cjs/geometry4d/Point4d.d.ts.map +1 -1
  157. package/lib/cjs/geometry4d/Point4d.js +27 -16
  158. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  159. package/lib/cjs/numerics/BezierPolynomials.d.ts +2 -0
  160. package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
  161. package/lib/cjs/numerics/BezierPolynomials.js +11 -0
  162. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  163. package/lib/cjs/numerics/SmallSystem.d.ts +77 -36
  164. package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
  165. package/lib/cjs/numerics/SmallSystem.js +129 -73
  166. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  167. package/lib/cjs/polyface/FacetOrientation.d.ts +1 -1
  168. package/lib/cjs/polyface/FacetOrientation.js +1 -1
  169. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  170. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts +55 -40
  171. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  172. package/lib/cjs/polyface/IndexedEdgeMatcher.js +83 -75
  173. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  174. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  175. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  176. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +47 -38
  177. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  178. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  179. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  180. package/lib/cjs/polyface/IndexedPolyfaceWalker.js +47 -32
  181. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  182. package/lib/cjs/polyface/Polyface.d.ts +19 -5
  183. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  184. package/lib/cjs/polyface/Polyface.js +18 -2
  185. package/lib/cjs/polyface/Polyface.js.map +1 -1
  186. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +1 -1
  187. package/lib/cjs/polyface/PolyfaceBuilder.js +3 -3
  188. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  189. package/lib/cjs/polyface/PolyfaceClip.d.ts +19 -18
  190. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  191. package/lib/cjs/polyface/PolyfaceClip.js +39 -42
  192. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  193. package/lib/cjs/polyface/PolyfaceData.d.ts +1 -1
  194. package/lib/cjs/polyface/PolyfaceData.js +1 -1
  195. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  196. package/lib/cjs/polyface/PolyfaceQuery.d.ts +119 -78
  197. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  198. package/lib/cjs/polyface/PolyfaceQuery.js +315 -231
  199. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  200. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  201. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  202. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +3 -3
  203. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  204. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  205. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  206. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  207. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  208. package/lib/cjs/serialization/GeometrySamples.d.ts +1 -1
  209. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  210. package/lib/cjs/serialization/GeometrySamples.js +3 -3
  211. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  212. package/lib/cjs/serialization/IModelJsonSchema.d.ts +3 -3
  213. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  214. package/lib/cjs/solid/LinearSweep.d.ts +2 -3
  215. package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
  216. package/lib/cjs/solid/LinearSweep.js +2 -3
  217. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  218. package/lib/cjs/solid/RotationalSweep.d.ts +2 -2
  219. package/lib/cjs/solid/RotationalSweep.js +2 -2
  220. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  221. package/lib/cjs/topology/ChainMerge.d.ts +1 -1
  222. package/lib/cjs/topology/ChainMerge.js +1 -1
  223. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  224. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +1 -0
  225. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  226. package/lib/cjs/topology/HalfEdgeGraphSearch.js +1 -0
  227. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  228. package/lib/cjs/topology/Merging.d.ts +0 -1
  229. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  230. package/lib/cjs/topology/Merging.js +49 -46
  231. package/lib/cjs/topology/Merging.js.map +1 -1
  232. package/lib/cjs/topology/Triangulation.d.ts +9 -14
  233. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  234. package/lib/cjs/topology/Triangulation.js +29 -22
  235. package/lib/cjs/topology/Triangulation.js.map +1 -1
  236. package/lib/esm/Geometry.d.ts +12 -4
  237. package/lib/esm/Geometry.d.ts.map +1 -1
  238. package/lib/esm/Geometry.js +13 -3
  239. package/lib/esm/Geometry.js.map +1 -1
  240. package/lib/esm/bspline/BSpline1dNd.d.ts +1 -1
  241. package/lib/esm/bspline/BSpline1dNd.js +1 -1
  242. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  243. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  244. package/lib/esm/bspline/BSplineCurve.js +7 -1
  245. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  246. package/lib/esm/bspline/BSplineSurface.d.ts +4 -3
  247. package/lib/esm/bspline/BSplineSurface.d.ts.map +1 -1
  248. package/lib/esm/bspline/BSplineSurface.js +6 -5
  249. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  250. package/lib/esm/clipping/ClipPlane.d.ts +7 -5
  251. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  252. package/lib/esm/clipping/ClipPlane.js +9 -5
  253. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  254. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  255. package/lib/esm/clipping/ClipUtils.js +5 -3
  256. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  257. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +1 -2
  258. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  259. package/lib/esm/clipping/ConvexClipPlaneSet.js +13 -25
  260. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  261. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +1 -2
  262. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  263. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +1 -2
  264. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  265. package/lib/esm/core-geometry.d.ts +1 -0
  266. package/lib/esm/core-geometry.d.ts.map +1 -1
  267. package/lib/esm/core-geometry.js +1 -0
  268. package/lib/esm/core-geometry.js.map +1 -1
  269. package/lib/esm/curve/Arc3d.d.ts +54 -32
  270. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  271. package/lib/esm/curve/Arc3d.js +56 -37
  272. package/lib/esm/curve/Arc3d.js.map +1 -1
  273. package/lib/esm/curve/CurveCollection.d.ts +33 -1
  274. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  275. package/lib/esm/curve/CurveCollection.js +79 -0
  276. package/lib/esm/curve/CurveCollection.js.map +1 -1
  277. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  278. package/lib/esm/curve/CurveFactory.js.map +1 -1
  279. package/lib/esm/curve/CurveLocationDetail.d.ts +25 -25
  280. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  281. package/lib/esm/curve/CurveLocationDetail.js +25 -25
  282. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  283. package/lib/esm/curve/CurvePrimitive.d.ts +2 -2
  284. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  285. package/lib/esm/curve/CurveTypes.d.ts +1 -1
  286. package/lib/esm/curve/CurveTypes.js.map +1 -1
  287. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  288. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +10 -5
  289. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  290. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +9 -5
  291. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  292. package/lib/esm/curve/Query/PlanarSubdivision.js +27 -11
  293. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  294. package/lib/esm/curve/RegionMomentsXY.d.ts +1 -0
  295. package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
  296. package/lib/esm/curve/RegionMomentsXY.js +21 -39
  297. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  298. package/lib/esm/curve/RegionOps.d.ts +55 -29
  299. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  300. package/lib/esm/curve/RegionOps.js +96 -35
  301. package/lib/esm/curve/RegionOps.js.map +1 -1
  302. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +27 -26
  303. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  304. package/lib/esm/curve/RegionOpsClassificationSweeps.js +70 -54
  305. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  306. package/lib/esm/curve/StrokeOptions.d.ts +1 -1
  307. package/lib/esm/curve/StrokeOptions.js +1 -1
  308. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  309. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  310. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +0 -1
  311. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  312. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +58 -32
  313. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  314. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  315. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +0 -1
  316. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  317. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.d.ts +14 -0
  318. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.d.ts.map +1 -0
  319. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js +30 -0
  320. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -0
  321. package/lib/esm/geometry3d/AngleSweep.d.ts +24 -17
  322. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  323. package/lib/esm/geometry3d/AngleSweep.js +31 -17
  324. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  325. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts +8 -7
  326. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  327. package/lib/esm/geometry3d/CoincidentGeometryOps.js +19 -25
  328. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  329. package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
  330. package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
  331. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  332. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +7 -2
  333. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  334. package/lib/esm/geometry3d/GrowableXYZArray.js +20 -2
  335. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  336. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +2 -1
  337. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  338. package/lib/esm/geometry3d/IndexedXYZCollection.js +7 -3
  339. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  340. package/lib/esm/geometry3d/Plane3d.d.ts +2 -0
  341. package/lib/esm/geometry3d/Plane3d.d.ts.map +1 -1
  342. package/lib/esm/geometry3d/Plane3d.js +6 -1
  343. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  344. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  345. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  346. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  347. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  348. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  349. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  350. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  351. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  352. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  353. package/lib/esm/geometry3d/Point2dVector2d.js +0 -2
  354. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  355. package/lib/esm/geometry3d/Point3dVector3d.d.ts +4 -4
  356. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  357. package/lib/esm/geometry3d/Point3dVector3d.js +4 -5
  358. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  359. package/lib/esm/geometry3d/PointHelpers.d.ts +7 -7
  360. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  361. package/lib/esm/geometry3d/PointHelpers.js +66 -26
  362. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  363. package/lib/esm/geometry3d/PolygonOps.d.ts +49 -2
  364. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  365. package/lib/esm/geometry3d/PolygonOps.js +38 -2
  366. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  367. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  368. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  369. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  370. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  371. package/lib/esm/geometry3d/PolylineOps.d.ts +5 -4
  372. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  373. package/lib/esm/geometry3d/PolylineOps.js +5 -4
  374. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  375. package/lib/esm/geometry3d/Range.d.ts +18 -10
  376. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  377. package/lib/esm/geometry3d/Range.js +32 -10
  378. package/lib/esm/geometry3d/Range.js.map +1 -1
  379. package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
  380. package/lib/esm/geometry3d/Ray2d.js +0 -1
  381. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  382. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  383. package/lib/esm/geometry3d/Ray3d.js +11 -23
  384. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  385. package/lib/esm/geometry3d/Transform.d.ts +21 -2
  386. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  387. package/lib/esm/geometry3d/Transform.js +32 -13
  388. package/lib/esm/geometry3d/Transform.js.map +1 -1
  389. package/lib/esm/geometry4d/Point4d.d.ts +8 -5
  390. package/lib/esm/geometry4d/Point4d.d.ts.map +1 -1
  391. package/lib/esm/geometry4d/Point4d.js +27 -16
  392. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  393. package/lib/esm/numerics/BezierPolynomials.d.ts +2 -0
  394. package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
  395. package/lib/esm/numerics/BezierPolynomials.js +11 -0
  396. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  397. package/lib/esm/numerics/SmallSystem.d.ts +77 -36
  398. package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
  399. package/lib/esm/numerics/SmallSystem.js +129 -73
  400. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  401. package/lib/esm/polyface/FacetOrientation.d.ts +1 -1
  402. package/lib/esm/polyface/FacetOrientation.js +1 -1
  403. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  404. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts +55 -40
  405. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  406. package/lib/esm/polyface/IndexedEdgeMatcher.js +83 -75
  407. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  408. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  409. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  410. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +47 -38
  411. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  412. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  413. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  414. package/lib/esm/polyface/IndexedPolyfaceWalker.js +47 -32
  415. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  416. package/lib/esm/polyface/Polyface.d.ts +19 -5
  417. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  418. package/lib/esm/polyface/Polyface.js +18 -2
  419. package/lib/esm/polyface/Polyface.js.map +1 -1
  420. package/lib/esm/polyface/PolyfaceBuilder.d.ts +1 -1
  421. package/lib/esm/polyface/PolyfaceBuilder.js +3 -3
  422. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  423. package/lib/esm/polyface/PolyfaceClip.d.ts +19 -18
  424. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  425. package/lib/esm/polyface/PolyfaceClip.js +39 -42
  426. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  427. package/lib/esm/polyface/PolyfaceData.d.ts +1 -1
  428. package/lib/esm/polyface/PolyfaceData.js +1 -1
  429. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  430. package/lib/esm/polyface/PolyfaceQuery.d.ts +119 -78
  431. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  432. package/lib/esm/polyface/PolyfaceQuery.js +316 -232
  433. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  434. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  435. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  436. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +3 -3
  437. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  438. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  439. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  440. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  441. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  442. package/lib/esm/serialization/GeometrySamples.d.ts +1 -1
  443. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  444. package/lib/esm/serialization/GeometrySamples.js +3 -3
  445. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  446. package/lib/esm/serialization/IModelJsonSchema.d.ts +3 -3
  447. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  448. package/lib/esm/solid/LinearSweep.d.ts +2 -3
  449. package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
  450. package/lib/esm/solid/LinearSweep.js +2 -3
  451. package/lib/esm/solid/LinearSweep.js.map +1 -1
  452. package/lib/esm/solid/RotationalSweep.d.ts +2 -2
  453. package/lib/esm/solid/RotationalSweep.js +2 -2
  454. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  455. package/lib/esm/topology/ChainMerge.d.ts +1 -1
  456. package/lib/esm/topology/ChainMerge.js +1 -1
  457. package/lib/esm/topology/ChainMerge.js.map +1 -1
  458. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +1 -0
  459. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  460. package/lib/esm/topology/HalfEdgeGraphSearch.js +1 -0
  461. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  462. package/lib/esm/topology/Merging.d.ts +0 -1
  463. package/lib/esm/topology/Merging.d.ts.map +1 -1
  464. package/lib/esm/topology/Merging.js +49 -46
  465. package/lib/esm/topology/Merging.js.map +1 -1
  466. package/lib/esm/topology/Triangulation.d.ts +9 -14
  467. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  468. package/lib/esm/topology/Triangulation.js +29 -22
  469. package/lib/esm/topology/Triangulation.js.map +1 -1
  470. package/package.json +3 -3
@@ -12,7 +12,6 @@ const core_bentley_1 = require("@itwin/core-bentley");
12
12
  const LineSegment3d_1 = require("../curve/LineSegment3d");
13
13
  const Geometry_1 = require("../Geometry");
14
14
  const Angle_1 = require("../geometry3d/Angle");
15
- const Point2dVector2d_1 = require("../geometry3d/Point2dVector2d");
16
15
  const Range_1 = require("../geometry3d/Range");
17
16
  const ClusterableArray_1 = require("../numerics/ClusterableArray");
18
17
  const SmallSystem_1 = require("../numerics/SmallSystem");
@@ -20,6 +19,7 @@ const Graph_1 = require("./Graph");
20
19
  const HalfEdgePriorityQueue_1 = require("./HalfEdgePriorityQueue");
21
20
  const RegularizeFace_1 = require("./RegularizeFace");
22
21
  const Triangulation_1 = require("./Triangulation");
22
+ // cspell:word XYUV
23
23
  class GraphSplitData {
24
24
  numUpEdge = 0;
25
25
  numIntersectionTest = 0;
@@ -465,35 +465,40 @@ class HalfEdgeGraphMerge {
465
465
  }
466
466
  return sweepHeap;
467
467
  }
468
- static snapFractionToNode(xy, fraction, node, nodeFraction) {
469
- if (Geometry_1.Geometry.isSameCoordinate(xy.x, node.x) && Geometry_1.Geometry.isSameCoordinate(xy.y, node.y))
470
- return nodeFraction;
471
- return fraction;
472
- }
473
- static computeIntersectionFractionsOnEdges(nodeA0, nodeB0, fractions, pointA, pointB) {
468
+ static computeIntersectionFractionsOnEdges(nodeA0, nodeB0, tol = Geometry_1.Geometry.smallMetricDistance) {
474
469
  const nodeA1 = nodeA0.faceSuccessor;
475
- const ax0 = nodeA0.x;
476
- const ay0 = nodeA0.y;
477
- const ux = nodeA1.x - ax0;
478
- const uy = nodeA1.y - ay0;
470
+ const aDir = { x: nodeA1.x - nodeA0.x, y: nodeA1.y - nodeA0.y };
479
471
  const nodeB1 = nodeB0.faceSuccessor;
480
- const bx0 = nodeB0.x;
481
- const by0 = nodeB0.y;
482
- const vx = nodeB1.x - bx0;
483
- const vy = nodeB1.y - by0;
484
- // cspell:word lineSegmentXYUVTransverseIntersectionUnbounded
485
- if (SmallSystem_1.SmallSystem.lineSegmentXYUVTransverseIntersectionUnbounded(ax0, ay0, ux, uy, bx0, by0, vx, vy, fractions)) {
486
- pointA.x = ax0 + fractions.x * ux;
487
- pointA.y = ay0 + fractions.x * uy;
488
- pointB.x = bx0 + fractions.y * vx;
489
- pointB.y = by0 + fractions.y * vy;
490
- fractions.x = this.snapFractionToNode(pointA, fractions.x, nodeA0, 0.0);
491
- fractions.x = this.snapFractionToNode(pointA, fractions.x, nodeA1, 1.0);
492
- fractions.y = this.snapFractionToNode(pointB, fractions.y, nodeB0, 0.0);
493
- fractions.y = this.snapFractionToNode(pointB, fractions.y, nodeB1, 1.0);
494
- return Geometry_1.Geometry.isIn01(fractions.x) && Geometry_1.Geometry.isIn01(fractions.y);
472
+ const bDir = { x: nodeB1.x - nodeB0.x, y: nodeB1.y - nodeB0.y };
473
+ let fractions = SmallSystem_1.SmallSystem.lineSegmentXYUVIntersectionUnbounded(nodeA0, aDir, nodeB0, bDir, tol);
474
+ if (fractions) {
475
+ const snapFractionToSegment = (fraction, segStart, segEnd) => {
476
+ const x = Geometry_1.Geometry.interpolate(segStart.x, fraction, segEnd.x);
477
+ const y = Geometry_1.Geometry.interpolate(segStart.y, fraction, segEnd.y);
478
+ if (Geometry_1.Geometry.isSameCoordinateXY(x, y, segStart.x, segStart.y, tol))
479
+ return 0.0;
480
+ if (Geometry_1.Geometry.isSameCoordinateXY(x, y, segEnd.x, segEnd.y, tol))
481
+ return 1.0;
482
+ return fraction;
483
+ };
484
+ fractions.f0.x = snapFractionToSegment(fractions.f0.x, nodeA0, nodeA1);
485
+ fractions.f0.y = snapFractionToSegment(fractions.f0.y, nodeB0, nodeB1);
486
+ if (fractions.f1) {
487
+ fractions.f1.x = snapFractionToSegment(fractions.f1.x, nodeA0, nodeA1);
488
+ fractions.f1.y = snapFractionToSegment(fractions.f1.y, nodeB0, nodeB1);
489
+ }
490
+ if (fractions.f1 && !(Geometry_1.Geometry.isIn01(fractions.f1.x) && Geometry_1.Geometry.isIn01(fractions.f1.y)))
491
+ fractions.f1 = undefined; // overlap ends beyond a segment; downgrade to simple intersection
492
+ if (!(Geometry_1.Geometry.isIn01(fractions.f0.x) && Geometry_1.Geometry.isIn01(fractions.f0.y))) {
493
+ if (fractions.f1) {
494
+ fractions.f0 = fractions.f1; // overlap starts beyond a segment; downgrade to simple intersection
495
+ fractions.f1 = undefined;
496
+ }
497
+ else
498
+ fractions = undefined; // intersection/overlap is outside both segments
499
+ }
495
500
  }
496
- return false;
501
+ return fractions;
497
502
  }
498
503
  /**
499
504
  * Split edges at intersections.
@@ -507,39 +512,37 @@ class HalfEdgeGraphMerge {
507
512
  const smallFraction = 1.0e-8;
508
513
  const largeFraction = 1.0 - smallFraction;
509
514
  let i;
510
- const fractions = Point2dVector2d_1.Vector2d.create();
511
- const pointA = Point2dVector2d_1.Point2d.create();
512
- const pointB = Point2dVector2d_1.Point2d.create();
513
515
  let nodeB0;
514
- const popTolerance = Geometry_1.Geometry.smallMetricDistance;
516
+ const distTol = Geometry_1.Geometry.smallMetricDistance;
515
517
  while (undefined !== (nodeA0 = sweepHeap.priorityQueue.pop())) {
516
518
  data.numUpEdge++;
517
519
  const n0 = sweepHeap.activeEdges.length;
518
- sweepHeap.removeArrayMembersWithY1Below(nodeA0.y - popTolerance);
520
+ sweepHeap.removeArrayMembersWithY1Below(nodeA0.y - distTol);
519
521
  data.numPopOut += n0 - sweepHeap.activeEdges.length;
520
522
  for (i = 0; i < sweepHeap.activeEdges.length; i++) {
521
523
  nodeB0 = sweepHeap.activeEdges[i];
522
524
  nodeB1 = nodeB0.faceSuccessor;
523
- // const nodeB1 = nodeB0.faceSuccessor;
524
- if (Geometry_1.Geometry.isSameCoordinateXY(nodeA0.x, nodeA0.y, nodeB0.x, nodeB0.y)) {
525
+ if (Geometry_1.Geometry.isSameCoordinateXY(nodeA0.x, nodeA0.y, nodeB0.x, nodeB0.y, distTol)) {
525
526
  data.numA0B0++;
526
527
  }
527
- else if (Geometry_1.Geometry.isSameCoordinateXY(nodeB1.x, nodeB1.y, nodeA0.x, nodeA0.y)) {
528
+ else if (Geometry_1.Geometry.isSameCoordinateXY(nodeB1.x, nodeB1.y, nodeA0.x, nodeA0.y, distTol)) {
528
529
  data.numA0B1++;
529
530
  }
530
531
  else {
531
532
  data.numIntersectionTest++;
532
- if (this.computeIntersectionFractionsOnEdges(nodeA0, nodeB0, fractions, pointA, pointB)) {
533
- if (fractions.x > smallFraction && fractions.x < largeFraction) {
534
- const nodeC0 = graph.splitEdgeAtFraction(nodeA0, fractions.x);
535
- sweepHeap.priorityQueue.push(nodeC0); // The upper portion will be reviewed as a nodeA0 later !!!
536
- data.numSplit++;
537
- }
538
- if (fractions.y > smallFraction && fractions.y < largeFraction) {
539
- const nodeD0 = graph.splitEdgeAtFraction(nodeB0, fractions.y);
540
- sweepHeap.priorityQueue.push(nodeD0); // The upper portion will be reviewed as a nodeA0 later !!!
541
- data.numSplit++;
542
- }
533
+ const fractions = this.computeIntersectionFractionsOnEdges(nodeA0, nodeB0, distTol);
534
+ if (fractions) {
535
+ const splitAndPush = (node, fraction) => {
536
+ if (fraction !== undefined && fraction > smallFraction && fraction < largeFraction) {
537
+ const newNode = graph.splitEdgeAtFraction(node, fraction);
538
+ sweepHeap.priorityQueue.push(newNode); // will be popped as a nodeA0 later
539
+ data.numSplit++;
540
+ }
541
+ };
542
+ splitAndPush(nodeA0, fractions.f0.x);
543
+ splitAndPush(nodeA0, fractions.f1?.x);
544
+ splitAndPush(nodeB0, fractions.f0.y);
545
+ splitAndPush(nodeB0, fractions.f1?.y);
543
546
  // existing nodeA0 and its shortened edge remain for further intersections
544
547
  }
545
548
  }
@@ -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 { Point2d, Vector2d } from \"../geometry3d/Point2dVector2d\";\nimport { Range3d } from \"../geometry3d/Range\";\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\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 private static snapFractionToNode(xy: Point2d, fraction: number, node: HalfEdge, nodeFraction: number): number {\n if (Geometry.isSameCoordinate(xy.x, node.x) && Geometry.isSameCoordinate(xy.y, node.y))\n return nodeFraction;\n return fraction;\n }\n private static computeIntersectionFractionsOnEdges(nodeA0: HalfEdge, nodeB0: HalfEdge, fractions: Vector2d, pointA: Point2d, pointB: Point2d): boolean {\n const nodeA1 = nodeA0.faceSuccessor;\n const ax0 = nodeA0.x;\n const ay0 = nodeA0.y;\n const ux = nodeA1.x - ax0;\n const uy = nodeA1.y - ay0;\n const nodeB1 = nodeB0.faceSuccessor;\n const bx0 = nodeB0.x;\n const by0 = nodeB0.y;\n const vx = nodeB1.x - bx0;\n const vy = nodeB1.y - by0;\n // cspell:word lineSegmentXYUVTransverseIntersectionUnbounded\n if (SmallSystem.lineSegmentXYUVTransverseIntersectionUnbounded(ax0, ay0, ux, uy,\n bx0, by0, vx, vy, fractions)) {\n pointA.x = ax0 + fractions.x * ux;\n pointA.y = ay0 + fractions.x * uy;\n pointB.x = bx0 + fractions.y * vx;\n pointB.y = by0 + fractions.y * vy;\n fractions.x = this.snapFractionToNode(pointA, fractions.x, nodeA0, 0.0);\n fractions.x = this.snapFractionToNode(pointA, fractions.x, nodeA1, 1.0);\n fractions.y = this.snapFractionToNode(pointB, fractions.y, nodeB0, 0.0);\n fractions.y = this.snapFractionToNode(pointB, fractions.y, nodeB1, 1.0);\n return Geometry.isIn01(fractions.x) && Geometry.isIn01(fractions.y);\n }\n return false;\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 const fractions = Vector2d.create();\n const pointA = Point2d.create();\n const pointB = Point2d.create();\n let nodeB0;\n const popTolerance = Geometry.smallMetricDistance;\n while (undefined !== (nodeA0 = sweepHeap.priorityQueue.pop())) {\n data.numUpEdge++;\n const n0 = sweepHeap.activeEdges.length;\n sweepHeap.removeArrayMembersWithY1Below(nodeA0.y - popTolerance);\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 // const nodeB1 = nodeB0.faceSuccessor;\n if (Geometry.isSameCoordinateXY(nodeA0.x, nodeA0.y, nodeB0.x, nodeB0.y)) {\n data.numA0B0++;\n } else if (Geometry.isSameCoordinateXY(nodeB1.x, nodeB1.y, nodeA0.x, nodeA0.y)) {\n data.numA0B1++;\n } else {\n data.numIntersectionTest++;\n if (this.computeIntersectionFractionsOnEdges(nodeA0, nodeB0, fractions, pointA, pointB)) {\n if (fractions.x > smallFraction && fractions.x < largeFraction) {\n const nodeC0 = graph.splitEdgeAtFraction(nodeA0, fractions.x);\n sweepHeap.priorityQueue.push(nodeC0); // The upper portion will be reviewed as a nodeA0 later !!!\n data.numSplit++;\n }\n if (fractions.y > smallFraction && fractions.y < largeFraction) {\n const nodeD0 = graph.splitEdgeAtFraction(nodeB0, fractions.y);\n sweepHeap.priorityQueue.push(nodeD0); // The upper portion will be reviewed as a nodeA0 later !!!\n data.numSplit++;\n }\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 { 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"]}
@@ -15,20 +15,15 @@ export declare class Triangulator {
15
15
  */
16
16
  private static flipEdgeBetweenTriangles;
17
17
  /**
18
- * * nodeA is a given node
19
- * * nodeA1 is its nodeA.faceSuccessor
20
- * * nodeA2 is nodeA1.faceSuccessor, i.e. 3rd node of triangle A
21
- * * nodeB is nodeA.edgeMate, i.e. a node in the "other" triangle at nodeA's edge
22
- * * nodeB1 is nodeB.faceSuccessor
23
- * * nodeB2 is nodeB1.faceSuccessor, i.e the 3rd node of triangle B
24
- * Construct (as simple doubles, to avoid object creation) xy vectors from:
25
- * * (ux,uy): nodeA to nodeA1, i.e. the shared edge
26
- * * (vx,vy): nodeA to nodeA2,
27
- * * (wx,wy): nodeA to nodeB2
28
- * * this determinant is positive if nodeA is "in the circle" of nodeB2, nodeA1, nodeA2
29
- * * Return true if clearly positive
30
- * * Return false if clearly negative or almost zero.
31
- * @param nodeA node on the diagonal edge of candidate for edge flip.
18
+ * Given a node in triangle A on the edge shared by triangle B, test whether the far vertex of B lies inside the circumcircle of A.
19
+ * @param nodeA node on the shared edge between triangles A and B.
20
+ * @return The following are equivalent:
21
+ * * return true
22
+ * * the computed determinant is strongly positive (greater than epsilon)
23
+ * * the far vertex of B lies strictly inside the circumcircle of A
24
+ * * the quad AB fails the Delaunay condition
25
+ * * the quad CD obtained from AB by switching to the other diagonal satisfies the Delaunay condition
26
+ * * to satisfy Delaunay, the caller should flip the diagonal of AB (obtaining CD)
32
27
  */
33
28
  static computeCircumcircleDeterminantIsStrongPositive(nodeA: HalfEdge): boolean;
34
29
  /**
@@ -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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"}
@@ -47,29 +47,36 @@ class Triangulator {
47
47
  c.z = f.z;
48
48
  }
49
49
  /**
50
- * * nodeA is a given node
51
- * * nodeA1 is its nodeA.faceSuccessor
52
- * * nodeA2 is nodeA1.faceSuccessor, i.e. 3rd node of triangle A
53
- * * nodeB is nodeA.edgeMate, i.e. a node in the "other" triangle at nodeA's edge
54
- * * nodeB1 is nodeB.faceSuccessor
55
- * * nodeB2 is nodeB1.faceSuccessor, i.e the 3rd node of triangle B
56
- * Construct (as simple doubles, to avoid object creation) xy vectors from:
57
- * * (ux,uy): nodeA to nodeA1, i.e. the shared edge
58
- * * (vx,vy): nodeA to nodeA2,
59
- * * (wx,wy): nodeA to nodeB2
60
- * * this determinant is positive if nodeA is "in the circle" of nodeB2, nodeA1, nodeA2
61
- * * Return true if clearly positive
62
- * * Return false if clearly negative or almost zero.
63
- * @param nodeA node on the diagonal edge of candidate for edge flip.
50
+ * Given a node in triangle A on the edge shared by triangle B, test whether the far vertex of B lies inside the circumcircle of A.
51
+ * @param nodeA node on the shared edge between triangles A and B.
52
+ * @return The following are equivalent:
53
+ * * return true
54
+ * * the computed determinant is strongly positive (greater than epsilon)
55
+ * * the far vertex of B lies strictly inside the circumcircle of A
56
+ * * the quad AB fails the Delaunay condition
57
+ * * the quad CD obtained from AB by switching to the other diagonal satisfies the Delaunay condition
58
+ * * to satisfy Delaunay, the caller should flip the diagonal of AB (obtaining CD)
64
59
  */
65
60
  static computeCircumcircleDeterminantIsStrongPositive(nodeA) {
66
- // Assume triangle A1,A2,B2 is ccw.
67
- // Shift the triangle to the origin (by negated A coords).
68
- // The Delaunay condition is computed by projecting the origin and the shifted triangle
69
- // points up to the paraboloid z = x*x + y*y. Due to the radially symmetric convexity of
70
- // this surface and the ccw orientation of this triangle, "A is inside the circumcircle of triangle A1,A2,B2"
71
- // is equivalent to "the volume of the parallelepiped formed by the projected points is
72
- // negative, as computed by the triple product."
61
+ // Confusingly enough, what we are actually doing here is testing the quad CD.
62
+ // * CD satisfies the Delaunay condition if and only if AB does not.
63
+ // * So let AB be convex, with CCW triangles (A,A1,A2) and (B,B1,B2) where A and B are edge mates.
64
+ // Then CD consists of two CCW triangles that share an edge between the vertices at A2 and B2.
65
+ // We only have to test one of the two triangles of CD---whether its circumcircle contains the far vertex.
66
+ // By a beautiful theorem (Corollary 5.7.1 in O'Rourke, Computational Geometry in C, 2nd ed.), the following
67
+ // are equivalent based on the radial symmetry and convexity of the paraboloid P defined by z = x*x + y*y,
68
+ // and the CCW triangle orientation:
69
+ // * A is outside the circumcircle of the CCW triangle with vertices (A1,A2,B2).
70
+ // * The volume of the tetrahedron (determinant) formed by the projections of the quad points to P is negative.
71
+ // * The volume of the parallelepiped (triple product) formed by vectors u=A1-A, v=A2-A, w=B2-A projected to P is negative.
72
+ // * The triple product u.(v x w) is negative.
73
+ // * The triple product w.(v x u) is positive <-- this is what we compute below.
74
+ // * The quad CD satisfies the Delaunay condition.
75
+ // * The quad AB fails the Delaunay condition.
76
+ // * Return true.
77
+ // * When AB is non-convex, CD is convex and consists of a large CCW triangle that contains the other CW triangle.
78
+ // This containment causes the triple product to be positive, which implies CD fails (and thus AB satisfies)
79
+ // the Delaunay condition, so this method returns false.
73
80
  const nodeA1 = nodeA.faceSuccessor;
74
81
  const nodeA2 = nodeA1.faceSuccessor;
75
82
  if (nodeA2.faceSuccessor !== nodeA)
@@ -168,7 +175,7 @@ class Triangulator {
168
175
  context.insertAndRetriangulate(p, zRule);
169
176
  numInsert++; // eslint-disable-line @typescript-eslint/no-unused-vars
170
177
  }
171
- if (face0.countEdgesAroundFace() > 3) // all vertices are on the hull (or duplicates of them)
178
+ if (face0.countEdgesAroundFace() > 3) // no strictly interior vertices to split the hull polygon, so triangulate it
172
179
  return Triangulator.createTriangulatedGraphFromSingleLoop(hull);
173
180
  return graph;
174
181
  }