@itwin/core-geometry 5.5.0-dev.4 → 5.5.0-dev.5

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 (611) hide show
  1. package/lib/cjs/Geometry.d.ts +7 -0
  2. package/lib/cjs/Geometry.d.ts.map +1 -1
  3. package/lib/cjs/Geometry.js +9 -0
  4. package/lib/cjs/Geometry.js.map +1 -1
  5. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurve.js +2 -1
  7. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  8. package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
  9. package/lib/cjs/bspline/BSplineCurveOps.js +4 -1
  10. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  11. package/lib/cjs/bspline/BezierCurve3d.d.ts.map +1 -1
  12. package/lib/cjs/bspline/BezierCurve3d.js +14 -4
  13. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  14. package/lib/cjs/bspline/BezierCurve3dH.d.ts +2 -0
  15. package/lib/cjs/bspline/BezierCurve3dH.d.ts.map +1 -1
  16. package/lib/cjs/bspline/BezierCurve3dH.js +19 -3
  17. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  18. package/lib/cjs/bspline/BezierCurveBase.d.ts +8 -2
  19. package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
  20. package/lib/cjs/bspline/BezierCurveBase.js +10 -4
  21. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  22. package/lib/cjs/clipping/AlternatingConvexClipTree.js +4 -4
  23. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  24. package/lib/cjs/clipping/ClipPlane.d.ts +0 -3
  25. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  26. package/lib/cjs/clipping/ClipPlane.js +9 -2
  27. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  28. package/lib/cjs/clipping/ClipPrimitive.d.ts +59 -9
  29. package/lib/cjs/clipping/ClipPrimitive.d.ts.map +1 -1
  30. package/lib/cjs/clipping/ClipPrimitive.js +124 -55
  31. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  32. package/lib/cjs/clipping/ClipUtils.js +1 -1
  33. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  34. package/lib/cjs/clipping/ClipVector.d.ts.map +1 -1
  35. package/lib/cjs/clipping/ClipVector.js +12 -8
  36. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  37. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +0 -2
  38. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  39. package/lib/cjs/clipping/ConvexClipPlaneSet.js +19 -18
  40. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  41. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.d.ts +1 -1
  42. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.d.ts.map +1 -1
  43. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js +4 -5
  44. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  45. package/lib/cjs/core-geometry.d.ts +0 -1
  46. package/lib/cjs/core-geometry.d.ts.map +1 -1
  47. package/lib/cjs/core-geometry.js +0 -1
  48. package/lib/cjs/core-geometry.js.map +1 -1
  49. package/lib/cjs/curve/Arc3d.js +2 -2
  50. package/lib/cjs/curve/Arc3d.js.map +1 -1
  51. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +12 -4
  52. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  53. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +52 -33
  54. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  55. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  56. package/lib/cjs/curve/CurveCollection.js +13 -6
  57. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  58. package/lib/cjs/curve/CurveCurve.js +1 -1
  59. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  60. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  61. package/lib/cjs/curve/CurveFactory.js +13 -1
  62. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  63. package/lib/cjs/curve/CurveLocationDetail.d.ts +12 -4
  64. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  65. package/lib/cjs/curve/CurveLocationDetail.js +14 -5
  66. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  67. package/lib/cjs/curve/CurvePrimitive.d.ts +5 -4
  68. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  69. package/lib/cjs/curve/CurvePrimitive.js +7 -4
  70. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  71. package/lib/cjs/curve/LineString3d.d.ts +25 -16
  72. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  73. package/lib/cjs/curve/LineString3d.js +90 -72
  74. package/lib/cjs/curve/LineString3d.js.map +1 -1
  75. package/lib/cjs/curve/Path.d.ts +0 -3
  76. package/lib/cjs/curve/Path.d.ts.map +1 -1
  77. package/lib/cjs/curve/Path.js +9 -2
  78. package/lib/cjs/curve/Path.js.map +1 -1
  79. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  80. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  81. package/lib/cjs/curve/Query/PlanarSubdivision.js +25 -31
  82. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  83. package/lib/cjs/curve/Query/StrokeCountChain.d.ts +7 -1
  84. package/lib/cjs/curve/Query/StrokeCountChain.d.ts.map +1 -1
  85. package/lib/cjs/curve/Query/StrokeCountChain.js +27 -36
  86. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  87. package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
  88. package/lib/cjs/curve/RegionMomentsXY.js +7 -1
  89. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  90. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  91. package/lib/cjs/curve/RegionOps.js +8 -5
  92. package/lib/cjs/curve/RegionOps.js.map +1 -1
  93. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  94. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +6 -6
  95. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  96. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
  97. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js +4 -1
  98. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  99. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  100. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +6 -1
  101. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  102. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +5 -21
  103. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  104. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +29 -73
  105. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  106. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +55 -13
  107. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  108. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +238 -110
  109. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  110. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +1 -1
  111. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  112. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +1 -4
  113. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  114. package/lib/cjs/curve/spiral/DirectSpiral3d.js +9 -9
  115. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  116. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +11 -14
  117. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  118. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +18 -18
  119. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  120. package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts +7 -1
  121. package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
  122. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  123. package/lib/cjs/geometry3d/Ellipsoid.d.ts +19 -7
  124. package/lib/cjs/geometry3d/Ellipsoid.d.ts.map +1 -1
  125. package/lib/cjs/geometry3d/Ellipsoid.js +26 -11
  126. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  127. package/lib/cjs/geometry3d/FrustumAnimation.d.ts.map +1 -1
  128. package/lib/cjs/geometry3d/FrustumAnimation.js +11 -1
  129. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  130. package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts +5 -1
  131. package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
  132. package/lib/cjs/geometry3d/GrowableFloat64Array.js +11 -1
  133. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  134. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
  135. package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
  136. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  137. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +49 -8
  138. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  139. package/lib/cjs/geometry3d/GrowableXYZArray.js +90 -37
  140. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  141. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +100 -3
  142. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  143. package/lib/cjs/geometry3d/IndexedXYZCollection.js +125 -0
  144. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  145. package/lib/cjs/geometry3d/Matrix3d.d.ts +10 -1
  146. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  147. package/lib/cjs/geometry3d/Matrix3d.js +53 -34
  148. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  149. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +1 -1
  150. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  151. package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts +49 -2
  152. package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  153. package/lib/cjs/geometry3d/Point3dArrayCarrier.js +67 -9
  154. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  155. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  156. package/lib/cjs/geometry3d/Point3dVector3d.js +1 -1
  157. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  158. package/lib/cjs/geometry3d/PointStreaming.js +1 -1
  159. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  160. package/lib/cjs/geometry3d/PolygonOps.d.ts +24 -32
  161. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  162. package/lib/cjs/geometry3d/PolygonOps.js +147 -180
  163. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  164. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +5 -5
  165. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  166. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  167. package/lib/cjs/geometry3d/PolylineOps.js +13 -3
  168. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  169. package/lib/cjs/geometry3d/Range.js.map +1 -1
  170. package/lib/cjs/geometry3d/Ray3d.d.ts +0 -3
  171. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  172. package/lib/cjs/geometry3d/Ray3d.js +5 -1
  173. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  174. package/lib/cjs/geometry3d/SortablePolygon.d.ts +2 -2
  175. package/lib/cjs/geometry3d/SortablePolygon.d.ts.map +1 -1
  176. package/lib/cjs/geometry3d/SortablePolygon.js +14 -18
  177. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  178. package/lib/cjs/geometry3d/Transform.d.ts +8 -0
  179. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  180. package/lib/cjs/geometry3d/Transform.js +15 -9
  181. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  182. package/lib/cjs/numerics/ClusterableArray.d.ts +4 -2
  183. package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
  184. package/lib/cjs/numerics/ClusterableArray.js +6 -4
  185. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  186. package/lib/cjs/numerics/Newton.d.ts +3 -1
  187. package/lib/cjs/numerics/Newton.d.ts.map +1 -1
  188. package/lib/cjs/numerics/Newton.js +5 -1
  189. package/lib/cjs/numerics/Newton.js.map +1 -1
  190. package/lib/cjs/polyface/AuxData.d.ts +1 -4
  191. package/lib/cjs/polyface/AuxData.d.ts.map +1 -1
  192. package/lib/cjs/polyface/AuxData.js +5 -1
  193. package/lib/cjs/polyface/AuxData.js.map +1 -1
  194. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js +3 -3
  195. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  196. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  197. package/lib/cjs/polyface/Polyface.js +14 -16
  198. package/lib/cjs/polyface/Polyface.js.map +1 -1
  199. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +84 -28
  200. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  201. package/lib/cjs/polyface/PolyfaceBuilder.js +277 -217
  202. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  203. package/lib/cjs/polyface/PolyfaceClip.d.ts +4 -3
  204. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  205. package/lib/cjs/polyface/PolyfaceClip.js +11 -4
  206. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  207. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  208. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  209. package/lib/cjs/polyface/PolyfaceQuery.js +9 -7
  210. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  211. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.d.ts.map +1 -1
  212. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js +3 -2
  213. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  214. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +1 -1
  215. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +2 -2
  216. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  217. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  218. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +14 -12
  219. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  220. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.d.ts +1 -1
  221. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.d.ts.map +1 -1
  222. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js +10 -6
  223. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  224. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js +4 -3
  225. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  226. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  227. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +3 -5
  228. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  229. package/lib/cjs/polyface/multiclip/XYPointBuckets.d.ts +1 -1
  230. package/lib/cjs/polyface/multiclip/XYPointBuckets.d.ts.map +1 -1
  231. package/lib/cjs/polyface/multiclip/XYPointBuckets.js +4 -8
  232. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  233. package/lib/cjs/serialization/BGFBAccessors.d.ts.map +1 -1
  234. package/lib/cjs/serialization/BGFBAccessors.js +1 -0
  235. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  236. package/lib/cjs/serialization/BGFBReader.d.ts.map +1 -1
  237. package/lib/cjs/serialization/BGFBReader.js +37 -7
  238. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  239. package/lib/cjs/serialization/BGFBWriter.d.ts +4 -4
  240. package/lib/cjs/serialization/BGFBWriter.d.ts.map +1 -1
  241. package/lib/cjs/serialization/BGFBWriter.js +24 -40
  242. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  243. package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
  244. package/lib/cjs/serialization/IModelJsonSchema.js +9 -3
  245. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  246. package/lib/cjs/serialization/SerializationHelpers.d.ts +0 -3
  247. package/lib/cjs/serialization/SerializationHelpers.d.ts.map +1 -1
  248. package/lib/cjs/serialization/SerializationHelpers.js +16 -7
  249. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  250. package/lib/cjs/solid/Box.d.ts +2 -2
  251. package/lib/cjs/solid/Box.d.ts.map +1 -1
  252. package/lib/cjs/solid/Box.js.map +1 -1
  253. package/lib/cjs/solid/Cone.d.ts +3 -2
  254. package/lib/cjs/solid/Cone.d.ts.map +1 -1
  255. package/lib/cjs/solid/Cone.js +4 -1
  256. package/lib/cjs/solid/Cone.js.map +1 -1
  257. package/lib/cjs/solid/LinearSweep.d.ts +1 -1
  258. package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
  259. package/lib/cjs/solid/LinearSweep.js +1 -1
  260. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  261. package/lib/cjs/solid/RotationalSweep.d.ts.map +1 -1
  262. package/lib/cjs/solid/RotationalSweep.js +1 -3
  263. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  264. package/lib/cjs/solid/TorusPipe.d.ts +4 -3
  265. package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
  266. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  267. package/lib/cjs/topology/ChainMerge.d.ts +4 -4
  268. package/lib/cjs/topology/ChainMerge.d.ts.map +1 -1
  269. package/lib/cjs/topology/ChainMerge.js +11 -1
  270. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  271. package/lib/cjs/topology/Graph.d.ts +2 -0
  272. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  273. package/lib/cjs/topology/Graph.js +5 -0
  274. package/lib/cjs/topology/Graph.js.map +1 -1
  275. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  276. package/lib/cjs/topology/HalfEdgeGraphSearch.js +2 -0
  277. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  278. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  279. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +23 -16
  280. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  281. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts +20 -9
  282. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  283. package/lib/cjs/topology/HalfEdgePositionDetail.js +17 -13
  284. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  285. package/lib/cjs/topology/HalfEdgePriorityQueue.d.ts.map +1 -1
  286. package/lib/cjs/topology/HalfEdgePriorityQueue.js +3 -1
  287. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  288. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts +6 -2
  289. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  290. package/lib/cjs/topology/InsertAndRetriangulateContext.js +41 -35
  291. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  292. package/lib/cjs/topology/MaskManager.d.ts +7 -3
  293. package/lib/cjs/topology/MaskManager.d.ts.map +1 -1
  294. package/lib/cjs/topology/MaskManager.js +10 -4
  295. package/lib/cjs/topology/MaskManager.js.map +1 -1
  296. package/lib/cjs/topology/RegularizeFace.d.ts.map +1 -1
  297. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  298. package/lib/cjs/topology/Triangulation.d.ts +2 -1
  299. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  300. package/lib/cjs/topology/Triangulation.js +12 -7
  301. package/lib/cjs/topology/Triangulation.js.map +1 -1
  302. package/lib/esm/Geometry.d.ts +7 -0
  303. package/lib/esm/Geometry.d.ts.map +1 -1
  304. package/lib/esm/Geometry.js +9 -0
  305. package/lib/esm/Geometry.js.map +1 -1
  306. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  307. package/lib/esm/bspline/BSplineCurve.js +2 -1
  308. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  309. package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
  310. package/lib/esm/bspline/BSplineCurveOps.js +4 -1
  311. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  312. package/lib/esm/bspline/BezierCurve3d.d.ts.map +1 -1
  313. package/lib/esm/bspline/BezierCurve3d.js +14 -4
  314. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  315. package/lib/esm/bspline/BezierCurve3dH.d.ts +2 -0
  316. package/lib/esm/bspline/BezierCurve3dH.d.ts.map +1 -1
  317. package/lib/esm/bspline/BezierCurve3dH.js +19 -3
  318. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  319. package/lib/esm/bspline/BezierCurveBase.d.ts +8 -2
  320. package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
  321. package/lib/esm/bspline/BezierCurveBase.js +10 -4
  322. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  323. package/lib/esm/clipping/AlternatingConvexClipTree.js +4 -4
  324. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  325. package/lib/esm/clipping/ClipPlane.d.ts +0 -3
  326. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  327. package/lib/esm/clipping/ClipPlane.js +9 -2
  328. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  329. package/lib/esm/clipping/ClipPrimitive.d.ts +59 -9
  330. package/lib/esm/clipping/ClipPrimitive.d.ts.map +1 -1
  331. package/lib/esm/clipping/ClipPrimitive.js +124 -55
  332. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  333. package/lib/esm/clipping/ClipUtils.js +1 -1
  334. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  335. package/lib/esm/clipping/ClipVector.d.ts.map +1 -1
  336. package/lib/esm/clipping/ClipVector.js +12 -8
  337. package/lib/esm/clipping/ClipVector.js.map +1 -1
  338. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +0 -2
  339. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  340. package/lib/esm/clipping/ConvexClipPlaneSet.js +20 -19
  341. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  342. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.d.ts +1 -1
  343. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.d.ts.map +1 -1
  344. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js +4 -5
  345. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  346. package/lib/esm/core-geometry.d.ts +0 -1
  347. package/lib/esm/core-geometry.d.ts.map +1 -1
  348. package/lib/esm/core-geometry.js +0 -1
  349. package/lib/esm/core-geometry.js.map +1 -1
  350. package/lib/esm/curve/Arc3d.js +2 -2
  351. package/lib/esm/curve/Arc3d.js.map +1 -1
  352. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +12 -4
  353. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  354. package/lib/esm/curve/CurveChainWithDistanceIndex.js +53 -34
  355. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  356. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  357. package/lib/esm/curve/CurveCollection.js +13 -6
  358. package/lib/esm/curve/CurveCollection.js.map +1 -1
  359. package/lib/esm/curve/CurveCurve.js +1 -1
  360. package/lib/esm/curve/CurveCurve.js.map +1 -1
  361. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  362. package/lib/esm/curve/CurveFactory.js +13 -1
  363. package/lib/esm/curve/CurveFactory.js.map +1 -1
  364. package/lib/esm/curve/CurveLocationDetail.d.ts +12 -4
  365. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  366. package/lib/esm/curve/CurveLocationDetail.js +14 -5
  367. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  368. package/lib/esm/curve/CurvePrimitive.d.ts +5 -4
  369. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  370. package/lib/esm/curve/CurvePrimitive.js +7 -4
  371. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  372. package/lib/esm/curve/LineString3d.d.ts +25 -16
  373. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  374. package/lib/esm/curve/LineString3d.js +90 -72
  375. package/lib/esm/curve/LineString3d.js.map +1 -1
  376. package/lib/esm/curve/Path.d.ts +0 -3
  377. package/lib/esm/curve/Path.d.ts.map +1 -1
  378. package/lib/esm/curve/Path.js +9 -2
  379. package/lib/esm/curve/Path.js.map +1 -1
  380. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  381. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  382. package/lib/esm/curve/Query/PlanarSubdivision.js +25 -31
  383. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  384. package/lib/esm/curve/Query/StrokeCountChain.d.ts +7 -1
  385. package/lib/esm/curve/Query/StrokeCountChain.d.ts.map +1 -1
  386. package/lib/esm/curve/Query/StrokeCountChain.js +27 -36
  387. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  388. package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
  389. package/lib/esm/curve/RegionMomentsXY.js +7 -1
  390. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  391. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  392. package/lib/esm/curve/RegionOps.js +8 -5
  393. package/lib/esm/curve/RegionOps.js.map +1 -1
  394. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  395. package/lib/esm/curve/RegionOpsClassificationSweeps.js +6 -6
  396. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  397. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
  398. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js +4 -1
  399. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  400. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  401. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +6 -1
  402. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  403. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +5 -21
  404. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  405. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +29 -73
  406. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  407. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +55 -13
  408. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  409. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +239 -111
  410. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  411. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +1 -1
  412. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  413. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +1 -4
  414. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  415. package/lib/esm/curve/spiral/DirectSpiral3d.js +9 -9
  416. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  417. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +11 -14
  418. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  419. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +18 -18
  420. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  421. package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts +7 -1
  422. package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
  423. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  424. package/lib/esm/geometry3d/Ellipsoid.d.ts +19 -7
  425. package/lib/esm/geometry3d/Ellipsoid.d.ts.map +1 -1
  426. package/lib/esm/geometry3d/Ellipsoid.js +26 -11
  427. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  428. package/lib/esm/geometry3d/FrustumAnimation.d.ts.map +1 -1
  429. package/lib/esm/geometry3d/FrustumAnimation.js +11 -1
  430. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  431. package/lib/esm/geometry3d/GrowableFloat64Array.d.ts +5 -1
  432. package/lib/esm/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
  433. package/lib/esm/geometry3d/GrowableFloat64Array.js +11 -1
  434. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  435. package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
  436. package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
  437. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  438. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +49 -8
  439. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  440. package/lib/esm/geometry3d/GrowableXYZArray.js +90 -37
  441. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  442. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +100 -3
  443. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  444. package/lib/esm/geometry3d/IndexedXYZCollection.js +125 -0
  445. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  446. package/lib/esm/geometry3d/Matrix3d.d.ts +10 -1
  447. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  448. package/lib/esm/geometry3d/Matrix3d.js +53 -34
  449. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  450. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +1 -1
  451. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  452. package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts +49 -2
  453. package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  454. package/lib/esm/geometry3d/Point3dArrayCarrier.js +67 -9
  455. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  456. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  457. package/lib/esm/geometry3d/Point3dVector3d.js +1 -1
  458. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  459. package/lib/esm/geometry3d/PointStreaming.js +1 -1
  460. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  461. package/lib/esm/geometry3d/PolygonOps.d.ts +24 -32
  462. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  463. package/lib/esm/geometry3d/PolygonOps.js +147 -180
  464. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  465. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +5 -5
  466. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  467. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  468. package/lib/esm/geometry3d/PolylineOps.js +13 -3
  469. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  470. package/lib/esm/geometry3d/Range.js.map +1 -1
  471. package/lib/esm/geometry3d/Ray3d.d.ts +0 -3
  472. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  473. package/lib/esm/geometry3d/Ray3d.js +5 -1
  474. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  475. package/lib/esm/geometry3d/SortablePolygon.d.ts +2 -2
  476. package/lib/esm/geometry3d/SortablePolygon.d.ts.map +1 -1
  477. package/lib/esm/geometry3d/SortablePolygon.js +14 -18
  478. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  479. package/lib/esm/geometry3d/Transform.d.ts +8 -0
  480. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  481. package/lib/esm/geometry3d/Transform.js +15 -9
  482. package/lib/esm/geometry3d/Transform.js.map +1 -1
  483. package/lib/esm/numerics/ClusterableArray.d.ts +4 -2
  484. package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
  485. package/lib/esm/numerics/ClusterableArray.js +6 -4
  486. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  487. package/lib/esm/numerics/Newton.d.ts +3 -1
  488. package/lib/esm/numerics/Newton.d.ts.map +1 -1
  489. package/lib/esm/numerics/Newton.js +5 -1
  490. package/lib/esm/numerics/Newton.js.map +1 -1
  491. package/lib/esm/polyface/AuxData.d.ts +1 -4
  492. package/lib/esm/polyface/AuxData.d.ts.map +1 -1
  493. package/lib/esm/polyface/AuxData.js +5 -1
  494. package/lib/esm/polyface/AuxData.js.map +1 -1
  495. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js +3 -3
  496. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  497. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  498. package/lib/esm/polyface/Polyface.js +14 -16
  499. package/lib/esm/polyface/Polyface.js.map +1 -1
  500. package/lib/esm/polyface/PolyfaceBuilder.d.ts +84 -28
  501. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  502. package/lib/esm/polyface/PolyfaceBuilder.js +277 -217
  503. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  504. package/lib/esm/polyface/PolyfaceClip.d.ts +4 -3
  505. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  506. package/lib/esm/polyface/PolyfaceClip.js +11 -4
  507. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  508. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  509. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  510. package/lib/esm/polyface/PolyfaceQuery.js +9 -7
  511. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  512. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.d.ts.map +1 -1
  513. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js +3 -2
  514. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  515. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +1 -1
  516. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +2 -2
  517. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  518. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  519. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +14 -12
  520. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  521. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.d.ts +1 -1
  522. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.d.ts.map +1 -1
  523. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js +10 -6
  524. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  525. package/lib/esm/polyface/multiclip/OffsetMeshContext.js +4 -3
  526. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  527. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  528. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +3 -5
  529. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  530. package/lib/esm/polyface/multiclip/XYPointBuckets.d.ts +1 -1
  531. package/lib/esm/polyface/multiclip/XYPointBuckets.d.ts.map +1 -1
  532. package/lib/esm/polyface/multiclip/XYPointBuckets.js +4 -8
  533. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  534. package/lib/esm/serialization/BGFBAccessors.d.ts.map +1 -1
  535. package/lib/esm/serialization/BGFBAccessors.js +1 -0
  536. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  537. package/lib/esm/serialization/BGFBReader.d.ts.map +1 -1
  538. package/lib/esm/serialization/BGFBReader.js +37 -7
  539. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  540. package/lib/esm/serialization/BGFBWriter.d.ts +4 -4
  541. package/lib/esm/serialization/BGFBWriter.d.ts.map +1 -1
  542. package/lib/esm/serialization/BGFBWriter.js +24 -40
  543. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  544. package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
  545. package/lib/esm/serialization/IModelJsonSchema.js +9 -3
  546. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  547. package/lib/esm/serialization/SerializationHelpers.d.ts +0 -3
  548. package/lib/esm/serialization/SerializationHelpers.d.ts.map +1 -1
  549. package/lib/esm/serialization/SerializationHelpers.js +16 -7
  550. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  551. package/lib/esm/solid/Box.d.ts +2 -2
  552. package/lib/esm/solid/Box.d.ts.map +1 -1
  553. package/lib/esm/solid/Box.js.map +1 -1
  554. package/lib/esm/solid/Cone.d.ts +3 -2
  555. package/lib/esm/solid/Cone.d.ts.map +1 -1
  556. package/lib/esm/solid/Cone.js +4 -1
  557. package/lib/esm/solid/Cone.js.map +1 -1
  558. package/lib/esm/solid/LinearSweep.d.ts +1 -1
  559. package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
  560. package/lib/esm/solid/LinearSweep.js +1 -1
  561. package/lib/esm/solid/LinearSweep.js.map +1 -1
  562. package/lib/esm/solid/RotationalSweep.d.ts.map +1 -1
  563. package/lib/esm/solid/RotationalSweep.js +1 -3
  564. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  565. package/lib/esm/solid/TorusPipe.d.ts +4 -3
  566. package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
  567. package/lib/esm/solid/TorusPipe.js.map +1 -1
  568. package/lib/esm/topology/ChainMerge.d.ts +4 -4
  569. package/lib/esm/topology/ChainMerge.d.ts.map +1 -1
  570. package/lib/esm/topology/ChainMerge.js +11 -1
  571. package/lib/esm/topology/ChainMerge.js.map +1 -1
  572. package/lib/esm/topology/Graph.d.ts +2 -0
  573. package/lib/esm/topology/Graph.d.ts.map +1 -1
  574. package/lib/esm/topology/Graph.js +5 -0
  575. package/lib/esm/topology/Graph.js.map +1 -1
  576. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  577. package/lib/esm/topology/HalfEdgeGraphSearch.js +2 -0
  578. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  579. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  580. package/lib/esm/topology/HalfEdgePointInGraphSearch.js +23 -16
  581. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  582. package/lib/esm/topology/HalfEdgePositionDetail.d.ts +20 -9
  583. package/lib/esm/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  584. package/lib/esm/topology/HalfEdgePositionDetail.js +17 -13
  585. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  586. package/lib/esm/topology/HalfEdgePriorityQueue.d.ts.map +1 -1
  587. package/lib/esm/topology/HalfEdgePriorityQueue.js +4 -2
  588. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  589. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts +6 -2
  590. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  591. package/lib/esm/topology/InsertAndRetriangulateContext.js +41 -35
  592. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  593. package/lib/esm/topology/MaskManager.d.ts +7 -3
  594. package/lib/esm/topology/MaskManager.d.ts.map +1 -1
  595. package/lib/esm/topology/MaskManager.js +10 -4
  596. package/lib/esm/topology/MaskManager.js.map +1 -1
  597. package/lib/esm/topology/RegularizeFace.d.ts.map +1 -1
  598. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  599. package/lib/esm/topology/Triangulation.d.ts +2 -1
  600. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  601. package/lib/esm/topology/Triangulation.js +12 -7
  602. package/lib/esm/topology/Triangulation.js.map +1 -1
  603. package/package.json +3 -3
  604. package/lib/cjs/serialization/GeometrySamples.d.ts +0 -705
  605. package/lib/cjs/serialization/GeometrySamples.d.ts.map +0 -1
  606. package/lib/cjs/serialization/GeometrySamples.js +0 -2433
  607. package/lib/cjs/serialization/GeometrySamples.js.map +0 -1
  608. package/lib/esm/serialization/GeometrySamples.d.ts +0 -705
  609. package/lib/esm/serialization/GeometrySamples.d.ts.map +0 -1
  610. package/lib/esm/serialization/GeometrySamples.js +0 -2428
  611. package/lib/esm/serialization/GeometrySamples.js.map +0 -1
