@itwin/core-geometry 4.9.0-dev.8 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/CHANGELOG.md +41 -1
  2. package/lib/cjs/Geometry.d.ts +57 -46
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +73 -53
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/curve/Arc3d.d.ts +141 -38
  7. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  8. package/lib/cjs/curve/Arc3d.js +219 -31
  9. package/lib/cjs/curve/Arc3d.js.map +1 -1
  10. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +11 -6
  11. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  12. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +12 -10
  13. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  14. package/lib/cjs/curve/CurveCollection.d.ts +2 -1
  15. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  16. package/lib/cjs/curve/CurveCollection.js +2 -1
  17. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  18. package/lib/cjs/curve/CurveCurve.d.ts +11 -9
  19. package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
  20. package/lib/cjs/curve/CurveCurve.js +11 -9
  21. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  22. package/lib/cjs/curve/CurveFactory.d.ts +4 -3
  23. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  24. package/lib/cjs/curve/CurveFactory.js +4 -3
  25. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  26. package/lib/cjs/curve/CurveLocationDetail.d.ts +19 -1
  27. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  28. package/lib/cjs/curve/CurveLocationDetail.js +39 -0
  29. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  30. package/lib/cjs/curve/CurveOps.d.ts +4 -4
  31. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  32. package/lib/cjs/curve/CurveOps.js +6 -6
  33. package/lib/cjs/curve/CurveOps.js.map +1 -1
  34. package/lib/cjs/curve/CurvePrimitive.d.ts +1 -1
  35. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  36. package/lib/cjs/curve/LineString3d.d.ts +7 -5
  37. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  38. package/lib/cjs/curve/LineString3d.js +8 -6
  39. package/lib/cjs/curve/LineString3d.js.map +1 -1
  40. package/lib/cjs/curve/Loop.d.ts.map +1 -1
  41. package/lib/cjs/curve/Loop.js +6 -6
  42. package/lib/cjs/curve/Loop.js.map +1 -1
  43. package/lib/cjs/curve/OffsetOptions.d.ts +1 -1
  44. package/lib/cjs/curve/OffsetOptions.js +1 -1
  45. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  46. package/lib/cjs/curve/Path.d.ts.map +1 -1
  47. package/lib/cjs/curve/Path.js +5 -6
  48. package/lib/cjs/curve/Path.js.map +1 -1
  49. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  50. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -4
  51. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  52. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  53. package/lib/cjs/curve/RegionOps.d.ts +4 -3
  54. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  55. package/lib/cjs/curve/RegionOps.js +4 -3
  56. package/lib/cjs/curve/RegionOps.js.map +1 -1
  57. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +23 -7
  58. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  59. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
  60. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  61. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +22 -8
  62. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  63. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +127 -52
  64. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  65. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
  66. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
  67. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js +1000 -0
  68. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
  69. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +11 -8
  70. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  71. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +7 -4
  72. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  73. package/lib/cjs/geometry3d/Angle.d.ts +18 -5
  74. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  75. package/lib/cjs/geometry3d/Angle.js +23 -7
  76. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  77. package/lib/cjs/geometry3d/AngleSweep.d.ts +14 -1
  78. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  79. package/lib/cjs/geometry3d/AngleSweep.js +47 -12
  80. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  81. package/lib/cjs/geometry3d/FrameBuilder.d.ts +2 -1
  82. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  83. package/lib/cjs/geometry3d/FrameBuilder.js +12 -10
  84. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  85. package/lib/cjs/geometry3d/GeometryHandler.d.ts.map +1 -1
  86. package/lib/cjs/geometry3d/GeometryHandler.js +1 -7
  87. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  88. package/lib/cjs/geometry3d/Matrix3d.d.ts +6 -4
  89. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  90. package/lib/cjs/geometry3d/Matrix3d.js +6 -4
  91. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  92. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +5 -5
  93. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  94. package/lib/cjs/geometry3d/Point3dVector3d.js +5 -5
  95. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  96. package/lib/cjs/geometry3d/PointHelpers.d.ts +6 -5
  97. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  98. package/lib/cjs/geometry3d/PointHelpers.js +11 -10
  99. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  100. package/lib/cjs/geometry3d/PolygonOps.d.ts +4 -4
  101. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  102. package/lib/cjs/geometry3d/PolygonOps.js +7 -11
  103. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  104. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +1 -1
  105. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  106. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +3 -3
  107. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  108. package/lib/cjs/geometry3d/Range.d.ts +6 -1
  109. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  110. package/lib/cjs/geometry3d/Range.js +9 -3
  111. package/lib/cjs/geometry3d/Range.js.map +1 -1
  112. package/lib/cjs/geometry3d/Ray3d.d.ts +1 -1
  113. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  114. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  115. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  116. package/lib/cjs/geometry3d/Transform.js +1 -1
  117. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  118. package/lib/cjs/numerics/Newton.d.ts +3 -3
  119. package/lib/cjs/numerics/Newton.d.ts.map +1 -1
  120. package/lib/cjs/numerics/Newton.js +14 -16
  121. package/lib/cjs/numerics/Newton.js.map +1 -1
  122. package/lib/cjs/numerics/Polynomials.d.ts +2 -2
  123. package/lib/cjs/numerics/Polynomials.js +2 -2
  124. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  125. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +7 -4
  126. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  127. package/lib/cjs/polyface/PolyfaceBuilder.js +11 -6
  128. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  129. package/lib/cjs/polyface/PolyfaceClip.d.ts +13 -10
  130. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  131. package/lib/cjs/polyface/PolyfaceClip.js +17 -14
  132. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  133. package/lib/cjs/polyface/PolyfaceQuery.d.ts +11 -14
  134. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  135. package/lib/cjs/polyface/PolyfaceQuery.js +59 -52
  136. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  137. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  138. package/lib/cjs/serialization/BGFBWriter.js +2 -2
  139. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  140. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  141. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  142. package/lib/cjs/solid/SweepContour.js +0 -4
  143. package/lib/cjs/solid/SweepContour.js.map +1 -1
  144. package/lib/cjs/topology/Graph.d.ts +1 -1
  145. package/lib/cjs/topology/Graph.js +2 -2
  146. package/lib/cjs/topology/Graph.js.map +1 -1
  147. package/lib/cjs/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
  148. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js +1 -1
  149. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  150. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
  151. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  152. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +168 -127
  153. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  154. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts +35 -35
  155. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  156. package/lib/cjs/topology/HalfEdgePositionDetail.js +63 -41
  157. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  158. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts +64 -12
  159. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  160. package/lib/cjs/topology/InsertAndRetriangulateContext.js +174 -75
  161. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  162. package/lib/cjs/topology/Merging.d.ts +2 -2
  163. package/lib/cjs/topology/Merging.js +2 -2
  164. package/lib/cjs/topology/Merging.js.map +1 -1
  165. package/lib/cjs/topology/Triangulation.d.ts +16 -10
  166. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  167. package/lib/cjs/topology/Triangulation.js +23 -30
  168. package/lib/cjs/topology/Triangulation.js.map +1 -1
  169. package/lib/esm/Geometry.d.ts +57 -46
  170. package/lib/esm/Geometry.d.ts.map +1 -1
  171. package/lib/esm/Geometry.js +73 -53
  172. package/lib/esm/Geometry.js.map +1 -1
  173. package/lib/esm/curve/Arc3d.d.ts +141 -38
  174. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  175. package/lib/esm/curve/Arc3d.js +217 -30
  176. package/lib/esm/curve/Arc3d.js.map +1 -1
  177. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +11 -6
  178. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  179. package/lib/esm/curve/CurveChainWithDistanceIndex.js +12 -10
  180. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  181. package/lib/esm/curve/CurveCollection.d.ts +2 -1
  182. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  183. package/lib/esm/curve/CurveCollection.js +2 -1
  184. package/lib/esm/curve/CurveCollection.js.map +1 -1
  185. package/lib/esm/curve/CurveCurve.d.ts +11 -9
  186. package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
  187. package/lib/esm/curve/CurveCurve.js +11 -9
  188. package/lib/esm/curve/CurveCurve.js.map +1 -1
  189. package/lib/esm/curve/CurveFactory.d.ts +4 -3
  190. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  191. package/lib/esm/curve/CurveFactory.js +4 -3
  192. package/lib/esm/curve/CurveFactory.js.map +1 -1
  193. package/lib/esm/curve/CurveLocationDetail.d.ts +19 -1
  194. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  195. package/lib/esm/curve/CurveLocationDetail.js +39 -0
  196. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  197. package/lib/esm/curve/CurveOps.d.ts +4 -4
  198. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  199. package/lib/esm/curve/CurveOps.js +6 -6
  200. package/lib/esm/curve/CurveOps.js.map +1 -1
  201. package/lib/esm/curve/CurvePrimitive.d.ts +1 -1
  202. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  203. package/lib/esm/curve/LineString3d.d.ts +7 -5
  204. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  205. package/lib/esm/curve/LineString3d.js +8 -6
  206. package/lib/esm/curve/LineString3d.js.map +1 -1
  207. package/lib/esm/curve/Loop.d.ts.map +1 -1
  208. package/lib/esm/curve/Loop.js +6 -6
  209. package/lib/esm/curve/Loop.js.map +1 -1
  210. package/lib/esm/curve/OffsetOptions.d.ts +1 -1
  211. package/lib/esm/curve/OffsetOptions.js +1 -1
  212. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  213. package/lib/esm/curve/Path.d.ts.map +1 -1
  214. package/lib/esm/curve/Path.js +5 -6
  215. package/lib/esm/curve/Path.js.map +1 -1
  216. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  217. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -4
  218. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  219. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  220. package/lib/esm/curve/RegionOps.d.ts +4 -3
  221. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  222. package/lib/esm/curve/RegionOps.js +4 -3
  223. package/lib/esm/curve/RegionOps.js.map +1 -1
  224. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +23 -7
  225. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  226. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
  227. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  228. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +22 -8
  229. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  230. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +127 -52
  231. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  232. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
  233. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
  234. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js +995 -0
  235. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
  236. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +11 -8
  237. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  238. package/lib/esm/curve/internalContexts/MultiChainCollector.js +7 -4
  239. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  240. package/lib/esm/geometry3d/Angle.d.ts +18 -5
  241. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  242. package/lib/esm/geometry3d/Angle.js +23 -7
  243. package/lib/esm/geometry3d/Angle.js.map +1 -1
  244. package/lib/esm/geometry3d/AngleSweep.d.ts +14 -1
  245. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  246. package/lib/esm/geometry3d/AngleSweep.js +47 -12
  247. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  248. package/lib/esm/geometry3d/FrameBuilder.d.ts +2 -1
  249. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  250. package/lib/esm/geometry3d/FrameBuilder.js +12 -10
  251. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  252. package/lib/esm/geometry3d/GeometryHandler.d.ts.map +1 -1
  253. package/lib/esm/geometry3d/GeometryHandler.js +1 -7
  254. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  255. package/lib/esm/geometry3d/Matrix3d.d.ts +6 -4
  256. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  257. package/lib/esm/geometry3d/Matrix3d.js +6 -4
  258. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  259. package/lib/esm/geometry3d/Point3dVector3d.d.ts +5 -5
  260. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  261. package/lib/esm/geometry3d/Point3dVector3d.js +5 -5
  262. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  263. package/lib/esm/geometry3d/PointHelpers.d.ts +6 -5
  264. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  265. package/lib/esm/geometry3d/PointHelpers.js +11 -10
  266. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  267. package/lib/esm/geometry3d/PolygonOps.d.ts +4 -4
  268. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  269. package/lib/esm/geometry3d/PolygonOps.js +7 -11
  270. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  271. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +1 -1
  272. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  273. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +3 -3
  274. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  275. package/lib/esm/geometry3d/Range.d.ts +6 -1
  276. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  277. package/lib/esm/geometry3d/Range.js +9 -3
  278. package/lib/esm/geometry3d/Range.js.map +1 -1
  279. package/lib/esm/geometry3d/Ray3d.d.ts +1 -1
  280. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  281. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  282. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  283. package/lib/esm/geometry3d/Transform.js +1 -1
  284. package/lib/esm/geometry3d/Transform.js.map +1 -1
  285. package/lib/esm/numerics/Newton.d.ts +3 -3
  286. package/lib/esm/numerics/Newton.d.ts.map +1 -1
  287. package/lib/esm/numerics/Newton.js +14 -16
  288. package/lib/esm/numerics/Newton.js.map +1 -1
  289. package/lib/esm/numerics/Polynomials.d.ts +2 -2
  290. package/lib/esm/numerics/Polynomials.js +2 -2
  291. package/lib/esm/numerics/Polynomials.js.map +1 -1
  292. package/lib/esm/polyface/PolyfaceBuilder.d.ts +7 -4
  293. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  294. package/lib/esm/polyface/PolyfaceBuilder.js +11 -6
  295. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  296. package/lib/esm/polyface/PolyfaceClip.d.ts +13 -10
  297. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  298. package/lib/esm/polyface/PolyfaceClip.js +17 -14
  299. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  300. package/lib/esm/polyface/PolyfaceQuery.d.ts +11 -14
  301. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  302. package/lib/esm/polyface/PolyfaceQuery.js +59 -52
  303. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  304. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  305. package/lib/esm/serialization/BGFBWriter.js +2 -2
  306. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  307. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  308. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  309. package/lib/esm/solid/SweepContour.js +0 -4
  310. package/lib/esm/solid/SweepContour.js.map +1 -1
  311. package/lib/esm/topology/Graph.d.ts +1 -1
  312. package/lib/esm/topology/Graph.js +2 -2
  313. package/lib/esm/topology/Graph.js.map +1 -1
  314. package/lib/esm/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
  315. package/lib/esm/topology/HalfEdgeNodeXYZUV.js +1 -1
  316. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  317. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
  318. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  319. package/lib/esm/topology/HalfEdgePointInGraphSearch.js +168 -127
  320. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  321. package/lib/esm/topology/HalfEdgePositionDetail.d.ts +35 -35
  322. package/lib/esm/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  323. package/lib/esm/topology/HalfEdgePositionDetail.js +63 -41
  324. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  325. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts +64 -12
  326. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  327. package/lib/esm/topology/InsertAndRetriangulateContext.js +173 -74
  328. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  329. package/lib/esm/topology/Merging.d.ts +2 -2
  330. package/lib/esm/topology/Merging.js +2 -2
  331. package/lib/esm/topology/Merging.js.map +1 -1
  332. package/lib/esm/topology/Triangulation.d.ts +16 -10
  333. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  334. package/lib/esm/topology/Triangulation.js +24 -31
  335. package/lib/esm/topology/Triangulation.js.map +1 -1
  336. package/package.json +3 -3
