@itwin/core-geometry 4.2.0-dev.9 → 4.3.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/lib/cjs/Geometry.d.ts +4 -4
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +2 -2
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/clipping/AlternatingConvexClipTree.d.ts +4 -3
  7. package/lib/cjs/clipping/AlternatingConvexClipTree.d.ts.map +1 -1
  8. package/lib/cjs/clipping/AlternatingConvexClipTree.js +1 -1
  9. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  10. package/lib/cjs/clipping/BooleanClipNode.d.ts +4 -3
  11. package/lib/cjs/clipping/BooleanClipNode.d.ts.map +1 -1
  12. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  13. package/lib/cjs/clipping/ClipPlane.d.ts +2 -1
  14. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  15. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  16. package/lib/cjs/clipping/ClipUtils.d.ts +17 -11
  17. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  18. package/lib/cjs/clipping/ClipUtils.js +14 -8
  19. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  20. package/lib/cjs/clipping/ClipVector.d.ts +6 -5
  21. package/lib/cjs/clipping/ClipVector.d.ts.map +1 -1
  22. package/lib/cjs/clipping/ClipVector.js +1 -1
  23. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  24. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +3 -2
  25. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  26. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  27. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -1
  28. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  29. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  30. package/lib/cjs/core-geometry.d.ts +1 -3
  31. package/lib/cjs/core-geometry.d.ts.map +1 -1
  32. package/lib/cjs/core-geometry.js +1 -3
  33. package/lib/cjs/core-geometry.js.map +1 -1
  34. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  35. package/lib/cjs/curve/Arc3d.js +4 -4
  36. package/lib/cjs/curve/Arc3d.js.map +1 -1
  37. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +93 -91
  38. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  39. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +171 -152
  40. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  41. package/lib/cjs/curve/CurveCollection.d.ts +19 -19
  42. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  43. package/lib/cjs/curve/CurveCollection.js +20 -22
  44. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  45. package/lib/cjs/curve/CurveCurve.d.ts +47 -30
  46. package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
  47. package/lib/cjs/curve/CurveCurve.js +81 -46
  48. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  49. package/lib/cjs/curve/CurveFactory.d.ts +1 -1
  50. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  51. package/lib/cjs/curve/CurveLocationDetail.d.ts +17 -5
  52. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  53. package/lib/cjs/curve/CurveLocationDetail.js +14 -2
  54. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  55. package/lib/cjs/curve/CurveOps.d.ts +1 -1
  56. package/lib/cjs/curve/CurveOps.js.map +1 -1
  57. package/lib/cjs/curve/CurvePrimitive.d.ts +1 -2
  58. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  59. package/lib/cjs/curve/CurvePrimitive.js +2 -2
  60. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  61. package/lib/cjs/curve/CurveProcessor.d.ts +1 -1
  62. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  63. package/lib/cjs/curve/{CurveChain.d.ts → CurveTypes.d.ts} +6 -6
  64. package/lib/cjs/curve/CurveTypes.d.ts.map +1 -0
  65. package/lib/cjs/curve/{CurveChain.js → CurveTypes.js} +1 -1
  66. package/lib/cjs/curve/CurveTypes.js.map +1 -0
  67. package/lib/cjs/curve/CurveWireMomentsXYZ.d.ts +1 -1
  68. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  69. package/lib/cjs/curve/ParityRegion.d.ts +3 -3
  70. package/lib/cjs/curve/ParityRegion.d.ts.map +1 -1
  71. package/lib/cjs/curve/ParityRegion.js +2 -2
  72. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  73. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts +3 -2
  74. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  75. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +2 -2
  76. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  77. package/lib/cjs/curve/Query/CurveSplitContext.d.ts +1 -1
  78. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  79. package/lib/cjs/curve/Query/CylindricalRange.d.ts +1 -1
  80. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  81. package/lib/cjs/curve/Query/InOutTests.d.ts +1 -1
  82. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  83. package/lib/cjs/curve/Query/StrokeCountChain.d.ts +1 -1
  84. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  85. package/lib/cjs/curve/RegionOps.d.ts +54 -5
  86. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  87. package/lib/cjs/curve/RegionOps.js +154 -3
  88. package/lib/cjs/curve/RegionOps.js.map +1 -1
  89. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +1 -1
  90. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  91. package/lib/cjs/curve/StrokeOptions.d.ts +20 -11
  92. package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
  93. package/lib/cjs/curve/StrokeOptions.js +22 -11
  94. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  95. package/lib/cjs/curve/UnionRegion.d.ts +3 -3
  96. package/lib/cjs/curve/UnionRegion.d.ts.map +1 -1
  97. package/lib/cjs/curve/UnionRegion.js +2 -2
  98. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  99. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
  100. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  101. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +2 -2
  102. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  103. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +233 -0
  104. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -0
  105. package/lib/cjs/curve/{CurveCurveCloseApproachXY.js → internalContexts/CurveCurveCloseApproachXY.js} +299 -202
  106. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -0
  107. package/lib/{esm/curve → cjs/curve/internalContexts}/CurveCurveIntersectXY.d.ts +45 -51
  108. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -0
  109. package/lib/cjs/curve/{CurveCurveIntersectXY.js → internalContexts/CurveCurveIntersectXY.js} +104 -115
  110. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -0
  111. package/lib/cjs/curve/{CurveCurveIntersectXYZ.d.ts → internalContexts/CurveCurveIntersectXYZ.d.ts} +18 -18
  112. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -0
  113. package/lib/cjs/curve/{CurveCurveIntersectXYZ.js → internalContexts/CurveCurveIntersectXYZ.js} +134 -108
  114. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -0
  115. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.d.ts +2 -2
  116. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.d.ts.map +1 -1
  117. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js +9 -5
  118. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  119. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +1 -1
  120. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  121. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts +1 -0
  122. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  123. package/lib/cjs/geometry3d/BarycentricTriangle.js +1 -0
  124. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  125. package/lib/cjs/geometry3d/FrameBuilder.d.ts +28 -11
  126. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  127. package/lib/cjs/geometry3d/FrameBuilder.js +57 -45
  128. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  129. package/lib/cjs/geometry3d/GeometryHandler.d.ts +15 -26
  130. package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
  131. package/lib/cjs/geometry3d/GeometryHandler.js +23 -32
  132. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  133. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +0 -8
  134. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  135. package/lib/cjs/geometry3d/GrowableXYZArray.js +0 -16
  136. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  137. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +4 -4
  138. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  139. package/lib/cjs/geometry3d/IndexedXYZCollection.js +12 -0
  140. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  141. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  142. package/lib/cjs/geometry3d/Matrix3d.js +3 -6
  143. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  144. package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  145. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  146. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -2
  147. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  148. package/lib/cjs/geometry3d/Point3dVector3d.js +0 -1
  149. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  150. package/lib/cjs/geometry3d/PolygonOps.d.ts +2 -2
  151. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  152. package/lib/cjs/geometry3d/PolygonOps.js +2 -3
  153. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  154. package/lib/cjs/geometry3d/Range.d.ts +1 -1
  155. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  156. package/lib/cjs/geometry3d/Range.js +1 -1
  157. package/lib/cjs/geometry3d/Range.js.map +1 -1
  158. package/lib/cjs/geometry3d/Ray3d.d.ts +3 -1
  159. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  160. package/lib/cjs/geometry3d/Ray3d.js +4 -3
  161. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  162. package/lib/cjs/geometry3d/ReusableObjectCache.d.ts +2 -1
  163. package/lib/cjs/geometry3d/ReusableObjectCache.d.ts.map +1 -1
  164. package/lib/cjs/geometry3d/ReusableObjectCache.js +1 -1
  165. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  166. package/lib/cjs/geometry3d/SortablePolygon.d.ts +1 -1
  167. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  168. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  169. package/lib/cjs/geometry3d/Transform.js +4 -6
  170. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  171. package/lib/cjs/geometry3d/YawPitchRollAngles.js +1 -1
  172. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  173. package/lib/cjs/geometry4d/Map4d.d.ts +14 -8
  174. package/lib/cjs/geometry4d/Map4d.d.ts.map +1 -1
  175. package/lib/cjs/geometry4d/Map4d.js +38 -16
  176. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  177. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  178. package/lib/cjs/geometry4d/Matrix4d.js +4 -2
  179. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  180. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  181. package/lib/cjs/numerics/Polynomials.d.ts +2 -2
  182. package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
  183. package/lib/cjs/numerics/Polynomials.js +2 -2
  184. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  185. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +18 -6
  186. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  187. package/lib/cjs/polyface/PolyfaceBuilder.js +55 -25
  188. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  189. package/lib/cjs/polyface/PolyfaceClip.d.ts +16 -7
  190. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  191. package/lib/cjs/polyface/PolyfaceClip.js +38 -7
  192. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  193. package/lib/cjs/polyface/PolyfaceData.d.ts +5 -39
  194. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  195. package/lib/cjs/polyface/PolyfaceData.js +7 -41
  196. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  197. package/lib/cjs/polyface/PolyfaceQuery.d.ts +10 -8
  198. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  199. package/lib/cjs/polyface/PolyfaceQuery.js +64 -18
  200. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  201. package/lib/cjs/serialization/GeometrySamples.d.ts +6 -0
  202. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  203. package/lib/cjs/serialization/GeometrySamples.js +68 -2
  204. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  205. package/lib/cjs/solid/LinearSweep.d.ts +1 -1
  206. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  207. package/lib/cjs/solid/RotationalSweep.d.ts +1 -1
  208. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  209. package/lib/cjs/solid/RuledSweep.d.ts +1 -1
  210. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  211. package/lib/cjs/solid/SweepContour.d.ts +35 -26
  212. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  213. package/lib/cjs/solid/SweepContour.js +84 -100
  214. package/lib/cjs/solid/SweepContour.js.map +1 -1
  215. package/lib/cjs/topology/Graph.d.ts +29 -11
  216. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  217. package/lib/cjs/topology/Graph.js +45 -26
  218. package/lib/cjs/topology/Graph.js.map +1 -1
  219. package/lib/cjs/topology/HalfEdgeMarkSet.d.ts +2 -2
  220. package/lib/cjs/topology/HalfEdgeMarkSet.d.ts.map +1 -1
  221. package/lib/cjs/topology/HalfEdgeMarkSet.js +4 -4
  222. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  223. package/lib/cjs/topology/Merging.d.ts +3 -0
  224. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  225. package/lib/cjs/topology/Merging.js +19 -5
  226. package/lib/cjs/topology/Merging.js.map +1 -1
  227. package/lib/cjs/topology/Triangulation.d.ts +15 -7
  228. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  229. package/lib/cjs/topology/Triangulation.js +89 -47
  230. package/lib/cjs/topology/Triangulation.js.map +1 -1
  231. package/lib/esm/Geometry.d.ts +4 -4
  232. package/lib/esm/Geometry.d.ts.map +1 -1
  233. package/lib/esm/Geometry.js +2 -2
  234. package/lib/esm/Geometry.js.map +1 -1
  235. package/lib/esm/clipping/AlternatingConvexClipTree.d.ts +4 -3
  236. package/lib/esm/clipping/AlternatingConvexClipTree.d.ts.map +1 -1
  237. package/lib/esm/clipping/AlternatingConvexClipTree.js +1 -1
  238. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  239. package/lib/esm/clipping/BooleanClipNode.d.ts +4 -3
  240. package/lib/esm/clipping/BooleanClipNode.d.ts.map +1 -1
  241. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  242. package/lib/esm/clipping/ClipPlane.d.ts +2 -1
  243. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  244. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  245. package/lib/esm/clipping/ClipUtils.d.ts +17 -11
  246. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  247. package/lib/esm/clipping/ClipUtils.js +14 -8
  248. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  249. package/lib/esm/clipping/ClipVector.d.ts +6 -5
  250. package/lib/esm/clipping/ClipVector.d.ts.map +1 -1
  251. package/lib/esm/clipping/ClipVector.js +1 -1
  252. package/lib/esm/clipping/ClipVector.js.map +1 -1
  253. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +3 -2
  254. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  255. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  256. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -1
  257. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  258. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  259. package/lib/esm/core-geometry.d.ts +1 -3
  260. package/lib/esm/core-geometry.d.ts.map +1 -1
  261. package/lib/esm/core-geometry.js +1 -3
  262. package/lib/esm/core-geometry.js.map +1 -1
  263. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  264. package/lib/esm/curve/Arc3d.js +4 -4
  265. package/lib/esm/curve/Arc3d.js.map +1 -1
  266. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +93 -91
  267. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  268. package/lib/esm/curve/CurveChainWithDistanceIndex.js +171 -152
  269. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  270. package/lib/esm/curve/CurveCollection.d.ts +19 -19
  271. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  272. package/lib/esm/curve/CurveCollection.js +19 -20
  273. package/lib/esm/curve/CurveCollection.js.map +1 -1
  274. package/lib/esm/curve/CurveCurve.d.ts +47 -30
  275. package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
  276. package/lib/esm/curve/CurveCurve.js +81 -46
  277. package/lib/esm/curve/CurveCurve.js.map +1 -1
  278. package/lib/esm/curve/CurveFactory.d.ts +1 -1
  279. package/lib/esm/curve/CurveFactory.js.map +1 -1
  280. package/lib/esm/curve/CurveLocationDetail.d.ts +17 -5
  281. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  282. package/lib/esm/curve/CurveLocationDetail.js +12 -1
  283. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  284. package/lib/esm/curve/CurveOps.d.ts +1 -1
  285. package/lib/esm/curve/CurveOps.js.map +1 -1
  286. package/lib/esm/curve/CurvePrimitive.d.ts +1 -2
  287. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  288. package/lib/esm/curve/CurvePrimitive.js +2 -2
  289. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  290. package/lib/esm/curve/CurveProcessor.d.ts +1 -1
  291. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  292. package/lib/esm/curve/{CurveChain.d.ts → CurveTypes.d.ts} +6 -6
  293. package/lib/esm/curve/CurveTypes.d.ts.map +1 -0
  294. package/lib/esm/curve/{CurveChain.js → CurveTypes.js} +1 -1
  295. package/lib/esm/curve/CurveTypes.js.map +1 -0
  296. package/lib/esm/curve/CurveWireMomentsXYZ.d.ts +1 -1
  297. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  298. package/lib/esm/curve/ParityRegion.d.ts +3 -3
  299. package/lib/esm/curve/ParityRegion.d.ts.map +1 -1
  300. package/lib/esm/curve/ParityRegion.js +2 -2
  301. package/lib/esm/curve/ParityRegion.js.map +1 -1
  302. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts +3 -2
  303. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  304. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +1 -1
  305. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  306. package/lib/esm/curve/Query/CurveSplitContext.d.ts +1 -1
  307. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  308. package/lib/esm/curve/Query/CylindricalRange.d.ts +1 -1
  309. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  310. package/lib/esm/curve/Query/InOutTests.d.ts +1 -1
  311. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  312. package/lib/esm/curve/Query/StrokeCountChain.d.ts +1 -1
  313. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  314. package/lib/esm/curve/RegionOps.d.ts +54 -5
  315. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  316. package/lib/esm/curve/RegionOps.js +153 -3
  317. package/lib/esm/curve/RegionOps.js.map +1 -1
  318. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +1 -1
  319. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  320. package/lib/esm/curve/StrokeOptions.d.ts +20 -11
  321. package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
  322. package/lib/esm/curve/StrokeOptions.js +22 -11
  323. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  324. package/lib/esm/curve/UnionRegion.d.ts +3 -3
  325. package/lib/esm/curve/UnionRegion.d.ts.map +1 -1
  326. package/lib/esm/curve/UnionRegion.js +2 -2
  327. package/lib/esm/curve/UnionRegion.js.map +1 -1
  328. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +1 -1
  329. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  330. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +2 -2
  331. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  332. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +233 -0
  333. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -0
  334. package/lib/esm/curve/{CurveCurveCloseApproachXY.js → internalContexts/CurveCurveCloseApproachXY.js} +299 -202
  335. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -0
  336. package/lib/{cjs/curve → esm/curve/internalContexts}/CurveCurveIntersectXY.d.ts +45 -51
  337. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -0
  338. package/lib/esm/curve/{CurveCurveIntersectXY.js → internalContexts/CurveCurveIntersectXY.js} +103 -113
  339. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -0
  340. package/lib/esm/curve/{CurveCurveIntersectXYZ.d.ts → internalContexts/CurveCurveIntersectXYZ.d.ts} +18 -18
  341. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.d.ts.map +1 -0
  342. package/lib/esm/curve/{CurveCurveIntersectXYZ.js → internalContexts/CurveCurveIntersectXYZ.js} +134 -108
  343. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -0
  344. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.d.ts +2 -2
  345. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.d.ts.map +1 -1
  346. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js +9 -5
  347. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  348. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +1 -1
  349. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  350. package/lib/esm/geometry3d/BarycentricTriangle.d.ts +1 -0
  351. package/lib/esm/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  352. package/lib/esm/geometry3d/BarycentricTriangle.js +1 -0
  353. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  354. package/lib/esm/geometry3d/FrameBuilder.d.ts +28 -11
  355. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  356. package/lib/esm/geometry3d/FrameBuilder.js +57 -45
  357. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  358. package/lib/esm/geometry3d/GeometryHandler.d.ts +15 -26
  359. package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
  360. package/lib/esm/geometry3d/GeometryHandler.js +23 -32
  361. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  362. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +0 -8
  363. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  364. package/lib/esm/geometry3d/GrowableXYZArray.js +0 -16
  365. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  366. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +4 -4
  367. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  368. package/lib/esm/geometry3d/IndexedXYZCollection.js +12 -0
  369. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  370. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  371. package/lib/esm/geometry3d/Matrix3d.js +3 -6
  372. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  373. package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  374. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  375. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -2
  376. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  377. package/lib/esm/geometry3d/Point3dVector3d.js +0 -1
  378. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  379. package/lib/esm/geometry3d/PolygonOps.d.ts +2 -2
  380. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  381. package/lib/esm/geometry3d/PolygonOps.js +2 -3
  382. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  383. package/lib/esm/geometry3d/Range.d.ts +1 -1
  384. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  385. package/lib/esm/geometry3d/Range.js +1 -1
  386. package/lib/esm/geometry3d/Range.js.map +1 -1
  387. package/lib/esm/geometry3d/Ray3d.d.ts +3 -1
  388. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  389. package/lib/esm/geometry3d/Ray3d.js +4 -3
  390. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  391. package/lib/esm/geometry3d/ReusableObjectCache.d.ts +2 -1
  392. package/lib/esm/geometry3d/ReusableObjectCache.d.ts.map +1 -1
  393. package/lib/esm/geometry3d/ReusableObjectCache.js +1 -1
  394. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  395. package/lib/esm/geometry3d/SortablePolygon.d.ts +1 -1
  396. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  397. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  398. package/lib/esm/geometry3d/Transform.js +4 -6
  399. package/lib/esm/geometry3d/Transform.js.map +1 -1
  400. package/lib/esm/geometry3d/YawPitchRollAngles.js +1 -1
  401. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  402. package/lib/esm/geometry4d/Map4d.d.ts +14 -8
  403. package/lib/esm/geometry4d/Map4d.d.ts.map +1 -1
  404. package/lib/esm/geometry4d/Map4d.js +38 -16
  405. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  406. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  407. package/lib/esm/geometry4d/Matrix4d.js +4 -2
  408. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  409. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  410. package/lib/esm/numerics/Polynomials.d.ts +2 -2
  411. package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
  412. package/lib/esm/numerics/Polynomials.js +2 -2
  413. package/lib/esm/numerics/Polynomials.js.map +1 -1
  414. package/lib/esm/polyface/PolyfaceBuilder.d.ts +18 -6
  415. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  416. package/lib/esm/polyface/PolyfaceBuilder.js +55 -25
  417. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  418. package/lib/esm/polyface/PolyfaceClip.d.ts +16 -7
  419. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  420. package/lib/esm/polyface/PolyfaceClip.js +38 -7
  421. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  422. package/lib/esm/polyface/PolyfaceData.d.ts +5 -39
  423. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  424. package/lib/esm/polyface/PolyfaceData.js +7 -41
  425. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  426. package/lib/esm/polyface/PolyfaceQuery.d.ts +10 -8
  427. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  428. package/lib/esm/polyface/PolyfaceQuery.js +64 -18
  429. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  430. package/lib/esm/serialization/GeometrySamples.d.ts +6 -0
  431. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  432. package/lib/esm/serialization/GeometrySamples.js +68 -2
  433. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  434. package/lib/esm/solid/LinearSweep.d.ts +1 -1
  435. package/lib/esm/solid/LinearSweep.js.map +1 -1
  436. package/lib/esm/solid/RotationalSweep.d.ts +1 -1
  437. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  438. package/lib/esm/solid/RuledSweep.d.ts +1 -1
  439. package/lib/esm/solid/RuledSweep.js.map +1 -1
  440. package/lib/esm/solid/SweepContour.d.ts +35 -26
  441. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  442. package/lib/esm/solid/SweepContour.js +84 -100
  443. package/lib/esm/solid/SweepContour.js.map +1 -1
  444. package/lib/esm/topology/Graph.d.ts +29 -11
  445. package/lib/esm/topology/Graph.d.ts.map +1 -1
  446. package/lib/esm/topology/Graph.js +45 -26
  447. package/lib/esm/topology/Graph.js.map +1 -1
  448. package/lib/esm/topology/HalfEdgeMarkSet.d.ts +2 -2
  449. package/lib/esm/topology/HalfEdgeMarkSet.d.ts.map +1 -1
  450. package/lib/esm/topology/HalfEdgeMarkSet.js +2 -2
  451. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  452. package/lib/esm/topology/Merging.d.ts +3 -0
  453. package/lib/esm/topology/Merging.d.ts.map +1 -1
  454. package/lib/esm/topology/Merging.js +19 -5
  455. package/lib/esm/topology/Merging.js.map +1 -1
  456. package/lib/esm/topology/Triangulation.d.ts +15 -7
  457. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  458. package/lib/esm/topology/Triangulation.js +89 -47
  459. package/lib/esm/topology/Triangulation.js.map +1 -1
  460. package/package.json +4 -4
  461. package/lib/cjs/curve/CurveChain.d.ts.map +0 -1
  462. package/lib/cjs/curve/CurveChain.js.map +0 -1
  463. package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts +0 -175
  464. package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts.map +0 -1
  465. package/lib/cjs/curve/CurveCurveCloseApproachXY.js.map +0 -1
  466. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +0 -1
  467. package/lib/cjs/curve/CurveCurveIntersectXY.js.map +0 -1
  468. package/lib/cjs/curve/CurveCurveIntersectXYZ.d.ts.map +0 -1
  469. package/lib/cjs/curve/CurveCurveIntersectXYZ.js.map +0 -1
  470. package/lib/esm/curve/CurveChain.d.ts.map +0 -1
  471. package/lib/esm/curve/CurveChain.js.map +0 -1
  472. package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts +0 -175
  473. package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts.map +0 -1
  474. package/lib/esm/curve/CurveCurveCloseApproachXY.js.map +0 -1
  475. package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +0 -1
  476. package/lib/esm/curve/CurveCurveIntersectXY.js.map +0 -1
  477. package/lib/esm/curve/CurveCurveIntersectXYZ.d.ts.map +0 -1
  478. package/lib/esm/curve/CurveCurveIntersectXYZ.js.map +0 -1