@@ -5,6 +5,7 @@
5
5
  /** @packageDocumentation
6
6
  * @module Topology
7
7
  */
8
+ import { assert } from "@itwin/core-bentley";
8
9
  import { Range1d } from "../geometry3d/Range";
9
10
  import { HalfEdgeGraph, HalfEdgeMask } from "./Graph";
10
11
  import { SignedDataSummary } from "./SignedDataSummary";
@@ -148,6 +149,7 @@ export class HalfEdgeGraphSearch {
148
149
  HalfEdgeGraphSearch.pushAndMaskAllNodesInFace(faceSeed, allMasks, stack, faces);
149
150
  while (stack.length > 0) {
150
151
  const p = stack.pop();
152
+ assert(p !== undefined, "expect defined; we just checked the stack length");
151
153
  const mate = p.edgeMate;
152
154
  if (!mate)
153
155
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"HalfEdgeGraphSearch.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgeGraphSearch.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\nimport { Range1d } from \"../geometry3d/Range\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask, HalfEdgeToBooleanFunction, NodeToNumberFunction } from \"./Graph\";\r\nimport { SignedDataSummary } from \"./SignedDataSummary\";\r\nimport { XYParitySearchContext } from \"./XYParitySearchContext\";\r\n\r\n/**\r\n * Interface for an object that executes boolean tests on edges.\r\n * @internal\r\n */\r\nexport interface HalfEdgeTestObject {\r\n testEdge(h: HalfEdge): boolean;\r\n}\r\n/**\r\n * Class to test match of half edge mask.\r\n * @internal\r\n */\r\nexport class HalfEdgeMaskTester {\r\n private _targetMask: HalfEdgeMask;\r\n private _targetValue: boolean;\r\n /**\r\n * Constructor\r\n * @param mask mask to test in `testEdge` function\r\n * @param targetValue value to match for true return\r\n */\r\n public constructor(mask: HalfEdgeMask, targetValue: boolean = true) {\r\n this._targetMask = mask;\r\n this._targetValue = targetValue;\r\n }\r\n /** Return true if the value of the targetMask matches the targetValue. */\r\n public testEdge(edge: HalfEdge): boolean {\r\n return edge.isMaskSet(this._targetMask) === this._targetValue;\r\n }\r\n}\r\n/**\r\n * Class for different types of searches for HalfEdgeGraph.\r\n * @internal\r\n */\r\nexport class HalfEdgeGraphSearch {\r\n /**\r\n * Static method for face area computation -- useful as function parameter in `collectFaceAreaSummary`.\r\n * * This simply calls `node.signedFaceArea()`\r\n * @param node instance for signedFaceArea call.\r\n */\r\n public static signedFaceArea(node: HalfEdge): number {\r\n return node.signedFaceArea();\r\n }\r\n /**\r\n * Return a summary of face data (e.g., area) as computed by the callback on the faces of the graph.\r\n * * Callers with curved edge graphs must supply their own area function.\r\n * @param source graph or array of nodes to examine.\r\n * @param collectAllNodes flag to pass to the `SignedDataSummary` constructor to control collection of nodes.\r\n * @param areaFunction function to obtain area (or other numeric value). Default computes polygonal face area.\r\n */\r\n public static collectFaceAreaSummary(\r\n source: HalfEdgeGraph | HalfEdge[],\r\n collectAllNodes: boolean = false,\r\n areaFunction: NodeToNumberFunction = (node) => HalfEdgeGraphSearch.signedFaceArea(node),\r\n ): SignedDataSummary<HalfEdge> {\r\n const result = new SignedDataSummary<HalfEdge>(collectAllNodes);\r\n let allFaces: HalfEdge[];\r\n if (source instanceof HalfEdgeGraph)\r\n allFaces = source.collectFaceLoops();\r\n else\r\n allFaces = source;\r\n for (const node of allFaces) {\r\n const area = areaFunction(node);\r\n result.announceItem(node, area);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Search the graph for the face with the most negative area.\r\n * * If the graph has exactly one connected component, this is its outer face.\r\n * @param oneCandidateNodePerFace graph or an array containing one node from each face to be considered.\r\n * @returns node on the negative area face with largest absolute area, or `undefined` if no negative area face.\r\n */\r\n public static findMinimumAreaFace(\r\n oneCandidateNodePerFace: HalfEdgeGraph | HalfEdge[], faceAreaFunction?: NodeToNumberFunction,\r\n ): HalfEdge | undefined {\r\n const summary = HalfEdgeGraphSearch.collectFaceAreaSummary(oneCandidateNodePerFace, false, faceAreaFunction);\r\n return summary.largestNegativeItem;\r\n }\r\n /**\r\n * Test if the graph is triangulated.\r\n * * Return `false` if:\r\n * * number of positive area faces with more than 3 edges is larger than `numPositiveExceptionsAllowed`.\r\n * * graph has more than 1 negative area face when `allowMultipleNegativeAreaFaces` is `false`.\r\n * * 2-edge faces are ignored.\r\n */\r\n public static isTriangulatedCCW(\r\n source: HalfEdgeGraph | HalfEdge[],\r\n allowMultipleNegativeAreaFaces: boolean = true,\r\n numPositiveExceptionsAllowed: number = 0,\r\n ): boolean {\r\n let allFaces: HalfEdge[];\r\n if (source instanceof HalfEdgeGraph)\r\n allFaces = source.collectFaceLoops();\r\n else\r\n allFaces = source;\r\n let numNegative = 0;\r\n let numPositiveExceptions = 0;\r\n for (const node of allFaces) {\r\n const numEdges = node.countEdgesAroundFace();\r\n if (numEdges >= 3) {\r\n const area = node.signedFaceArea();\r\n if (area > 0) {\r\n if (numEdges > 3) {\r\n numPositiveExceptions++;\r\n if (numPositiveExceptions > numPositiveExceptionsAllowed)\r\n return false;\r\n }\r\n } else {\r\n numNegative++;\r\n if (numNegative > 1) {\r\n if (!allowMultipleNegativeAreaFaces)\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Process a face during graph traversal.\r\n * @param faceSeed a node in the face.\r\n * @param mask mask to set on each node of the face.\r\n * @param allNodeStack array appended with each node of the face.\r\n * @param onePerFaceStack array appended with `faceSeed`.\r\n */\r\n private static pushAndMaskAllNodesInFace(\r\n faceSeed: HalfEdge, mask: number, allNodeStack: HalfEdge[], onePerFaceStack: HalfEdge[],\r\n ): void {\r\n onePerFaceStack.push(faceSeed);\r\n faceSeed.collectAroundFace((node: HalfEdge) => {\r\n node.setMask(mask);\r\n allNodeStack.push(node);\r\n });\r\n }\r\n /**\r\n * Traverse (via Depth First Search) to all accessible faces from the given seed.\r\n * @param faceSeed first node to start the traverse.\r\n * @param visitMask mask applied to all faces as visited.\r\n * @param parityEdgeTester function to test if an edge is adjacent to two faces of opposite parity, e.g., a boundary\r\n * edge that separates an \"interior\" face and an \"exterior\" face. If `parityEdgeTester` is not supplied and `parityMask`\r\n * is supplied, the default parity rule is to alternate parity state in a \"bullseye\" pattern starting at the seed face,\r\n * with each successive concentric ring of faces at constant topological distance from the seed face receiving the\r\n * opposite parity state of the previous ring.\r\n * @param parityMask mask to apply to the first face and faces that share the same parity as the first face, as\r\n * determined by the parity rule. If this is `NULL_MASK`, there is no record of parity. If (non-null) parity mask\r\n * is given, on return it is entirely set or entirely clear around each face.\r\n * @returns an array that contains one representative node in each face of the connected component.\r\n */\r\n private static parityFloodFromSeed(\r\n faceSeed: HalfEdge,\r\n visitMask: HalfEdgeMask,\r\n parityEdgeTester: HalfEdgeTestObject | undefined,\r\n parityMask: HalfEdgeMask,\r\n ): HalfEdge[] {\r\n const faces: HalfEdge[] = [];\r\n if (faceSeed.isMaskSet(visitMask))\r\n return faces; // empty array\r\n const allMasks = parityMask | visitMask;\r\n const stack: HalfEdge[] = [];\r\n // the seed face is arbitrarily assigned the parity mask\r\n HalfEdgeGraphSearch.pushAndMaskAllNodesInFace(faceSeed, allMasks, stack, faces);\r\n while (stack.length > 0) {\r\n const p = stack.pop()!;\r\n const mate = p.edgeMate;\r\n if (!mate)\r\n continue;\r\n if (!mate.isMaskSet(visitMask)) {\r\n let newState = p.isMaskSet(parityMask);\r\n if (!parityEdgeTester || parityEdgeTester.testEdge(p))\r\n newState = !newState;\r\n HalfEdgeGraphSearch.pushAndMaskAllNodesInFace(mate, newState ? allMasks : visitMask, stack, faces);\r\n }\r\n }\r\n return faces;\r\n }\r\n /**\r\n * * Correct the parity mask in the faces of a component.\r\n * * It is assumed that the parity mask is applied _consistently_ throughout the supplied faces, but maybe\r\n * not _correctly_.\r\n * * A consistently applied parity mask is \"correct\" if it is set on the negative area (\"exterior\") face of\r\n * a connected component.\r\n * * This method finds a face with negative area and toggles the mask throughout the input faces if this face\r\n * lacks the parity mask.\r\n * * In a properly merged planar subdivision there should be only one true negative area face per component.\r\n */\r\n private static correctParityInSingleComponent(parityMask: HalfEdgeMask, faces: HalfEdge[]): void {\r\n const exteriorHalfEdge = HalfEdgeGraphSearch.findMinimumAreaFace(faces);\r\n if (!exteriorHalfEdge) {\r\n // graph has all degenerate faces; do nothing\r\n } else if (exteriorHalfEdge.isMaskSet(parityMask)) {\r\n // all should be well; nothing to do\r\n } else {\r\n for (const faceSeed of faces) {\r\n if (faceSeed.isMaskSet(parityMask)) {\r\n faceSeed.clearMaskAroundFace(parityMask);\r\n } else {\r\n faceSeed.setMaskAroundFace(parityMask);\r\n }\r\n }\r\n }\r\n }\r\n /** Apply `correctParityInSingleComponent` to each array in components (quick exit if `parityMask` is `NULL_MASK`). */\r\n private static correctParityInComponentArrays(parityMask: HalfEdgeMask, components: HalfEdge[][]): void {\r\n if (parityMask === HalfEdgeMask.NULL_MASK)\r\n return;\r\n for (const facesInComponent of components)\r\n HalfEdgeGraphSearch.correctParityInSingleComponent(parityMask, facesInComponent);\r\n }\r\n /**\r\n * Collect connected components of the graph (via Depth First Search).\r\n * @param graph graph to inspect.\r\n * @param parityEdgeTester (optional) function to test if an edge is adjacent to two faces of opposite parity,\r\n * e.g., a boundary edge that separates an \"interior\" face and an \"exterior\" face. If `parityEdgeTester` is not\r\n * supplied and `parityMask` is supplied, the default parity rule is to alternate parity state in a \"bullseye\"\r\n * pattern starting at the seed face, with each successive concentric ring of faces at constant topological\r\n * distance from the seed face receiving the opposite parity state of the previous ring.\r\n * @param parityMask (optional) mask to apply to the first face and faces that share the same parity as the\r\n * first face, as determined by the parity rule. If this is `NULL_MASK` (default), there is no record of parity.\r\n * If (non-null) parity mask is given, on return it is entirely set or entirely clear around each face.\r\n * @returns the components of the graph, each component represented by an array of nodes, one node per face\r\n * of the component. In other words, entry [i][j] is a HalfEdge in the j_th face loop of the i_th component.\r\n */\r\n public static collectConnectedComponentsWithExteriorParityMasks(\r\n graph: HalfEdgeGraph,\r\n parityEdgeTester: HalfEdgeTestObject | undefined,\r\n parityMask: HalfEdgeMask = HalfEdgeMask.NULL_MASK,\r\n ): HalfEdge[][] {\r\n // Illustration of the algorithm can be found at geometry/internaldocs/Graph.md\r\n const components = [];\r\n const visitMask = HalfEdgeMask.VISITED;\r\n const allMasks = parityMask | visitMask;\r\n graph.clearMask(allMasks);\r\n for (const faceSeed of graph.allHalfEdges) {\r\n if (!faceSeed.isMaskSet(visitMask)) {\r\n const newFaces = HalfEdgeGraphSearch.parityFloodFromSeed(faceSeed, visitMask, parityEdgeTester, parityMask);\r\n // parityFloodFromSeed does not return an empty array because it is called on an unvisited faceSeed\r\n components.push(newFaces);\r\n }\r\n }\r\n HalfEdgeGraphSearch.correctParityInComponentArrays(parityMask, components);\r\n return components;\r\n }\r\n /**\r\n * Breadth-first search through the connected component defined by `seed` and `ignoreMask`.\r\n * @param seed a HalfEdge in the component from which to start the search.\r\n * @param visitMask a mask to apply to visited nodes. Assumed cleared throughout component before first call.\r\n * @param ignoreMask (optional) mask preset on faces that are to be treated as _outside_ the component.\r\n * Default value is `HalfEdgeMask.EXTERIOR` to ignore exterior faces.\r\n * Pass `HalfEdgeMask.NULL_MASK` to process all faces of the component.\r\n * Note that if `ignoreMask` is set on both sides of an edge, both adjacent faces will be ignored; thus it\r\n * is generally more useful if set on only one side of an edge.\r\n * @param maxFaceCount (optional) maximum number of faces to search in the component. If nonpositive or\r\n * `undefined`, `Infinity` is used.\r\n * @param result optional array to append with HalfEdges and return as the `faces` array. This array is not\r\n * emptied first, so callers can send it into a subsequent call to continue searching the component at `nextSeed`.\r\n * @returns `faces` consists of one edge per face of the component; `nextSeed` is the seed at which to start\r\n * the next call if `maxFaceCount` is exceeded (otherwise it is `undefined`).\r\n */\r\n public static exploreComponent(\r\n seed: HalfEdge,\r\n visitMask: HalfEdgeMask,\r\n ignoreMask: HalfEdgeMask = HalfEdgeMask.EXTERIOR,\r\n maxFaceCount: number = Infinity,\r\n result?: HalfEdge[],\r\n ): { faces: HalfEdge[], nextSeed: HalfEdge | undefined} {\r\n if (maxFaceCount <= 0)\r\n maxFaceCount = Infinity;\r\n const boundaryMask: HalfEdgeMask = visitMask | ignoreMask;\r\n let numFaces = 0;\r\n const candidates: HalfEdge[] = []; // the queue\r\n const faces: HalfEdge[] = result ? result : [];\r\n candidates.push(seed);\r\n while (candidates.length > 0 && numFaces < maxFaceCount) {\r\n // TODO: shift is O(n) thus inefficient for large queues. If needed, we can\r\n // replace the queue by a circular array or use 2 stacks; both are O(1).\r\n const node = candidates.shift();\r\n if (node && !node.isMaskSet(boundaryMask)) {\r\n faces.push(node);\r\n ++numFaces;\r\n node.collectAroundFace((he: HalfEdge) => {\r\n he.setMask(visitMask);\r\n const neighbor = he.vertexSuccessor;\r\n if (!neighbor.isMaskSet(boundaryMask))\r\n candidates.push(neighbor); // enqueue neighboring face\r\n });\r\n }\r\n }\r\n if (candidates.length === 0)\r\n return { faces, nextSeed: undefined };\r\n\r\n // try to find a node at the boundary of the current component and the next\r\n let nextSeed = candidates[0];\r\n for (const candidate of candidates) {\r\n if (candidate.vertexSuccessor.isMaskSet(ignoreMask) || candidate.edgeMate.isMaskSet(ignoreMask)) {\r\n nextSeed = candidate;\r\n break;\r\n }\r\n }\r\n return { faces, nextSeed };\r\n }\r\n /**\r\n * Collect connected components of the graph (via Breadth First Search).\r\n * @param graph graph to inspect.\r\n * @param maxFaceCount (optional) maximum number of faces in each component. Should be positive; otherwise\r\n * `Infinity` is used.\r\n * @param ignoreMask (optional) mask preset on faces to ignore. Default value is `HalfEdgeMask.EXTERIOR` to ignore\r\n * exterior faces. Pass `HalfEdgeMask.NULL_MASK` to process all faces.\r\n * @returns the components of the graph, each component represented by an array of nodes, one node per face\r\n * of the component. In other words, entry [i][j] is a HalfEdge in the j_th face loop of the i_th component.\r\n */\r\n public static collectConnectedComponents(\r\n graph: HalfEdgeGraph,\r\n maxFaceCount: number = Infinity,\r\n ignoreMask: HalfEdgeMask = HalfEdgeMask.EXTERIOR,\r\n ): HalfEdge[][] {\r\n const components: HalfEdge[][] = [];\r\n if (graph.countMask(ignoreMask) === 0)\r\n ignoreMask = HalfEdgeMask.NULL_MASK;\r\n const visitMask = HalfEdgeMask.VISITED;\r\n graph.clearMask(visitMask);\r\n const boundaryMask: HalfEdgeMask = visitMask | ignoreMask;\r\n // Starting with the input node, look ahead for a boundary face. Failing that, return the input node.\r\n // Starting all floods at the boundary reduces the chance of ending up with a ring-shaped component at the boundary.\r\n const findNextFloodSeed = (index: number) => {\r\n for (let i = index; i < graph.countNodes(); ++i) {\r\n if (!graph.allHalfEdges[i].isMaskSet(boundaryMask)\r\n && graph.allHalfEdges[i].edgeMate.isMaskSet(boundaryMask)) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n return index;\r\n };\r\n for (let i = 0; i < graph.countNodes(); ++i) {\r\n if (graph.allHalfEdges[i].isMaskSet(boundaryMask))\r\n continue;\r\n const i0 = findNextFloodSeed(i);\r\n let seed: HalfEdge | undefined = graph.allHalfEdges[i0];\r\n do { // flood this component\r\n const result = HalfEdgeGraphSearch.exploreComponent(seed, visitMask, ignoreMask, maxFaceCount);\r\n seed = result.nextSeed;\r\n if (result.faces.length > 0)\r\n components.push(result.faces); // each sub-component of length <= maxFaceCount is treated as a component\r\n } while (seed !== undefined);\r\n if (!graph.allHalfEdges[i].isMaskSet(visitMask))\r\n --i; // reprocess this node\r\n }\r\n return components;\r\n }\r\n /**\r\n * Test if test point (xTest,yTest) is inside/outside a face or on an edge.\r\n * * NOTE: a point outside the graph (in the exterior face) returns -1.\r\n * @param seedNode any node on the face loop.\r\n * @param xTest x coordinate of the test point.\r\n * @param yTest y coordinate of the test point.\r\n * @returns 0 if ON, 1 if IN, -1 if OUT.\r\n */\r\n public static pointInOrOnFaceXY(seedNode: HalfEdge, xTest: number, yTest: number): number {\r\n const context = new XYParitySearchContext(xTest, yTest);\r\n // walk around looking for an accepted node to start the search (seedNode is usually ok)\r\n let nodeA = seedNode;\r\n let nodeB = seedNode.faceSuccessor;\r\n for (; ; nodeA = nodeB) {\r\n if (context.tryStartEdge(nodeA.x, nodeA.y, nodeB.x, nodeB.y))\r\n break;\r\n if (nodeB === seedNode) {\r\n // the test point and the face are all on line \"y = yTest\"\r\n const range = Range1d.createXX(nodeB.x, nodeB.faceSuccessor.x);\r\n return range.containsX(xTest) ? 0 : -1;\r\n }\r\n nodeB = nodeA.faceSuccessor;\r\n }\r\n // nodeB is the real start node for search, so stop when we revisit it. For each edge, accumulate parity and hits\r\n let nodeC = nodeB.faceSuccessor;\r\n for (; ;) {\r\n if (!context.advance(nodeC.x, nodeC.y)) {\r\n return context.classifyCounts();\r\n }\r\n if (nodeC === nodeB)\r\n break;\r\n nodeC = nodeC.faceSuccessor;\r\n }\r\n return context.classifyCounts();\r\n }\r\n /**\r\n * Collect boundary edges starting from `seed`.\r\n * * If `seed` is not a boundary node or is already visited, the function exists early.\r\n * @param seed start node.\r\n * @param visitMask mask to set on processed nodes.\r\n * @param isBoundaryEdge function to test if an edge in a boundary edge.\r\n * @param announceEdgeInBoundary callback invoked on each edge in the boundary loop in order. The counter is zero\r\n * for the first edge, and incremented with each successive edge.\r\n */\r\n public static collectExtendedBoundaryLoopFromSeed(\r\n seed: HalfEdge,\r\n visitMask: HalfEdgeMask,\r\n isBoundaryEdge: HalfEdgeToBooleanFunction,\r\n announceEdgeInBoundary: (edge: HalfEdge, counter: number) => void,\r\n ): void {\r\n let counter = 0;\r\n while (!seed.getMask(visitMask) && isBoundaryEdge(seed)) {\r\n announceEdgeInBoundary(seed, counter++);\r\n seed.setMask(visitMask);\r\n const vertexBase = seed.faceSuccessor;\r\n let candidateAroundVertex = vertexBase;\r\n for (; ;) {\r\n if (candidateAroundVertex.getMask(visitMask)) // end of boundary loop\r\n return;\r\n if (isBoundaryEdge(candidateAroundVertex)) {\r\n seed = candidateAroundVertex;\r\n break;\r\n }\r\n candidateAroundVertex = candidateAroundVertex.vertexPredecessor;\r\n if (candidateAroundVertex === vertexBase)\r\n break; // prevent infinite loop in case exteriorMask is not set on the edge mate of the boundary edge\r\n }\r\n }\r\n }\r\n /**\r\n * Collect boundary edges in the graph.\r\n * * A boundary edge is defined by `exteriorMask` being set on only its \"exterior\" edge mate.\r\n * * Each boundary edge is identified in the output by its edge mate that lacks `exteriorMask`.\r\n * * Each inner array is ordered in the output so that its boundary edges form a connected path. If `exteriorMask`\r\n * is preset consistently around each \"exterior\" face, these paths are loops.\r\n * @param graph the graph to query\r\n * @param exteriorMask mask preset on exactly one side of boundary edges\r\n * @returns array of boundary loops, each loop an array of the unmasked mates of boundary edges\r\n */\r\n public static collectExtendedBoundaryLoopsInGraph(graph: HalfEdgeGraph, exteriorMask: HalfEdgeMask): HalfEdge[][] {\r\n // Illustration of the algorithm can be found at geometry/internaldocs/Graph.md\r\n const loops: HalfEdge[][] = [];\r\n const visitMask = graph.grabMask(true);\r\n const isBoundaryEdge = (edge: HalfEdge): boolean => {\r\n return edge.getMask(exteriorMask) === 0 && edge.edgeMate.getMask(exteriorMask) !== 0;\r\n };\r\n const announceEdgeInBoundary = (edge: HalfEdge, counter: number) => {\r\n if (counter === 0)\r\n loops.push([]);\r\n loops[loops.length - 1].push(edge);\r\n };\r\n for (const seed of graph.allHalfEdges) {\r\n this.collectExtendedBoundaryLoopFromSeed(seed, visitMask, isBoundaryEdge, announceEdgeInBoundary);\r\n }\r\n graph.dropMask(visitMask);\r\n return loops;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HalfEdgeGraphSearch.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgeGraphSearch.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\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Range1d } from \"../geometry3d/Range\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask, HalfEdgeToBooleanFunction, NodeToNumberFunction } from \"./Graph\";\r\nimport { SignedDataSummary } from \"./SignedDataSummary\";\r\nimport { XYParitySearchContext } from \"./XYParitySearchContext\";\r\n\r\n/**\r\n * Interface for an object that executes boolean tests on edges.\r\n * @internal\r\n */\r\nexport interface HalfEdgeTestObject {\r\n testEdge(h: HalfEdge): boolean;\r\n}\r\n/**\r\n * Class to test match of half edge mask.\r\n * @internal\r\n */\r\nexport class HalfEdgeMaskTester {\r\n private _targetMask: HalfEdgeMask;\r\n private _targetValue: boolean;\r\n /**\r\n * Constructor\r\n * @param mask mask to test in `testEdge` function\r\n * @param targetValue value to match for true return\r\n */\r\n public constructor(mask: HalfEdgeMask, targetValue: boolean = true) {\r\n this._targetMask = mask;\r\n this._targetValue = targetValue;\r\n }\r\n /** Return true if the value of the targetMask matches the targetValue. */\r\n public testEdge(edge: HalfEdge): boolean {\r\n return edge.isMaskSet(this._targetMask) === this._targetValue;\r\n }\r\n}\r\n/**\r\n * Class for different types of searches for HalfEdgeGraph.\r\n * @internal\r\n */\r\nexport class HalfEdgeGraphSearch {\r\n /**\r\n * Static method for face area computation -- useful as function parameter in `collectFaceAreaSummary`.\r\n * * This simply calls `node.signedFaceArea()`\r\n * @param node instance for signedFaceArea call.\r\n */\r\n public static signedFaceArea(node: HalfEdge): number {\r\n return node.signedFaceArea();\r\n }\r\n /**\r\n * Return a summary of face data (e.g., area) as computed by the callback on the faces of the graph.\r\n * * Callers with curved edge graphs must supply their own area function.\r\n * @param source graph or array of nodes to examine.\r\n * @param collectAllNodes flag to pass to the `SignedDataSummary` constructor to control collection of nodes.\r\n * @param areaFunction function to obtain area (or other numeric value). Default computes polygonal face area.\r\n */\r\n public static collectFaceAreaSummary(\r\n source: HalfEdgeGraph | HalfEdge[],\r\n collectAllNodes: boolean = false,\r\n areaFunction: NodeToNumberFunction = (node) => HalfEdgeGraphSearch.signedFaceArea(node),\r\n ): SignedDataSummary<HalfEdge> {\r\n const result = new SignedDataSummary<HalfEdge>(collectAllNodes);\r\n let allFaces: HalfEdge[];\r\n if (source instanceof HalfEdgeGraph)\r\n allFaces = source.collectFaceLoops();\r\n else\r\n allFaces = source;\r\n for (const node of allFaces) {\r\n const area = areaFunction(node);\r\n result.announceItem(node, area);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Search the graph for the face with the most negative area.\r\n * * If the graph has exactly one connected component, this is its outer face.\r\n * @param oneCandidateNodePerFace graph or an array containing one node from each face to be considered.\r\n * @returns node on the negative area face with largest absolute area, or `undefined` if no negative area face.\r\n */\r\n public static findMinimumAreaFace(\r\n oneCandidateNodePerFace: HalfEdgeGraph | HalfEdge[], faceAreaFunction?: NodeToNumberFunction,\r\n ): HalfEdge | undefined {\r\n const summary = HalfEdgeGraphSearch.collectFaceAreaSummary(oneCandidateNodePerFace, false, faceAreaFunction);\r\n return summary.largestNegativeItem;\r\n }\r\n /**\r\n * Test if the graph is triangulated.\r\n * * Return `false` if:\r\n * * number of positive area faces with more than 3 edges is larger than `numPositiveExceptionsAllowed`.\r\n * * graph has more than 1 negative area face when `allowMultipleNegativeAreaFaces` is `false`.\r\n * * 2-edge faces are ignored.\r\n */\r\n public static isTriangulatedCCW(\r\n source: HalfEdgeGraph | HalfEdge[],\r\n allowMultipleNegativeAreaFaces: boolean = true,\r\n numPositiveExceptionsAllowed: number = 0,\r\n ): boolean {\r\n let allFaces: HalfEdge[];\r\n if (source instanceof HalfEdgeGraph)\r\n allFaces = source.collectFaceLoops();\r\n else\r\n allFaces = source;\r\n let numNegative = 0;\r\n let numPositiveExceptions = 0;\r\n for (const node of allFaces) {\r\n const numEdges = node.countEdgesAroundFace();\r\n if (numEdges >= 3) {\r\n const area = node.signedFaceArea();\r\n if (area > 0) {\r\n if (numEdges > 3) {\r\n numPositiveExceptions++;\r\n if (numPositiveExceptions > numPositiveExceptionsAllowed)\r\n return false;\r\n }\r\n } else {\r\n numNegative++;\r\n if (numNegative > 1) {\r\n if (!allowMultipleNegativeAreaFaces)\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Process a face during graph traversal.\r\n * @param faceSeed a node in the face.\r\n * @param mask mask to set on each node of the face.\r\n * @param allNodeStack array appended with each node of the face.\r\n * @param onePerFaceStack array appended with `faceSeed`.\r\n */\r\n private static pushAndMaskAllNodesInFace(\r\n faceSeed: HalfEdge, mask: number, allNodeStack: HalfEdge[], onePerFaceStack: HalfEdge[],\r\n ): void {\r\n onePerFaceStack.push(faceSeed);\r\n faceSeed.collectAroundFace((node: HalfEdge) => {\r\n node.setMask(mask);\r\n allNodeStack.push(node);\r\n });\r\n }\r\n /**\r\n * Traverse (via Depth First Search) to all accessible faces from the given seed.\r\n * @param faceSeed first node to start the traverse.\r\n * @param visitMask mask applied to all faces as visited.\r\n * @param parityEdgeTester function to test if an edge is adjacent to two faces of opposite parity, e.g., a boundary\r\n * edge that separates an \"interior\" face and an \"exterior\" face. If `parityEdgeTester` is not supplied and `parityMask`\r\n * is supplied, the default parity rule is to alternate parity state in a \"bullseye\" pattern starting at the seed face,\r\n * with each successive concentric ring of faces at constant topological distance from the seed face receiving the\r\n * opposite parity state of the previous ring.\r\n * @param parityMask mask to apply to the first face and faces that share the same parity as the first face, as\r\n * determined by the parity rule. If this is `NULL_MASK`, there is no record of parity. If (non-null) parity mask\r\n * is given, on return it is entirely set or entirely clear around each face.\r\n * @returns an array that contains one representative node in each face of the connected component.\r\n */\r\n private static parityFloodFromSeed(\r\n faceSeed: HalfEdge,\r\n visitMask: HalfEdgeMask,\r\n parityEdgeTester: HalfEdgeTestObject | undefined,\r\n parityMask: HalfEdgeMask,\r\n ): HalfEdge[] {\r\n const faces: HalfEdge[] = [];\r\n if (faceSeed.isMaskSet(visitMask))\r\n return faces; // empty array\r\n const allMasks = parityMask | visitMask;\r\n const stack: HalfEdge[] = [];\r\n // the seed face is arbitrarily assigned the parity mask\r\n HalfEdgeGraphSearch.pushAndMaskAllNodesInFace(faceSeed, allMasks, stack, faces);\r\n while (stack.length > 0) {\r\n const p = stack.pop();\r\n assert(p !== undefined, \"expect defined; we just checked the stack length\");\r\n const mate = p.edgeMate;\r\n if (!mate)\r\n continue;\r\n if (!mate.isMaskSet(visitMask)) {\r\n let newState = p.isMaskSet(parityMask);\r\n if (!parityEdgeTester || parityEdgeTester.testEdge(p))\r\n newState = !newState;\r\n HalfEdgeGraphSearch.pushAndMaskAllNodesInFace(mate, newState ? allMasks : visitMask, stack, faces);\r\n }\r\n }\r\n return faces;\r\n }\r\n /**\r\n * * Correct the parity mask in the faces of a component.\r\n * * It is assumed that the parity mask is applied _consistently_ throughout the supplied faces, but maybe\r\n * not _correctly_.\r\n * * A consistently applied parity mask is \"correct\" if it is set on the negative area (\"exterior\") face of\r\n * a connected component.\r\n * * This method finds a face with negative area and toggles the mask throughout the input faces if this face\r\n * lacks the parity mask.\r\n * * In a properly merged planar subdivision there should be only one true negative area face per component.\r\n */\r\n private static correctParityInSingleComponent(parityMask: HalfEdgeMask, faces: HalfEdge[]): void {\r\n const exteriorHalfEdge = HalfEdgeGraphSearch.findMinimumAreaFace(faces);\r\n if (!exteriorHalfEdge) {\r\n // graph has all degenerate faces; do nothing\r\n } else if (exteriorHalfEdge.isMaskSet(parityMask)) {\r\n // all should be well; nothing to do\r\n } else {\r\n for (const faceSeed of faces) {\r\n if (faceSeed.isMaskSet(parityMask)) {\r\n faceSeed.clearMaskAroundFace(parityMask);\r\n } else {\r\n faceSeed.setMaskAroundFace(parityMask);\r\n }\r\n }\r\n }\r\n }\r\n /** Apply `correctParityInSingleComponent` to each array in components (quick exit if `parityMask` is `NULL_MASK`). */\r\n private static correctParityInComponentArrays(parityMask: HalfEdgeMask, components: HalfEdge[][]): void {\r\n if (parityMask === HalfEdgeMask.NULL_MASK)\r\n return;\r\n for (const facesInComponent of components)\r\n HalfEdgeGraphSearch.correctParityInSingleComponent(parityMask, facesInComponent);\r\n }\r\n /**\r\n * Collect connected components of the graph (via Depth First Search).\r\n * @param graph graph to inspect.\r\n * @param parityEdgeTester (optional) function to test if an edge is adjacent to two faces of opposite parity,\r\n * e.g., a boundary edge that separates an \"interior\" face and an \"exterior\" face. If `parityEdgeTester` is not\r\n * supplied and `parityMask` is supplied, the default parity rule is to alternate parity state in a \"bullseye\"\r\n * pattern starting at the seed face, with each successive concentric ring of faces at constant topological\r\n * distance from the seed face receiving the opposite parity state of the previous ring.\r\n * @param parityMask (optional) mask to apply to the first face and faces that share the same parity as the\r\n * first face, as determined by the parity rule. If this is `NULL_MASK` (default), there is no record of parity.\r\n * If (non-null) parity mask is given, on return it is entirely set or entirely clear around each face.\r\n * @returns the components of the graph, each component represented by an array of nodes, one node per face\r\n * of the component. In other words, entry [i][j] is a HalfEdge in the j_th face loop of the i_th component.\r\n */\r\n public static collectConnectedComponentsWithExteriorParityMasks(\r\n graph: HalfEdgeGraph,\r\n parityEdgeTester: HalfEdgeTestObject | undefined,\r\n parityMask: HalfEdgeMask = HalfEdgeMask.NULL_MASK,\r\n ): HalfEdge[][] {\r\n // Illustration of the algorithm can be found at geometry/internaldocs/Graph.md\r\n const components = [];\r\n const visitMask = HalfEdgeMask.VISITED;\r\n const allMasks = parityMask | visitMask;\r\n graph.clearMask(allMasks);\r\n for (const faceSeed of graph.allHalfEdges) {\r\n if (!faceSeed.isMaskSet(visitMask)) {\r\n const newFaces = HalfEdgeGraphSearch.parityFloodFromSeed(faceSeed, visitMask, parityEdgeTester, parityMask);\r\n // parityFloodFromSeed does not return an empty array because it is called on an unvisited faceSeed\r\n components.push(newFaces);\r\n }\r\n }\r\n HalfEdgeGraphSearch.correctParityInComponentArrays(parityMask, components);\r\n return components;\r\n }\r\n /**\r\n * Breadth-first search through the connected component defined by `seed` and `ignoreMask`.\r\n * @param seed a HalfEdge in the component from which to start the search.\r\n * @param visitMask a mask to apply to visited nodes. Assumed cleared throughout component before first call.\r\n * @param ignoreMask (optional) mask preset on faces that are to be treated as _outside_ the component.\r\n * Default value is `HalfEdgeMask.EXTERIOR` to ignore exterior faces.\r\n * Pass `HalfEdgeMask.NULL_MASK` to process all faces of the component.\r\n * Note that if `ignoreMask` is set on both sides of an edge, both adjacent faces will be ignored; thus it\r\n * is generally more useful if set on only one side of an edge.\r\n * @param maxFaceCount (optional) maximum number of faces to search in the component. If nonpositive or\r\n * `undefined`, `Infinity` is used.\r\n * @param result optional array to append with HalfEdges and return as the `faces` array. This array is not\r\n * emptied first, so callers can send it into a subsequent call to continue searching the component at `nextSeed`.\r\n * @returns `faces` consists of one edge per face of the component; `nextSeed` is the seed at which to start\r\n * the next call if `maxFaceCount` is exceeded (otherwise it is `undefined`).\r\n */\r\n public static exploreComponent(\r\n seed: HalfEdge,\r\n visitMask: HalfEdgeMask,\r\n ignoreMask: HalfEdgeMask = HalfEdgeMask.EXTERIOR,\r\n maxFaceCount: number = Infinity,\r\n result?: HalfEdge[],\r\n ): { faces: HalfEdge[], nextSeed: HalfEdge | undefined} {\r\n if (maxFaceCount <= 0)\r\n maxFaceCount = Infinity;\r\n const boundaryMask: HalfEdgeMask = visitMask | ignoreMask;\r\n let numFaces = 0;\r\n const candidates: HalfEdge[] = []; // the queue\r\n const faces: HalfEdge[] = result ? result : [];\r\n candidates.push(seed);\r\n while (candidates.length > 0 && numFaces < maxFaceCount) {\r\n // TODO: shift is O(n) thus inefficient for large queues. If needed, we can\r\n // replace the queue by a circular array or use 2 stacks; both are O(1).\r\n const node = candidates.shift();\r\n if (node && !node.isMaskSet(boundaryMask)) {\r\n faces.push(node);\r\n ++numFaces;\r\n node.collectAroundFace((he: HalfEdge) => {\r\n he.setMask(visitMask);\r\n const neighbor = he.vertexSuccessor;\r\n if (!neighbor.isMaskSet(boundaryMask))\r\n candidates.push(neighbor); // enqueue neighboring face\r\n });\r\n }\r\n }\r\n if (candidates.length === 0)\r\n return { faces, nextSeed: undefined };\r\n\r\n // try to find a node at the boundary of the current component and the next\r\n let nextSeed = candidates[0];\r\n for (const candidate of candidates) {\r\n if (candidate.vertexSuccessor.isMaskSet(ignoreMask) || candidate.edgeMate.isMaskSet(ignoreMask)) {\r\n nextSeed = candidate;\r\n break;\r\n }\r\n }\r\n return { faces, nextSeed };\r\n }\r\n /**\r\n * Collect connected components of the graph (via Breadth First Search).\r\n * @param graph graph to inspect.\r\n * @param maxFaceCount (optional) maximum number of faces in each component. Should be positive; otherwise\r\n * `Infinity` is used.\r\n * @param ignoreMask (optional) mask preset on faces to ignore. Default value is `HalfEdgeMask.EXTERIOR` to ignore\r\n * exterior faces. Pass `HalfEdgeMask.NULL_MASK` to process all faces.\r\n * @returns the components of the graph, each component represented by an array of nodes, one node per face\r\n * of the component. In other words, entry [i][j] is a HalfEdge in the j_th face loop of the i_th component.\r\n */\r\n public static collectConnectedComponents(\r\n graph: HalfEdgeGraph,\r\n maxFaceCount: number = Infinity,\r\n ignoreMask: HalfEdgeMask = HalfEdgeMask.EXTERIOR,\r\n ): HalfEdge[][] {\r\n const components: HalfEdge[][] = [];\r\n if (graph.countMask(ignoreMask) === 0)\r\n ignoreMask = HalfEdgeMask.NULL_MASK;\r\n const visitMask = HalfEdgeMask.VISITED;\r\n graph.clearMask(visitMask);\r\n const boundaryMask: HalfEdgeMask = visitMask | ignoreMask;\r\n // Starting with the input node, look ahead for a boundary face. Failing that, return the input node.\r\n // Starting all floods at the boundary reduces the chance of ending up with a ring-shaped component at the boundary.\r\n const findNextFloodSeed = (index: number) => {\r\n for (let i = index; i < graph.countNodes(); ++i) {\r\n if (!graph.allHalfEdges[i].isMaskSet(boundaryMask)\r\n && graph.allHalfEdges[i].edgeMate.isMaskSet(boundaryMask)) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n return index;\r\n };\r\n for (let i = 0; i < graph.countNodes(); ++i) {\r\n if (graph.allHalfEdges[i].isMaskSet(boundaryMask))\r\n continue;\r\n const i0 = findNextFloodSeed(i);\r\n let seed: HalfEdge | undefined = graph.allHalfEdges[i0];\r\n do { // flood this component\r\n const result = HalfEdgeGraphSearch.exploreComponent(seed, visitMask, ignoreMask, maxFaceCount);\r\n seed = result.nextSeed;\r\n if (result.faces.length > 0)\r\n components.push(result.faces); // each sub-component of length <= maxFaceCount is treated as a component\r\n } while (seed !== undefined);\r\n if (!graph.allHalfEdges[i].isMaskSet(visitMask))\r\n --i; // reprocess this node\r\n }\r\n return components;\r\n }\r\n /**\r\n * Test if test point (xTest,yTest) is inside/outside a face or on an edge.\r\n * * NOTE: a point outside the graph (in the exterior face) returns -1.\r\n * @param seedNode any node on the face loop.\r\n * @param xTest x coordinate of the test point.\r\n * @param yTest y coordinate of the test point.\r\n * @returns 0 if ON, 1 if IN, -1 if OUT.\r\n */\r\n public static pointInOrOnFaceXY(seedNode: HalfEdge, xTest: number, yTest: number): number {\r\n const context = new XYParitySearchContext(xTest, yTest);\r\n // walk around looking for an accepted node to start the search (seedNode is usually ok)\r\n let nodeA = seedNode;\r\n let nodeB = seedNode.faceSuccessor;\r\n for (; ; nodeA = nodeB) {\r\n if (context.tryStartEdge(nodeA.x, nodeA.y, nodeB.x, nodeB.y))\r\n break;\r\n if (nodeB === seedNode) {\r\n // the test point and the face are all on line \"y = yTest\"\r\n const range = Range1d.createXX(nodeB.x, nodeB.faceSuccessor.x);\r\n return range.containsX(xTest) ? 0 : -1;\r\n }\r\n nodeB = nodeA.faceSuccessor;\r\n }\r\n // nodeB is the real start node for search, so stop when we revisit it. For each edge, accumulate parity and hits\r\n let nodeC = nodeB.faceSuccessor;\r\n for (; ;) {\r\n if (!context.advance(nodeC.x, nodeC.y)) {\r\n return context.classifyCounts();\r\n }\r\n if (nodeC === nodeB)\r\n break;\r\n nodeC = nodeC.faceSuccessor;\r\n }\r\n return context.classifyCounts();\r\n }\r\n /**\r\n * Collect boundary edges starting from `seed`.\r\n * * If `seed` is not a boundary node or is already visited, the function exists early.\r\n * @param seed start node.\r\n * @param visitMask mask to set on processed nodes.\r\n * @param isBoundaryEdge function to test if an edge in a boundary edge.\r\n * @param announceEdgeInBoundary callback invoked on each edge in the boundary loop in order. The counter is zero\r\n * for the first edge, and incremented with each successive edge.\r\n */\r\n public static collectExtendedBoundaryLoopFromSeed(\r\n seed: HalfEdge,\r\n visitMask: HalfEdgeMask,\r\n isBoundaryEdge: HalfEdgeToBooleanFunction,\r\n announceEdgeInBoundary: (edge: HalfEdge, counter: number) => void,\r\n ): void {\r\n let counter = 0;\r\n while (!seed.getMask(visitMask) && isBoundaryEdge(seed)) {\r\n announceEdgeInBoundary(seed, counter++);\r\n seed.setMask(visitMask);\r\n const vertexBase = seed.faceSuccessor;\r\n let candidateAroundVertex = vertexBase;\r\n for (; ;) {\r\n if (candidateAroundVertex.getMask(visitMask)) // end of boundary loop\r\n return;\r\n if (isBoundaryEdge(candidateAroundVertex)) {\r\n seed = candidateAroundVertex;\r\n break;\r\n }\r\n candidateAroundVertex = candidateAroundVertex.vertexPredecessor;\r\n if (candidateAroundVertex === vertexBase)\r\n break; // prevent infinite loop in case exteriorMask is not set on the edge mate of the boundary edge\r\n }\r\n }\r\n }\r\n /**\r\n * Collect boundary edges in the graph.\r\n * * A boundary edge is defined by `exteriorMask` being set on only its \"exterior\" edge mate.\r\n * * Each boundary edge is identified in the output by its edge mate that lacks `exteriorMask`.\r\n * * Each inner array is ordered in the output so that its boundary edges form a connected path. If `exteriorMask`\r\n * is preset consistently around each \"exterior\" face, these paths are loops.\r\n * @param graph the graph to query\r\n * @param exteriorMask mask preset on exactly one side of boundary edges\r\n * @returns array of boundary loops, each loop an array of the unmasked mates of boundary edges\r\n */\r\n public static collectExtendedBoundaryLoopsInGraph(graph: HalfEdgeGraph, exteriorMask: HalfEdgeMask): HalfEdge[][] {\r\n // Illustration of the algorithm can be found at geometry/internaldocs/Graph.md\r\n const loops: HalfEdge[][] = [];\r\n const visitMask = graph.grabMask(true);\r\n const isBoundaryEdge = (edge: HalfEdge): boolean => {\r\n return edge.getMask(exteriorMask) === 0 && edge.edgeMate.getMask(exteriorMask) !== 0;\r\n };\r\n const announceEdgeInBoundary = (edge: HalfEdge, counter: number) => {\r\n if (counter === 0)\r\n loops.push([]);\r\n loops[loops.length - 1].push(edge);\r\n };\r\n for (const seed of graph.allHalfEdges) {\r\n this.collectExtendedBoundaryLoopFromSeed(seed, visitMask, isBoundaryEdge, announceEdgeInBoundary);\r\n }\r\n graph.dropMask(visitMask);\r\n return loops;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"HalfEdgePointInGraphSearch.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgePointInGraphSearch.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAY,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;GAGG;AACH,oBAAY,iBAAiB;IAC3B,MAAM,IAAA;IACN,cAAc,IAAA;IACd,YAAY,IAAA;IACZ,OAAO,IAAA;IACP,YAAY,IAAA;IACZ,WAAW,IAAA;CACZ;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO;WAGO,MAAM,CAAC,GAAG,GAAE,MAAqC;IAG/D,OAAO,CAAC,KAAK;IAab;;;;;;;OAOG;IACI,aAAa,CAClB,OAAO,EAAE,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,GAClE,sBAAsB;IAsDzB;;;;;;OAMG;IACI,eAAe,CACpB,SAAS,EAAE,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,GACpE,sBAAsB;IA0DzB;;;;;;;;;;;;;;;;;;OAkBG;IACI,eAAe,CACpB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,KAAK,EACV,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,sBAAsB,GACjC,iBAAiB;IA0DpB;;;;;;;;;OASG;IACI,YAAY,CAAC,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO;CAWzF"}
1
+ {"version":3,"file":"HalfEdgePointInGraphSearch.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgePointInGraphSearch.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAY,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;GAGG;AACH,oBAAY,iBAAiB;IAC3B,MAAM,IAAA;IACN,cAAc,IAAA;IACd,YAAY,IAAA;IACZ,OAAO,IAAA;IACP,YAAY,IAAA;IACZ,WAAW,IAAA;CACZ;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO;WAGO,MAAM,CAAC,GAAG,GAAE,MAAqC;IAG/D,OAAO,CAAC,KAAK;IAcb;;;;;;;OAOG;IACI,aAAa,CAClB,OAAO,EAAE,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,GAClE,sBAAsB;IAwDzB;;;;;;OAMG;IACI,eAAe,CACpB,SAAS,EAAE,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,GACpE,sBAAsB;IA4DzB;;;;;;;;;;;;;;;;;;OAkBG;IACI,eAAe,CACpB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,KAAK,EACV,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,sBAAsB,GACjC,iBAAiB;IA4DpB;;;;;;;;;OASG;IACI,YAAY,CAAC,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO;CAWzF"}
@@ -39,8 +39,8 @@ export class PointSearchContext {
39
39
  return new PointSearchContext(tol);
40
40
  }
41
41
  panic() {
42
- // A note on "unexpectedly" found in comments in this file:
43
- // Though this class assumes all edges of the graph have length at least tolerance, the tests below account for
42
+ // A note on the word "unexpectedly" found in comments below:
43
+ // Though this class assumes all edges of the graph have length at least tolerance, class logic accounts for
44
44
  // edges with smaller length. This is because we are using two different metrics: Euclidean for distinguishing
45
45
  // points matching user expectation, and Chebyshev, aka "max component", for efficiently testing ray-sector
46
46
  // inclusion in the reAimXXX methods. In particular, epsilon-balls in the former metric are smaller than in the
@@ -49,6 +49,7 @@ export class PointSearchContext {
49
49
  // epsilon, yielding a Chebyshev edge length less than epsilon. This discrepancy requires careful analysis below,
50
50
  // and if this method is invoked, it is probably because we've missed a case where a dot/cross product lies just
51
51
  // beyond the tolerance.
52
+ assert(false, "Unexpected condition in PointSearchContext.");
52
53
  return HalfEdgePositionDetail.create();
53
54
  }
54
55
  /**
@@ -60,6 +61,8 @@ export class PointSearchContext {
60
61
  * @return detail closer to the target point.
61
62
  */
62
63
  reAimFromEdge(edgeHit, ray, targetDistance) {
64
+ if (!edgeHit.isEdge())
65
+ return this.panic();
63
66
  const nodeA = edgeHit.node;
64
67
  const dataA = NodeXYZUV.createNodeAndRayOrigin(nodeA, ray);
65
68
  const dataB = NodeXYZUV.createNodeAndRayOrigin(nodeA.edgeMate, ray);
@@ -79,17 +82,17 @@ export class PointSearchContext {
79
82
  const alongB = dataB.classifyU(targetDistance, this._tol);
80
83
  if (sideA === 0 && alongA === 0) { // hit start vertex
81
84
  result = edgeHit.resetAsVertex(dataA.node);
82
- result.setITag(1);
85
+ result.iTag = 1;
83
86
  }
84
87
  else if (sideB === 0 && alongB === 0) { // hit end vertex
85
88
  result = edgeHit.resetAsVertex(dataB.node);
86
- result.setITag(1);
89
+ result.iTag = 1;
87
90
  }
88
91
  else if (sideA === 0 && sideB === 0) { // ray is clearly along the edge
89
92
  if (alongA * alongB < 0) { // target is within edge
90
93
  const edgeFraction = (targetDistance - dataA.u) / (dataB.u - dataA.u);
91
94
  result = edgeHit.resetAtEdgeAndFraction(dataA.node, edgeFraction);
92
- result.setITag(1);
95
+ result.iTag = 1;
93
96
  }
94
97
  else if (alongA < 0 && alongB < 0) { // target is beyond the edge; move towards it
95
98
  if (dataA.u > dataB.u)
@@ -130,13 +133,15 @@ export class PointSearchContext {
130
133
  * @return detail closer to the target point.
131
134
  */
132
135
  reAimFromVertex(vertexHit, ray, targetDistance) {
136
+ if (!vertexHit.isVertex())
137
+ return this.panic();
133
138
  assert(ray.origin.isExactEqual(vertexHit));
134
139
  const vertexNode = vertexHit.node;
135
140
  let outboundEdge = vertexNode;
136
141
  // lambda to handle the case where the target definitively lies in the same direction as outboundEdge
137
142
  const advancePositionAlongOutboundEdge = (rayParam) => {
138
143
  if (Math.abs(rayParam - targetDistance) <= this._tol) { // direct hit at far end of outBoundEdge
139
- vertexHit.resetAsVertex(outboundEdge.faceSuccessor).setITag(1);
144
+ vertexHit.resetAsVertex(outboundEdge.faceSuccessor).iTag = 1;
140
145
  }
141
146
  else if (rayParam > targetDistance) { // direct hit within outBoundEdge
142
147
  vertexHit.resetAtEdgeAndFraction(outboundEdge, targetDistance / rayParam);
@@ -213,8 +218,8 @@ export class PointSearchContext {
213
218
  */
214
219
  reAimAroundFace(faceNode, ray, targetDistance, lastBefore, firstAfter) {
215
220
  assert(!faceNode.isMaskSet(HalfEdgeMask.EXTERIOR));
216
- lastBefore.resetAsUndefinedWithTag(-Number.MAX_VALUE);
217
- firstAfter.resetAsUndefinedWithTag(Number.MAX_VALUE);
221
+ lastBefore.resetAsUndefinedWithTag(-Number.MAX_VALUE); // these two objects...
222
+ firstAfter.resetAsUndefinedWithTag(Number.MAX_VALUE); // ...always have dTag
218
223
  const data0 = NodeXYZUV.createNodeAndRayOrigin(faceNode, ray);
219
224
  let data1;
220
225
  let node0 = faceNode;
@@ -228,38 +233,40 @@ export class PointSearchContext {
228
233
  const v1 = data1.v;
229
234
  if (Math.abs(v1) < this._tol) { // ray parallel to edge
230
235
  const vertexHit = HalfEdgePositionDetail.createVertex(node1);
231
- vertexHit.setDTag(u1);
236
+ vertexHit.dTag = u1;
232
237
  if (Math.abs(u1 - targetDistance) < this._tol) {
233
238
  firstAfter.setFrom(vertexHit);
234
239
  lastBefore.setFrom(vertexHit);
235
240
  return RayClassification.TargetOnVertex;
236
241
  }
237
- if (u1 > targetDistance && u1 < firstAfter.getDTag())
242
+ assert(firstAfter.hasDTag() && lastBefore.hasDTag());
243
+ if (u1 > targetDistance && u1 < firstAfter.dTag)
238
244
  firstAfter.setFrom(vertexHit);
239
- if (u1 < targetDistance && u1 > lastBefore.getDTag())
245
+ if (u1 < targetDistance && u1 > lastBefore.dTag)
240
246
  lastBefore.setFrom(vertexHit);
241
247
  }
242
248
  else if (v0 * v1 < 0.0) { // ray crosses edge
243
249
  const edgeFraction = -v0 / (v1 - v0);
244
250
  const rayFraction = Geometry.interpolate(u0, edgeFraction, u1);
245
251
  const edgeHit = HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);
246
- edgeHit.setDTag(rayFraction);
252
+ edgeHit.dTag = rayFraction;
247
253
  if (Math.abs(rayFraction - targetDistance) <= this._tol) {
248
254
  firstAfter.setFrom(edgeHit);
249
255
  lastBefore.setFrom(edgeHit);
250
256
  return RayClassification.TargetOnEdge;
251
257
  }
252
- if (rayFraction > targetDistance && rayFraction < firstAfter.getDTag())
258
+ assert(firstAfter.hasDTag() && lastBefore.hasDTag());
259
+ if (rayFraction > targetDistance && rayFraction < firstAfter.dTag)
253
260
  firstAfter.setFrom(edgeHit);
254
- if (rayFraction < targetDistance && rayFraction > lastBefore.getDTag())
261
+ if (rayFraction < targetDistance && rayFraction > lastBefore.dTag)
255
262
  lastBefore.setFrom(edgeHit);
256
263
  }
257
264
  data0.setFrom(data1);
258
265
  node0 = node0.faceSuccessor;
259
266
  } while (node0 !== faceNode);
260
267
  // returned to start node
261
- firstAfter.setITag(0);
262
- lastBefore.setITag(0);
268
+ firstAfter.iTag = 0;
269
+ lastBefore.iTag = 0;
263
270
  if (lastBefore.isUnclassified) {
264
271
  if (firstAfter.isUnclassified)
265
272
  return RayClassification.NoHits;
@@ -1 +1 @@
1
- {"version":3,"file":"HalfEdgePointInGraphSearch.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePointInGraphSearch.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAW,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAY,YAAY,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,wBAAwB;AAExB;;;GAGG;AACH,MAAM,CAAN,IAAY,iBAOX;AAPD,WAAY,iBAAiB;IAC3B,6DAAM,CAAA;IACN,6EAAc,CAAA;IACd,yEAAY,CAAA;IACZ,+DAAO,CAAA;IACP,yEAAY,CAAA;IACZ,uEAAW,CAAA;AACb,CAAC,EAPW,iBAAiB,KAAjB,iBAAiB,QAO5B;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IACrB,IAAI,CAAS;IACrB,YAAoB,GAAW;QAC7B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IACM,MAAM,CAAC,MAAM,CAAC,MAAc,QAAQ,CAAC,mBAAmB;QAC7D,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IACO,KAAK;QACX,2DAA2D;QAC3D,+GAA+G;QAC/G,8GAA8G;QAC9G,2GAA2G;QAC3G,+GAA+G;QAC/G,+GAA+G;QAC/G,+GAA+G;QAC/G,iHAAiH;QACjH,gHAAgH;QAChH,wBAAwB;QACxB,OAAO,sBAAsB,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IACD;;;;;;;OAOG;IACI,aAAa,CAClB,OAA+B,EAAE,GAAU,EAAE,cAAsB;QAEnE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,sBAAsB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,sBAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC;QACX,IAAI,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,wCAAwC;YAC/D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,mBAAmB;gBACpD,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,iBAAiB;gBACzD,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,gCAAgC;gBACvE,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,wBAAwB;oBACjD,MAAM,YAAY,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;oBAClE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;qBAAM,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,6CAA6C;oBAClF,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;wBACnB,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;wBAE3C,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC,CAAC,sGAAsG;oBAC7G,OAAO,CAAC,cAAc,EAAE,CAAC;oBACzB,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,qDAAqD;gBAC7E,IAAI,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;oBACvC,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;oBAE3C,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC,CAAC,mDAAmD;gBAC1D,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;oBACvC,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;oBAE3C,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;aAAM,CAAC,CAAC,wFAAwF;YAC/F,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;OAMG;IACI,eAAe,CACpB,SAAiC,EAAE,GAAU,EAAE,cAAsB;QAErE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC;QAClC,IAAI,YAAY,GAAG,UAAW,CAAC;QAC/B,qGAAqG;QACrG,MAAM,gCAAgC,GAAG,CAAC,QAAgB,EAAW,EAAE;YACrE,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,wCAAwC;gBAC9F,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;iBAAM,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC,CAAC,iCAAiC;gBACvE,SAAS,CAAC,sBAAsB,CAAC,YAAY,EAAE,cAAc,GAAG,QAAQ,CAAC,CAAC;YAC5E,CAAC;iBAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,8CAA8C;gBAC/E,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,GAAG,CAAC;YACF,iGAAiG;YACjG,MAAM,KAAK,GAAG,SAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAChF,MAAM,KAAK,GAAG,SAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YAClF,mGAAmG;YACnG,qGAAqG;YACrG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YACnB,oGAAoG;YACpG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,+BAA+B;gBAC9D,IAAI,gCAAgC,CAAC,EAAE,CAAC;oBACtC,OAAO,SAAS,CAAC;gBACnB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,8BAA8B;oBAC7D,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtE,OAAO,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBAC7D,CAAC;gBACD,gFAAgF;gBAChF,4FAA4F;gBAC5F,4FAA4F;YAC9F,CAAC;iBAAM,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,qCAAqC;oBACvD,OAAO,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBAC3D,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,uCAAuC;oBAC7D,sDAAsD;oBACtD,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,4CAA4C;wBAC3E,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,+BAA+B;4BACpF,OAAO,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;oBAC7D,CAAC;yBAAM,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,gDAAgD;wBACrF,OAAO,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,8BAA8B;oBAC5F,CAAC;gBACH,CAAC;gBACD,uFAAuF;YACzF,CAAC;YACD,6GAA6G;YAC7G,yGAAyG;YACzG,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC;QAC9C,CAAC,QAAQ,YAAY,KAAK,UAAU,EAAE;QACtC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IACD;;;;;;;;;;;;;;;;;;OAkBG;IACI,eAAe,CACpB,QAAkB,EAClB,GAAU,EACV,cAAsB,EACtB,UAAkC,EAClC,UAAkC;QAElC,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,UAAU,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtD,UAAU,CAAC,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC;QACV,IAAI,KAAK,GAAG,QAAQ,CAAC;QACrB,sFAAsF;QACtF,GAAG,CAAC;YACF,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YAClC,KAAK,GAAG,SAAS,CAAC,sBAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YACnB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,uBAAuB;gBACrD,MAAM,SAAS,GAAG,sBAAsB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC7D,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACtB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC9C,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC9B,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC9B,OAAO,iBAAiB,CAAC,cAAc,CAAC;gBAC1C,CAAC;gBACD,IAAI,EAAE,GAAG,cAAc,IAAI,EAAE,GAAG,UAAU,CAAC,OAAO,EAAG;oBACnD,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChC,IAAI,EAAE,GAAG,cAAc,IAAI,EAAE,GAAG,UAAU,CAAC,OAAO,EAAG;oBACnD,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,mBAAmB;gBAC7C,MAAM,YAAY,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;gBACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,sBAAsB,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBACtF,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACxD,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,OAAO,iBAAiB,CAAC,YAAY,CAAC;gBACxC,CAAC;gBACD,IAAI,WAAW,GAAG,cAAc,IAAI,WAAW,GAAG,UAAU,CAAC,OAAO,EAAG;oBACrE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC9B,IAAI,WAAW,GAAG,cAAc,IAAI,WAAW,GAAG,UAAU,CAAC,OAAO,EAAG;oBACrE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;QAC9B,CAAC,QAAQ,KAAK,KAAK,QAAQ,EAAE;QAC7B,yBAAyB;QACzB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9B,IAAI,UAAU,CAAC,cAAc;gBAC3B,OAAO,iBAAiB,CAAC,MAAM,CAAC;YAClC,OAAO,iBAAiB,CAAC,YAAY,CAAC;QACxC,CAAC;QACD,IAAI,UAAU,CAAC,cAAc;YAC3B,OAAO,iBAAiB,CAAC,WAAW,CAAC;;YAErC,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC,uDAAuD;IAC7F,CAAC;IACD;;;;;;;;;OASG;IACI,YAAY,CAAC,KAA6B,EAAE,MAAe,EAAE,GAAU;QAC5E,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACjC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3D,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;QACtB,MAAM,kBAAkB,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QACvD,IAAI,kBAAkB,GAAG,IAAI,CAAC,IAAI;YAChC,OAAO,KAAK,CAAC,CAAC,6DAA6D;QAC7E,GAAG,CAAC,CAAC,GAAG,kBAAkB,CAAC;QAC3B,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,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 { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { HalfEdge, HalfEdgeMask } from \"./Graph\";\r\nimport { NodeXYZUV } from \"./HalfEdgeNodeXYZUV\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\n\r\n// cspell:word Chebyshev\r\n\r\n/**\r\n * Return code from [PointSearchContext.reAimAroundFace]\r\n * @internal\r\n */\r\nexport enum RayClassification {\r\n NoHits,\r\n TargetOnVertex,\r\n TargetOnEdge,\r\n Bracket,\r\n TargetBefore,\r\n TargetAfter,\r\n}\r\n\r\n/**\r\n * Context for searching for the location of an xy-point in a graph.\r\n * * Assumptions: interior faces of the graph are convex, no edge has length less than `tol`.\r\n * @internal\r\n */\r\nexport class PointSearchContext {\r\n private _tol: number;\r\n private constructor(tol: number) {\r\n this._tol = tol;\r\n }\r\n public static create(tol: number = Geometry.smallMetricDistance) {\r\n return new PointSearchContext(tol);\r\n }\r\n private panic(): HalfEdgePositionDetail {\r\n // A note on \"unexpectedly\" found in comments in this file:\r\n // Though this class assumes all edges of the graph have length at least tolerance, the tests below account for\r\n // edges with smaller length. This is because we are using two different metrics: Euclidean for distinguishing\r\n // points matching user expectation, and Chebyshev, aka \"max component\", for efficiently testing ray-sector\r\n // inclusion in the reAimXXX methods. In particular, epsilon-balls in the former metric are smaller than in the\r\n // latter. Thus an edge can be inserted into the graph with Euclidean length (barely) greater than epsilon, but\r\n // the edge's parallel and perpendicular components with respect to a ray can have Euclidean length *less* than\r\n // epsilon, yielding a Chebyshev edge length less than epsilon. This discrepancy requires careful analysis below,\r\n // and if this method is invoked, it is probably because we've missed a case where a dot/cross product lies just\r\n // beyond the tolerance.\r\n return HalfEdgePositionDetail.create();\r\n }\r\n /**\r\n * Reposition `edgeHit` to an adjacent face or vertex, or another position on the edge, that is closer to the\r\n * target point.\r\n * @param edgeHit start position on a graph edge, updated and returned.\r\n * @param ray the ray to the target point. Origin is assumed to lie on the edge.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @return detail closer to the target point.\r\n */\r\n public reAimFromEdge(\r\n edgeHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\r\n ): HalfEdgePositionDetail {\r\n const nodeA = edgeHit.node!;\r\n const dataA = NodeXYZUV.createNodeAndRayOrigin(nodeA, ray);\r\n const dataB = NodeXYZUV.createNodeAndRayOrigin(nodeA.edgeMate, ray);\r\n const sideA = -dataA.classifyV(0.0, this._tol);\r\n const sideB = -dataB.classifyV(0.0, this._tol);\r\n let result;\r\n if (sideA * sideB < 0) { // simple crossing; just aim into a face\r\n if (sideA > 0) {\r\n result = edgeHit.resetAsFace(dataA.node);\r\n } else {\r\n result = edgeHit.resetAsFace(dataB.node);\r\n }\r\n } else if (sideA === 0 || sideB === 0) {\r\n const alongA = dataA.classifyU(targetDistance, this._tol);\r\n const alongB = dataB.classifyU(targetDistance, this._tol);\r\n if (sideA === 0 && alongA === 0) { // hit start vertex\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n result.setITag(1);\r\n } else if (sideB === 0 && alongB === 0) { // hit end vertex\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n result.setITag(1);\r\n } else if (sideA === 0 && sideB === 0) { // ray is clearly along the edge\r\n if (alongA * alongB < 0) { // target is within edge\r\n const edgeFraction = (targetDistance - dataA.u) / (dataB.u - dataA.u);\r\n result = edgeHit.resetAtEdgeAndFraction(dataA.node, edgeFraction);\r\n result.setITag(1);\r\n } else if (alongA < 0 && alongB < 0) { // target is beyond the edge; move towards it\r\n if (dataA.u > dataB.u)\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n else\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n } else { // both vertices lie on the ray before or after the target; shouldn't happen for edgeHit between nodes\r\n edgeHit.resetAsUnknown();\r\n result = this.panic();\r\n }\r\n } else if (sideA === 0) { // ray near start vertex but NOT parallel to the edge\r\n if (0 === dataA.classifyU(0.0, this._tol))\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n else\r\n result = edgeHit.resetAsFace(sideB > 0 ? dataB.node : dataA.node);\r\n } else { // ray near end vertex but NOT parallel to the edge\r\n assert(sideB === 0);\r\n if (0 === dataB.classifyU(0.0, this._tol))\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n else\r\n result = edgeHit.resetAsFace(sideA > 0 ? dataA.node : dataB.node);\r\n }\r\n } else { // both vertices are to same side of the ray; shouldn't happen for edgeHit between nodes\r\n edgeHit.resetAsUnknown();\r\n result = this.panic();\r\n }\r\n return result;\r\n }\r\n /**\r\n * Reposition `vertexHit` to an adjacent face, edge, or vertex hit that is closer to the target point.\r\n * @param vertexHit start position at a graph vertex, updated and returned.\r\n * @param ray the ray to the target point, assumed to start exactly at the vertex.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @return detail closer to the target point.\r\n */\r\n public reAimFromVertex(\r\n vertexHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\r\n ): HalfEdgePositionDetail {\r\n assert(ray.origin.isExactEqual(vertexHit));\r\n const vertexNode = vertexHit.node;\r\n let outboundEdge = vertexNode!;\r\n // lambda to handle the case where the target definitively lies in the same direction as outboundEdge\r\n const advancePositionAlongOutboundEdge = (rayParam: number): boolean => {\r\n if (Math.abs(rayParam - targetDistance) <= this._tol) { // direct hit at far end of outBoundEdge\r\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor).setITag(1);\r\n } else if (rayParam > targetDistance) { // direct hit within outBoundEdge\r\n vertexHit.resetAtEdgeAndFraction(outboundEdge, targetDistance / rayParam);\r\n } else if (rayParam > this._tol) { // far end of outBoundEdge is closer to target\r\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor);\r\n } else {\r\n return false;\r\n }\r\n return true;\r\n };\r\n do {\r\n // examine the sector at the outboundEdge node; if ray lies in this sector, return updated detail\r\n const data0 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.faceSuccessor, ray);\r\n const data1 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.facePredecessor, ray);\r\n // u0 is the length of projection of faceSuccessor to the ray and v0 is the length of projection of\r\n // faceSuccessor to the ray perp line (90 degrees CCW). Similarly for u1 and v1 with facePredecessor.\r\n const u0 = data0.u;\r\n const u1 = data1.u;\r\n const v0 = data0.v;\r\n const v1 = data1.v;\r\n // examine dot and cross of ray with both edges defining this sector to see if ray lies between them\r\n if (Math.abs(v0) <= this._tol) { // ray parallel to outBoundEdge\r\n if (advancePositionAlongOutboundEdge(u0))\r\n return vertexHit;\r\n if (Math.abs(u0) <= this._tol) { // edge is unexpectedly* small\r\n if (v0 <= 0 && v1 > this._tol && (u0 >= 0 || (u0 < 0 && u1 > this._tol)))\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n }\r\n // The only remaining case is u0 < -this._tol: ray points opposite outBoundEdge.\r\n // By our convexity assumption, the only way that ray lies in this sector is if the lookBack\r\n // vector points in the same direction as ray, but this would be handled in the next sector.\r\n } else if (v0 < -this._tol) {\r\n if (v1 > this._tol) // ray definitely lies in this sector\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n if (v1 >= -this._tol) { // ray and lookBack vector are parallel\r\n // handle special cases not handled in the next sector\r\n if (Math.abs(u1) <= this._tol) { // lookBack vector is unexpectedly* small...\r\n if (v1 > 0 && (u1 >= 0 || (u0 > this._tol && u1 < 0))) // ...and ray is in this sector\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n } else if (u0 > this._tol && u1 < 0) { // ray and lookBack point in opposite directions\r\n return vertexHit.resetAsVertex(outboundEdge.faceSuccessor); // far end is closer to target\r\n }\r\n }\r\n // The only remaining case is v1 < -this._tol: ray definitely lies outside this sector.\r\n }\r\n // Proceed to the next sector around this vertex. We even examine the (concave) exterior sector at a boundary\r\n // vertex in order to handle the case where the target lies in the direction of an exterior outboundEdge.\r\n outboundEdge = outboundEdge.vertexSuccessor;\r\n } while (outboundEdge !== vertexNode);\r\n return this.panic();\r\n }\r\n /**\r\n * Visit all edges around the face, updating `lastBefore` and `firstAfter` to ray-edge intersections that\r\n * lie directly before and/or after the target point on the ray, if at all.\r\n * @param faceNode starting node on a graph face.\r\n * @param ray the ray to the target point.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @param lastBefore the detail to reset as the last hit on the ray before the target point (CALLER CREATED).\r\n * @param firstAfter the detail to reset as the first hit on the ray after the target point (CALLER CREATED).\r\n * @returns summary of the updated details:\r\n * * [[RayClassification.TargetOnVertex]] - target lies at a vertex of the face (details are identical).\r\n * * [[RayClassification.TargetOnEdge]] - target lies on an edge of the face (details are identical).\r\n * * [[RayClassification.TargetBefore]] - target lies before the face; the ray intersects the face beyond\r\n * the target point.\r\n * * [[RayClassification.TargetAfter]] - target lies after the face; the ray intersects the face before\r\n * the target point.\r\n * * [[RayClassification.Bracket]] - target lies between intersections of the ray and the face; if the face\r\n * is convex, this means the target lies inside the face.\r\n * * [[RayClassification.NoHits]] - the face does not intersect the ray.\r\n */\r\n public reAimAroundFace(\r\n faceNode: HalfEdge,\r\n ray: Ray3d,\r\n targetDistance: number,\r\n lastBefore: HalfEdgePositionDetail,\r\n firstAfter: HalfEdgePositionDetail,\r\n ): RayClassification {\r\n assert(!faceNode.isMaskSet(HalfEdgeMask.EXTERIOR));\r\n lastBefore.resetAsUndefinedWithTag(-Number.MAX_VALUE);\r\n firstAfter.resetAsUndefinedWithTag(Number.MAX_VALUE);\r\n const data0 = NodeXYZUV.createNodeAndRayOrigin(faceNode, ray);\r\n let data1;\r\n let node0 = faceNode;\r\n // find the intersection of the ray with each edge of the face to classify the ray hit\r\n do {\r\n const node1 = node0.faceSuccessor;\r\n data1 = NodeXYZUV.createNodeAndRayOrigin(node1, ray, data1);\r\n const u0 = data0.u;\r\n const u1 = data1.u;\r\n const v0 = data0.v;\r\n const v1 = data1.v;\r\n if (Math.abs(v1) < this._tol) { // ray parallel to edge\r\n const vertexHit = HalfEdgePositionDetail.createVertex(node1);\r\n vertexHit.setDTag(u1);\r\n if (Math.abs(u1 - targetDistance) < this._tol) {\r\n firstAfter.setFrom(vertexHit);\r\n lastBefore.setFrom(vertexHit);\r\n return RayClassification.TargetOnVertex;\r\n }\r\n if (u1 > targetDistance && u1 < firstAfter.getDTag()!)\r\n firstAfter.setFrom(vertexHit);\r\n if (u1 < targetDistance && u1 > lastBefore.getDTag()!)\r\n lastBefore.setFrom(vertexHit);\r\n } else if (v0 * v1 < 0.0) { // ray crosses edge\r\n const edgeFraction = -v0 / (v1 - v0);\r\n const rayFraction = Geometry.interpolate(u0, edgeFraction, u1);\r\n const edgeHit = HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);\r\n edgeHit.setDTag(rayFraction);\r\n if (Math.abs(rayFraction - targetDistance) <= this._tol) {\r\n firstAfter.setFrom(edgeHit);\r\n lastBefore.setFrom(edgeHit);\r\n return RayClassification.TargetOnEdge;\r\n }\r\n if (rayFraction > targetDistance && rayFraction < firstAfter.getDTag()!)\r\n firstAfter.setFrom(edgeHit);\r\n if (rayFraction < targetDistance && rayFraction > lastBefore.getDTag()!)\r\n lastBefore.setFrom(edgeHit);\r\n }\r\n data0.setFrom(data1);\r\n node0 = node0.faceSuccessor;\r\n } while (node0 !== faceNode);\r\n // returned to start node\r\n firstAfter.setITag(0);\r\n lastBefore.setITag(0);\r\n if (lastBefore.isUnclassified) {\r\n if (firstAfter.isUnclassified)\r\n return RayClassification.NoHits;\r\n return RayClassification.TargetBefore;\r\n }\r\n if (firstAfter.isUnclassified)\r\n return RayClassification.TargetAfter;\r\n else\r\n return RayClassification.Bracket; // face is locally convex; target lies inside this face\r\n }\r\n /**\r\n * Initialize the input ray for topology search:\r\n * * `origin` is at `start`\r\n * * `direction` is the unit xy-vector from `start` towards `target`\r\n * * `a` is the xy-distance from `start` to `target`\r\n * @param start existing position\r\n * @param target target xy coordinates\r\n * @param ray updated in place\r\n * @returns false if target is reached.\r\n */\r\n public setSearchRay(start: HalfEdgePositionDetail, target: Point3d, ray: Ray3d): boolean {\r\n ray.origin.setFromPoint3d(start);\r\n Vector3d.createStartEnd(ray.origin, target, ray.direction);\r\n ray.direction.z = 0.0;\r\n const distanceToTargetXY = ray.direction.magnitudeXY();\r\n if (distanceToTargetXY < this._tol)\r\n return false; // no searching necessary, we are already at the target point\r\n ray.a = distanceToTargetXY;\r\n ray.direction.scaleInPlace(1 / distanceToTargetXY);\r\n return true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HalfEdgePointInGraphSearch.js","sourceRoot":"","sources":["../../../src/topology/HalfEdgePointInGraphSearch.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 { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { HalfEdge, HalfEdgeMask } from \"./Graph\";\r\nimport { NodeXYZUV } from \"./HalfEdgeNodeXYZUV\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\n\r\n// cspell:word Chebyshev\r\n\r\n/**\r\n * Return code from [PointSearchContext.reAimAroundFace]\r\n * @internal\r\n */\r\nexport enum RayClassification {\r\n NoHits,\r\n TargetOnVertex,\r\n TargetOnEdge,\r\n Bracket,\r\n TargetBefore,\r\n TargetAfter,\r\n}\r\n\r\n/**\r\n * Context for searching for the location of an xy-point in a graph.\r\n * * Assumptions: interior faces of the graph are convex, no edge has length less than `tol`.\r\n * @internal\r\n */\r\nexport class PointSearchContext {\r\n private _tol: number;\r\n private constructor(tol: number) {\r\n this._tol = tol;\r\n }\r\n public static create(tol: number = Geometry.smallMetricDistance) {\r\n return new PointSearchContext(tol);\r\n }\r\n private panic(): HalfEdgePositionDetail {\r\n // A note on the word \"unexpectedly\" found in comments below:\r\n // Though this class assumes all edges of the graph have length at least tolerance, class logic accounts for\r\n // edges with smaller length. This is because we are using two different metrics: Euclidean for distinguishing\r\n // points matching user expectation, and Chebyshev, aka \"max component\", for efficiently testing ray-sector\r\n // inclusion in the reAimXXX methods. In particular, epsilon-balls in the former metric are smaller than in the\r\n // latter. Thus an edge can be inserted into the graph with Euclidean length (barely) greater than epsilon, but\r\n // the edge's parallel and perpendicular components with respect to a ray can have Euclidean length *less* than\r\n // epsilon, yielding a Chebyshev edge length less than epsilon. This discrepancy requires careful analysis below,\r\n // and if this method is invoked, it is probably because we've missed a case where a dot/cross product lies just\r\n // beyond the tolerance.\r\n assert(false, \"Unexpected condition in PointSearchContext.\");\r\n return HalfEdgePositionDetail.create();\r\n }\r\n /**\r\n * Reposition `edgeHit` to an adjacent face or vertex, or another position on the edge, that is closer to the\r\n * target point.\r\n * @param edgeHit start position on a graph edge, updated and returned.\r\n * @param ray the ray to the target point. Origin is assumed to lie on the edge.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @return detail closer to the target point.\r\n */\r\n public reAimFromEdge(\r\n edgeHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\r\n ): HalfEdgePositionDetail {\r\n if (!edgeHit.isEdge())\r\n return this.panic();\r\n const nodeA = edgeHit.node;\r\n const dataA = NodeXYZUV.createNodeAndRayOrigin(nodeA, ray);\r\n const dataB = NodeXYZUV.createNodeAndRayOrigin(nodeA.edgeMate, ray);\r\n const sideA = -dataA.classifyV(0.0, this._tol);\r\n const sideB = -dataB.classifyV(0.0, this._tol);\r\n let result;\r\n if (sideA * sideB < 0) { // simple crossing; just aim into a face\r\n if (sideA > 0) {\r\n result = edgeHit.resetAsFace(dataA.node);\r\n } else {\r\n result = edgeHit.resetAsFace(dataB.node);\r\n }\r\n } else if (sideA === 0 || sideB === 0) {\r\n const alongA = dataA.classifyU(targetDistance, this._tol);\r\n const alongB = dataB.classifyU(targetDistance, this._tol);\r\n if (sideA === 0 && alongA === 0) { // hit start vertex\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n result.iTag = 1;\r\n } else if (sideB === 0 && alongB === 0) { // hit end vertex\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n result.iTag = 1;\r\n } else if (sideA === 0 && sideB === 0) { // ray is clearly along the edge\r\n if (alongA * alongB < 0) { // target is within edge\r\n const edgeFraction = (targetDistance - dataA.u) / (dataB.u - dataA.u);\r\n result = edgeHit.resetAtEdgeAndFraction(dataA.node, edgeFraction);\r\n result.iTag = 1;\r\n } else if (alongA < 0 && alongB < 0) { // target is beyond the edge; move towards it\r\n if (dataA.u > dataB.u)\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n else\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n } else { // both vertices lie on the ray before or after the target; shouldn't happen for edgeHit between nodes\r\n edgeHit.resetAsUnknown();\r\n result = this.panic();\r\n }\r\n } else if (sideA === 0) { // ray near start vertex but NOT parallel to the edge\r\n if (0 === dataA.classifyU(0.0, this._tol))\r\n result = edgeHit.resetAsVertex(dataA.node);\r\n else\r\n result = edgeHit.resetAsFace(sideB > 0 ? dataB.node : dataA.node);\r\n } else { // ray near end vertex but NOT parallel to the edge\r\n assert(sideB === 0);\r\n if (0 === dataB.classifyU(0.0, this._tol))\r\n result = edgeHit.resetAsVertex(dataB.node);\r\n else\r\n result = edgeHit.resetAsFace(sideA > 0 ? dataA.node : dataB.node);\r\n }\r\n } else { // both vertices are to same side of the ray; shouldn't happen for edgeHit between nodes\r\n edgeHit.resetAsUnknown();\r\n result = this.panic();\r\n }\r\n return result;\r\n }\r\n /**\r\n * Reposition `vertexHit` to an adjacent face, edge, or vertex hit that is closer to the target point.\r\n * @param vertexHit start position at a graph vertex, updated and returned.\r\n * @param ray the ray to the target point, assumed to start exactly at the vertex.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @return detail closer to the target point.\r\n */\r\n public reAimFromVertex(\r\n vertexHit: HalfEdgePositionDetail, ray: Ray3d, targetDistance: number,\r\n ): HalfEdgePositionDetail {\r\n if (!vertexHit.isVertex())\r\n return this.panic();\r\n assert(ray.origin.isExactEqual(vertexHit));\r\n const vertexNode = vertexHit.node;\r\n let outboundEdge = vertexNode;\r\n // lambda to handle the case where the target definitively lies in the same direction as outboundEdge\r\n const advancePositionAlongOutboundEdge = (rayParam: number): boolean => {\r\n if (Math.abs(rayParam - targetDistance) <= this._tol) { // direct hit at far end of outBoundEdge\r\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor).iTag = 1;\r\n } else if (rayParam > targetDistance) { // direct hit within outBoundEdge\r\n vertexHit.resetAtEdgeAndFraction(outboundEdge, targetDistance / rayParam);\r\n } else if (rayParam > this._tol) { // far end of outBoundEdge is closer to target\r\n vertexHit.resetAsVertex(outboundEdge.faceSuccessor);\r\n } else {\r\n return false;\r\n }\r\n return true;\r\n };\r\n do {\r\n // examine the sector at the outboundEdge node; if ray lies in this sector, return updated detail\r\n const data0 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.faceSuccessor, ray);\r\n const data1 = NodeXYZUV.createNodeAndRayOrigin(outboundEdge.facePredecessor, ray);\r\n // u0 is the length of projection of faceSuccessor to the ray and v0 is the length of projection of\r\n // faceSuccessor to the ray perp line (90 degrees CCW). Similarly for u1 and v1 with facePredecessor.\r\n const u0 = data0.u;\r\n const u1 = data1.u;\r\n const v0 = data0.v;\r\n const v1 = data1.v;\r\n // examine dot and cross of ray with both edges defining this sector to see if ray lies between them\r\n if (Math.abs(v0) <= this._tol) { // ray parallel to outBoundEdge\r\n if (advancePositionAlongOutboundEdge(u0))\r\n return vertexHit;\r\n if (Math.abs(u0) <= this._tol) { // edge is unexpectedly* small\r\n if (v0 <= 0 && v1 > this._tol && (u0 >= 0 || (u0 < 0 && u1 > this._tol)))\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n }\r\n // The only remaining case is u0 < -this._tol: ray points opposite outBoundEdge.\r\n // By our convexity assumption, the only way that ray lies in this sector is if the lookBack\r\n // vector points in the same direction as ray, but this would be handled in the next sector.\r\n } else if (v0 < -this._tol) {\r\n if (v1 > this._tol) // ray definitely lies in this sector\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n if (v1 >= -this._tol) { // ray and lookBack vector are parallel\r\n // handle special cases not handled in the next sector\r\n if (Math.abs(u1) <= this._tol) { // lookBack vector is unexpectedly* small...\r\n if (v1 > 0 && (u1 >= 0 || (u0 > this._tol && u1 < 0))) // ...and ray is in this sector\r\n return vertexHit.resetAsFace(outboundEdge, outboundEdge);\r\n } else if (u0 > this._tol && u1 < 0) { // ray and lookBack point in opposite directions\r\n return vertexHit.resetAsVertex(outboundEdge.faceSuccessor); // far end is closer to target\r\n }\r\n }\r\n // The only remaining case is v1 < -this._tol: ray definitely lies outside this sector.\r\n }\r\n // Proceed to the next sector around this vertex. We even examine the (concave) exterior sector at a boundary\r\n // vertex in order to handle the case where the target lies in the direction of an exterior outboundEdge.\r\n outboundEdge = outboundEdge.vertexSuccessor;\r\n } while (outboundEdge !== vertexNode);\r\n return this.panic();\r\n }\r\n /**\r\n * Visit all edges around the face, updating `lastBefore` and `firstAfter` to ray-edge intersections that\r\n * lie directly before and/or after the target point on the ray, if at all.\r\n * @param faceNode starting node on a graph face.\r\n * @param ray the ray to the target point.\r\n * @param targetDistance distance along the ray to the target point.\r\n * @param lastBefore the detail to reset as the last hit on the ray before the target point (CALLER CREATED).\r\n * @param firstAfter the detail to reset as the first hit on the ray after the target point (CALLER CREATED).\r\n * @returns summary of the updated details:\r\n * * [[RayClassification.TargetOnVertex]] - target lies at a vertex of the face (details are identical).\r\n * * [[RayClassification.TargetOnEdge]] - target lies on an edge of the face (details are identical).\r\n * * [[RayClassification.TargetBefore]] - target lies before the face; the ray intersects the face beyond\r\n * the target point.\r\n * * [[RayClassification.TargetAfter]] - target lies after the face; the ray intersects the face before\r\n * the target point.\r\n * * [[RayClassification.Bracket]] - target lies between intersections of the ray and the face; if the face\r\n * is convex, this means the target lies inside the face.\r\n * * [[RayClassification.NoHits]] - the face does not intersect the ray.\r\n */\r\n public reAimAroundFace(\r\n faceNode: HalfEdge,\r\n ray: Ray3d,\r\n targetDistance: number,\r\n lastBefore: HalfEdgePositionDetail,\r\n firstAfter: HalfEdgePositionDetail,\r\n ): RayClassification {\r\n assert(!faceNode.isMaskSet(HalfEdgeMask.EXTERIOR));\r\n lastBefore.resetAsUndefinedWithTag(-Number.MAX_VALUE); // these two objects...\r\n firstAfter.resetAsUndefinedWithTag(Number.MAX_VALUE); // ...always have dTag\r\n const data0 = NodeXYZUV.createNodeAndRayOrigin(faceNode, ray);\r\n let data1;\r\n let node0 = faceNode;\r\n // find the intersection of the ray with each edge of the face to classify the ray hit\r\n do {\r\n const node1 = node0.faceSuccessor;\r\n data1 = NodeXYZUV.createNodeAndRayOrigin(node1, ray, data1);\r\n const u0 = data0.u;\r\n const u1 = data1.u;\r\n const v0 = data0.v;\r\n const v1 = data1.v;\r\n if (Math.abs(v1) < this._tol) { // ray parallel to edge\r\n const vertexHit = HalfEdgePositionDetail.createVertex(node1);\r\n vertexHit.dTag = u1;\r\n if (Math.abs(u1 - targetDistance) < this._tol) {\r\n firstAfter.setFrom(vertexHit);\r\n lastBefore.setFrom(vertexHit);\r\n return RayClassification.TargetOnVertex;\r\n }\r\n assert(firstAfter.hasDTag() && lastBefore.hasDTag());\r\n if (u1 > targetDistance && u1 < firstAfter.dTag)\r\n firstAfter.setFrom(vertexHit);\r\n if (u1 < targetDistance && u1 > lastBefore.dTag)\r\n lastBefore.setFrom(vertexHit);\r\n } else if (v0 * v1 < 0.0) { // ray crosses edge\r\n const edgeFraction = -v0 / (v1 - v0);\r\n const rayFraction = Geometry.interpolate(u0, edgeFraction, u1);\r\n const edgeHit = HalfEdgePositionDetail.createEdgeAtFraction(data0.node, edgeFraction);\r\n edgeHit.dTag = rayFraction;\r\n if (Math.abs(rayFraction - targetDistance) <= this._tol) {\r\n firstAfter.setFrom(edgeHit);\r\n lastBefore.setFrom(edgeHit);\r\n return RayClassification.TargetOnEdge;\r\n }\r\n assert(firstAfter.hasDTag() && lastBefore.hasDTag());\r\n if (rayFraction > targetDistance && rayFraction < firstAfter.dTag)\r\n firstAfter.setFrom(edgeHit);\r\n if (rayFraction < targetDistance && rayFraction > lastBefore.dTag)\r\n lastBefore.setFrom(edgeHit);\r\n }\r\n data0.setFrom(data1);\r\n node0 = node0.faceSuccessor;\r\n } while (node0 !== faceNode);\r\n // returned to start node\r\n firstAfter.iTag = 0;\r\n lastBefore.iTag = 0;\r\n if (lastBefore.isUnclassified) {\r\n if (firstAfter.isUnclassified)\r\n return RayClassification.NoHits;\r\n return RayClassification.TargetBefore;\r\n }\r\n if (firstAfter.isUnclassified)\r\n return RayClassification.TargetAfter;\r\n else\r\n return RayClassification.Bracket; // face is locally convex; target lies inside this face\r\n }\r\n /**\r\n * Initialize the input ray for topology search:\r\n * * `origin` is at `start`\r\n * * `direction` is the unit xy-vector from `start` towards `target`\r\n * * `a` is the xy-distance from `start` to `target`\r\n * @param start existing position\r\n * @param target target xy coordinates\r\n * @param ray updated in place\r\n * @returns false if target is reached.\r\n */\r\n public setSearchRay(start: HalfEdgePositionDetail, target: Point3d, ray: Ray3d): boolean {\r\n ray.origin.setFromPoint3d(start);\r\n Vector3d.createStartEnd(ray.origin, target, ray.direction);\r\n ray.direction.z = 0.0;\r\n const distanceToTargetXY = ray.direction.magnitudeXY();\r\n if (distanceToTargetXY < this._tol)\r\n return false; // no searching necessary, we are already at the target point\r\n ray.a = distanceToTargetXY;\r\n ray.direction.scaleInPlace(1 / distanceToTargetXY);\r\n return true;\r\n }\r\n}\r\n"]}
@@ -25,6 +25,7 @@ export declare enum HalfEdgeTopo {
25
25
  * * "at a certain node around a vertex"
26
26
  * * "at a fractional position along an edge"
27
27
  * * "within a face"
28
+ * @internal
28
29
  */
29
30
  export declare class HalfEdgePositionDetail {
30
31
  /** The relevant node. */
@@ -54,11 +55,14 @@ export declare class HalfEdgePositionDetail {
54
55
  resetAsUnknown(): void;
55
56
  /** Create with null data. */
56
57
  static create(): HalfEdgePositionDetail;
57
- getITag(): number | undefined;
58
- setITag(value: number): void;
59
- getDTag(): number | undefined;
60
- setDTag(value: number): void;
61
- getTopo(): HalfEdgeTopo;
58
+ get iTag(): number | undefined;
59
+ set iTag(value: number);
60
+ get dTag(): number | undefined;
61
+ set dTag(value: number);
62
+ hasDTag(): this is {
63
+ get dTag(): number;
64
+ };
65
+ get topo(): HalfEdgeTopo;
62
66
  /** Create with node, fraction along edge, marked as "HalfEdgeTopo.Edge". Compute interpolated xyz on the edge. */
63
67
  static createEdgeAtFraction(node: HalfEdge, edgeFraction: number): HalfEdgePositionDetail;
64
68
  /**
@@ -94,17 +98,24 @@ export declare class HalfEdgePositionDetail {
94
98
  */
95
99
  get isExteriorTarget(): boolean;
96
100
  /** Return true if this detail is marked as being within a face. */
97
- get isFace(): boolean;
101
+ isFace(): this is {
102
+ get node(): HalfEdge;
103
+ };
98
104
  /** Return true if this detail is marked as being within an edge. */
99
- get isEdge(): boolean;
105
+ isEdge(): this is {
106
+ get node(): HalfEdge;
107
+ get edgeFraction(): number;
108
+ };
100
109
  /** Return true if this detail is marked as being at a vertex. */
101
- get isVertex(): boolean;
110
+ isVertex(): this is {
111
+ get node(): HalfEdge;
112
+ };
102
113
  /** Return true if this detail has no vertex, edge, or face qualifier. */
103
114
  get isUnclassified(): boolean;
104
115
  /** Return the node reference from this detail */
105
116
  get node(): HalfEdge | undefined;
106
117
  /** Return the (clone of, or optional filled in result) coordinates from this detail. */
107
118
  clonePoint(result?: Point3d): Point3d;
108
- isAtXY(x: number, y: number): boolean;
119
+ isAtXY(x: number, y: number, tolerance?: number): boolean;
109
120
  }
110
121
  //# sourceMappingURL=HalfEdgePositionDetail.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HalfEdgePositionDetail.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgePositionDetail.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,iGAAiG;AACjG,oBAAY,YAAY;IACtB,yBAAyB;IACzB,IAAI,IAAI;IACR,4DAA4D;IAC5D,MAAM,IAAI;IACV,0BAA0B;IAC1B,IAAI,IAAI;IACR,gDAAgD;IAChD,IAAI,IAAI;IACR;;;MAGE;IACF,YAAY,IAAI;CACjB;AACD;;;;;GAKG;AACH,qBAAa,sBAAsB;IACjC,yBAAyB;IACzB,OAAO,CAAC,KAAK,CAAC,CAAW;IACzB,+BAA+B;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,0DAA0D;IAC1D,OAAO,CAAC,KAAK,CAAe;IAC5B,sBAAsB;IACtB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,uBAAuB;IACvB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAAC,CAAU;IACpC;;;OAGG;IACH,OAAO;IAiBP,4CAA4C;IACrC,OAAO,CAAC,KAAK,EAAE,sBAAsB;IAU5C,gCAAgC;IACzB,cAAc;IAIrB,6BAA6B;WACf,MAAM,IAAI,sBAAsB;IAIvC,OAAO,IAAI,MAAM,GAAG,SAAS;IAG7B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAG5B,OAAO,IAAI,MAAM,GAAG,SAAS;IAG7B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAG5B,OAAO,IAAI,YAAY;IAG9B,mHAAmH;WACrG,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,sBAAsB;IAOhG;;;;OAIG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,sBAAsB;IAYzE,+EAA+E;IACxE,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB;IASpE;;;;OAIG;IACI,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,sBAAsB;IAW3F;;;OAGG;WACW,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,sBAAsB;IAGlE,qCAAqC;IAC9B,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,sBAAsB;IAQ5D,2DAA2D;IACpD,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS;IAG1D,8DAA8D;IACvD,cAAc,CAAC,IAAI,EAAE,QAAQ;IAKpC,qDAAqD;IACrD,IAAW,YAAY,IAAI,MAAM,GAAG,SAAS,CAE5C;IACD;;;OAGG;IACH,IAAW,gBAAgB,IAAI,OAAO,CAErC;IACD,mEAAmE;IACnE,IAAW,MAAM,IAAI,OAAO,CAE3B;IACD,oEAAoE;IACpE,IAAW,MAAM,IAAI,OAAO,CAE3B;IACD,iEAAiE;IACjE,IAAW,QAAQ,IAAI,OAAO,CAE7B;IACD,yEAAyE;IACzE,IAAW,cAAc,IAAI,OAAO,CAEnC;IACD,iDAAiD;IACjD,IAAW,IAAI,IAAI,QAAQ,GAAG,SAAS,CAEtC;IACD,wFAAwF;IACjF,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAkBrC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;CAG7C"}
1
+ {"version":3,"file":"HalfEdgePositionDetail.d.ts","sourceRoot":"","sources":["../../../src/topology/HalfEdgePositionDetail.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ export var HalfEdgeTopo;
29
29
  * * "at a certain node around a vertex"
30
30
  * * "at a fractional position along an edge"
31
31
  * * "within a face"
32
+ * @internal
32
33
  */
33
34
  export class HalfEdgePositionDetail {
34
35
  /** The relevant node. */
@@ -83,19 +84,22 @@ export class HalfEdgePositionDetail {
83
84
  const detail = new HalfEdgePositionDetail(undefined, 0, 0, 0, HalfEdgeTopo.None);
84
85
  return detail;
85
86
  }
86
- getITag() {
87
+ get iTag() {
87
88
  return this._iTag;
88
89
  }
89
- setITag(value) {
90
+ set iTag(value) {
90
91
  this._iTag = value;
91
92
  }
92
- getDTag() {
93
+ get dTag() {
93
94
  return this._dTag;
94
95
  }
95
- setDTag(value) {
96
+ set dTag(value) {
96
97
  this._dTag = value;
97
98
  }
98
- getTopo() {
99
+ hasDTag() {
100
+ return this._dTag !== undefined;
101
+ }
102
+ get topo() {
99
103
  return this._topo;
100
104
  }
101
105
  /** Create with node, fraction along edge, marked as "HalfEdgeTopo.Edge". Compute interpolated xyz on the edge. */
@@ -187,16 +191,16 @@ export class HalfEdgePositionDetail {
187
191
  return this._isExteriorTarget !== undefined ? this._isExteriorTarget : false;
188
192
  }
189
193
  /** Return true if this detail is marked as being within a face. */
190
- get isFace() {
191
- return this._topo === HalfEdgeTopo.Face;
194
+ isFace() {
195
+ return this._topo === HalfEdgeTopo.Face && this._node !== undefined;
192
196
  }
193
197
  /** Return true if this detail is marked as being within an edge. */
194
- get isEdge() {
195
- return this._topo === HalfEdgeTopo.Edge;
198
+ isEdge() {
199
+ return this._topo === HalfEdgeTopo.Edge && this._node !== undefined && this._edgeFraction !== undefined;
196
200
  }
197
201
  /** Return true if this detail is marked as being at a vertex. */
198
- get isVertex() {
199
- return this._topo === HalfEdgeTopo.Vertex;
202
+ isVertex() {
203
+ return this._topo === HalfEdgeTopo.Vertex && this._node !== undefined;
200
204
  }
201
205
  /** Return true if this detail has no vertex, edge, or face qualifier. */
202
206
  get isUnclassified() {
@@ -225,8 +229,8 @@ export class HalfEdgePositionDetail {
225
229
  return false;
226
230
  }
227
231
  */
228
- isAtXY(x, y) {
229
- return this._topo !== HalfEdgeTopo.None && Geometry.isSameCoordinate(this.x, x) && Geometry.isSameCoordinate(this.y, y);
232
+ isAtXY(x, y, tolerance = Geometry.smallMetricDistance) {
233
+ return this._topo !== HalfEdgeTopo.None && Geometry.isSameCoordinateXY(this.x, this.y, x, y, tolerance);
230
234
  }
231
235
  }
232
236
  //# sourceMappingURL=HalfEdgePositionDetail.js.map