@@ -7,8 +7,11 @@
7
7
  * @module Topology
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.InsertAndRetriangulateContext = void 0;
10
+ exports.InsertAndRetriangulateContext = exports.InsertedVertexZOptions = void 0;
11
+ const core_bentley_1 = require("@itwin/core-bentley");
12
+ const Geometry_1 = require("../Geometry");
11
13
  const Point3dVector3d_1 = require("../geometry3d/Point3dVector3d");
14
+ const PolygonOps_1 = require("../geometry3d/PolygonOps");
12
15
  const Ray3d_1 = require("../geometry3d/Ray3d");
13
16
  const Polynomials_1 = require("../numerics/Polynomials");
14
17
  const Graph_1 = require("./Graph");
@@ -16,37 +19,59 @@ const HalfEdgeMarkSet_1 = require("./HalfEdgeMarkSet");
16
19
  const HalfEdgePointInGraphSearch_1 = require("./HalfEdgePointInGraphSearch");
17
20
  const HalfEdgePositionDetail_1 = require("./HalfEdgePositionDetail");
18
21
  const Triangulation_1 = require("./Triangulation");
22
+ /**
23
+ * Options for setting the z-coordinate of a vertex in the triangulation when a point with the same xy is inserted.
24
+ * @internal
25
+ */
26
+ var InsertedVertexZOptions;
27
+ (function (InsertedVertexZOptions) {
28
+ /** The point's z-coordinate is ignored, and the existing vertex's z-coordinate is unchanged. */
29
+ InsertedVertexZOptions[InsertedVertexZOptions["Ignore"] = 0] = "Ignore";
30
+ /** The point's z-coordinate replaces the existing vertex's z-coordinate. */
31
+ InsertedVertexZOptions[InsertedVertexZOptions["Replace"] = 1] = "Replace";
32
+ /**
33
+ * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the
34
+ * point's z-coordinate is larger.
35
+ */
36
+ InsertedVertexZOptions[InsertedVertexZOptions["ReplaceIfLarger"] = 2] = "ReplaceIfLarger";
37
+ /**
38
+ * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the
39
+ * point's z-coordinate is smaller.
40
+ */
41
+ InsertedVertexZOptions[InsertedVertexZOptions["ReplaceIfSmaller"] = 3] = "ReplaceIfSmaller";
42
+ })(InsertedVertexZOptions || (exports.InsertedVertexZOptions = InsertedVertexZOptions = {}));
19
43
  /**
20
44
  * Context for repeated insertion of new points in a graph.
21
- * * Initial graph should have clean outer boundary. (e.g. as typically marked with HalfEdgeMask.EXTERIOR)
45
+ * * Initial graph should have clean outer boundary (e.g., as typically marked with `HalfEdgeMask.EXTERIOR` and
46
+ * `HalfEdgeMask.BOUNDARY_EDGE`).
22
47
  * * After each insertion, the current "position" within the graph is remembered so that each subsequent insertion
23
- * can reuse that position as start for walking to the new point.
48
+ * can reuse that position as start for walking to the new point.
49
+ * @internal
24
50
  */