@@ -178,7 +178,7 @@ class Triangulator {
178
178
  /**
179
179
  * * Only one outer loop permitted.
180
180
  * * Largest area loop is assumed outer.
181
- * @param loops an array of loops as GrowableXYZArray or XAndY[]
181
+ * @param loops an array of loops
182
182
  * @returns triangulated graph, or undefined if bad data.
183
183
  */
184
184
  static createTriangulatedGraphFromLoops(loops) {
@@ -252,12 +252,11 @@ class Triangulator {
252
252
  const graph = new HalfEdgeGraph();
253
253
  const startingNode = Triangulator.createFaceLoopFromCoordinates(graph, data, true, true);
254
254
  if (!startingNode || graph.countNodes() < 6)
255
- return graph;
256
- if (Triangulator.triangulateSingleFace(graph, startingNode)) {
257
- Triangulator.flipTriangles(graph);
258
- return graph;
259
- }
260
- return undefined;
255
+ return undefined;
256
+ if (!Triangulator.triangulateSingleFace(graph, startingNode))
257
+ return undefined;
258
+ Triangulator.flipTriangles(graph);
259
+ return graph;
261
260
  }
262
261
  /**
263
262
  * cautiously split the edge starting at baseNode.
@@ -285,40 +284,66 @@ class Triangulator {
285
284
  return graph.splitEdge(baseNode, x, y, z);
286
285
  if (Triangulator.isAlmostEqualXAndYXY(baseNode, x, y))
287
286
  return baseNode;
288
- if (Triangulator.isAlmostEqualXAndYXY(baseNode.faceSuccessor, x, y))
289
- return baseNode;
290
287
  return graph.splitEdge(baseNode, x, y, z);
291
288
  }
289
+ /** Return length of data without wraparound point(s), if present */
290
+ static getUnwrappedLength(data) {
291
+ let n = data.length;
292
+ let x0, y0, x1, y1;
293
+ while (n > 1) {
294
+ if (data instanceof IndexedXYZCollection) {
295
+ x0 = data.getXAtUncheckedPointIndex(0);
296
+ y0 = data.getYAtUncheckedPointIndex(0);
297
+ x1 = data.getXAtUncheckedPointIndex(n - 1);
298
+ y1 = data.getYAtUncheckedPointIndex(n - 1);
299
+ }
300
+ else if (Geometry.isArrayOfNumberArray(data, n, 2)) {
301
+ x0 = data[0][0];
302
+ y0 = data[0][1];
303
+ x1 = data[n - 1][0];
304
+ y1 = data[n - 1][1];
305
+ }
306
+ else {
307
+ x0 = data[0].x;
308
+ y0 = data[0].y;
309
+ x1 = data[n - 1].x;
310
+ y1 = data[n - 1].y;
311
+ }
312
+ if (Geometry.isAlmostEqualNumber(x0, x1) && Geometry.isAlmostEqualNumber(y0, y1))
313
+ --n;
314
+ else
315
+ break;
316
+ }
317
+ return n;
318
+ }
292
319
  /** Create a loop from coordinates.
293
320
  * * Return a pointer to any node on the loop.
294
321
  * * no masking or other markup is applied.
295
322
  */
296
323
  static directCreateFaceLoopFromCoordinates(graph, data) {
297
- // Add the starting nodes as the boundary, and apply initial masks to the primary edge and exteriors
324
+ const n = this.getUnwrappedLength(data); // open it up to allow starting at a bridge edge
298
325
  let baseNode;
299
326
  if (data instanceof IndexedXYZCollection) {
300
327
  const xyz = Point3d.create();
301
- for (let i = 0; i < data.length; i++) {
328
+ for (let i = 0; i < n; i++) {
302
329
  data.getPoint3dAtCheckedPointIndex(i, xyz);
303
330
  baseNode = Triangulator.interiorEdgeSplit(graph, baseNode, xyz);
304
331
  }
305
332
  }
306
333
  else {
307
- for (const xy of data) {
308
- baseNode = Triangulator.interiorEdgeSplit(graph, baseNode, xy);
309
- }
334
+ for (let i = 0; i < n; i++)
335
+ baseNode = Triangulator.interiorEdgeSplit(graph, baseNode, data[i]);
310
336
  }
311
337
  return baseNode;
312
338
  }
313
339
  /** Create chains from coordinates.
314
340
  * * Return array of pointers to base node of the chains.
315
- * * no masking or other markup is applied.
341
+ * * no masking or other markup is applied (save id).
316
342
  * @param graph New edges are built in this graph
317
343
  * @param data coordinate data
318
344
  * @param id id to attach to (both side of all) edges
319
345
  */
320
346
  static directCreateChainsFromCoordinates(graph, data, id = 0) {
321
- // Add the starting nodes as the boundary, and apply initial masks to the primary edge and exteriors
322
347
  const assembler = new AssembleXYZXYZChains(graph, id);
323
348
  VariantPointDataStream.streamXYZ(data, assembler);
324
349
  return assembler.claimSeeds();
@@ -476,15 +501,20 @@ class Triangulator {
476
501
  ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);
477
502
  return true;
478
503
  }
479
- // earcut does not support self intersections.
480
- // BUT .. maybe if we watch from the simplest case of next2 returning to pred it will catch some . . .
481
- // (no need to do flips -- we know it's already a triangle)
482
- // EDL Sept 2021 NO... coordinate test is fooled into early exit when large outer triangle has
483
- // edges going in from pred.
484
- // Hence add the around vertex test. But this is possibly vulnerable to a variant false positive ..
504
+ // The earcut algorithm does not support self intersections, however we do handle the re-entrant triangle
505
+ // case by pinching a bridge/hole into existence when vertices i and i+3 live in the same face loop, but not
506
+ // the same vertex loop. Earcut whittles larger faces down into triangles, so this is the only case needed.
485
507
  if (Geometry.isAlmostEqualXAndY(next2, pred) && !next2.findAroundVertex(pred)) {
486
- HalfEdge.pinch(pred, next2);
487
- ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);
508
+ const next3 = next2.faceSuccessor;
509
+ const hasBridgeEdgeOrHoleInside = this.nodeInTriangle(pred, ear, next, next3);
510
+ if (hasBridgeEdgeOrHoleInside) {
511
+ const nullOrHoleFace = next2.vertexPredecessor;
512
+ HalfEdge.pinch(pred.vertexSuccessor, nullOrHoleFace); // keep pred and next2 in their face loop
513
+ }
514
+ else {
515
+ HalfEdge.pinch(pred, next2); // pred and next2 split into different face loops
516
+ ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);
517
+ }
488
518
  ear = next2;
489
519
  continue;
490
520
  }
@@ -545,6 +575,15 @@ class Triangulator {
545
575
  Triangulator.sEnableDebugGraphCapture = value;
546
576
  Triangulator.sDebugGraph = undefined;
547
577
  }
578
+ /**
579
+ * Whether a and b are in same vertex loop, or at the same xy location.
580
+ * @internal
581
+ */
582
+ static findAroundOrAtVertex(a, b) {
583
+ if (a.findAroundVertex(b))
584
+ return true;
585
+ return Geometry.isAlmostEqualXAndY(a, b);
586
+ }
548
587
  /** Check whether a polygon node forms a valid ear with adjacent nodes */
549
588
  static isEar(ear) {
550
589
  const a = ear.facePredecessor;
@@ -574,31 +613,32 @@ class Triangulator {
574
613
  const q = p.faceSuccessor;
575
614
  Range2d.createXYXY(p.x, p.y, q.x, q.y, edgeRange);
576
615
  if (earRange.intersectsRange(edgeRange)) {
577
- // Does pq impinge on the triangle?
616
+ // Does pq impinge on the triangle abc?
578
617
  Range1d.createXX(zeroMinus, onePlus, edgeInterval);
579
618
  ClipUtilities.clipSegmentBelowPlanesXY(planes, p, q, edgeInterval, clipTolerance);
580
619
  if (!edgeInterval.isNull) {
581
- const mate = p.edgeMate;
582
- if (mate === a || mate === b) {
583
- // this is the back side of a bridge edge
584
- }
585
- else if (edgeInterval.low > oneMinus) {
586
- // the endpoint (q) just touches ... if it is at one of the vertex loops it's ok ...
587
- if (!a.findAroundVertex(q)
588
- && !b.findAroundVertex(q)
589
- && !c.findAroundVertex(q))
620
+ if (edgeInterval.low > oneMinus) {
621
+ // only q touches triangle abc, so b might still be an ear if q lies at a vertex
622
+ if (!this.findAroundOrAtVertex(a, q)
623
+ && !this.findAroundOrAtVertex(b, q)
624
+ && !this.findAroundOrAtVertex(c, q))
590
625
  return false;
591
626
  }
592
627
  else if (edgeInterval.high < zeroPlus) {
593
- // the start (p) just touches ... if it is at one of the vertex loops it's ok ...
594
- if (!a.findAroundVertex(p)
595
- && !b.findAroundVertex(p)
596
- && !c.findAroundVertex(p))
628
+ // only p touches triangle abc, so b might still be an ear if p lies at a vertex
629
+ if (!this.findAroundOrAtVertex(a, p)
630
+ && !this.findAroundOrAtVertex(b, p)
631
+ && !this.findAroundOrAtVertex(c, p))
597
632
  return false;
598
633
  }
634
+ else if (this.findAroundOrAtVertex(b, q) && this.findAroundOrAtVertex(c, p)) {
635
+ // edge pq is the back side of bridge edge bc, so b might still be an ear
636
+ }
637
+ else if (this.findAroundOrAtVertex(a, q) && this.findAroundOrAtVertex(b, p)) {
638
+ // edge pq is the back side of bridge edge ab, so b might still be an ear
639
+ }
599
640
  else {
600
- // significant internal intersection -- this edge really intrudes on the into the triangle
601
- return false;
641
+ return false; // edge pq intrudes into triangle abc, so b cannot be an ear
602
642
  }
603
643
  }
604
644
  }
@@ -666,9 +706,9 @@ class Triangulator {
666
706
  return undefined;
667
707
  if (hx === qx)
668
708
  return m.facePredecessor; // hole touches outer segment; pick lower endpoint
669
- // look for points inside the triangle of hole point, segment intersection and endpoint;
670
- // if there are no points found, we have a valid connection;
671
- // otherwise choose the point of the minimum angle with the ray as connection point
709
+ // look for outer loop points p inside the triangle of hole point h, outer segment intersection (qx,hy), and outer segment endpoint m;
710
+ // if there are no points found, we have a valid connection (m);
711
+ // otherwise choose the point p with minimum angle with the ray as connection point
672
712
  const stop = m;
673
713
  const mx = m.x;
674
714
  const my = m.y;
@@ -699,18 +739,20 @@ class Triangulator {
699
739
  } while (p !== start);
700
740
  return leftmost;
701
741
  }
702
- /** check if a point lies within a convex triangle.
703
- * i.e. areas of 3 triangles with an edge of abc and p all have zero or positive area. (abp, bcp, cap)
742
+ /**
743
+ * Check if a point lies within a triangle.
744
+ * * In other words, the areas of the 3 triangles formed by an edge of abc and p all have zero or positive area.
704
745
  */
705
746
  static pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
706
747
  return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
707
748
  (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
708
749
  (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
709
750
  }
751
+ /** Check if node p lies strictly inside the triangle abc. */
710
752
  static nodeInTriangle(a, b, c, p) {
711
753
  return Triangulator.signedTolerancedCCWTriangleArea(a, b, p) > 0
712
- && Triangulator.signedTolerancedCCWTriangleArea(b, c, p) > 0.0
713
- && Triangulator.signedTolerancedCCWTriangleArea(c, a, p) > 0.0;
754
+ && Triangulator.signedTolerancedCCWTriangleArea(b, c, p) > 0
755
+ && Triangulator.signedTolerancedCCWTriangleArea(c, a, p) > 0;
714
756
  }
715
757
  /** signed area of a triangle
716
758
  * EDL 2/21 This is negative of usual CCW area. Beware in callers !!!
@@ -1 +1 @@
1
- {"version":3,"file":"Triangulation.js","sourceRoot":"","sources":["../../../src/topology/Triangulation.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACpG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAchF;;;GAGG;AACH,MAAa,YAAY;IAEvB;;;;OAIG;IACK,MAAM,CAAC,wBAAwB,CAAC,CAAW,EAAE,CAAW,EAAE,CAAW,EAAE,CAAW,EAAE,CAAW,EAAE,CAAW;QAClH,+BAA+B;QAC/B,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErB,oEAAoE;QACpE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACZ,CAAC;IACD;;;;;;;;;;;;;;;OAeG;IACI,MAAM,CAAC,0CAA0C,CAAC,KAAe;QACtE,mCAAmC;QACnC,0DAA0D;QAC1D,uFAAuF;QACvF,wFAAwF;QACxF,yFAAyF;QACzF,uFAAuF;QACvF,gDAAgD;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;QACpC,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK;YAChC,OAAO,KAAK,CAAC;QACf,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;QACpC,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK;YAChC,OAAO,KAAK,CAAC;QACf,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC9B,IAAI,QAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,gFAAgF;QAChF,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,EACV,EAAE,EAAE,EAAE,EAAE,EAAE,EACV,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,CAAC;YACP,OAAO,KAAK,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;cAClF,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,KAAoB;QAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY;YACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,sBAAsB,CAAC,KAAoB,EAAE,OAAsB;QAC/E,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,GAAG,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC;QAEpG,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;QACxC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,IAAI,CAAC;QACT,OAAO,SAAS,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,EAAE;YAE1D,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,mBAAmB;gBACnD,SAAS;YAEX,IAAI,YAAY,CAAC,0CAA0C,CAAC,IAAI,CAAC,EAAE;gBACjE,qBAAqB;gBACrB,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBACjK,8BAA8B;gBAC9B,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC5B,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrC,OAAO,EAAE,CAAC;aACX;iBAAM;gBACL,KAAK,EAAE,CAAC;aACT;YACD,IAAI,OAAO,GAAG,KAAK,GAAG,OAAO;gBAC3B,MAAM;SACT;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iCAAiC,CAAC,MAAiB;QAC/D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YACnB,OAAO,SAAS,CAAC;QACnB,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,YAAY,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,6BAA6B,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,YAAY,CAAC,6BAA6B,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACpE,oDAAoD;QACpD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE;YACxB,OAAO,CAAC,sBAAsB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACxC,SAAS,EAAE,CAAC;YACZ,IAAI,SAAS,GAAG,EAAE,EAAE;gBAClB;;;;kBAIE;gBACF,SAAS,GAAG,CAAC,CAAC;aACf;SACF;QACD;;;;;;;cAOM;QACN,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,gCAAgC,CAAC,KAAqC;QAClF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAClB,OAAO,SAAS,CAAC;QACnB,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC;QACpE,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC;QACvB,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;QACtB,+DAA+D;QAC/D,uCAAuC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,IAAI,GAAG,YAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,IAAI,IAAI,EAAE;gBACR,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAE,4BAA4B;gBACxD,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;gBAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACtC,SAAS,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,EAAE;oBAC7B,OAAO,GAAG,IAAI,CAAC;oBACf,YAAY,GAAG,CAAC,CAAC;iBAClB;aACF;SACF;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,gCAAgC;QAChC,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QAC5C,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1D,SAAS,CAAC,GAAG,EAAE,CAAC;QAChB,WAAW,CAAC,eAAe,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACrE,6EAA6E;QAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC9C,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;SACvD;QAED,MAAM,YAAY,GAAG,YAAY,CAAC,0BAA0B,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC5F,IAAI,YAAY,EAAE;YAChB,IAAI,YAAY,CAAC,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC;gBACzD,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;OAEG;IACI,MAAM,CAAC,+BAA+B,CAAC,KAAoB;QAChE,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACvC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC,EAAE;gBACnC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBACnC,IAAI,IAAI,GAAG,GAAG;oBACZ,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC;wBAClD,OAAO,EAAE,CAAC;aACf;SACF;QACD,OAAO,OAAO,KAAK,CAAC,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,qCAAqC,CAAC,IAAgC;QAClF,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,YAAY,CAAC,6BAA6B,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEzF,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAE1D,IAAI,YAAY,CAAC,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE;YAC3D,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;SACd;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,iBAAiB,CAAC,KAAoB,EAAE,QAA8B,EAAE,EAAoB;QACzG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACrB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACV,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACV,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;SACjC;aAAM;YACL,MAAM,CAAC,GAAG,EAAS,CAAC;YACpB,IAAI,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC;gBAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC;gBAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC;gBAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACpC;QACD,IAAI,CAAC,QAAQ;YACX,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,YAAY,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,OAAO,QAAQ,CAAC;QAClB,IAAI,YAAY,CAAC,oBAAoB,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;YACjE,OAAO,QAAQ,CAAC;QAClB,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,mCAAmC,CAAC,KAAoB,EAAE,IAA2B;QACjG,oGAAoG;QACpG,IAAI,QAA8B,CAAC;QACnC,IAAI,IAAI,YAAY,oBAAoB,EAAE;YACxC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACpC,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC3C,QAAQ,GAAG,YAAY,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;aACjE;SACF;aAAM;YACL,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE;gBACrB,QAAQ,GAAG,YAAY,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;aAChE;SACF;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,iCAAiC,CAAC,KAAoB,EAAE,IAAgC,EAAE,KAAa,CAAC;QACpH,oGAAoG;QACpG,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,sBAAsB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClD,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,wBAAwB,CAAC,MAAqB,EAAE,IAA0B,EAAE,sBAA+B,EACxH,gBAA8B,EAC9B,gBAA8B;QAC9B,gCAAgC;QAChC,IAAI,IAAI,EAAE;YACR,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,sFAAsF;YACjH,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC3B,IAAI,gBAAgB,KAAK,YAAY,CAAC,SAAS,EAAE;gBAC/C,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;gBACzC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;aAC1C;YAED,IAAI,aAAa,GAAG,IAAI,CAAC;YACzB,IAAI,sBAAsB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBACtC,aAAa,GAAG,IAAI,CAAC;YACvB,MAAM,SAAS,GAAG,aAAa,CAAC,eAAe,CAAC;YAEhD,IAAI,gBAAgB,KAAK,YAAY,CAAC,SAAS;gBAC7C,SAAS,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YAChD,OAAO,aAAa,CAAC;SACtB;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,6BAA6B,CAAC,KAAoB,EAAE,IAA2B,EAAE,sBAA+B,EAAE,YAAqB;QACnJ,MAAM,IAAI,GAAG,YAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3E,OAAO,YAAY,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAC9E,YAAY,CAAC,aAAa,GAAG,YAAY,CAAC,YAAY,EACtD,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,qCAAqC,CAAC,KAAoB,EAAE,IAA2B,EAAE,sBAA+B,EACpI,gBAA8B,EAC9B,gBAA8B;QAC9B,MAAM,IAAI,GAAG,YAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3E,OAAO,YAAY,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IACxH,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,kBAAkB,CAAC,KAAoB,EAAE,GAAa;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAClC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,EAC1F,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;QAE5B,oGAAoG;QACpG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACxC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC3C,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;IACxD,CAAC;IACO,MAAM,CAAC,kBAAkB,CAAC,CAAW;QAC3C,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;YACpF,OAAO,KAAK,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;YACpF,OAAO,KAAK,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;YACpF,OAAO,KAAK,CAAC;QACf,OAAO,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,cAAc,CAAC,GAAa;QACzC,oEAAoE;QACpE,wCAAwC;QACxC,wCAAwC;QACxC,iDAAiD;QACjD,oCAAoC;QACpC,4DAA4D;QAC5D,iEAAiE;QACjE,uGAAuG;QACvG,2EAA2E;QAC3E,EAAE;QACF,gEAAgE;QAChE,gEAAgE;QAChE,gEAAgE;QAChE,gEAAgE;QAChE,gEAAgE;QAChE,gEAAgE;QAChE,gEAAgE;QAChE,6DAA6D;QAC7D,0DAA0D;QAC1D,wDAAwD;QACxD,sDAAsD;QACtD,mDAAmD;QACnD,IAAI,EAAE,GAAG,GAAG,CAAC;QACb,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;QACrB,OAAO,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE;YACjF,MAAM,IAAI,GAAG,YAAY,CAAC,0CAA0C,CAAC,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,IAAI;gBACP,MAAM;YACR,qBAAqB;YACrB,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;YAC5B,YAAY,CAAC,wBAAwB,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;YAC1H,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC;YACxB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;SAClB;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,qBAAqB,CAAC,KAAoB,EAAE,GAAc;QACvE,IAAI,CAAC,GAAG,EAAE;YACR,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;SACd;QAED,IAAI,IAAI,CAAC;QACT,IAAI,KAAK,CAAC;QACV,IAAI,IAAI,CAAC;QACT,IAAI,YAAY,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAC9C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,GAAG,CAAC,mBAAmB,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACxD,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE;YACrD,IAAI,GAAG,GAAG,EAAE,eAAe,CAAC;YAC5B,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC;YACzB,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;YAC3B,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;gBAC/B,OAAO,IAAI,CAAC;YACd,IAAI,KAAK,CAAC,aAAa,KAAK,GAAG,EAAE;gBAC/B,wFAAwF;gBACxF,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC;aACb;YACD,8CAA8C;YAC9C,uGAAuG;YACvG,2DAA2D;YAC3D,8FAA8F;YAC9F,4BAA4B;YAC5B,oGAAoG;YACpG,IAAI,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAE,IAAI,CAAC,EAAE;gBAC9E,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC5B,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;gBACtD,GAAG,GAAG,KAAK,CAAC;gBACZ,SAAS;aACV;YACD,IAAI,EAAE,YAAY,GAAG,YAAY,EAAE;gBACjC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAClC,OAAO,KAAK,CAAC;aACd;YACD,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC3B,YAAY,EAAE,CAAC;gBACf,YAAY,GAAG,CAAC,CAAC;gBAEjB,4DAA4D;gBAE5D,uDAAuD;gBACvD,IAAI,GAAG,CAAC,aAAa,CAAC,aAAa,KAAK,GAAG,CAAC,eAAe,EAAE;oBAC3D,YAAY,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAC5C,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;oBACvC,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC;oBAC/C,kDAAkD;iBACnD;qBAAM;oBACL,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;oBACtD,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;iBAC1B;gBACD,SAAS;aACV;YACD,GAAG,GAAG,IAAI,CAAC;SACZ;QACD,OAAO,IAAI,CAAC,CAAE,yCAAyC;IACzD,CAAC;IAMD;;;;mBAIe;IACR,MAAM,CAAC,eAAe;QAC3B,MAAM,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC;QACnC,YAAY,CAAC,WAAW,GAAG,SAAS,CAAC;QACrC,YAAY,CAAC,wBAAwB,GAAG,KAAK,CAAC;QAC9C,OAAO,CAAC,CAAC;IACX,CAAC;IACD;;;;mBAIe;IACR,MAAM,CAAC,aAAa,CAAC,KAAgC,IAAI,IAAI,YAAY,CAAC,wBAAwB;QAAE,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;IAC9I;;;;;;;;;mBASe;IACR,MAAM,CAAC,+BAA+B,CAAC,KAAc;QAC1D,YAAY,CAAC,wBAAwB,GAAG,KAAK,CAAC;QAC9C,YAAY,CAAC,WAAW,GAAG,SAAS,CAAC;IACvC,CAAC;IAWD,yEAAyE;IACjE,MAAM,CAAC,KAAK,CAAC,GAAa;QAChC,MAAM,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC;QACd,MAAM,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC;QAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,IAAI,IAAI,IAAI,CAAC;YACX,OAAO,KAAK,CAAC,CAAC,0BAA0B;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,4BAA4B,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;eACrE,CAAC,4BAA4B,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;eACtE,CAAC,4BAA4B,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QAEf,wFAAwF;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7D,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,QAAQ,GAAG,MAAM,CAAC;QACxB,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC;QAC5B,MAAM,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC/B,MAAM,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC;QAChC,MAAM,aAAa,GAAG,OAAO,GAAG,IAAI,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,EAAE;YACd,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;YAC1B,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAClD,IAAI,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBACvC,mCAAmC;gBACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;gBACnD,aAAa,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;gBAClF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;oBACxB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC;oBACxB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;wBAC5B,yCAAyC;qBAC1C;yBAAM,IAAI,YAAY,CAAC,GAAG,GAAG,QAAQ,EAAE;wBACtC,oFAAoF;wBACpF,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;+BACrB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;+BACtB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;4BACzB,OAAO,KAAK,CAAC;qBAChB;yBAAM,IAAI,YAAY,CAAC,IAAI,GAAG,QAAQ,EAAE;wBACvC,iFAAiF;wBACjF,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;+BACrB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;+BACtB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;4BACzB,OAAO,KAAK,CAAC;qBAChB;yBAAM;wBACL,2FAA2F;wBAC3F,OAAO,KAAK,CAAC;qBACd;iBACF;aACF;YACD,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;SACrB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;OAEG;IACK,MAAM,CAAC,0BAA0B,CAAC,KAAoB,EAAE,SAAmB,EAAE,oBAAgC;QAEnH,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,mCAAmC;QACnC,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE;YAC5C,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;gBAC1D,OAAO,EAAE,CAAC;SACb;QAED,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;IACD,mEAAmE;IAC3D,MAAM,CAAC,QAAQ,CAAC,CAAW,EAAE,CAAW;QAC9C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,2FAA2F;IACnF,MAAM,CAAC,aAAa,CAAC,KAAoB,EAAE,IAAc,EAAE,SAAmB;QACpF,MAAM,UAAU,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChE,IAAI,UAAU,EAAE;YACd,OAAO,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,SAAS,CAAC;SACtE;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,qBAAqB;IACrB;;;OAGG;IACK,MAAM,CAAC,cAAc,CAAC,IAAc,EAAE,SAAoB;QAChE,IAAI,CAAC,GAAG,SAAS,CAAC;QAElB,IAAI,CAAC,CAAC;YACJ,OAAO,SAAS,CAAC;QAEnB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;QACnB,IAAI,CAAC,CAAC;QAEN,kFAAkF;QAClF,sEAAsE;QACtE,GAAG;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACrE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;oBACrB,EAAE,GAAG,CAAC,CAAC;oBACP,IAAI,CAAC,KAAK,EAAE,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;4BAAE,OAAO,CAAC,CAAC;wBACzB,IAAI,EAAE,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC;4BAAE,OAAO,CAAC,CAAC,aAAa,CAAC;qBACtD;oBACD,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;iBACnD;aACF;YACD,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;SACrB,QAAQ,CAAC,KAAK,SAAS,EAAE;QAE1B,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAEzB,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,kDAAkD;QAE3F,wFAAwF;QACxF,4DAA4D;QAC5D,mFAAmF;QAEnF,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,IAAI,GAAG,CAAC;QAER,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;QAEpB,OAAO,CAAC,KAAK,IAAI,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACtC,YAAY,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBAE9F,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;gBAEpD,IAAI,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;oBAC1F,CAAC,GAAG,CAAC,CAAC;oBACN,MAAM,GAAG,GAAG,CAAC;iBACd;aACF;YAED,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;SACrB;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAED,2CAA2C;IACnC,MAAM,CAAC,WAAW,CAAC,KAAe;QACxC,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,GAAG;YACD,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAAE,QAAQ,GAAG,CAAC,CAAC;YACnC,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;SACrB,QAAQ,CAAC,KAAK,KAAK,EAAE;QAEtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,eAAe,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;QAC3H,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;YACvD,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;YAClD,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IACO,MAAM,CAAC,cAAc,CAAC,CAAW,EAAE,CAAW,EAAE,CAAW,EAAE,CAAW;QAC9E,OAAO,YAAY,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;eAC3D,YAAY,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG;eAC3D,YAAY,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;IACnE,CAAC;IACD;;;MAGE;IACM,MAAM,CAAC,oBAAoB,CAAC,CAAW,EAAE,CAAW,EAAE,CAAW;QACvE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;MACE;IACM,MAAM,CAAC,+BAA+B,CAAC,CAAW,EAAE,CAAW,EAAE,CAAW,EAAE,SAAiB,OAAO;QAC5G,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,IAAI,GAAG,GAAG;YACZ,OAAO,IAAI,CAAC;QACd,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;YAC3B,OAAO,GAAG,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oCAAoC;IAC5B,MAAM,CAAC,oBAAoB,CAAC,EAAS,EAAE,CAAS,EAAE,CAAS;QACjE,OAAO,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,iDAAiD;IACzC,MAAM,CAAC,aAAa,CAAC,CAAW,EAAE,CAAW;QACnD,OAAO,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;YACnF,YAAY,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAClI,YAAY,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACnI,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,SAAS,CAAC,KAAoB,EAAE,CAAW,EAAE,CAAW;QACrE,IAAI,QAAQ,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAChF,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;YAC5B,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,OAAO,EAAE,CAAC;SACX;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,6BAA6B,CAAC,KAAoB,EAAE,KAAe;QAC/E,IAAI,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC;QACjC,IAAI,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;QAChC,uDAAuD;QACvD,IAAI,kBAAkB,CAAC;QACvB,OAAO,IAAI,KAAK,KAAK;eAChB,KAAK,KAAK,KAAK;eACf,KAAK,CAAC,aAAa,KAAK,IAAI,EAAE;YACjC,uDAAuD;YACvD,IAAI,QAAQ,CAAC,wBAAwB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;gBAC5D,OAAO,KAAK,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBACtB,OAAO,KAAK,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACvB,OAAO,KAAK,CAAC;YACf,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACvB;qCACqB;gBAErB;mDACmC;gBACnC,IAAI,EAAE,GAAG,IAAI,CAAC;gBACd,IAAI,EAAE,GAAG,KAAK,CAAC;gBACf,IAAI,EAAE,GAAG,KAAK,CAAC;gBACf;;;;mBAIG;gBACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACrC,OAAO,EAAE,KAAK,KAAK;2BACd,EAAE,KAAK,EAAE;2BACT,EAAE,KAAK,EAAE;2BACT,QAAQ,CAAC,wBAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE;wBACtD,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC3D,IAAI,kBAAkB,KAAK,SAAS;4BAClC,OAAO,KAAK,CAAC;wBACf,EAAE,GAAG,kBAAkB,CAAC;wBACxB,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;wBACtB,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;qBACvB;oBACD,EAAE,GAAG,EAAE,CAAC;oBACR,EAAE,GAAG,EAAE,CAAC;oBACR,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC;iBACzB;gBACD;;mDAEmC;gBACnC,IAAI,GAAG,EAAE,CAAC;gBACV,EAAE,GAAG,KAAK,CAAC;gBACX,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC;gBACxB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC;gBACxB,OAAO,EAAE,CAAC,aAAa,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;oBAC7C,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC3D,IAAI,kBAAkB,KAAK,SAAS;wBAClC,OAAO,KAAK,CAAC;oBACf,EAAE,GAAG,kBAAkB,CAAC;oBACxB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC;iBACzB;gBACD;;gCAEgB;gBAChB,IAAI,EAAE,CAAC,aAAa,KAAK,EAAE,EAAE;oBAC3B,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC3D,IAAI,kBAAkB,KAAK,SAAS;wBAClC,OAAO,KAAK,CAAC;oBACf,EAAE,GAAG,kBAAkB,CAAC;iBACzB;gBACD,KAAK,GAAG,EAAE,CAAC;gBACX,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBAC5B,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC;aAE9B;iBAAM;gBACL;oCACoB;gBAEpB;mDACmC;gBACnC,IAAI,EAAE,GAAG,IAAI,CAAC;gBACd,IAAI,EAAE,GAAG,KAAK,CAAC;gBACf,IAAI,EAAE,GAAG,KAAK,CAAC;gBACf;;;;;;mBAMG;gBACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACpC,OAAO,EAAE,KAAK,IAAI;2BACb,EAAE,KAAK,EAAE;2BACT,EAAE,KAAK,EAAE;2BACT,QAAQ,CAAC,wBAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE;wBACtD,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC3D,IAAI,kBAAkB,KAAK,SAAS;4BAClC,OAAO,KAAK,CAAC;wBAEf,EAAE,GAAG,kBAAkB,CAAC,eAAe,CAAC;wBACxC,EAAE,GAAG,kBAAkB,CAAC;qBACzB;oBACD,EAAE,GAAG,EAAE,CAAC;oBACR,EAAE,GAAG,EAAE,CAAC;oBACR,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;iBACvB;gBACD;;mDAEmC;gBACnC,KAAK,GAAG,EAAE,CAAC;gBACX,EAAE,GAAG,IAAI,CAAC;gBACV,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;gBACtB,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;gBACtB,OAAO,EAAE,CAAC,aAAa,KAAK,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE;oBAC9C,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC3D,IAAI,kBAAkB,KAAK,SAAS;wBAClC,OAAO,KAAK,CAAC;oBACf,EAAE,GAAG,kBAAkB,CAAC;oBACxB,wJAAwJ;oBACxJ,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;iBACvB;gBACD;;gCAEgB;gBAChB,IAAI,EAAE,CAAC,aAAa,KAAK,EAAE,EAAE;oBAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtD,IAAI,OAAO,KAAK,SAAS;wBACvB,OAAO,KAAK,CAAC;iBAChB;gBACD,KAAK,GAAG,KAAK,CAAC;gBACd,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;gBAC5B,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC;aAC9B;SACF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;;AA/ZD,gBAAgB;AACD,qCAAwB,GAAG,KAAK,CAAC;AAkChD,yCAAyC;AAC1B,0BAAa,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;AACrC,sBAAS,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;AACjC,uBAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;AAClC,oBAAO,GAAmC;IACvD,4BAA4B,CAAC,aAAa,EAAE;IAC5C,4BAA4B,CAAC,aAAa,EAAE;IAC5C,4BAA4B,CAAC,aAAa,EAAE;CAC7C,CAAC;SAtjBS,YAAY;AA86BzB;;;GAGG;AACH,MAAM,oBAAqB,SAAQ,4BAA4B;IAQ7D,YAAmB,KAAoB,EAAE,EAAO;QAC9C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IAChB,CAAC;IACe,UAAU,CAAC,SAAqC,EAAE,MAAe;QAC/E,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IACe,YAAY,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;QACjG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;SAC5C;aAAM;YACL,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;SACzC;IACH,CAAC;IACe,QAAQ,CAAC,SAAqC,EAAE,MAAe;QAC7E,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAChC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAClC;QACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IACM,UAAU;QACf,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAC3B,OAAO,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { ClipUtilities } from \"../clipping/ClipUtils\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { PointStreamXYZXYZHandlerBase, VariantPointDataStream } from \"../geometry3d/PointStreaming\";\r\nimport { Range1d, Range2d } from \"../geometry3d/Range\";\r\nimport { XAndY, XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { InsertAndRetriangulateContext } from \"./InsertAndRetriangulateContext\";\r\n\r\n/**\r\n * type for use as signature for xyz data of a single linestring appearing in a parameter list.\r\n * @public\r\n */\r\nexport type LineStringDataVariant = IndexedXYZCollection | XYAndZ[] | XAndY[] | number[][];\r\n\r\n/**\r\n * type for use as signature for multiple xyz data of multiple linestrings appearing in a parameter list.\r\n * @public\r\n */\r\nexport type MultiLineStringDataVariant = LineStringDataVariant | LineStringDataVariant[];\r\n\r\n/**\r\n * (static) methods for triangulating polygons\r\n * * @internal\r\n */\r\nexport class Triangulator {\r\n\r\n /** Given the six nodes that make up two bordering triangles, \"pinch\" and relocate the nodes to flip them\r\n * * The shared edge mates are c and e.\r\n * * (abc) are a triangle in CCW order\r\n * * (dfe) are a triangle in CCW order. (!! node dfe instead of def.)\r\n */\r\n private static flipEdgeBetweenTriangles(a: HalfEdge, b: HalfEdge, c: HalfEdge, d: HalfEdge, e: HalfEdge, f: HalfEdge) {\r\n // Reassign all of the pointers\r\n HalfEdge.pinch(a, e);\r\n HalfEdge.pinch(c, d);\r\n HalfEdge.pinch(f, c);\r\n HalfEdge.pinch(e, b);\r\n\r\n // Move alpha and beta into the xy coordinates of their predecessors\r\n e.x = b.x;\r\n e.y = b.y;\r\n e.z = b.z;\r\n e.i = b.i;\r\n c.i = f.i;\r\n c.x = f.x;\r\n c.y = f.y;\r\n c.z = f.z;\r\n }\r\n /**\r\n * * nodeA is a given node\r\n * * nodeA1 is its nodeA.faceSuccessor\r\n * * nodeA2 is nodeA1.faceSuccessor, i.e. 3rd node of triangle A\r\n * * nodeB is nodeA.edgeMate, i.e. a node in the \"other\" triangle at nodeA's edge\r\n * * nodeB1 is nodeB.faceSuccessor\r\n * * nodeB2 is nodeB1.faceSuccessor, i.e the 3rd node of triangle B\r\n * Construct (as simple doubles, to avoid object creation) xy vectors from:\r\n * * (ux,uy): nodeA to nodeA1, i.e. the shared edge\r\n * * (vx,vy): nodeA to nodeA2,\r\n * * (wx,wy): nodeA to nodeB2\r\n * * this determinant is positive if nodeA is \"in the circle\" of nodeB2, nodeA1, nodeA2\r\n * * Return true if clearly positive\r\n * * Return false if clearly negative or almost zero.\r\n * @param nodeA node on the diagonal edge of candidate for edge flip.\r\n */\r\n public static computeInCircleDeterminantIsStrongPositive(nodeA: HalfEdge): boolean {\r\n // Assume triangle A1,A2,B2 is ccw.\r\n // Shift the triangle to the origin (by negated A coords).\r\n // The Delaunay condition is computed by projecting the origin and the shifted triangle\r\n // points up to the paraboloid z = x*x + y*y. Due to the radially symmetric convexity of\r\n // this surface and the ccw orientation of this triangle, \"A is inside triangle A1,A2,B2\"\r\n // is equivalent to \"the volume of the parallelepiped formed by the projected points is\r\n // negative, as computed by the triple product.\"\r\n const nodeA1 = nodeA.faceSuccessor;\r\n const nodeA2 = nodeA1.faceSuccessor;\r\n if (nodeA2.faceSuccessor !== nodeA)\r\n return false;\r\n const nodeB = nodeA.edgeMate;\r\n const nodeB1 = nodeB.faceSuccessor;\r\n const nodeB2 = nodeB1.faceSuccessor;\r\n if (nodeB2.faceSuccessor !== nodeB)\r\n return false;\r\n const ux = nodeA1.x - nodeA.x;\r\n const uy = nodeA1.y - nodeA.y;\r\n const vx = nodeA2.x - nodeA.x;\r\n const vy = nodeA2.y - nodeA.y;\r\n if (Geometry.crossProductXYXY(ux, uy, vx, vy) < 0)\r\n return false;\r\n // we assume identical coordinates in pairs (nodeA, nodeB1) and (nodeA1, nodeB)\r\n const wx = nodeB2.x - nodeA.x;\r\n const wy = nodeB2.y - nodeA.y;\r\n const tx = wx * wx + wy * wy;\r\n const ty = vx * vx + vy * vy;\r\n const tz = ux * ux + uy * uy;\r\n const q = Geometry.tripleProduct(\r\n wx, wy, tx,\r\n vx, vy, ty,\r\n ux, uy, tz);\r\n if (q < 0)\r\n return false;\r\n const denom = Math.abs(wx * vy * tz) + Math.abs(wy * ty * ux) + Math.abs(tx * vx * uy)\r\n + Math.abs(wx * ty * uy) + Math.abs(wy * vx * tz) + Math.abs(tx * vy * ux);\r\n return q > 1.0e-12 * denom;\r\n }\r\n\r\n /**\r\n * * Visit each node of the graph array\r\n * * If a flip would be possible, test the results of flipping using incircle condition\r\n * * If revealed to be an improvement, conduct the flip, mark involved nodes as unvisited, and repeat until all nodes are visited\r\n */\r\n public static flipTriangles(graph: HalfEdgeGraph): number {\r\n const edgeSet = MarkedEdgeSet.create(graph)!;\r\n for (const node of graph.allHalfEdges)\r\n edgeSet.addToSet(node);\r\n const numFlip = this.flipTrianglesInEdgeSet(graph, edgeSet);\r\n edgeSet.teardown();\r\n return numFlip;\r\n }\r\n\r\n /**\r\n * * Visit each node of the graph array\r\n * * If a flip would be possible, test the results of flipping using incircle condition\r\n * * If revealed to be an improvement, conduct the flip, mark involved nodes as unvisited, and repeat until all nodes are visited\r\n */\r\n public static flipTrianglesInEdgeSet(graph: HalfEdgeGraph, edgeSet: MarkedEdgeSet): number {\r\n const barrierMasks = HalfEdgeMask.EXTERIOR | HalfEdgeMask.PRIMARY_EDGE | HalfEdgeMask.BOUNDARY_EDGE;\r\n\r\n const nodeArray = graph.allHalfEdges;\r\n const maxTest = 10.0 * nodeArray.length;\r\n let numFlip = 0;\r\n let numOK = 0;\r\n let node;\r\n while (undefined !== (node = edgeSet.chooseAndRemoveAny())) {\r\n\r\n if (node.isMaskSet(barrierMasks)) // Flip not allowed\r\n continue;\r\n\r\n if (Triangulator.computeInCircleDeterminantIsStrongPositive(node)) {\r\n // Flip the triangles\r\n Triangulator.flipEdgeBetweenTriangles(node.edgeMate.faceSuccessor, node.edgeMate.facePredecessor, node.edgeMate, node.faceSuccessor, node, node.facePredecessor);\r\n // keep looking at the 2 faces\r\n edgeSet.addAroundFace(node);\r\n edgeSet.addAroundFace(node.edgeMate);\r\n numFlip++;\r\n } else {\r\n numOK++;\r\n }\r\n if (numFlip + numOK > maxTest)\r\n break;\r\n }\r\n return numFlip;\r\n }\r\n\r\n /** Create a graph with a triangulation points.\r\n * * The outer limit of the graph is the convex hull of the points.\r\n * * The outside loop is marked `HalfEdgeMask.EXTERIOR`\r\n */\r\n public static createTriangulatedGraphFromPoints(points: Point3d[]): HalfEdgeGraph | undefined {\r\n if (points.length < 3)\r\n return undefined;\r\n const hull: Point3d[] = [];\r\n const interior: Point3d[] = [];\r\n Point3dArray.computeConvexHullXY(points, hull, interior, true);\r\n const graph = new HalfEdgeGraph();\r\n const context = InsertAndRetriangulateContext.create(graph);\r\n Triangulator.createFaceLoopFromCoordinates(graph, hull, true, true);\r\n // HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph);\r\n let numInsert = 0;\r\n for (const p of interior) {\r\n context.insertAndRetriangulate(p, true);\r\n numInsert++;\r\n if (numInsert > 16) {\r\n /*\r\n context.reset();\r\n Triangulator.flipTriangles(context.graph);\r\n // console.log (\" intermediate flips \" + numFlip);\r\n */\r\n numInsert = 0;\r\n }\r\n }\r\n /*\r\n // final touchup for aspect ratio flip\r\n for (let i = 0; i < 15; i++) {\r\n const numFlip = Triangulator.flipTriangles(graph);\r\n if (numFlip === 0)\r\n break;\r\n }\r\n */\r\n return graph;\r\n }\r\n /**\r\n * * Only one outer loop permitted.\r\n * * Largest area loop is assumed outer.\r\n * @param loops an array of loops as GrowableXYZArray or XAndY[]\r\n * @returns triangulated graph, or undefined if bad data.\r\n */\r\n public static createTriangulatedGraphFromLoops(loops: GrowableXYZArray[] | XAndY[][]): HalfEdgeGraph | undefined {\r\n if (loops.length < 1)\r\n return undefined;\r\n const mask = HalfEdgeMask.BOUNDARY_EDGE | HalfEdgeMask.PRIMARY_EDGE;\r\n const graph = new HalfEdgeGraph();\r\n const holeSeeds: HalfEdge[] = [];\r\n let maxArea = -10000.0;\r\n let maxAreaIndex = -1;\r\n // collect all the loops with pointers to the positive (inside)\r\n // remember which one has largest area.\r\n for (let i = 0; i < loops.length; i++) {\r\n let seed = Triangulator.directCreateFaceLoopFromCoordinates(graph, loops[i]);\r\n if (seed) {\r\n seed = seed.faceSuccessor; // directCreate returns tail\r\n const mate = seed.vertexSuccessor;\r\n seed.setMaskAroundFace(mask);\r\n mate.setMaskAroundFace(mask);\r\n const signedFaceArea = seed.signedFaceArea();\r\n const area = Math.abs(signedFaceArea);\r\n holeSeeds.push(signedFaceArea >= 0 ? seed : mate);\r\n if (i === 0 || area > maxArea) {\r\n maxArea = area;\r\n maxAreaIndex = i;\r\n }\r\n }\r\n }\r\n if (holeSeeds.length === 0)\r\n return undefined;\r\n // extract the max area seed ...\r\n const maxAreaFace = holeSeeds[maxAreaIndex];\r\n holeSeeds[maxAreaIndex] = holeSeeds[holeSeeds.length - 1];\r\n holeSeeds.pop();\r\n maxAreaFace.vertexSuccessor.setMaskAroundFace(HalfEdgeMask.EXTERIOR);\r\n // The hole seeds all have inside nodes. Set mask there and jump to outside.\r\n for (let i = 0; i < holeSeeds.length; i++) {\r\n const seed = holeSeeds[i];\r\n seed.setMaskAroundFace(HalfEdgeMask.EXTERIOR);\r\n holeSeeds[i] = this.getLeftmost(seed.vertexSuccessor);\r\n }\r\n\r\n const startingNode = Triangulator.spliceLeftMostNodesOfHoles(graph, maxAreaFace, holeSeeds);\r\n if (startingNode) {\r\n if (Triangulator.triangulateSingleFace(graph, startingNode))\r\n return graph;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Triangulate all positive area faces of a graph.\r\n */\r\n public static triangulateAllPositiveAreaFaces(graph: HalfEdgeGraph): boolean {\r\n const seeds = graph.collectFaceLoops();\r\n let numFail = 0;\r\n for (const face of seeds) {\r\n if (face.countEdgesAroundFace() > 3) {\r\n const area = face.signedFaceArea();\r\n if (area > 0.0)\r\n if (!Triangulator.triangulateSingleFace(graph, face))\r\n numFail++;\r\n }\r\n }\r\n return numFail === 0;\r\n }\r\n\r\n /**\r\n * Triangulate the polygon made up of by a series of points.\r\n * * The loop may be either CCW or CW -- CCW order will be used for triangles.\r\n * * To triangulate a polygon with holes, use createTriangulatedGraphFromLoops\r\n */\r\n public static createTriangulatedGraphFromSingleLoop(data: XAndY[] | GrowableXYZArray): HalfEdgeGraph | undefined {\r\n const graph = new HalfEdgeGraph();\r\n const startingNode = Triangulator.createFaceLoopFromCoordinates(graph, data, true, true);\r\n\r\n if (!startingNode || graph.countNodes() < 6) return graph;\r\n\r\n if (Triangulator.triangulateSingleFace(graph, startingNode)) {\r\n Triangulator.flipTriangles(graph);\r\n return graph;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * cautiously split the edge starting at baseNode.\r\n * * If baseNode is null, create a trivial loop with the single vertex at xy\r\n * * if xy is distinct from the coordinates at both baseNode and its successor, insert xy as a new node within that edge.\r\n * * also include z coordinate if present.\r\n */\r\n private static interiorEdgeSplit(graph: HalfEdgeGraph, baseNode: HalfEdge | undefined, xy: XAndY | number[]): HalfEdge | undefined {\r\n let x = 0, y = 0, z = 0;\r\n if (Array.isArray(xy)) {\r\n x = xy[0];\r\n y = xy[1];\r\n z = xy.length > 2 ? xy[3] : 0.0;\r\n } else {\r\n const q = xy as any;\r\n if (q.hasOwnProperty(\"x\")) x = q.x;\r\n if (q.hasOwnProperty(\"y\")) y = q.y;\r\n if (q.hasOwnProperty(\"z\")) z = q.z;\r\n }\r\n if (!baseNode)\r\n return graph.splitEdge(baseNode, x, y, z);\r\n if (Triangulator.isAlmostEqualXAndYXY(baseNode, x, y))\r\n return baseNode;\r\n if (Triangulator.isAlmostEqualXAndYXY(baseNode.faceSuccessor, x, y))\r\n return baseNode;\r\n return graph.splitEdge(baseNode, x, y, z);\r\n }\r\n /** Create a loop from coordinates.\r\n * * Return a pointer to any node on the loop.\r\n * * no masking or other markup is applied.\r\n */\r\n public static directCreateFaceLoopFromCoordinates(graph: HalfEdgeGraph, data: LineStringDataVariant): HalfEdge | undefined {\r\n // Add the starting nodes as the boundary, and apply initial masks to the primary edge and exteriors\r\n let baseNode: HalfEdge | undefined;\r\n if (data instanceof IndexedXYZCollection) {\r\n const xyz = Point3d.create();\r\n for (let i = 0; i < data.length; i++) {\r\n data.getPoint3dAtCheckedPointIndex(i, xyz);\r\n baseNode = Triangulator.interiorEdgeSplit(graph, baseNode, xyz);\r\n }\r\n } else {\r\n for (const xy of data) {\r\n baseNode = Triangulator.interiorEdgeSplit(graph, baseNode, xy);\r\n }\r\n }\r\n return baseNode;\r\n }\r\n\r\n /** Create chains from coordinates.\r\n * * Return array of pointers to base node of the chains.\r\n * * no masking or other markup is applied.\r\n * @param graph New edges are built in this graph\r\n * @param data coordinate data\r\n * @param id id to attach to (both side of all) edges\r\n */\r\n public static directCreateChainsFromCoordinates(graph: HalfEdgeGraph, data: MultiLineStringDataVariant, id: number = 0): HalfEdge[] {\r\n // Add the starting nodes as the boundary, and apply initial masks to the primary edge and exteriors\r\n const assembler = new AssembleXYZXYZChains(graph, id);\r\n VariantPointDataStream.streamXYZ(data, assembler);\r\n return assembler.claimSeeds();\r\n }\r\n\r\n /**\r\n * @param graph the containing graph\r\n * @param base The last node of a newly created loop. (i.e. its `faceSuccessor` has the start xy)\r\n * @param returnPositiveAreaLoop if true, return the start node on the side with positive area. otherwise return the left side as given.\r\n * @param maskForBothSides mask to apply on both sides.\r\n * @param maskForOtherSide mask to apply to the \"other\" side of the loop.\r\n * @return the loop's start node or its vertex successor, chosen to be the positive or negative loop per request.\r\n */\r\n private static maskAndOrientNewFaceLoop(_graph: HalfEdgeGraph, base: HalfEdge | undefined, returnPositiveAreaLoop: boolean,\r\n maskForBothSides: HalfEdgeMask,\r\n maskForOtherSide: HalfEdgeMask): HalfEdge | undefined {\r\n // base is the final coordinates\r\n if (base) {\r\n base = base.faceSuccessor; // because typical construction process leaves the \"live\" edge at the end of the loop.\r\n const area = base.signedFaceArea();\r\n const mate = base.edgeMate;\r\n if (maskForBothSides !== HalfEdgeMask.NULL_MASK) {\r\n base.setMaskAroundFace(maskForBothSides);\r\n mate.setMaskAroundFace(maskForBothSides);\r\n }\r\n\r\n let preferredNode = base;\r\n if (returnPositiveAreaLoop && (area < 0))\r\n preferredNode = mate;\r\n const otherNode = preferredNode.vertexSuccessor;\r\n\r\n if (maskForOtherSide !== HalfEdgeMask.NULL_MASK)\r\n otherNode.setMaskAroundFace(maskForOtherSide);\r\n return preferredNode;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * create a circular doubly linked list of internal and external nodes from polygon points in the specified winding order\r\n * * This applies the masks used by typical applications:\r\n * * HalfEdgeMask.BOUNDARY on both sides\r\n * * HalfEdgeMask.PRIMARY_EDGE on both sides.\r\n * * Use `createFaceLoopFromCoordinatesAndMasks` for detail control of masks.\r\n */\r\n public static createFaceLoopFromCoordinates(graph: HalfEdgeGraph, data: LineStringDataVariant, returnPositiveAreaLoop: boolean, markExterior: boolean): HalfEdge | undefined {\r\n const base = Triangulator.directCreateFaceLoopFromCoordinates(graph, data);\r\n return Triangulator.maskAndOrientNewFaceLoop(graph, base, returnPositiveAreaLoop,\r\n HalfEdgeMask.BOUNDARY_EDGE | HalfEdgeMask.PRIMARY_EDGE,\r\n markExterior ? HalfEdgeMask.EXTERIOR : HalfEdgeMask.NULL_MASK);\r\n }\r\n\r\n /**\r\n * create a circular doubly linked list of internal and external nodes from polygon points.\r\n * * Optionally jump to the \"other\" side so the returned loop has positive area\r\n * @param graph graph to receive the new edges\r\n * @param data array with x,y coordinates\r\n * @param returnPositiveAreaLoop if false, return an edge proceeding around the loop in the order given. If true, compute the loop area and flip return the side with positive area.\r\n * @param maskForBothSides mask to apply on both sides.\r\n * @param maskForOtherSide mask to apply on the \"other\" side from the returned loop.\r\n */\r\n public static createFaceLoopFromCoordinatesAndMasks(graph: HalfEdgeGraph, data: LineStringDataVariant, returnPositiveAreaLoop: boolean,\r\n maskForBothSides: HalfEdgeMask,\r\n maskForOtherSide: HalfEdgeMask): HalfEdge | undefined {\r\n const base = Triangulator.directCreateFaceLoopFromCoordinates(graph, data);\r\n return Triangulator.maskAndOrientNewFaceLoop(graph, base, returnPositiveAreaLoop, maskForBothSides, maskForOtherSide);\r\n }\r\n\r\n /** Cut off an ear, forming a new face loop of nodes\r\n * @param ear the vertex being cut off.\r\n * * Form two new nodes, alpha and beta, which have the coordinates one step away from the ear vertex.\r\n * * Reassigns the pointers such that beta is left behind with the new face created\r\n * * Reassigns the pointers such that alpha becomes the resulting missing node from the remaining polygon\r\n * * Reassigns prevZ and nextZ pointers\r\n */\r\n private static joinNeighborsOfEar(graph: HalfEdgeGraph, ear: HalfEdge) {\r\n const alpha = graph.createEdgeXYZXYZ(\r\n ear.facePredecessor.x, ear.facePredecessor.y, ear.facePredecessor.z, ear.facePredecessor.i,\r\n ear.faceSuccessor.x, ear.faceSuccessor.y, ear.faceSuccessor.z, ear.faceSuccessor.i);\r\n const beta = alpha.edgeMate;\r\n\r\n // Add two nodes alpha and beta and reassign pointers (also mark triangle nodes as part of triangle)\r\n HalfEdge.pinch(ear.faceSuccessor, beta);\r\n HalfEdge.pinch(ear.facePredecessor, alpha);\r\n ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n }\r\n private static isInteriorTriangle(a: HalfEdge) {\r\n if (!a.isMaskSet(HalfEdgeMask.TRIANGULATED_FACE) || a.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const b = a.faceSuccessor;\r\n if (!b.isMaskSet(HalfEdgeMask.TRIANGULATED_FACE) || b.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const c = b.faceSuccessor;\r\n if (!c.isMaskSet(HalfEdgeMask.TRIANGULATED_FACE) || c.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n return c.faceSuccessor === a;\r\n }\r\n\r\n /**\r\n * Perform 0, 1, or more edge flips to improve aspect ratio just behind an ear that was just cut.\r\n * @param ear the triangle corner which just served as the ear node.\r\n * @returns the node at the back corner after flipping.\"appropriately positioned\" node for the usual advance to ear.faceSuccessor.edgeMate.faceSuccessor.\r\n */\r\n private static doPostCutFlips(ear: HalfEdge) {\r\n // B is the ear -- inside a (probably newly created) triangle ABC\r\n // CA is the recently added cut edge.\r\n // AB is the candidate to be flipped.\r\n // triangle B1 A1 D is on the other side of AB\r\n // The condition for flipping is:\r\n // ! both triangles must be TRIANGULATED_NODE_MASK\r\n // ! incircle condition flags D as in the circle of ABC\r\n // after flip, node A moves to the vertex of D, and is the effective \"ear\", with the cap edge C A1\r\n // after flip, consider the A1 D (whose nodes are A1 and flipped A!!!)\r\n //\r\n // * *\r\n // . C0| . / |\r\n // . | . C0 /B1|\r\n // . | . /v |\r\n // . ^| . / |\r\n // . A0 ----> B0| . / ^|\r\n // *=======================* --> * A1 / B0*\r\n // \\ A1 <---- B1/ \\ / /\r\n // \\ / \\ / /\r\n // \\ / \\ ^/ D1/\r\n // \\ D1 / \\A0/ /\r\n // * *\r\n let b0 = ear;\r\n let a0 = b0.facePredecessor;\r\n let b1 = a0.edgeMate;\r\n while (Triangulator.isInteriorTriangle(a0) && Triangulator.isInteriorTriangle(b1)) {\r\n const detA = Triangulator.computeInCircleDeterminantIsStrongPositive(a0);\r\n if (!detA)\r\n break;\r\n // Flip the triangles\r\n const a1 = b1.faceSuccessor;\r\n Triangulator.flipEdgeBetweenTriangles(a1, a1.faceSuccessor, a1.facePredecessor, b0, b0.facePredecessor, b0.faceSuccessor);\r\n b0 = a0;\r\n a0 = b0.facePredecessor;\r\n b1 = a0.edgeMate;\r\n }\r\n return b0;\r\n }\r\n\r\n /**\r\n * main ear slicing loop which triangulates a polygon (given as a linked list)\r\n * While there still exists ear nodes that have not yet been triangulated...\r\n *\r\n * * Check if the ear is hashed, and can easily be split off. If so, \"join\" that ear.\r\n * * If not hashed, move on to a separate ear.\r\n * * If no ears are currently hashed, attempt to cure self intersections or split the polygon into two before continuing\r\n */\r\n private static triangulateSingleFace(graph: HalfEdgeGraph, ear?: HalfEdge): boolean {\r\n if (!ear) {\r\n Triangulator.setDebugGraph(graph);\r\n return false;\r\n }\r\n\r\n let next;\r\n let next2;\r\n let pred;\r\n let maxCandidate = ear.countEdgesAroundFace();\r\n let numCandidate = 0;\r\n ear.clearMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n // iterate through ears, slicing them one by one\r\n while (!ear.isMaskSet(HalfEdgeMask.TRIANGULATED_FACE)) {\r\n pred = ear?.facePredecessor;\r\n next = ear.faceSuccessor;\r\n next2 = next.faceSuccessor;\r\n if (next === ear || next2 === ear)\r\n return true;\r\n if (next2.faceSuccessor === ear) {\r\n // if triangle, mask it so that its edges can potentially be flipped by doPostCutFlips()\r\n ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n return true;\r\n }\r\n // earcut does not support self intersections.\r\n // BUT .. maybe if we watch from the simplest case of next2 returning to pred it will catch some . . .\r\n // (no need to do flips -- we know it's already a triangle)\r\n // EDL Sept 2021 NO... coordinate test is fooled into early exit when large outer triangle has\r\n // edges going in from pred.\r\n // Hence add the around vertex test. But this is possibly vulnerable to a variant false positive ..\r\n if (Geometry.isAlmostEqualXAndY(next2, pred) && !next2.findAroundVertex (pred)) {\r\n HalfEdge.pinch(pred, next2);\r\n ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n ear = next2;\r\n continue;\r\n }\r\n if (++numCandidate > maxCandidate) {\r\n Triangulator.setDebugGraph(graph);\r\n return false;\r\n }\r\n if (Triangulator.isEar(ear)) {\r\n maxCandidate--;\r\n numCandidate = 0;\r\n\r\n // skipping the next vertices leads to less sliver triangles\r\n\r\n // If we already have a separated triangle, do not join\r\n if (ear.faceSuccessor.faceSuccessor !== ear.facePredecessor) {\r\n Triangulator.joinNeighborsOfEar(graph, ear);\r\n ear = Triangulator.doPostCutFlips(ear);\r\n ear = ear.faceSuccessor.edgeMate.faceSuccessor;\r\n // another step? Nate's 2017 code went one more.\r\n } else {\r\n ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n ear = next.faceSuccessor;\r\n }\r\n continue;\r\n }\r\n ear = next;\r\n }\r\n return true; // um .. I'm not sure what this state is.\r\n }\r\n /** @internal */\r\n private static sDebugGraph: HalfEdgeGraph | undefined;\r\n /** @internal */\r\n private static sEnableDebugGraphCapture = false;\r\n\r\n /**\r\n * * returns the (possibly undefined) debug graph.\r\n * * sets the debug graph to undefined.\r\n * * disables subsequent saving.\r\n * @internal */\r\n public static claimDebugGraph(): HalfEdgeGraph | undefined {\r\n const g = Triangulator.sDebugGraph;\r\n Triangulator.sDebugGraph = undefined;\r\n Triangulator.sEnableDebugGraphCapture = false;\r\n return g;\r\n }\r\n /** Call (from within the triangulator) to announce a graph to be saved for debug.\r\n * * If debug graph capture is not enabled, do nothing.\r\n * * If debug graph capture is enabled, save this graph.\r\n * * This is called by internal steps at point of failure to preserve the failing graph for unit test examination.\r\n * @internal */\r\n public static setDebugGraph(graph: HalfEdgeGraph | undefined) { if (Triangulator.sEnableDebugGraphCapture) Triangulator.sDebugGraph = graph; }\r\n /**\r\n * * Clear the debug graph\r\n * * Set capture enabled to indicated value.\r\n * * Intended use:\r\n * * By default \"enabled\" is false so there is no activity in the debug graph.\r\n * * A unit test which needs to see graph after failure calls clearAndEnableDebugGraphCapture (true)\r\n * * run the triangulation step\r\n * * call claimDebugGraph.\r\n * * claimDebugGraph reverts everything to default no-capture state.\r\n * @internal */\r\n public static clearAndEnableDebugGraphCapture(value: boolean) {\r\n Triangulator.sEnableDebugGraphCapture = value;\r\n Triangulator.sDebugGraph = undefined;\r\n }\r\n\r\n // for reuse over all calls to isEar ....\r\n private static _edgeInterval = Range1d.createNull();\r\n private static _earRange = Range2d.createNull();\r\n private static _edgeRange = Range2d.createNull();\r\n private static _planes: Plane3dByOriginAndUnitNormal[] = [\r\n Plane3dByOriginAndUnitNormal.createXYPlane(),\r\n Plane3dByOriginAndUnitNormal.createXYPlane(),\r\n Plane3dByOriginAndUnitNormal.createXYPlane(),\r\n ];\r\n /** Check whether a polygon node forms a valid ear with adjacent nodes */\r\n private static isEar(ear: HalfEdge) {\r\n const a = ear.facePredecessor;\r\n const b = ear;\r\n const c = ear.faceSuccessor;\r\n const area = Triangulator.signedTolerancedCCWTriangleArea(a, b, c);\r\n if (area <= 0)\r\n return false; // reflex, can't be an ear\r\n const planes = this._planes;\r\n if (!Plane3dByOriginAndUnitNormal.createOriginAndTargetXY(a, b, planes[0])\r\n || !Plane3dByOriginAndUnitNormal.createOriginAndTargetXY(b, c, planes[1])\r\n || !Plane3dByOriginAndUnitNormal.createOriginAndTargetXY(c, a, planes[2]))\r\n return false;\r\n\r\n // now make sure we don't have other points inside the potential ear, or edges crossing.\r\n const earRange = this._earRange;\r\n const edgeRange = this._edgeRange;\r\n const edgeInterval = this._edgeInterval;\r\n Range2d.createXYXYXY(a.x, a.y, b.x, b.y, c.x, c.y, earRange);\r\n earRange.expandInPlace(Geometry.smallMetricDistance);\r\n let p = c;\r\n const zeroPlus = 1.0e-8;\r\n const zeroMinus = -zeroPlus;\r\n const onePlus = 1.0 + zeroPlus;\r\n const oneMinus = 1.0 - zeroPlus;\r\n const clipTolerance = 1.0e-10 * area;\r\n while (p !== a) {\r\n const q = p.faceSuccessor;\r\n Range2d.createXYXY(p.x, p.y, q.x, q.y, edgeRange);\r\n if (earRange.intersectsRange(edgeRange)) {\r\n // Does pq impinge on the triangle?\r\n Range1d.createXX(zeroMinus, onePlus, edgeInterval);\r\n ClipUtilities.clipSegmentBelowPlanesXY(planes, p, q, edgeInterval, clipTolerance);\r\n if (!edgeInterval.isNull) {\r\n const mate = p.edgeMate;\r\n if (mate === a || mate === b) {\r\n // this is the back side of a bridge edge\r\n } else if (edgeInterval.low > oneMinus) {\r\n // the endpoint (q) just touches ... if it is at one of the vertex loops it's ok ...\r\n if (!a.findAroundVertex(q)\r\n && !b.findAroundVertex(q)\r\n && !c.findAroundVertex(q))\r\n return false;\r\n } else if (edgeInterval.high < zeroPlus) {\r\n // the start (p) just touches ... if it is at one of the vertex loops it's ok ...\r\n if (!a.findAroundVertex(p)\r\n && !b.findAroundVertex(p)\r\n && !c.findAroundVertex(p))\r\n return false;\r\n } else {\r\n // significant internal intersection -- this edge really intrudes on the into the triangle\r\n return false;\r\n }\r\n }\r\n }\r\n p = p.faceSuccessor;\r\n }\r\n return true;\r\n }\r\n /** link holeLoopNodes[1], holeLoopNodes[2] etc into the outer loop, producing a single-ring polygon without holes\r\n *\r\n */\r\n private static spliceLeftMostNodesOfHoles(graph: HalfEdgeGraph, outerNode: HalfEdge, leftMostHoleLoopNode: HalfEdge[]): HalfEdge | undefined {\r\n\r\n leftMostHoleLoopNode.sort((a, b) => Triangulator.compareX(a, b));\r\n let numFail = 0;\r\n // process holes from left to right\r\n for (const holeStart of leftMostHoleLoopNode) {\r\n if (!Triangulator.eliminateHole(graph, holeStart, outerNode))\r\n numFail++;\r\n }\r\n\r\n return numFail === 0 ? outerNode : undefined;\r\n }\r\n /** For use in sorting -- return (signed) difference (a.x - b.x) */\r\n private static compareX(a: HalfEdge, b: HalfEdge) {\r\n return a.x - b.x;\r\n }\r\n\r\n /** find a bridge between vertices that connects hole with an outer ring and and link it */\r\n private static eliminateHole(graph: HalfEdgeGraph, hole: HalfEdge, outerNode: HalfEdge): boolean {\r\n const outerNodeA = Triangulator.findHoleBridge(hole, outerNode);\r\n if (outerNodeA) {\r\n return Triangulator.splitFace(graph, outerNodeA, hole) !== undefined;\r\n }\r\n return false;\r\n }\r\n // cspell:word Eberly\r\n /**\r\n * David Eberly algorithm for finding a bridge between hole and outer polygon:\r\n * https://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf\r\n */\r\n private static findHoleBridge(hole: HalfEdge, outerNode?: HalfEdge): HalfEdge | undefined {\r\n let p = outerNode;\r\n\r\n if (!p)\r\n return undefined;\r\n\r\n const hx = hole.x;\r\n const hy = hole.y;\r\n let qx = -Infinity;\r\n let m;\r\n\r\n // find a segment intersected by a ray from the hole's leftmost point to the left;\r\n // segment's endpoint with lesser x will be potential connection point\r\n do {\r\n if (hy <= p.y && hy >= p.faceSuccessor.y && p.faceSuccessor.y !== p.y) {\r\n const x = p.x + (hy - p.y) * (p.faceSuccessor.x - p.x) / (p.faceSuccessor.y - p.y);\r\n if (x <= hx && x > qx) {\r\n qx = x;\r\n if (x === hx) {\r\n if (hy === p.y) return p;\r\n if (hy === p.faceSuccessor.y) return p.faceSuccessor;\r\n }\r\n m = p.x < p.faceSuccessor.x ? p : p.faceSuccessor;\r\n }\r\n }\r\n p = p.faceSuccessor;\r\n } while (p !== outerNode);\r\n\r\n if (!m) return undefined;\r\n\r\n if (hx === qx) return m.facePredecessor; // hole touches outer segment; pick lower endpoint\r\n\r\n // look for points inside the triangle of hole point, segment intersection and endpoint;\r\n // if there are no points found, we have a valid connection;\r\n // otherwise choose the point of the minimum angle with the ray as connection point\r\n\r\n const stop = m;\r\n const mx = m.x;\r\n const my = m.y;\r\n let tanMin = Infinity;\r\n let tan;\r\n\r\n p = m.faceSuccessor;\r\n\r\n while (p !== stop) {\r\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\r\n Triangulator.pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\r\n\r\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\r\n\r\n if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && Triangulator.locallyInside(p, hole)) {\r\n m = p;\r\n tanMin = tan;\r\n }\r\n }\r\n\r\n p = p.faceSuccessor;\r\n }\r\n\r\n return m;\r\n }\r\n\r\n // find the leftmost node of a polygon ring\r\n private static getLeftmost(start: HalfEdge) {\r\n let p = start;\r\n let leftmost = start;\r\n do {\r\n if (p.x < leftmost.x) leftmost = p;\r\n p = p.faceSuccessor;\r\n } while (p !== start);\r\n\r\n return leftmost;\r\n }\r\n\r\n /** check if a point lies within a convex triangle.\r\n * i.e. areas of 3 triangles with an edge of abc and p all have zero or positive area. (abp, bcp, cap)\r\n */\r\n private static pointInTriangle(ax: number, ay: number, bx: number, by: number, cx: number, cy: number, px: number, py: number) {\r\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\r\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\r\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\r\n }\r\n private static nodeInTriangle(a: HalfEdge, b: HalfEdge, c: HalfEdge, p: HalfEdge) {\r\n return Triangulator.signedTolerancedCCWTriangleArea(a, b, p) > 0\r\n && Triangulator.signedTolerancedCCWTriangleArea(b, c, p) > 0.0\r\n && Triangulator.signedTolerancedCCWTriangleArea(c, a, p) > 0.0;\r\n }\r\n /** signed area of a triangle\r\n * EDL 2/21 This is negative of usual CCW area. Beware in callers !!!\r\n * (This originates in classic earcut code.)\r\n */\r\n private static signedCWTriangleArea(p: HalfEdge, q: HalfEdge, r: HalfEdge) {\r\n return 0.5 * ((q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y));\r\n }\r\n\r\n /** signed area of a triangle, with small positive corrected to zero by relTol\r\n */\r\n private static signedTolerancedCCWTriangleArea(p: HalfEdge, q: HalfEdge, r: HalfEdge, relTol: number = 1.0e-12) {\r\n const ux = q.x - p.x;\r\n const uy = q.y - p.y;\r\n const vx = r.x - p.x;\r\n const vy = r.y - p.y;\r\n const area = 0.5 * (ux * vy - uy * vx);\r\n if (area < 0.0)\r\n return area;\r\n const uu = ux * ux + uy * uy;\r\n const vv = vx * vx + vy * vy;\r\n if (area < relTol * (uu + vv))\r\n return 0.0;\r\n return area;\r\n }\r\n\r\n /** check if two points are equal */\r\n private static isAlmostEqualXAndYXY(p1: XAndY, x: number, y: number) {\r\n return Geometry.isAlmostEqualNumber(p1.x, x) && Geometry.isAlmostEqualNumber(p1.y, y);\r\n }\r\n\r\n /** check if a b is inside the sector around a */\r\n private static locallyInside(a: HalfEdge, b: HalfEdge) {\r\n return Triangulator.signedCWTriangleArea(a.facePredecessor, a, a.faceSuccessor) < 0 ?\r\n Triangulator.signedCWTriangleArea(a, b, a.faceSuccessor) >= 0 && Triangulator.signedCWTriangleArea(a, a.facePredecessor, b) >= 0 :\r\n Triangulator.signedCWTriangleArea(a, b, a.facePredecessor) < 0 || Triangulator.signedCWTriangleArea(a, a.faceSuccessor, b) < 0;\r\n }\r\n\r\n /**\r\n * link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\r\n * if one belongs to the outer ring and another to a hole, it merges it into a single ring\r\n * * Returns the base of the new edge at the \"a\" end.\r\n * * \"a\" and \"b\" still represent the same physical pieces of edges\r\n * @returns Returns the (base of) the new half edge, at the \"a\" end.\r\n */\r\n private static splitFace(graph: HalfEdgeGraph, a: HalfEdge, b: HalfEdge): HalfEdge | undefined {\r\n if (HalfEdge.isNodeVisibleInSector(a, b) && HalfEdge.isNodeVisibleInSector(b, a)) {\r\n const a2 = graph.createEdgeXYZXYZ(a.x, a.y, a.z, a.i, b.x, b.y, b.z, b.i);\r\n const b2 = a2.faceSuccessor;\r\n HalfEdge.pinch(a, a2);\r\n HalfEdge.pinch(b, b2);\r\n return a2;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Triangulate a single face with (linear time) logic applicable only if the lowNode is the lowest node.\r\n * @returns false if any monotonicity condition is violated.\r\n */\r\n public static triangulateSingleMonotoneFace(graph: HalfEdgeGraph, start: HalfEdge): boolean {\r\n let left = start.facePredecessor;\r\n let right = start.faceSuccessor;\r\n // P0, P1, P2 are successive edges along evolving chain\r\n let upperSideOfNewEdge;\r\n while (left !== right\r\n && right !== start\r\n && right.faceSuccessor !== left) {\r\n /** These should not happen if face is monotone . .. */\r\n if (HalfEdge.crossProductXYAlongChain(left, start, right) <= 0)\r\n return false;\r\n if (!start.belowYX(left))\r\n return false;\r\n if (!start.belowYX(right))\r\n return false;\r\n if (left.belowYX(right)) {\r\n /* Triangulate to all left side edges that\r\n are below right */\r\n\r\n /* Phase 1: move upward, adding back edges\r\n when prior nodes are visible. */\r\n let P0 = left;\r\n let P1 = start;\r\n let P2 = right;\r\n /* Invariant: the path from P0 back to P1 is concave.\r\n Each loop pass moves P0 up the left side, filling in\r\n edges as needed. The right side edge\r\n (following start) is never altered.\r\n */\r\n while (P0 !== P2 && P0.belowYX(right)) {\r\n while (P2 !== right\r\n && P2 !== P0\r\n && P2 !== P1\r\n && HalfEdge.crossProductXYAlongChain(P0, P1, P2) > 0) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n P0 = upperSideOfNewEdge;\r\n P1 = P0.faceSuccessor;\r\n P2 = P1.faceSuccessor;\r\n }\r\n P2 = P1;\r\n P1 = P0;\r\n P0 = P0.facePredecessor;\r\n }\r\n /* Phase 2: Fan out edges from right to the\r\n left side. P0.P1.P2 describes a pair of\r\n adjacent edges at the bottom. */\r\n left = P1;\r\n P2 = right;\r\n P1 = P2.facePredecessor;\r\n P0 = P1.facePredecessor;\r\n while (P2.faceSuccessor !== P0 && P0 !== left) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n P1 = upperSideOfNewEdge;\r\n P0 = P1.facePredecessor;\r\n }\r\n /* Finish off with the last stroke from the\r\n left node to the right, except when already\r\n topped out */\r\n if (P2.faceSuccessor !== P0) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n P0 = upperSideOfNewEdge;\r\n }\r\n start = P0;\r\n right = start.faceSuccessor;\r\n left = start.facePredecessor;\r\n\r\n } else {\r\n /* Triangulate to all right side edges that\r\n are below left */\r\n\r\n /* Phase 1: move upward, adding back edges\r\n when prior nodes are visible. */\r\n let P0 = left;\r\n let P1 = start;\r\n let P2 = right;\r\n /* Invariant: the path up to P1 is concave.\r\n Each loop pass advances P1, filling in\r\n edges as needed. Note that the\r\n start edge may get hidden, so the\r\n bottom node must be referenced as\r\n left.faceSuccessor rather than as start.\r\n */\r\n while (P0 !== P2 && P2.belowYX(left)) {\r\n while (P0 !== left\r\n && P2 !== P0\r\n && P2 !== P1\r\n && HalfEdge.crossProductXYAlongChain(P0, P1, P2) > 0) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n\r\n P0 = upperSideOfNewEdge.facePredecessor;\r\n P1 = upperSideOfNewEdge;\r\n }\r\n P0 = P1;\r\n P1 = P2;\r\n P2 = P2.faceSuccessor;\r\n }\r\n /* Phase 2: Fan out edges from left to the\r\n right side. P0.P1.P2 describes a pair of\r\n adjacent edges at the bottom. */\r\n right = P1;\r\n P0 = left;\r\n P1 = P0.faceSuccessor;\r\n P2 = P1.faceSuccessor;\r\n while (P2.faceSuccessor !== P0 && P2 !== right) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n P0 = upperSideOfNewEdge;\r\n // P1 = P2; // original code (ported from native) carefully maintained P1..P2 relationship. But code analyzer says P1 is not used again. So skip it.\r\n P2 = P2.faceSuccessor;\r\n }\r\n /* Finish off with the last stroke from the\r\n left node to the right, except when already\r\n topped out */\r\n if (P2.faceSuccessor !== P0) {\r\n const newEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (newEdge === undefined)\r\n return false;\r\n }\r\n start = right;\r\n right = start.faceSuccessor;\r\n left = start.facePredecessor;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Internal class for assembling chains\r\n * @internal\r\n */\r\nclass AssembleXYZXYZChains extends PointStreamXYZXYZHandlerBase {\r\n // Add the starting nodes as the boundary, and apply initial masks to the primary edge and exteriors\r\n private _seeds?: HalfEdge[];\r\n private _baseNode: HalfEdge | undefined;\r\n private _nodeB: HalfEdge | undefined;\r\n private _nodeC: HalfEdge | undefined;\r\n private _graph: HalfEdgeGraph;\r\n private _id: any;\r\n public constructor(graph: HalfEdgeGraph, id: any) {\r\n super();\r\n this._graph = graph;\r\n this._id = id;\r\n }\r\n public override startChain(chainData: MultiLineStringDataVariant, isLeaf: boolean): void {\r\n super.startChain(chainData, isLeaf);\r\n this._baseNode = undefined;\r\n this._nodeB = undefined;\r\n }\r\n public override handleXYZXYZ(x0: number, y0: number, z0: number, x1: number, y1: number, z1: number) {\r\n this._nodeC = this._graph.createEdgeXYZXYZ(x0, y0, z0, this._id, x1, y1, z1, this._id);\r\n if (this._baseNode === undefined) {\r\n this._baseNode = this._nodeC;\r\n this._nodeB = this._baseNode.faceSuccessor;\r\n } else {\r\n HalfEdge.pinch(this._nodeB!, this._nodeC);\r\n this._nodeB = this._nodeC.faceSuccessor;\r\n }\r\n }\r\n public override endChain(chainData: MultiLineStringDataVariant, isLeaf: boolean): void {\r\n super.endChain(chainData, isLeaf);\r\n if (this._baseNode !== undefined) {\r\n if (this._seeds === undefined)\r\n this._seeds = [];\r\n this._seeds.push(this._baseNode);\r\n }\r\n this._baseNode = undefined;\r\n this._nodeB = undefined;\r\n this._nodeC = undefined;\r\n }\r\n public claimSeeds(): HalfEdge[] {\r\n if (this._seeds === undefined)\r\n return [];\r\n return this._seeds;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Triangulation.js","sourceRoot":"","sources":["../../../src/topology/Triangulation.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { ClipUtilities } from \"../clipping/ClipUtils\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { PointStreamXYZXYZHandlerBase, VariantPointDataStream } from \"../geometry3d/PointStreaming\";\r\nimport { Range1d, Range2d } from \"../geometry3d/Range\";\r\nimport { XAndY, XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { InsertAndRetriangulateContext } from \"./InsertAndRetriangulateContext\";\r\n\r\n/**\r\n * type for use as signature for xyz data of a single linestring appearing in a parameter list.\r\n * @public\r\n */\r\nexport type LineStringDataVariant = IndexedXYZCollection | XYAndZ[] | XAndY[] | number[][];\r\n\r\n/**\r\n * type for use as signature for multiple xyz data of multiple linestrings appearing in a parameter list.\r\n * @public\r\n */\r\nexport type MultiLineStringDataVariant = LineStringDataVariant | LineStringDataVariant[];\r\n\r\n/**\r\n * (static) methods for triangulating polygons\r\n * * @internal\r\n */\r\nexport class Triangulator {\r\n\r\n /** Given the six nodes that make up two bordering triangles, \"pinch\" and relocate the nodes to flip them\r\n * * The shared edge mates are c and e.\r\n * * (abc) are a triangle in CCW order\r\n * * (dfe) are a triangle in CCW order. (!! node dfe instead of def.)\r\n */\r\n private static flipEdgeBetweenTriangles(a: HalfEdge, b: HalfEdge, c: HalfEdge, d: HalfEdge, e: HalfEdge, f: HalfEdge) {\r\n // Reassign all of the pointers\r\n HalfEdge.pinch(a, e);\r\n HalfEdge.pinch(c, d);\r\n HalfEdge.pinch(f, c);\r\n HalfEdge.pinch(e, b);\r\n\r\n // Move alpha and beta into the xy coordinates of their predecessors\r\n e.x = b.x;\r\n e.y = b.y;\r\n e.z = b.z;\r\n e.i = b.i;\r\n c.i = f.i;\r\n c.x = f.x;\r\n c.y = f.y;\r\n c.z = f.z;\r\n }\r\n /**\r\n * * nodeA is a given node\r\n * * nodeA1 is its nodeA.faceSuccessor\r\n * * nodeA2 is nodeA1.faceSuccessor, i.e. 3rd node of triangle A\r\n * * nodeB is nodeA.edgeMate, i.e. a node in the \"other\" triangle at nodeA's edge\r\n * * nodeB1 is nodeB.faceSuccessor\r\n * * nodeB2 is nodeB1.faceSuccessor, i.e the 3rd node of triangle B\r\n * Construct (as simple doubles, to avoid object creation) xy vectors from:\r\n * * (ux,uy): nodeA to nodeA1, i.e. the shared edge\r\n * * (vx,vy): nodeA to nodeA2,\r\n * * (wx,wy): nodeA to nodeB2\r\n * * this determinant is positive if nodeA is \"in the circle\" of nodeB2, nodeA1, nodeA2\r\n * * Return true if clearly positive\r\n * * Return false if clearly negative or almost zero.\r\n * @param nodeA node on the diagonal edge of candidate for edge flip.\r\n */\r\n public static computeInCircleDeterminantIsStrongPositive(nodeA: HalfEdge): boolean {\r\n // Assume triangle A1,A2,B2 is ccw.\r\n // Shift the triangle to the origin (by negated A coords).\r\n // The Delaunay condition is computed by projecting the origin and the shifted triangle\r\n // points up to the paraboloid z = x*x + y*y. Due to the radially symmetric convexity of\r\n // this surface and the ccw orientation of this triangle, \"A is inside triangle A1,A2,B2\"\r\n // is equivalent to \"the volume of the parallelepiped formed by the projected points is\r\n // negative, as computed by the triple product.\"\r\n const nodeA1 = nodeA.faceSuccessor;\r\n const nodeA2 = nodeA1.faceSuccessor;\r\n if (nodeA2.faceSuccessor !== nodeA)\r\n return false;\r\n const nodeB = nodeA.edgeMate;\r\n const nodeB1 = nodeB.faceSuccessor;\r\n const nodeB2 = nodeB1.faceSuccessor;\r\n if (nodeB2.faceSuccessor !== nodeB)\r\n return false;\r\n const ux = nodeA1.x - nodeA.x;\r\n const uy = nodeA1.y - nodeA.y;\r\n const vx = nodeA2.x - nodeA.x;\r\n const vy = nodeA2.y - nodeA.y;\r\n if (Geometry.crossProductXYXY(ux, uy, vx, vy) < 0)\r\n return false;\r\n // we assume identical coordinates in pairs (nodeA, nodeB1) and (nodeA1, nodeB)\r\n const wx = nodeB2.x - nodeA.x;\r\n const wy = nodeB2.y - nodeA.y;\r\n const tx = wx * wx + wy * wy;\r\n const ty = vx * vx + vy * vy;\r\n const tz = ux * ux + uy * uy;\r\n const q = Geometry.tripleProduct(\r\n wx, wy, tx,\r\n vx, vy, ty,\r\n ux, uy, tz);\r\n if (q < 0)\r\n return false;\r\n const denom = Math.abs(wx * vy * tz) + Math.abs(wy * ty * ux) + Math.abs(tx * vx * uy)\r\n + Math.abs(wx * ty * uy) + Math.abs(wy * vx * tz) + Math.abs(tx * vy * ux);\r\n return q > 1.0e-12 * denom;\r\n }\r\n\r\n /**\r\n * * Visit each node of the graph array\r\n * * If a flip would be possible, test the results of flipping using incircle condition\r\n * * If revealed to be an improvement, conduct the flip, mark involved nodes as unvisited, and repeat until all nodes are visited\r\n */\r\n public static flipTriangles(graph: HalfEdgeGraph): number {\r\n const edgeSet = MarkedEdgeSet.create(graph)!;\r\n for (const node of graph.allHalfEdges)\r\n edgeSet.addToSet(node);\r\n const numFlip = this.flipTrianglesInEdgeSet(graph, edgeSet);\r\n edgeSet.teardown();\r\n return numFlip;\r\n }\r\n\r\n /**\r\n * * Visit each node of the graph array\r\n * * If a flip would be possible, test the results of flipping using incircle condition\r\n * * If revealed to be an improvement, conduct the flip, mark involved nodes as unvisited, and repeat until all nodes are visited\r\n */\r\n public static flipTrianglesInEdgeSet(graph: HalfEdgeGraph, edgeSet: MarkedEdgeSet): number {\r\n const barrierMasks = HalfEdgeMask.EXTERIOR | HalfEdgeMask.PRIMARY_EDGE | HalfEdgeMask.BOUNDARY_EDGE;\r\n\r\n const nodeArray = graph.allHalfEdges;\r\n const maxTest = 10.0 * nodeArray.length;\r\n let numFlip = 0;\r\n let numOK = 0;\r\n let node;\r\n while (undefined !== (node = edgeSet.chooseAndRemoveAny())) {\r\n\r\n if (node.isMaskSet(barrierMasks)) // Flip not allowed\r\n continue;\r\n\r\n if (Triangulator.computeInCircleDeterminantIsStrongPositive(node)) {\r\n // Flip the triangles\r\n Triangulator.flipEdgeBetweenTriangles(node.edgeMate.faceSuccessor, node.edgeMate.facePredecessor, node.edgeMate, node.faceSuccessor, node, node.facePredecessor);\r\n // keep looking at the 2 faces\r\n edgeSet.addAroundFace(node);\r\n edgeSet.addAroundFace(node.edgeMate);\r\n numFlip++;\r\n } else {\r\n numOK++;\r\n }\r\n if (numFlip + numOK > maxTest)\r\n break;\r\n }\r\n return numFlip;\r\n }\r\n\r\n /** Create a graph with a triangulation points.\r\n * * The outer limit of the graph is the convex hull of the points.\r\n * * The outside loop is marked `HalfEdgeMask.EXTERIOR`\r\n */\r\n public static createTriangulatedGraphFromPoints(points: Point3d[]): HalfEdgeGraph | undefined {\r\n if (points.length < 3)\r\n return undefined;\r\n const hull: Point3d[] = [];\r\n const interior: Point3d[] = [];\r\n Point3dArray.computeConvexHullXY(points, hull, interior, true);\r\n const graph = new HalfEdgeGraph();\r\n const context = InsertAndRetriangulateContext.create(graph);\r\n Triangulator.createFaceLoopFromCoordinates(graph, hull, true, true);\r\n // HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph);\r\n let numInsert = 0;\r\n for (const p of interior) {\r\n context.insertAndRetriangulate(p, true);\r\n numInsert++;\r\n if (numInsert > 16) {\r\n /*\r\n context.reset();\r\n Triangulator.flipTriangles(context.graph);\r\n // console.log (\" intermediate flips \" + numFlip);\r\n */\r\n numInsert = 0;\r\n }\r\n }\r\n /*\r\n // final touchup for aspect ratio flip\r\n for (let i = 0; i < 15; i++) {\r\n const numFlip = Triangulator.flipTriangles(graph);\r\n if (numFlip === 0)\r\n break;\r\n }\r\n */\r\n return graph;\r\n }\r\n /**\r\n * * Only one outer loop permitted.\r\n * * Largest area loop is assumed outer.\r\n * @param loops an array of loops\r\n * @returns triangulated graph, or undefined if bad data.\r\n */\r\n public static createTriangulatedGraphFromLoops(loops: LineStringDataVariant[]): HalfEdgeGraph | undefined {\r\n if (loops.length < 1)\r\n return undefined;\r\n const mask = HalfEdgeMask.BOUNDARY_EDGE | HalfEdgeMask.PRIMARY_EDGE;\r\n const graph = new HalfEdgeGraph();\r\n const holeSeeds: HalfEdge[] = [];\r\n let maxArea = -10000.0;\r\n let maxAreaIndex = -1;\r\n // collect all the loops with pointers to the positive (inside)\r\n // remember which one has largest area.\r\n for (let i = 0; i < loops.length; i++) {\r\n let seed = Triangulator.directCreateFaceLoopFromCoordinates(graph, loops[i]);\r\n if (seed) {\r\n seed = seed.faceSuccessor; // directCreate returns tail\r\n const mate = seed.vertexSuccessor;\r\n seed.setMaskAroundFace(mask);\r\n mate.setMaskAroundFace(mask);\r\n const signedFaceArea = seed.signedFaceArea();\r\n const area = Math.abs(signedFaceArea);\r\n holeSeeds.push(signedFaceArea >= 0 ? seed : mate);\r\n if (i === 0 || area > maxArea) {\r\n maxArea = area;\r\n maxAreaIndex = i;\r\n }\r\n }\r\n }\r\n if (holeSeeds.length === 0)\r\n return undefined;\r\n // extract the max area seed ...\r\n const maxAreaFace = holeSeeds[maxAreaIndex];\r\n holeSeeds[maxAreaIndex] = holeSeeds[holeSeeds.length - 1];\r\n holeSeeds.pop();\r\n maxAreaFace.vertexSuccessor.setMaskAroundFace(HalfEdgeMask.EXTERIOR);\r\n // The hole seeds all have inside nodes. Set mask there and jump to outside.\r\n for (let i = 0; i < holeSeeds.length; i++) {\r\n const seed = holeSeeds[i];\r\n seed.setMaskAroundFace(HalfEdgeMask.EXTERIOR);\r\n holeSeeds[i] = this.getLeftmost(seed.vertexSuccessor);\r\n }\r\n\r\n const startingNode = Triangulator.spliceLeftMostNodesOfHoles(graph, maxAreaFace, holeSeeds);\r\n if (startingNode) {\r\n if (Triangulator.triangulateSingleFace(graph, startingNode))\r\n return graph;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Triangulate all positive area faces of a graph.\r\n */\r\n public static triangulateAllPositiveAreaFaces(graph: HalfEdgeGraph): boolean {\r\n const seeds = graph.collectFaceLoops();\r\n let numFail = 0;\r\n for (const face of seeds) {\r\n if (face.countEdgesAroundFace() > 3) {\r\n const area = face.signedFaceArea();\r\n if (area > 0.0)\r\n if (!Triangulator.triangulateSingleFace(graph, face))\r\n numFail++;\r\n }\r\n }\r\n return numFail === 0;\r\n }\r\n\r\n /**\r\n * Triangulate the polygon made up of by a series of points.\r\n * * The loop may be either CCW or CW -- CCW order will be used for triangles.\r\n * * To triangulate a polygon with holes, use createTriangulatedGraphFromLoops\r\n */\r\n public static createTriangulatedGraphFromSingleLoop(data: LineStringDataVariant): HalfEdgeGraph | undefined {\r\n const graph = new HalfEdgeGraph();\r\n const startingNode = Triangulator.createFaceLoopFromCoordinates(graph, data, true, true);\r\n\r\n if (!startingNode || graph.countNodes() < 6)\r\n return undefined;\r\n\r\n if (!Triangulator.triangulateSingleFace(graph, startingNode))\r\n return undefined;\r\n\r\n Triangulator.flipTriangles(graph);\r\n return graph;\r\n }\r\n\r\n /**\r\n * cautiously split the edge starting at baseNode.\r\n * * If baseNode is null, create a trivial loop with the single vertex at xy\r\n * * if xy is distinct from the coordinates at both baseNode and its successor, insert xy as a new node within that edge.\r\n * * also include z coordinate if present.\r\n */\r\n private static interiorEdgeSplit(graph: HalfEdgeGraph, baseNode: HalfEdge | undefined, xy: XAndY | number[]): HalfEdge | undefined {\r\n let x = 0, y = 0, z = 0;\r\n if (Array.isArray(xy)) {\r\n x = xy[0];\r\n y = xy[1];\r\n z = xy.length > 2 ? xy[3] : 0.0;\r\n } else {\r\n const q = xy as any;\r\n if (q.hasOwnProperty(\"x\")) x = q.x;\r\n if (q.hasOwnProperty(\"y\")) y = q.y;\r\n if (q.hasOwnProperty(\"z\")) z = q.z;\r\n }\r\n if (!baseNode)\r\n return graph.splitEdge(baseNode, x, y, z);\r\n if (Triangulator.isAlmostEqualXAndYXY(baseNode, x, y))\r\n return baseNode;\r\n return graph.splitEdge(baseNode, x, y, z);\r\n }\r\n /** Return length of data without wraparound point(s), if present */\r\n private static getUnwrappedLength(data: LineStringDataVariant): number {\r\n let n = data.length;\r\n let x0: number, y0: number, x1: number, y1: number;\r\n while (n > 1) {\r\n if (data instanceof IndexedXYZCollection) {\r\n x0 = data.getXAtUncheckedPointIndex(0);\r\n y0 = data.getYAtUncheckedPointIndex(0);\r\n x1 = data.getXAtUncheckedPointIndex(n - 1);\r\n y1 = data.getYAtUncheckedPointIndex(n - 1);\r\n } else if (Geometry.isArrayOfNumberArray(data, n, 2)) {\r\n x0 = data[0][0];\r\n y0 = data[0][1];\r\n x1 = data[n - 1][0];\r\n y1 = data[n - 1][1];\r\n } else {\r\n x0 = data[0].x;\r\n y0 = data[0].y;\r\n x1 = data[n - 1].x;\r\n y1 = data[n - 1].y;\r\n }\r\n if (Geometry.isAlmostEqualNumber(x0, x1) && Geometry.isAlmostEqualNumber(y0, y1))\r\n --n;\r\n else\r\n break;\r\n }\r\n return n;\r\n }\r\n /** Create a loop from coordinates.\r\n * * Return a pointer to any node on the loop.\r\n * * no masking or other markup is applied.\r\n */\r\n public static directCreateFaceLoopFromCoordinates(graph: HalfEdgeGraph, data: LineStringDataVariant): HalfEdge | undefined {\r\n const n = this.getUnwrappedLength(data); // open it up to allow starting at a bridge edge\r\n let baseNode: HalfEdge | undefined;\r\n if (data instanceof IndexedXYZCollection) {\r\n const xyz = Point3d.create();\r\n for (let i = 0; i < n; i++) {\r\n data.getPoint3dAtCheckedPointIndex(i, xyz);\r\n baseNode = Triangulator.interiorEdgeSplit(graph, baseNode, xyz);\r\n }\r\n } else {\r\n for (let i = 0; i < n; i++)\r\n baseNode = Triangulator.interiorEdgeSplit(graph, baseNode, data[i]);\r\n }\r\n return baseNode;\r\n }\r\n\r\n /** Create chains from coordinates.\r\n * * Return array of pointers to base node of the chains.\r\n * * no masking or other markup is applied (save id).\r\n * @param graph New edges are built in this graph\r\n * @param data coordinate data\r\n * @param id id to attach to (both side of all) edges\r\n */\r\n public static directCreateChainsFromCoordinates(graph: HalfEdgeGraph, data: MultiLineStringDataVariant, id: number = 0): HalfEdge[] {\r\n const assembler = new AssembleXYZXYZChains(graph, id);\r\n VariantPointDataStream.streamXYZ(data, assembler);\r\n return assembler.claimSeeds();\r\n }\r\n\r\n /**\r\n * @param graph the containing graph\r\n * @param base The last node of a newly created loop. (i.e. its `faceSuccessor` has the start xy)\r\n * @param returnPositiveAreaLoop if true, return the start node on the side with positive area. otherwise return the left side as given.\r\n * @param maskForBothSides mask to apply on both sides.\r\n * @param maskForOtherSide mask to apply to the \"other\" side of the loop.\r\n * @return the loop's start node or its vertex successor, chosen to be the positive or negative loop per request.\r\n */\r\n private static maskAndOrientNewFaceLoop(_graph: HalfEdgeGraph, base: HalfEdge | undefined, returnPositiveAreaLoop: boolean,\r\n maskForBothSides: HalfEdgeMask,\r\n maskForOtherSide: HalfEdgeMask): HalfEdge | undefined {\r\n // base is the final coordinates\r\n if (base) {\r\n base = base.faceSuccessor; // because typical construction process leaves the \"live\" edge at the end of the loop.\r\n const area = base.signedFaceArea();\r\n const mate = base.edgeMate;\r\n if (maskForBothSides !== HalfEdgeMask.NULL_MASK) {\r\n base.setMaskAroundFace(maskForBothSides);\r\n mate.setMaskAroundFace(maskForBothSides);\r\n }\r\n\r\n let preferredNode = base;\r\n if (returnPositiveAreaLoop && (area < 0))\r\n preferredNode = mate;\r\n const otherNode = preferredNode.vertexSuccessor;\r\n\r\n if (maskForOtherSide !== HalfEdgeMask.NULL_MASK)\r\n otherNode.setMaskAroundFace(maskForOtherSide);\r\n return preferredNode;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * create a circular doubly linked list of internal and external nodes from polygon points in the specified winding order\r\n * * This applies the masks used by typical applications:\r\n * * HalfEdgeMask.BOUNDARY on both sides\r\n * * HalfEdgeMask.PRIMARY_EDGE on both sides.\r\n * * Use `createFaceLoopFromCoordinatesAndMasks` for detail control of masks.\r\n */\r\n public static createFaceLoopFromCoordinates(graph: HalfEdgeGraph, data: LineStringDataVariant, returnPositiveAreaLoop: boolean, markExterior: boolean): HalfEdge | undefined {\r\n const base = Triangulator.directCreateFaceLoopFromCoordinates(graph, data);\r\n return Triangulator.maskAndOrientNewFaceLoop(graph, base, returnPositiveAreaLoop,\r\n HalfEdgeMask.BOUNDARY_EDGE | HalfEdgeMask.PRIMARY_EDGE,\r\n markExterior ? HalfEdgeMask.EXTERIOR : HalfEdgeMask.NULL_MASK);\r\n }\r\n\r\n /**\r\n * create a circular doubly linked list of internal and external nodes from polygon points.\r\n * * Optionally jump to the \"other\" side so the returned loop has positive area\r\n * @param graph graph to receive the new edges\r\n * @param data array with x,y coordinates\r\n * @param returnPositiveAreaLoop if false, return an edge proceeding around the loop in the order given. If true, compute the loop area and flip return the side with positive area.\r\n * @param maskForBothSides mask to apply on both sides.\r\n * @param maskForOtherSide mask to apply on the \"other\" side from the returned loop.\r\n */\r\n public static createFaceLoopFromCoordinatesAndMasks(graph: HalfEdgeGraph, data: LineStringDataVariant, returnPositiveAreaLoop: boolean,\r\n maskForBothSides: HalfEdgeMask,\r\n maskForOtherSide: HalfEdgeMask): HalfEdge | undefined {\r\n const base = Triangulator.directCreateFaceLoopFromCoordinates(graph, data);\r\n return Triangulator.maskAndOrientNewFaceLoop(graph, base, returnPositiveAreaLoop, maskForBothSides, maskForOtherSide);\r\n }\r\n\r\n /** Cut off an ear, forming a new face loop of nodes\r\n * @param ear the vertex being cut off.\r\n * * Form two new nodes, alpha and beta, which have the coordinates one step away from the ear vertex.\r\n * * Reassigns the pointers such that beta is left behind with the new face created\r\n * * Reassigns the pointers such that alpha becomes the resulting missing node from the remaining polygon\r\n * * Reassigns prevZ and nextZ pointers\r\n */\r\n private static joinNeighborsOfEar(graph: HalfEdgeGraph, ear: HalfEdge) {\r\n const alpha = graph.createEdgeXYZXYZ(\r\n ear.facePredecessor.x, ear.facePredecessor.y, ear.facePredecessor.z, ear.facePredecessor.i,\r\n ear.faceSuccessor.x, ear.faceSuccessor.y, ear.faceSuccessor.z, ear.faceSuccessor.i);\r\n const beta = alpha.edgeMate;\r\n\r\n // Add two nodes alpha and beta and reassign pointers (also mark triangle nodes as part of triangle)\r\n HalfEdge.pinch(ear.faceSuccessor, beta);\r\n HalfEdge.pinch(ear.facePredecessor, alpha);\r\n ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n }\r\n private static isInteriorTriangle(a: HalfEdge) {\r\n if (!a.isMaskSet(HalfEdgeMask.TRIANGULATED_FACE) || a.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const b = a.faceSuccessor;\r\n if (!b.isMaskSet(HalfEdgeMask.TRIANGULATED_FACE) || b.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const c = b.faceSuccessor;\r\n if (!c.isMaskSet(HalfEdgeMask.TRIANGULATED_FACE) || c.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n return c.faceSuccessor === a;\r\n }\r\n\r\n /**\r\n * Perform 0, 1, or more edge flips to improve aspect ratio just behind an ear that was just cut.\r\n * @param ear the triangle corner which just served as the ear node.\r\n * @returns the node at the back corner after flipping.\"appropriately positioned\" node for the usual advance to ear.faceSuccessor.edgeMate.faceSuccessor.\r\n */\r\n private static doPostCutFlips(ear: HalfEdge) {\r\n // B is the ear -- inside a (probably newly created) triangle ABC\r\n // CA is the recently added cut edge.\r\n // AB is the candidate to be flipped.\r\n // triangle B1 A1 D is on the other side of AB\r\n // The condition for flipping is:\r\n // ! both triangles must be TRIANGULATED_NODE_MASK\r\n // ! incircle condition flags D as in the circle of ABC\r\n // after flip, node A moves to the vertex of D, and is the effective \"ear\", with the cap edge C A1\r\n // after flip, consider the A1 D (whose nodes are A1 and flipped A!!!)\r\n //\r\n // * *\r\n // . C0| . / |\r\n // . | . C0 /B1|\r\n // . | . /v |\r\n // . ^| . / |\r\n // . A0 ----> B0| . / ^|\r\n // *=======================* --> * A1 / B0*\r\n // \\ A1 <---- B1/ \\ / /\r\n // \\ / \\ / /\r\n // \\ / \\ ^/ D1/\r\n // \\ D1 / \\A0/ /\r\n // * *\r\n let b0 = ear;\r\n let a0 = b0.facePredecessor;\r\n let b1 = a0.edgeMate;\r\n while (Triangulator.isInteriorTriangle(a0) && Triangulator.isInteriorTriangle(b1)) {\r\n const detA = Triangulator.computeInCircleDeterminantIsStrongPositive(a0);\r\n if (!detA)\r\n break;\r\n // Flip the triangles\r\n const a1 = b1.faceSuccessor;\r\n Triangulator.flipEdgeBetweenTriangles(a1, a1.faceSuccessor, a1.facePredecessor, b0, b0.facePredecessor, b0.faceSuccessor);\r\n b0 = a0;\r\n a0 = b0.facePredecessor;\r\n b1 = a0.edgeMate;\r\n }\r\n return b0;\r\n }\r\n\r\n /**\r\n * main ear slicing loop which triangulates a polygon (given as a linked list)\r\n * While there still exists ear nodes that have not yet been triangulated...\r\n *\r\n * * Check if the ear is hashed, and can easily be split off. If so, \"join\" that ear.\r\n * * If not hashed, move on to a separate ear.\r\n * * If no ears are currently hashed, attempt to cure self intersections or split the polygon into two before continuing\r\n */\r\n private static triangulateSingleFace(graph: HalfEdgeGraph, ear?: HalfEdge): boolean {\r\n if (!ear) {\r\n Triangulator.setDebugGraph(graph);\r\n return false;\r\n }\r\n\r\n let next;\r\n let next2;\r\n let pred;\r\n let maxCandidate = ear.countEdgesAroundFace();\r\n let numCandidate = 0;\r\n ear.clearMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n // iterate through ears, slicing them one by one\r\n while (!ear.isMaskSet(HalfEdgeMask.TRIANGULATED_FACE)) {\r\n pred = ear?.facePredecessor;\r\n next = ear.faceSuccessor;\r\n next2 = next.faceSuccessor;\r\n if (next === ear || next2 === ear)\r\n return true;\r\n if (next2.faceSuccessor === ear) {\r\n // if triangle, mask it so that its edges can potentially be flipped by doPostCutFlips()\r\n ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n return true;\r\n }\r\n // The earcut algorithm does not support self intersections, however we do handle the re-entrant triangle\r\n // case by pinching a bridge/hole into existence when vertices i and i+3 live in the same face loop, but not\r\n // the same vertex loop. Earcut whittles larger faces down into triangles, so this is the only case needed.\r\n if (Geometry.isAlmostEqualXAndY(next2, pred) && !next2.findAroundVertex (pred)) {\r\n const next3 = next2.faceSuccessor;\r\n const hasBridgeEdgeOrHoleInside = this.nodeInTriangle(pred, ear, next, next3);\r\n if (hasBridgeEdgeOrHoleInside) {\r\n const nullOrHoleFace = next2.vertexPredecessor;\r\n HalfEdge.pinch(pred.vertexSuccessor, nullOrHoleFace); // keep pred and next2 in their face loop\r\n } else {\r\n HalfEdge.pinch(pred, next2); // pred and next2 split into different face loops\r\n ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n }\r\n ear = next2;\r\n continue;\r\n }\r\n if (++numCandidate > maxCandidate) {\r\n Triangulator.setDebugGraph(graph);\r\n return false;\r\n }\r\n if (Triangulator.isEar(ear)) {\r\n maxCandidate--;\r\n numCandidate = 0;\r\n\r\n // skipping the next vertices leads to less sliver triangles\r\n\r\n // If we already have a separated triangle, do not join\r\n if (ear.faceSuccessor.faceSuccessor !== ear.facePredecessor) {\r\n Triangulator.joinNeighborsOfEar(graph, ear);\r\n ear = Triangulator.doPostCutFlips(ear);\r\n ear = ear.faceSuccessor.edgeMate.faceSuccessor;\r\n // another step? Nate's 2017 code went one more.\r\n } else {\r\n ear.setMaskAroundFace(HalfEdgeMask.TRIANGULATED_FACE);\r\n ear = next.faceSuccessor;\r\n }\r\n continue;\r\n }\r\n ear = next;\r\n }\r\n return true; // um .. I'm not sure what this state is.\r\n }\r\n /** @internal */\r\n private static sDebugGraph: HalfEdgeGraph | undefined;\r\n /** @internal */\r\n private static sEnableDebugGraphCapture = false;\r\n\r\n /**\r\n * * returns the (possibly undefined) debug graph.\r\n * * sets the debug graph to undefined.\r\n * * disables subsequent saving.\r\n * @internal */\r\n public static claimDebugGraph(): HalfEdgeGraph | undefined {\r\n const g = Triangulator.sDebugGraph;\r\n Triangulator.sDebugGraph = undefined;\r\n Triangulator.sEnableDebugGraphCapture = false;\r\n return g;\r\n }\r\n /** Call (from within the triangulator) to announce a graph to be saved for debug.\r\n * * If debug graph capture is not enabled, do nothing.\r\n * * If debug graph capture is enabled, save this graph.\r\n * * This is called by internal steps at point of failure to preserve the failing graph for unit test examination.\r\n * @internal */\r\n public static setDebugGraph(graph: HalfEdgeGraph | undefined) { if (Triangulator.sEnableDebugGraphCapture) Triangulator.sDebugGraph = graph; }\r\n /**\r\n * * Clear the debug graph\r\n * * Set capture enabled to indicated value.\r\n * * Intended use:\r\n * * By default \"enabled\" is false so there is no activity in the debug graph.\r\n * * A unit test which needs to see graph after failure calls clearAndEnableDebugGraphCapture (true)\r\n * * run the triangulation step\r\n * * call claimDebugGraph.\r\n * * claimDebugGraph reverts everything to default no-capture state.\r\n * @internal */\r\n public static clearAndEnableDebugGraphCapture(value: boolean) {\r\n Triangulator.sEnableDebugGraphCapture = value;\r\n Triangulator.sDebugGraph = undefined;\r\n }\r\n\r\n /**\r\n * Whether a and b are in same vertex loop, or at the same xy location.\r\n * @internal\r\n */\r\n private static findAroundOrAtVertex(a: HalfEdge, b: HalfEdge): boolean {\r\n if (a.findAroundVertex(b))\r\n return true;\r\n return Geometry.isAlmostEqualXAndY(a, b);\r\n }\r\n\r\n // for reuse over all calls to isEar ....\r\n private static _edgeInterval = Range1d.createNull();\r\n private static _earRange = Range2d.createNull();\r\n private static _edgeRange = Range2d.createNull();\r\n private static _planes: Plane3dByOriginAndUnitNormal[] = [\r\n Plane3dByOriginAndUnitNormal.createXYPlane(),\r\n Plane3dByOriginAndUnitNormal.createXYPlane(),\r\n Plane3dByOriginAndUnitNormal.createXYPlane(),\r\n ];\r\n /** Check whether a polygon node forms a valid ear with adjacent nodes */\r\n private static isEar(ear: HalfEdge) {\r\n const a = ear.facePredecessor;\r\n const b = ear;\r\n const c = ear.faceSuccessor;\r\n const area = Triangulator.signedTolerancedCCWTriangleArea(a, b, c);\r\n if (area <= 0)\r\n return false; // reflex, can't be an ear\r\n const planes = this._planes;\r\n if (!Plane3dByOriginAndUnitNormal.createOriginAndTargetXY(a, b, planes[0])\r\n || !Plane3dByOriginAndUnitNormal.createOriginAndTargetXY(b, c, planes[1])\r\n || !Plane3dByOriginAndUnitNormal.createOriginAndTargetXY(c, a, planes[2]))\r\n return false;\r\n\r\n // now make sure we don't have other points inside the potential ear, or edges crossing.\r\n const earRange = this._earRange;\r\n const edgeRange = this._edgeRange;\r\n const edgeInterval = this._edgeInterval;\r\n Range2d.createXYXYXY(a.x, a.y, b.x, b.y, c.x, c.y, earRange);\r\n earRange.expandInPlace(Geometry.smallMetricDistance);\r\n let p = c;\r\n const zeroPlus = 1.0e-8;\r\n const zeroMinus = -zeroPlus;\r\n const onePlus = 1.0 + zeroPlus;\r\n const oneMinus = 1.0 - zeroPlus;\r\n const clipTolerance = 1.0e-10 * area;\r\n while (p !== a) {\r\n const q = p.faceSuccessor;\r\n Range2d.createXYXY(p.x, p.y, q.x, q.y, edgeRange);\r\n if (earRange.intersectsRange(edgeRange)) {\r\n // Does pq impinge on the triangle abc?\r\n Range1d.createXX(zeroMinus, onePlus, edgeInterval);\r\n ClipUtilities.clipSegmentBelowPlanesXY(planes, p, q, edgeInterval, clipTolerance);\r\n if (!edgeInterval.isNull) {\r\n if (edgeInterval.low > oneMinus) {\r\n // only q touches triangle abc, so b might still be an ear if q lies at a vertex\r\n if (!this.findAroundOrAtVertex(a, q)\r\n && !this.findAroundOrAtVertex(b, q)\r\n && !this.findAroundOrAtVertex(c, q))\r\n return false;\r\n } else if (edgeInterval.high < zeroPlus) {\r\n // only p touches triangle abc, so b might still be an ear if p lies at a vertex\r\n if (!this.findAroundOrAtVertex(a, p)\r\n && !this.findAroundOrAtVertex(b, p)\r\n && !this.findAroundOrAtVertex(c, p))\r\n return false;\r\n } else if (this.findAroundOrAtVertex(b, q) && this.findAroundOrAtVertex(c, p)) {\r\n // edge pq is the back side of bridge edge bc, so b might still be an ear\r\n } else if (this.findAroundOrAtVertex(a, q) && this.findAroundOrAtVertex(b, p)) {\r\n // edge pq is the back side of bridge edge ab, so b might still be an ear\r\n } else {\r\n return false; // edge pq intrudes into triangle abc, so b cannot be an ear\r\n }\r\n }\r\n }\r\n p = p.faceSuccessor;\r\n }\r\n return true;\r\n }\r\n /** link holeLoopNodes[1], holeLoopNodes[2] etc into the outer loop, producing a single-ring polygon without holes\r\n *\r\n */\r\n private static spliceLeftMostNodesOfHoles(graph: HalfEdgeGraph, outerNode: HalfEdge, leftMostHoleLoopNode: HalfEdge[]): HalfEdge | undefined {\r\n\r\n leftMostHoleLoopNode.sort((a, b) => Triangulator.compareX(a, b));\r\n let numFail = 0;\r\n // process holes from left to right\r\n for (const holeStart of leftMostHoleLoopNode) {\r\n if (!Triangulator.eliminateHole(graph, holeStart, outerNode))\r\n numFail++;\r\n }\r\n\r\n return numFail === 0 ? outerNode : undefined;\r\n }\r\n /** For use in sorting -- return (signed) difference (a.x - b.x) */\r\n private static compareX(a: HalfEdge, b: HalfEdge) {\r\n return a.x - b.x;\r\n }\r\n\r\n /** find a bridge between vertices that connects hole with an outer ring and and link it */\r\n private static eliminateHole(graph: HalfEdgeGraph, hole: HalfEdge, outerNode: HalfEdge): boolean {\r\n const outerNodeA = Triangulator.findHoleBridge(hole, outerNode);\r\n if (outerNodeA) {\r\n return Triangulator.splitFace(graph, outerNodeA, hole) !== undefined;\r\n }\r\n return false;\r\n }\r\n // cspell:word Eberly\r\n /**\r\n * David Eberly algorithm for finding a bridge between hole and outer polygon:\r\n * https://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf\r\n */\r\n private static findHoleBridge(hole: HalfEdge, outerNode?: HalfEdge): HalfEdge | undefined {\r\n let p = outerNode;\r\n\r\n if (!p)\r\n return undefined;\r\n\r\n const hx = hole.x;\r\n const hy = hole.y;\r\n let qx = -Infinity;\r\n let m;\r\n\r\n // find a segment intersected by a ray from the hole's leftmost point to the left;\r\n // segment's endpoint with lesser x will be potential connection point\r\n do {\r\n if (hy <= p.y && hy >= p.faceSuccessor.y && p.faceSuccessor.y !== p.y) {\r\n const x = p.x + (hy - p.y) * (p.faceSuccessor.x - p.x) / (p.faceSuccessor.y - p.y);\r\n if (x <= hx && x > qx) {\r\n qx = x;\r\n if (x === hx) {\r\n if (hy === p.y) return p;\r\n if (hy === p.faceSuccessor.y) return p.faceSuccessor;\r\n }\r\n m = p.x < p.faceSuccessor.x ? p : p.faceSuccessor;\r\n }\r\n }\r\n p = p.faceSuccessor;\r\n } while (p !== outerNode);\r\n\r\n if (!m) return undefined;\r\n\r\n if (hx === qx) return m.facePredecessor; // hole touches outer segment; pick lower endpoint\r\n\r\n // look for outer loop points p inside the triangle of hole point h, outer segment intersection (qx,hy), and outer segment endpoint m;\r\n // if there are no points found, we have a valid connection (m);\r\n // otherwise choose the point p with minimum angle with the ray as connection point\r\n\r\n const stop = m;\r\n const mx = m.x;\r\n const my = m.y;\r\n let tanMin = Infinity;\r\n let tan;\r\n\r\n p = m.faceSuccessor;\r\n\r\n while (p !== stop) {\r\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\r\n Triangulator.pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\r\n\r\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\r\n\r\n if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && Triangulator.locallyInside(p, hole)) {\r\n m = p;\r\n tanMin = tan;\r\n }\r\n }\r\n\r\n p = p.faceSuccessor;\r\n }\r\n\r\n return m;\r\n }\r\n\r\n // find the leftmost node of a polygon ring\r\n private static getLeftmost(start: HalfEdge) {\r\n let p = start;\r\n let leftmost = start;\r\n do {\r\n if (p.x < leftmost.x) leftmost = p;\r\n p = p.faceSuccessor;\r\n } while (p !== start);\r\n\r\n return leftmost;\r\n }\r\n\r\n /**\r\n * Check if a point lies within a triangle.\r\n * * In other words, the areas of the 3 triangles formed by an edge of abc and p all have zero or positive area.\r\n */\r\n private static pointInTriangle(ax: number, ay: number, bx: number, by: number, cx: number, cy: number, px: number, py: number) {\r\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\r\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\r\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\r\n }\r\n /** Check if node p lies strictly inside the triangle abc. */\r\n private static nodeInTriangle(a: HalfEdge, b: HalfEdge, c: HalfEdge, p: HalfEdge) {\r\n return Triangulator.signedTolerancedCCWTriangleArea(a, b, p) > 0\r\n && Triangulator.signedTolerancedCCWTriangleArea(b, c, p) > 0\r\n && Triangulator.signedTolerancedCCWTriangleArea(c, a, p) > 0;\r\n }\r\n /** signed area of a triangle\r\n * EDL 2/21 This is negative of usual CCW area. Beware in callers !!!\r\n * (This originates in classic earcut code.)\r\n */\r\n private static signedCWTriangleArea(p: HalfEdge, q: HalfEdge, r: HalfEdge) {\r\n return 0.5 * ((q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y));\r\n }\r\n\r\n /** signed area of a triangle, with small positive corrected to zero by relTol\r\n */\r\n private static signedTolerancedCCWTriangleArea(p: HalfEdge, q: HalfEdge, r: HalfEdge, relTol: number = 1.0e-12) {\r\n const ux = q.x - p.x;\r\n const uy = q.y - p.y;\r\n const vx = r.x - p.x;\r\n const vy = r.y - p.y;\r\n const area = 0.5 * (ux * vy - uy * vx);\r\n if (area < 0.0)\r\n return area;\r\n const uu = ux * ux + uy * uy;\r\n const vv = vx * vx + vy * vy;\r\n if (area < relTol * (uu + vv))\r\n return 0.0;\r\n return area;\r\n }\r\n\r\n /** check if two points are equal */\r\n private static isAlmostEqualXAndYXY(p1: XAndY, x: number, y: number) {\r\n return Geometry.isAlmostEqualNumber(p1.x, x) && Geometry.isAlmostEqualNumber(p1.y, y);\r\n }\r\n\r\n /** check if a b is inside the sector around a */\r\n private static locallyInside(a: HalfEdge, b: HalfEdge) {\r\n return Triangulator.signedCWTriangleArea(a.facePredecessor, a, a.faceSuccessor) < 0 ?\r\n Triangulator.signedCWTriangleArea(a, b, a.faceSuccessor) >= 0 && Triangulator.signedCWTriangleArea(a, a.facePredecessor, b) >= 0 :\r\n Triangulator.signedCWTriangleArea(a, b, a.facePredecessor) < 0 || Triangulator.signedCWTriangleArea(a, a.faceSuccessor, b) < 0;\r\n }\r\n\r\n /**\r\n * link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\r\n * if one belongs to the outer ring and another to a hole, it merges it into a single ring\r\n * * Returns the base of the new edge at the \"a\" end.\r\n * * \"a\" and \"b\" still represent the same physical pieces of edges\r\n * @returns Returns the (base of) the new half edge, at the \"a\" end.\r\n */\r\n private static splitFace(graph: HalfEdgeGraph, a: HalfEdge, b: HalfEdge): HalfEdge | undefined {\r\n if (HalfEdge.isNodeVisibleInSector(a, b) && HalfEdge.isNodeVisibleInSector(b, a)) {\r\n const a2 = graph.createEdgeXYZXYZ(a.x, a.y, a.z, a.i, b.x, b.y, b.z, b.i);\r\n const b2 = a2.faceSuccessor;\r\n HalfEdge.pinch(a, a2);\r\n HalfEdge.pinch(b, b2);\r\n return a2;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Triangulate a single face with (linear time) logic applicable only if the lowNode is the lowest node.\r\n * @returns false if any monotonicity condition is violated.\r\n */\r\n public static triangulateSingleMonotoneFace(graph: HalfEdgeGraph, start: HalfEdge): boolean {\r\n let left = start.facePredecessor;\r\n let right = start.faceSuccessor;\r\n // P0, P1, P2 are successive edges along evolving chain\r\n let upperSideOfNewEdge;\r\n while (left !== right\r\n && right !== start\r\n && right.faceSuccessor !== left) {\r\n /** These should not happen if face is monotone . .. */\r\n if (HalfEdge.crossProductXYAlongChain(left, start, right) <= 0)\r\n return false;\r\n if (!start.belowYX(left))\r\n return false;\r\n if (!start.belowYX(right))\r\n return false;\r\n if (left.belowYX(right)) {\r\n /* Triangulate to all left side edges that\r\n are below right */\r\n\r\n /* Phase 1: move upward, adding back edges\r\n when prior nodes are visible. */\r\n let P0 = left;\r\n let P1 = start;\r\n let P2 = right;\r\n /* Invariant: the path from P0 back to P1 is concave.\r\n Each loop pass moves P0 up the left side, filling in\r\n edges as needed. The right side edge\r\n (following start) is never altered.\r\n */\r\n while (P0 !== P2 && P0.belowYX(right)) {\r\n while (P2 !== right\r\n && P2 !== P0\r\n && P2 !== P1\r\n && HalfEdge.crossProductXYAlongChain(P0, P1, P2) > 0) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n P0 = upperSideOfNewEdge;\r\n P1 = P0.faceSuccessor;\r\n P2 = P1.faceSuccessor;\r\n }\r\n P2 = P1;\r\n P1 = P0;\r\n P0 = P0.facePredecessor;\r\n }\r\n /* Phase 2: Fan out edges from right to the\r\n left side. P0.P1.P2 describes a pair of\r\n adjacent edges at the bottom. */\r\n left = P1;\r\n P2 = right;\r\n P1 = P2.facePredecessor;\r\n P0 = P1.facePredecessor;\r\n while (P2.faceSuccessor !== P0 && P0 !== left) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n P1 = upperSideOfNewEdge;\r\n P0 = P1.facePredecessor;\r\n }\r\n /* Finish off with the last stroke from the\r\n left node to the right, except when already\r\n topped out */\r\n if (P2.faceSuccessor !== P0) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n P0 = upperSideOfNewEdge;\r\n }\r\n start = P0;\r\n right = start.faceSuccessor;\r\n left = start.facePredecessor;\r\n\r\n } else {\r\n /* Triangulate to all right side edges that\r\n are below left */\r\n\r\n /* Phase 1: move upward, adding back edges\r\n when prior nodes are visible. */\r\n let P0 = left;\r\n let P1 = start;\r\n let P2 = right;\r\n /* Invariant: the path up to P1 is concave.\r\n Each loop pass advances P1, filling in\r\n edges as needed. Note that the\r\n start edge may get hidden, so the\r\n bottom node must be referenced as\r\n left.faceSuccessor rather than as start.\r\n */\r\n while (P0 !== P2 && P2.belowYX(left)) {\r\n while (P0 !== left\r\n && P2 !== P0\r\n && P2 !== P1\r\n && HalfEdge.crossProductXYAlongChain(P0, P1, P2) > 0) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n\r\n P0 = upperSideOfNewEdge.facePredecessor;\r\n P1 = upperSideOfNewEdge;\r\n }\r\n P0 = P1;\r\n P1 = P2;\r\n P2 = P2.faceSuccessor;\r\n }\r\n /* Phase 2: Fan out edges from left to the\r\n right side. P0.P1.P2 describes a pair of\r\n adjacent edges at the bottom. */\r\n right = P1;\r\n P0 = left;\r\n P1 = P0.faceSuccessor;\r\n P2 = P1.faceSuccessor;\r\n while (P2.faceSuccessor !== P0 && P2 !== right) {\r\n upperSideOfNewEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (upperSideOfNewEdge === undefined)\r\n return false;\r\n P0 = upperSideOfNewEdge;\r\n // P1 = P2; // original code (ported from native) carefully maintained P1..P2 relationship. But code analyzer says P1 is not used again. So skip it.\r\n P2 = P2.faceSuccessor;\r\n }\r\n /* Finish off with the last stroke from the\r\n left node to the right, except when already\r\n topped out */\r\n if (P2.faceSuccessor !== P0) {\r\n const newEdge = Triangulator.splitFace(graph, P0, P2);\r\n if (newEdge === undefined)\r\n return false;\r\n }\r\n start = right;\r\n right = start.faceSuccessor;\r\n left = start.facePredecessor;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Internal class for assembling chains\r\n * @internal\r\n */\r\nclass AssembleXYZXYZChains extends PointStreamXYZXYZHandlerBase {\r\n // Add the starting nodes as the boundary, and apply initial masks to the primary edge and exteriors\r\n private _seeds?: HalfEdge[];\r\n private _baseNode: HalfEdge | undefined;\r\n private _nodeB: HalfEdge | undefined;\r\n private _nodeC: HalfEdge | undefined;\r\n private _graph: HalfEdgeGraph;\r\n private _id: any;\r\n public constructor(graph: HalfEdgeGraph, id: any) {\r\n super();\r\n this._graph = graph;\r\n this._id = id;\r\n }\r\n public override startChain(chainData: MultiLineStringDataVariant, isLeaf: boolean): void {\r\n super.startChain(chainData, isLeaf);\r\n this._baseNode = undefined;\r\n this._nodeB = undefined;\r\n }\r\n public override handleXYZXYZ(x0: number, y0: number, z0: number, x1: number, y1: number, z1: number) {\r\n this._nodeC = this._graph.createEdgeXYZXYZ(x0, y0, z0, this._id, x1, y1, z1, this._id);\r\n if (this._baseNode === undefined) {\r\n this._baseNode = this._nodeC;\r\n this._nodeB = this._baseNode.faceSuccessor;\r\n } else {\r\n HalfEdge.pinch(this._nodeB!, this._nodeC);\r\n this._nodeB = this._nodeC.faceSuccessor;\r\n }\r\n }\r\n public override endChain(chainData: MultiLineStringDataVariant, isLeaf: boolean): void {\r\n super.endChain(chainData, isLeaf);\r\n if (this._baseNode !== undefined) {\r\n if (this._seeds === undefined)\r\n this._seeds = [];\r\n this._seeds.push(this._baseNode);\r\n }\r\n this._baseNode = undefined;\r\n this._nodeB = undefined;\r\n this._nodeC = undefined;\r\n }\r\n public claimSeeds(): HalfEdge[] {\r\n if (this._seeds === undefined)\r\n return [];\r\n return this._seeds;\r\n }\r\n}\r\n"]}