25
51
  class InsertAndRetriangulateContext {
26
- // Temporaries used in reAimFromFace
27
- // private _lastBefore: HalfEdgePositionDetail;
28
- // private _firstAfter: HalfEdgePositionDetail;
29
- constructor(graph) {
52
+ constructor(graph, tolerance) {
30
53
  this._graph = graph;
31
54
  this._edgeSet = HalfEdgeMarkSet_1.MarkedEdgeSet.create(graph);
32
55
  this._searcher = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
33
- // this._lastBefore = HalfEdgePositionDetail.create();
34
- // this._firstAfter = HalfEdgePositionDetail.create();
56
+ this._tolerance = tolerance;
35
57
  }
36
58
  /** Create a new context referencing the graph. */
37
- static create(graph) {
38
- return new InsertAndRetriangulateContext(graph);
59
+ static create(graph, tolerance = Geometry_1.Geometry.smallMetricDistance) {
60
+ return new InsertAndRetriangulateContext(graph, tolerance);
39
61
  }
40
62
  /** Query the (pointer to) the graph in the context. */
41
- get graph() { return this._graph; }
42
- // Walk face from edgeNode; insert new edges back to start node from all except
43
- // immediate successor and predecessor.
44
- // insert all new nodes, and nodes of the existing face, in edgeSet.
63
+ get graph() {
64
+ return this._graph;
65
+ }
66
+ /**
67
+ * Walk face from edgeNode. Insert new edges back to start node from all except immediate successor and predecessor.
68
+ * Insert all new nodes and nodes of the existing face in edgeSet.
69
+ */
45
70
  retriangulateFromBaseVertex(centralNode) {
46
71
  const numNode = centralNode.countEdgesAroundFace();
47
- this._edgeSet.addAroundFace(centralNode);
48
- if (numNode < 4 || centralNode.signedFaceArea() <= 0.0)
72
+ if (numNode < 4 || centralNode.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR))
49
73
  return;
74
+ this._edgeSet.addAroundFace(centralNode);
50
75
  const numEdge = numNode - 3;
51
76
  let farNode = centralNode.faceSuccessor;
52
77
  let nearNode = centralNode;
@@ -61,13 +86,11 @@ class InsertAndRetriangulateContext {
61
86
  reset() {
62
87
  this._searcher = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
63
88
  }
64
- /** Return a (reference to!) the current position in the graph */
65
- get currentPosition() { return this._searcher; }
66
- /**
67
- * Linear search through the graph
68
- * * Returns a HalfEdgePositionDetail for the nearest edge or vertex.
69
- * @param xyz
70
- */
89
+ /** Return a (reference to!) the current position in the graph. */
90
+ get currentPosition() {
91
+ return this._searcher;
92
+ }
93
+ /** Linear search for the nearest graph edge or vertex. */
71
94
  searchForNearestEdgeOrVertex(xyz) {
72
95
  const position = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
73
96
  position.setDTag(Number.MAX_VALUE);
@@ -103,6 +126,7 @@ class InsertAndRetriangulateContext {
103
126
  }
104
127
  return position;
105
128
  }
129
+ /** Linear search for the nearest graph vertex. */
106
130
  searchForNearestVertex(xyz) {
107
131
  const position = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
108
132
  position.setDTag(Number.MAX_VALUE);
@@ -116,60 +140,139 @@ class InsertAndRetriangulateContext {
116
140
  }
117
141
  return position;
118
142
  }
119
- resetSearch(xyz, maxDim) {
120
- if (maxDim > 0)
143
+ /**
144
+ * Reset the "current" position to a vertex nearest the target point.
145
+ * @param xyz target point
146
+ * @param searchEdgesToo reset to nearest vertex or edge
147
+ */
148
+ resetSearch(xyz, searchEdgesToo) {
149
+ if (searchEdgesToo)
121
150
  this._searcher = this.searchForNearestEdgeOrVertex(xyz);
122
151
  else
123
152
  this._searcher = this.searchForNearestVertex(xyz);
124
153
  }
125
- insertAndRetriangulate(xyz, newZWins) {
126
- this.moveToPoint(this._searcher, xyz);
127
- const seedNode = this._searcher.node;
128
- let stat = false;
129
- if (seedNode === undefined) {
154
+ /** Reclassify the current interior face hit if it is too close to an edge of the face. */
155
+ reclassifyFaceHit(point) {
156
+ if (undefined === this._searcher.node || !this._searcher.isFace || this._searcher.node.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR))
157
+ return false;
158
+ const pointXY = Point3dVector3d_1.Point3d.create(point.x, point.y);
159
+ const face = this._searcher.node.collectAroundFace((node) => {
160
+ const xy = Point3dVector3d_1.Point3d.create(node.x, node.y);
161
+ xy.node = node; // decorate the point with the node
162
+ return xy;
163
+ });
164
+ const detail = PolygonOps_1.PolygonOps.closestPointOnBoundary(face, pointXY, this._tolerance);
165
+ (0, core_bentley_1.assert)(detail.code === Geometry_1.PolygonLocation.OnPolygonEdgeInterior);
166
+ if (detail.a > this._tolerance)
167
+ return false;
168
+ const edge = face[detail.closestEdgeIndex].node;
169
+ const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;
170
+ if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)
171
+ this._searcher.resetAsVertex(vertex);
172
+ else
173
+ this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);
174
+ return true;
175
+ }
176
+ /** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */
177
+ reclassifyEdgeHit(point) {
178
+ if (undefined === this._searcher.node || !this._searcher.isEdge || this._searcher.node.isMaskSet(Graph_1.HalfEdgeMask.BOUNDARY_EDGE))
179
+ return false;
180
+ const pointXY = Point3dVector3d_1.Point3d.create(point.x, point.y);
181
+ const superFace = [];
182
+ for (let n = this._searcher.node.faceSuccessor; n !== this._searcher.node; n = n.faceSuccessor) {
183
+ const xy = Point3dVector3d_1.Point3d.create(n.x, n.y);
184
+ xy.node = n; // decorate the point with a node of the left face
185
+ superFace.push(xy);
186
+ }
187
+ for (let n = this._searcher.node.vertexPredecessor; n !== this._searcher.node.edgeMate; n = n.faceSuccessor) {
188
+ const xy = Point3dVector3d_1.Point3d.create(n.x, n.y);
189
+ xy.node = n; // decorate the point with a node of the right face
190
+ superFace.push(xy);
130
191
  }
131
- else if (this._searcher.isFace) {
132
- if (!seedNode.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR)) {
133
- const newInteriorNode = this._graph.createEdgeXYZHalfEdge(xyz.x, xyz.y, xyz.z, 0, seedNode, 0);
134
- this.retriangulateFromBaseVertex(newInteriorNode);
192
+ const detail = PolygonOps_1.PolygonOps.closestPointOnBoundary(superFace, pointXY, this._tolerance);
193
+ if (detail.a > this._tolerance)
194
+ return false;
195
+ const edge = superFace[detail.closestEdgeIndex].node;
196
+ const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;
197
+ if (detail.code === Geometry_1.PolygonLocation.OnPolygonVertex) // can happen if superFace is non-concave (e.g., a dart)
198
+ this._searcher.resetAsVertex(vertex);
199
+ else if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)
200
+ this._searcher.resetAsVertex(vertex);
201
+ else
202
+ this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);
203
+ return true;
204
+ }
205
+ /**
206
+ * Given a point that was just inserted into the graph at the given node, apply the z-coordinate rule around
207
+ * the vertex loop.
208
+ */
209
+ updateZAroundVertex(node, point, zOption) {
210
+ if (InsertedVertexZOptions.Ignore === zOption)
211
+ return;
212
+ if ((InsertedVertexZOptions.ReplaceIfLarger === zOption) && (point.z <= node.z))
213
+ return;
214
+ if ((InsertedVertexZOptions.ReplaceIfSmaller === zOption) && (point.z >= node.z))
215
+ return;
216
+ // only replace z; preserving xy preserves convexity of the hull
217
+ node.setXYZAroundVertex(node.x, node.y, point.z);
218
+ }
219
+ /**
220
+ * Insert a new point into the graph and retriangulate.
221
+ * @param point the coordinates of the node to be inserted.
222
+ * @param newZWins rule governing when `point.z` should override the z-coordinate of an existing vertex with the
223
+ * same x and y.
224
+ * @returns true if and only if the point didn't need to be inserted or was successfully inserted.
225
+ */
226
+ insertAndRetriangulate(point, newZWins) {
227
+ this.moveToPoint(this._searcher, point);
228
+ if (this._searcher.node === undefined)
229
+ return false;
230
+ // Try to avoid skinny triangles. If we iterated, this could get out of control (e.g., inserting point into a fan).
231
+ // Limiting to one reclassification ensures the hit doesn't move more than tol and reduces skinny triangles
232
+ // adjacent to the hull.
233
+ if (!this.reclassifyFaceHit(point))
234
+ this.reclassifyEdgeHit(point);
235
+ if (this._searcher.isFace) {
236
+ // insert point into the graph if it lies in an interior face
237
+ if (!this._searcher.node.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR)) {
238
+ const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);
239
+ this.retriangulateFromBaseVertex(newNode);
135
240
  Triangulation_1.Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);
136
- this._searcher.resetAsVertex(newInteriorNode);
241
+ this._searcher.resetAsVertex(newNode);
137
242
  }
138
- stat = true;
139
243
  }
140
244
  else if (this._searcher.isEdge) {
141
- const newA = this._graph.splitEdgeAtFraction(seedNode, this._searcher.edgeFraction);
245
+ // insert point into the graph by splitting its containing edge
246
+ const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction);
142
247
  const newB = newA.vertexPredecessor;
248
+ this.updateZAroundVertex(newA, point, InsertedVertexZOptions.Replace); // always replace
143
249
  this.retriangulateFromBaseVertex(newA);
144
250
  this.retriangulateFromBaseVertex(newB);
145
251
  Triangulation_1.Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);
146
252
  this._searcher.resetAsVertex(newA);
147
- stat = true;
148
253
  }
149
254
  else if (this._searcher.isVertex) {
150
- // There's already a vertex there. Maybe the z is different.
151
- if (newZWins)
152
- seedNode.setXYZAroundVertex(xyz.x, xyz.y, xyz.z);
153
- stat = true;
154
- }
155
- else {
156
- stat = false;
255
+ // no need to insert point as there's already a vertex there, but maybe update its z-coord
256
+ this.updateZAroundVertex(this._searcher.node, point, newZWins);
157
257
  }
158
- return stat;
258
+ return true;
159
259
  }
160
- // Advance movingPosition to a face, edge, or vertex position detail that contains xyz.
161
- // Prior content in movingPosition is used as seed.
162
- // Return true if successful.
163
- moveToPoint(movingPosition, xyz, announcer) {
164
- const psc = HalfEdgePointInGraphSearch_1.PointSearchContext.create();
260
+ /**
261
+ * Advance movingPosition to a face, edge, or vertex position detail that contains `target`.
262
+ * @param movingPosition input seed for search, updated on return.
263
+ * @param target point to search for containing topology in the graph.
264
+ * @param announcer optional callback invoked during search loop; return false to end search.
265
+ * @returns true if search was successful.
266
+ */
267
+ moveToPoint(movingPosition, target, announcer) {
268
+ const psc = HalfEdgePointInGraphSearch_1.PointSearchContext.create(this._tolerance);
165
269
  movingPosition.setITag(0);
166
270
  if (movingPosition.isUnclassified) {
167
- moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, 0);
271
+ moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, Graph_1.HalfEdgeMask.NULL_MASK);
168
272
  if (movingPosition.isUnclassified)
169
273
  return false;
170
274
  }
171
275
  let trap = 0;
172
- // double tol = vu_getMergeTol (pGraph);
173
276
  const ray = Ray3d_1.Ray3d.createXAxis();
174
277
  for (; movingPosition.getITag() === 0 && trap < 2;) {
175
278
  if (announcer !== undefined) {
@@ -177,40 +280,40 @@ class InsertAndRetriangulateContext {
177
280
  if (!continueSearch)
178
281
  break;
179
282
  }
180
- if (!psc.setSearchRay(movingPosition, xyz, ray)) {
283
+ if (!psc.setSearchRay(movingPosition, target, ray)) {
181
284
  return false;
182
285
  }
183
286
  else if (movingPosition.isFace) {
184
287
  const lastBefore = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
185
288
  const firstAfter = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
186
289
  const rc = psc.reAimAroundFace(movingPosition.node, ray, ray.a, lastBefore, firstAfter);
187
- // reAimAroundFace returns lots of cases in `lastBefore` !!
290
+ // reAimAroundFace returns lots of cases in `lastBefore`
188
291
  switch (rc) {
189
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_NoHits: {
292
+ case HalfEdgePointInGraphSearch_1.RayClassification.NoHits: {
190
293
  movingPosition.resetAsUnknown();
191
294
  break;
192
295
  }
193
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_TargetOnVertex: {
296
+ case HalfEdgePointInGraphSearch_1.RayClassification.TargetOnVertex: {
194
297
  movingPosition.setFrom(lastBefore);
195
298
  movingPosition.setITag(1);
196
299
  break;
197
300
  }
198
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_TargetOnEdge: {
301
+ case HalfEdgePointInGraphSearch_1.RayClassification.TargetOnEdge: {
199
302
  movingPosition.setFrom(lastBefore);
200
303
  movingPosition.setITag(1);
201
304
  break;
202
305
  }
203
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_Bracket: {
204
- movingPosition.resetAsFace(lastBefore.node, xyz);
306
+ case HalfEdgePointInGraphSearch_1.RayClassification.Bracket: {
307
+ movingPosition.resetAsFace(lastBefore.node, target);
205
308
  movingPosition.setITag(1);
206
309
  break;
207
310
  }
208
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_TargetBefore: {
209
- movingPosition.resetAsFace(movingPosition.node, xyz);
311
+ case HalfEdgePointInGraphSearch_1.RayClassification.TargetBefore: { // do we ever get here?
312
+ movingPosition.resetAsFace(movingPosition.node, target);
210
313
  movingPosition.setITag(1);
211
314
  break;
212
315
  }
213
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_TargetAfter: {
316
+ case HalfEdgePointInGraphSearch_1.RayClassification.TargetAfter: {
214
317
  if (movingPosition.node === lastBefore.node
215
318
  && movingPosition.isFace
216
319
  && (lastBefore.isEdge || lastBefore.isVertex)) {
@@ -235,28 +338,24 @@ class InsertAndRetriangulateContext {
235
338
  break;
236
339
  }
237
340
  }
238
- if (movingPosition.isAtXY(xyz.x, xyz.y))
341
+ if (movingPosition.isAtXY(target.x, target.y))
239
342
  return true;
240
343
  if (trap > 1) {
241
- // Ugh. We exited the loop by repeatedly hitting the same node
242
- // with edge or vertex type in lastBefore.
243
- // This happens only when the target point is exterior.
244
- // (Heavy triangulation use cases start with a convex hull and only do interior intersections,
245
- // so case only happens in contrived unit tests.... so far ...)
246
- // What to mark?
247
- // Leave it as is, but mark as exterior target
248
- //
344
+ // ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.
345
+ // This happens only when the target point is exterior (heavy triangulation use cases start with a convex
346
+ // hull and only do interior intersections, so case only happens in contrived unit tests so far
347
+ // What to mark? Leave it as is, but mark as exterior target
249
348
  if (movingPosition.node !== undefined) {
250
349
  movingPosition.setIsExteriorTarget(true);
251
350
  }
252
351
  return false;
253
352
  }
254
- // Murky here ... should never be hit. Has never been hit in unit tests.
353
+ // murky here; should never be hit. Has never been hit in unit tests.
255
354
  return false;
256
355
  }
257
356
  }
258
357
  exports.InsertAndRetriangulateContext = InsertAndRetriangulateContext;
259
- // Create a VuPositionDetail for specified fraction along any unmasked edge.
358
+ /** Set `position` to a random unmasked edge at the specified fraction. */
260
359
  function moveToAnyUnmaskedEdge(graph, position, edgeFraction, skipMask) {
261
360
  for (const candidate of graph.allHalfEdges) {
262
361
  if (!candidate.isMaskSet(skipMask)) {
@@ -1 +1 @@
1
- {"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.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/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\nimport { Triangulator } from \"./Triangulation\";\r\n\r\n/**\r\n * Context for repeated insertion of new points in a graph.\r\n * * Initial graph should have clean outer boundary. (e.g. as typically marked with HalfEdgeMask.EXTERIOR)\r\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\r\n * can reuse that position as start for walking to the new point.\r\n */\r\nexport class InsertAndRetriangulateContext {\r\n private _graph: HalfEdgeGraph;\r\n private _edgeSet: MarkedEdgeSet;\r\n private _searcher: HalfEdgePositionDetail;\r\n // Temporaries used in reAimFromFace\r\n // private _lastBefore: HalfEdgePositionDetail;\r\n // private _firstAfter: HalfEdgePositionDetail;\r\n\r\n private constructor(graph: HalfEdgeGraph) {\r\n this._graph = graph;\r\n this._edgeSet = MarkedEdgeSet.create(graph)!;\r\n this._searcher = HalfEdgePositionDetail.create();\r\n // this._lastBefore = HalfEdgePositionDetail.create();\r\n // this._firstAfter = HalfEdgePositionDetail.create();\r\n }\r\n /** Create a new context referencing the graph. */\r\n public static create(graph: HalfEdgeGraph) {\r\n return new InsertAndRetriangulateContext(graph);\r\n }\r\n /** Query the (pointer to) the graph in the context. */\r\n public get graph(): HalfEdgeGraph { return this._graph; }\r\n // Walk face from edgeNode; insert new edges back to start node from all except\r\n // immediate successor and predecessor.\r\n // insert all new nodes, and nodes of the existing face, in edgeSet.\r\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\r\n const numNode = centralNode.countEdgesAroundFace();\r\n this._edgeSet.addAroundFace(centralNode);\r\n if (numNode < 4 || centralNode.signedFaceArea() <= 0.0)\r\n return;\r\n const numEdge = numNode - 3;\r\n let farNode = centralNode.faceSuccessor;\r\n let nearNode = centralNode;\r\n for (let i = 0; i < numEdge; i++) {\r\n farNode = farNode.faceSuccessor;\r\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\r\n farNode = nearNode.faceSuccessor;\r\n this._edgeSet.addToSet(nearNode);\r\n }\r\n }\r\n /** Reset the \"current\" position to unknown state. */\r\n public reset() {\r\n this._searcher = HalfEdgePositionDetail.create();\r\n }\r\n\r\n /** Return a (reference to!) the current position in the graph */\r\n public get currentPosition() { return this._searcher; }\r\n /**\r\n * Linear search through the graph\r\n * * Returns a HalfEdgePositionDetail for the nearest edge or vertex.\r\n * @param xyz\r\n */\r\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n const xyzC = Point3d.create();\r\n let fractionC;\r\n let distanceC;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n const nodeB = nodeA.faceSuccessor;\r\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\r\n if (fractionC !== undefined) {\r\n if (fractionC > 1.0) {\r\n distanceC = xyz.distanceXY(nodeB);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeB);\r\n position.setDTag(distanceC);\r\n }\r\n } else if (fractionC < 0.0) {\r\n distanceC = xyz.distanceXY(nodeA);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceC);\r\n }\r\n } else {\r\n nodeA.fractionToPoint3d(fractionC, xyzC);\r\n\r\n distanceC = xyz.distanceXY(xyzC);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAtEdgeAndFraction(nodeA, fractionC);\r\n }\r\n }\r\n }\r\n }\r\n return position;\r\n }\r\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n let distanceA;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n distanceA = xyz.distanceXY(nodeA);\r\n if (distanceA < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceA);\r\n }\r\n }\r\n return position;\r\n }\r\n\r\n public resetSearch(xyz: Point3d, maxDim: number) {\r\n if (maxDim > 0)\r\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\r\n else\r\n this._searcher = this.searchForNearestVertex(xyz);\r\n }\r\n public insertAndRetriangulate(xyz: Point3d, newZWins: boolean): boolean {\r\n this.moveToPoint(this._searcher, xyz);\r\n const seedNode = this._searcher.node;\r\n let stat = false;\r\n if (seedNode === undefined) {\r\n } else if (this._searcher.isFace) {\r\n if (!seedNode.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const newInteriorNode = this._graph.createEdgeXYZHalfEdge(xyz.x, xyz.y, xyz.z, 0, seedNode, 0);\r\n this.retriangulateFromBaseVertex(newInteriorNode);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newInteriorNode);\r\n }\r\n stat = true;\r\n } else if (this._searcher.isEdge) {\r\n const newA = this._graph.splitEdgeAtFraction(seedNode, this._searcher.edgeFraction!);\r\n const newB = newA.vertexPredecessor;\r\n this.retriangulateFromBaseVertex(newA);\r\n this.retriangulateFromBaseVertex(newB);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newA);\r\n stat = true;\r\n } else if (this._searcher.isVertex) {\r\n // There's already a vertex there. Maybe the z is different.\r\n if (newZWins)\r\n seedNode.setXYZAroundVertex(xyz.x, xyz.y, xyz.z);\r\n stat = true;\r\n } else {\r\n stat = false;\r\n }\r\n return stat;\r\n }\r\n\r\n // Advance movingPosition to a face, edge, or vertex position detail that contains xyz.\r\n // Prior content in movingPosition is used as seed.\r\n // Return true if successful.\r\n public moveToPoint(movingPosition: HalfEdgePositionDetail, xyz: Point3d, announcer?: (position: HalfEdgePositionDetail) => boolean): boolean {\r\n const psc = PointSearchContext.create();\r\n movingPosition.setITag(0);\r\n if (movingPosition.isUnclassified) {\r\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, 0);\r\n if (movingPosition.isUnclassified)\r\n return false;\r\n }\r\n let trap = 0;\r\n // double tol = vu_getMergeTol (pGraph);\r\n const ray = Ray3d.createXAxis();\r\n for (; movingPosition.getITag() === 0 && trap < 2;) {\r\n if (announcer !== undefined) {\r\n const continueSearch = announcer(movingPosition);\r\n if (!continueSearch)\r\n break;\r\n }\r\n if (!psc.setSearchRay(movingPosition, xyz, ray)) {\r\n return false;\r\n } else if (movingPosition.isFace) {\r\n const lastBefore = HalfEdgePositionDetail.create();\r\n const firstAfter = HalfEdgePositionDetail.create();\r\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\r\n // reAimAroundFace returns lots of cases in `lastBefore` !!\r\n switch (rc) {\r\n case RayClassification.RC_NoHits: {\r\n movingPosition.resetAsUnknown();\r\n break;\r\n }\r\n case RayClassification.RC_TargetOnVertex: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_TargetOnEdge: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_Bracket: {\r\n movingPosition.resetAsFace(lastBefore.node, xyz);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_TargetBefore: {\r\n movingPosition.resetAsFace(movingPosition.node, xyz);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_TargetAfter: {\r\n if (movingPosition.node === lastBefore.node\r\n && movingPosition.isFace\r\n && (lastBefore.isEdge || lastBefore.isVertex)){\r\n trap++;\r\n } else {\r\n trap = 0;\r\n }\r\n movingPosition.setFrom(lastBefore);\r\n break;\r\n }\r\n }\r\n } else if (movingPosition.isEdge) {\r\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n } else if (movingPosition.isVertex) {\r\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n }\r\n }\r\n if (movingPosition.isAtXY(xyz.x, xyz.y))\r\n return true;\r\n if (trap > 1) {\r\n // Ugh. We exited the loop by repeatedly hitting the same node\r\n // with edge or vertex type in lastBefore.\r\n // This happens only when the target point is exterior.\r\n // (Heavy triangulation use cases start with a convex hull and only do interior intersections,\r\n // so case only happens in contrived unit tests.... so far ...)\r\n // What to mark?\r\n // Leave it as is, but mark as exterior target\r\n //\r\n if (movingPosition.node !== undefined) {\r\n movingPosition.setIsExteriorTarget(true);\r\n }\r\n return false;\r\n }\r\n // Murky here ... should never be hit. Has never been hit in unit tests.\r\n return false;\r\n }\r\n\r\n}\r\n// Create a VuPositionDetail for specified fraction along any unmasked edge.\r\nfunction moveToAnyUnmaskedEdge(graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask): boolean {\r\n for (const candidate of graph.allHalfEdges) {\r\n if (!candidate.isMaskSet(skipMask)) {\r\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"]}
1
+ {"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.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/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry, PolygonLocation } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\nimport { Triangulator } from \"./Triangulation\";\r\n\r\n/**\r\n * Options for setting the z-coordinate of a vertex in the triangulation when a point with the same xy is inserted.\r\n * @internal\r\n */\r\nexport enum InsertedVertexZOptions {\r\n /** The point's z-coordinate is ignored, and the existing vertex's z-coordinate is unchanged. */\r\n Ignore,\r\n /** The point's z-coordinate replaces the existing vertex's z-coordinate. */\r\n Replace,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is larger.\r\n */\r\n ReplaceIfLarger,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is smaller.\r\n */\r\n ReplaceIfSmaller,\r\n}\r\n\r\n/**\r\n * Context for repeated insertion of new points in a graph.\r\n * * Initial graph should have clean outer boundary (e.g., as typically marked with `HalfEdgeMask.EXTERIOR` and\r\n * `HalfEdgeMask.BOUNDARY_EDGE`).\r\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\r\n * can reuse that position as start for walking to the new point.\r\n * @internal\r\n */\r\nexport class InsertAndRetriangulateContext {\r\n private _graph: HalfEdgeGraph;\r\n private _edgeSet: MarkedEdgeSet;\r\n private _searcher: HalfEdgePositionDetail;\r\n private _tolerance: number;\r\n\r\n private constructor(graph: HalfEdgeGraph, tolerance: number) {\r\n this._graph = graph;\r\n this._edgeSet = MarkedEdgeSet.create(graph)!;\r\n this._searcher = HalfEdgePositionDetail.create();\r\n this._tolerance = tolerance;\r\n }\r\n /** Create a new context referencing the graph. */\r\n public static create(graph: HalfEdgeGraph, tolerance: number = Geometry.smallMetricDistance) {\r\n return new InsertAndRetriangulateContext(graph, tolerance);\r\n }\r\n /** Query the (pointer to) the graph in the context. */\r\n public get graph(): HalfEdgeGraph {\r\n return this._graph;\r\n }\r\n /**\r\n * Walk face from edgeNode. Insert new edges back to start node from all except immediate successor and predecessor.\r\n * Insert all new nodes and nodes of the existing face in edgeSet.\r\n */\r\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\r\n const numNode = centralNode.countEdgesAroundFace();\r\n if (numNode < 4 || centralNode.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return;\r\n this._edgeSet.addAroundFace(centralNode);\r\n const numEdge = numNode - 3;\r\n let farNode = centralNode.faceSuccessor;\r\n let nearNode = centralNode;\r\n for (let i = 0; i < numEdge; i++) {\r\n farNode = farNode.faceSuccessor;\r\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\r\n farNode = nearNode.faceSuccessor;\r\n this._edgeSet.addToSet(nearNode);\r\n }\r\n }\r\n /** Reset the \"current\" position to unknown state. */\r\n public reset() {\r\n this._searcher = HalfEdgePositionDetail.create();\r\n }\r\n /** Return a (reference to!) the current position in the graph. */\r\n public get currentPosition() {\r\n return this._searcher;\r\n }\r\n /** Linear search for the nearest graph edge or vertex. */\r\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n const xyzC = Point3d.create();\r\n let fractionC;\r\n let distanceC;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n const nodeB = nodeA.faceSuccessor;\r\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\r\n if (fractionC !== undefined) {\r\n if (fractionC > 1.0) {\r\n distanceC = xyz.distanceXY(nodeB);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeB);\r\n position.setDTag(distanceC);\r\n }\r\n } else if (fractionC < 0.0) {\r\n distanceC = xyz.distanceXY(nodeA);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceC);\r\n }\r\n } else {\r\n nodeA.fractionToPoint3d(fractionC, xyzC);\r\n\r\n distanceC = xyz.distanceXY(xyzC);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAtEdgeAndFraction(nodeA, fractionC);\r\n }\r\n }\r\n }\r\n }\r\n return position;\r\n }\r\n /** Linear search for the nearest graph vertex. */\r\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n let distanceA;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n distanceA = xyz.distanceXY(nodeA);\r\n if (distanceA < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceA);\r\n }\r\n }\r\n return position;\r\n }\r\n /**\r\n * Reset the \"current\" position to a vertex nearest the target point.\r\n * @param xyz target point\r\n * @param searchEdgesToo reset to nearest vertex or edge\r\n */\r\n public resetSearch(xyz: Point3d, searchEdgesToo: boolean): void {\r\n if (searchEdgesToo)\r\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\r\n else\r\n this._searcher = this.searchForNearestVertex(xyz);\r\n }\r\n /** Reclassify the current interior face hit if it is too close to an edge of the face. */\r\n private reclassifyFaceHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isFace || this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const face = this._searcher.node.collectAroundFace((node: HalfEdge) => {\r\n const xy = Point3d.create(node.x, node.y);\r\n (xy as any).node = node; // decorate the point with the node\r\n return xy;\r\n });\r\n const detail = PolygonOps.closestPointOnBoundary(face, pointXY, this._tolerance);\r\n assert(detail.code === PolygonLocation.OnPolygonEdgeInterior);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = face[detail.closestEdgeIndex].node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */\r\n private reclassifyEdgeHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isEdge || this._searcher.node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const superFace: Point3d[] = [];\r\n for (let n = this._searcher.node.faceSuccessor; n !== this._searcher.node; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the left face\r\n superFace.push(xy);\r\n }\r\n for (let n = this._searcher.node.vertexPredecessor; n !== this._searcher.node.edgeMate; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the right face\r\n superFace.push(xy);\r\n }\r\n const detail = PolygonOps.closestPointOnBoundary(superFace, pointXY, this._tolerance);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = (superFace[detail.closestEdgeIndex] as any).node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.code === PolygonLocation.OnPolygonVertex) // can happen if superFace is non-concave (e.g., a dart)\r\n this._searcher.resetAsVertex(vertex);\r\n else if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /**\r\n * Given a point that was just inserted into the graph at the given node, apply the z-coordinate rule around\r\n * the vertex loop.\r\n */\r\n private updateZAroundVertex(node: HalfEdge, point: Point3d, zOption: InsertedVertexZOptions): void {\r\n if (InsertedVertexZOptions.Ignore === zOption)\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfLarger === zOption) && (point.z <= node.z))\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfSmaller === zOption) && (point.z >= node.z))\r\n return;\r\n // only replace z; preserving xy preserves convexity of the hull\r\n node.setXYZAroundVertex(node.x, node.y, point.z);\r\n }\r\n /**\r\n * Insert a new point into the graph and retriangulate.\r\n * @param point the coordinates of the node to be inserted.\r\n * @param newZWins rule governing when `point.z` should override the z-coordinate of an existing vertex with the\r\n * same x and y.\r\n * @returns true if and only if the point didn't need to be inserted or was successfully inserted.\r\n */\r\n public insertAndRetriangulate(point: Point3d, newZWins: InsertedVertexZOptions): boolean {\r\n this.moveToPoint(this._searcher, point);\r\n if (this._searcher.node === undefined)\r\n return false;\r\n // Try to avoid skinny triangles. If we iterated, this could get out of control (e.g., inserting point into a fan).\r\n // Limiting to one reclassification ensures the hit doesn't move more than tol and reduces skinny triangles\r\n // adjacent to the hull.\r\n if (!this.reclassifyFaceHit(point))\r\n this.reclassifyEdgeHit(point);\r\n if (this._searcher.isFace) {\r\n // insert point into the graph if it lies in an interior face\r\n if (!this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);\r\n this.retriangulateFromBaseVertex(newNode);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newNode);\r\n }\r\n } else if (this._searcher.isEdge) {\r\n // insert point into the graph by splitting its containing edge\r\n const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction!);\r\n const newB = newA.vertexPredecessor;\r\n this.updateZAroundVertex(newA, point, InsertedVertexZOptions.Replace); // always replace\r\n this.retriangulateFromBaseVertex(newA);\r\n this.retriangulateFromBaseVertex(newB);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newA);\r\n } else if (this._searcher.isVertex) {\r\n // no need to insert point as there's already a vertex there, but maybe update its z-coord\r\n this.updateZAroundVertex(this._searcher.node, point, newZWins);\r\n }\r\n return true;\r\n }\r\n /**\r\n * Advance movingPosition to a face, edge, or vertex position detail that contains `target`.\r\n * @param movingPosition input seed for search, updated on return.\r\n * @param target point to search for containing topology in the graph.\r\n * @param announcer optional callback invoked during search loop; return false to end search.\r\n * @returns true if search was successful.\r\n */\r\n public moveToPoint(\r\n movingPosition: HalfEdgePositionDetail,\r\n target: Point3d,\r\n announcer?: (position: HalfEdgePositionDetail) => boolean,\r\n ): boolean {\r\n const psc = PointSearchContext.create(this._tolerance);\r\n movingPosition.setITag(0);\r\n if (movingPosition.isUnclassified) {\r\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, HalfEdgeMask.NULL_MASK);\r\n if (movingPosition.isUnclassified)\r\n return false;\r\n }\r\n let trap = 0;\r\n const ray = Ray3d.createXAxis();\r\n for (; movingPosition.getITag() === 0 && trap < 2;) {\r\n if (announcer !== undefined) {\r\n const continueSearch = announcer(movingPosition);\r\n if (!continueSearch)\r\n break;\r\n }\r\n if (!psc.setSearchRay(movingPosition, target, ray)) {\r\n return false;\r\n } else if (movingPosition.isFace) {\r\n const lastBefore = HalfEdgePositionDetail.create();\r\n const firstAfter = HalfEdgePositionDetail.create();\r\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\r\n // reAimAroundFace returns lots of cases in `lastBefore`\r\n switch (rc) {\r\n case RayClassification.NoHits: {\r\n movingPosition.resetAsUnknown();\r\n break;\r\n }\r\n case RayClassification.TargetOnVertex: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetOnEdge: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.Bracket: {\r\n movingPosition.resetAsFace(lastBefore.node, target);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetBefore: { // do we ever get here?\r\n movingPosition.resetAsFace(movingPosition.node, target);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetAfter: {\r\n if (movingPosition.node === lastBefore.node\r\n && movingPosition.isFace\r\n && (lastBefore.isEdge || lastBefore.isVertex)) {\r\n trap++;\r\n } else {\r\n trap = 0;\r\n }\r\n movingPosition.setFrom(lastBefore);\r\n break;\r\n }\r\n }\r\n } else if (movingPosition.isEdge) {\r\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n } else if (movingPosition.isVertex) {\r\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n }\r\n }\r\n if (movingPosition.isAtXY(target.x, target.y))\r\n return true;\r\n if (trap > 1) {\r\n // ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.\r\n // This happens only when the target point is exterior (heavy triangulation use cases start with a convex\r\n // hull and only do interior intersections, so case only happens in contrived unit tests so far\r\n // What to mark? Leave it as is, but mark as exterior target\r\n if (movingPosition.node !== undefined) {\r\n movingPosition.setIsExteriorTarget(true);\r\n }\r\n return false;\r\n }\r\n // murky here; should never be hit. Has never been hit in unit tests.\r\n return false;\r\n }\r\n}\r\n/** Set `position` to a random unmasked edge at the specified fraction. */\r\nfunction moveToAnyUnmaskedEdge(\r\n graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask,\r\n): boolean {\r\n for (const candidate of graph.allHalfEdges) {\r\n if (!candidate.isMaskSet(skipMask)) {\r\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"]}
@@ -144,8 +144,8 @@ export declare class HalfEdgeGraphMerge {
144
144
  static formGraphFromSegments(lineSegments: LineSegment3d[]): HalfEdgeGraph;
145
145
  /**
146
146
  * * Input is random linestrings, not necessarily loops
147
- * * Graph gets full splitEdges, regularize, and triangulate.
148
- * @returns triangulated graph, or undefined if bad data.
147
+ * * Graph gets full splitEdges, regularize (optional), and triangulate.
148
+ * @returns graph, or undefined if bad data.
149
149
  */
150
150
  static formGraphFromChains(chains: MultiLineStringDataVariant, regularize?: boolean, mask?: HalfEdgeMask): HalfEdgeGraph | undefined;
151
151
  }
@@ -562,8 +562,8 @@ class HalfEdgeGraphMerge {
562
562
  }
563
563
  /**
564
564
  * * Input is random linestrings, not necessarily loops
565
- * * Graph gets full splitEdges, regularize, and triangulate.
566
- * @returns triangulated graph, or undefined if bad data.
565
+ * * Graph gets full splitEdges, regularize (optional), and triangulate.
566
+ * @returns graph, or undefined if bad data.
567
567
  */
568
568
  static formGraphFromChains(chains, regularize = true, mask = Graph_1.HalfEdgeMask.PRIMARY_EDGE) {
569
569
  if (chains.length < 1)