@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
@@ -1 +1 @@
1
- {"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/curve/Path.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAuC,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,IAAK,SAAQ,UAAU;IAClC,wCAAwC;IACxC,SAAgB,mBAAmB,UAAU;IAC7C,+CAA+C;IACxC,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAGzD,2DAA2D;IACpD,wBAAwB,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,GAAE,MAAW,GAAG,IAAI;IAGrG,+BAA+B;;IAI/B;;;;OAIG;WACW,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,cAAc,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI;IAaxE;;;OAGG;WACW,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAGzD,oEAAoE;IAC7D,YAAY,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAMlD;;;;;;;;;;OAUG;IACa,YAAY,CAC1B,UAAU,EAAE,OAAO,EAAE,MAAM,GAAE,2BAAmC,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAC7F,mBAAmB,GAAG,SAAS;IAclC,+EAA+E;IACxE,eAAe,IAAI,MAAM;IAGhC,+CAA+C;IACxC,cAAc,IAAI,IAAI;IAG7B,sEAAsE;IAC/D,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;CAGhE"}
1
+ {"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/curve/Path.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAuC,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,IAAK,SAAQ,UAAU;IAClC,wCAAwC;IACxC,SAAgB,mBAAmB,UAAU;IAC7C,+CAA+C;IACxC,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAGzD,2DAA2D;IACpD,wBAAwB,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,GAAE,MAAW,GAAG,IAAI;IAGrG,+BAA+B;;IAI/B;;;;OAIG;WACW,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,cAAc,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI;IAaxE;;;OAGG;WACW,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAGzD,oEAAoE;IAC7D,YAAY,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAMlD;;;;;;;;;;OAUG;IACa,YAAY,CAC1B,UAAU,EAAE,OAAO,EAAE,MAAM,GAAE,2BAAmC,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAC7F,mBAAmB,GAAG,SAAS;IAiBlC,+EAA+E;IACxE,eAAe,IAAI,MAAM;IAGhC,+CAA+C;IACxC,cAAc,IAAI,IAAI;IAG7B,sEAAsE;IAC/D,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;CAGhE"}
@@ -2,6 +2,10 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ /** @packageDocumentation
6
+ * @module Curve
7
+ */
8
+ import { assert } from "@itwin/core-bentley";
5
9
  import { Point3d } from "../geometry3d/Point3dVector3d";
6
10
  import { CurveChainWithDistanceIndex } from "./CurveChainWithDistanceIndex";
7
11
  import { CurveChain } from "./CurveCollection";
@@ -81,8 +85,11 @@ export class Path extends CurveChain {
81
85
  const child = this.children[i]; // head only extends at start; tail, only at end. NOTE: child may be both head and tail!
82
86
  const mode0 = (i === 0) ? CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0) : CurveExtendMode.None;
83
87
  const mode1 = (i === this.children.length - 1) ? CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1) : CurveExtendMode.None;
84
- if (child.closestPoint(spacePoint, [mode0, mode1], detailB))
85
- detailA = result = CurveLocationDetail.chooseSmallerA(detailA, detailB).clone(result);
88
+ if (child.closestPoint(spacePoint, [mode0, mode1], detailB)) {
89
+ const smaller = CurveLocationDetail.chooseSmallerA(detailA, detailB);
90
+ assert(undefined !== smaller, "expect defined because detailB is always defined");
91
+ detailA = result = smaller.clone(result);
92
+ }
86
93
  }
87
94
  }
88
95
  return detailA;
@@ -1 +1 @@
1
- {"version":3,"file":"Path.js","sourceRoot":"","sources":["../../../src/curve/Path.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 Curve\r\n */\r\n\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { CurveChainWithDistanceIndex } from \"./CurveChainWithDistanceIndex\";\r\nimport { CurveChain } from \"./CurveCollection\";\r\nimport { CurveExtendMode, CurveExtendOptions, VariantCurveExtendParameter } from \"./CurveExtendMode\";\r\nimport { CurveLocationDetail } from \"./CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { RecursiveCurveProcessor } from \"./CurveProcessor\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * * A `Path` object is a collection of curves that join head-to-tail to form a path.\r\n * * A `Path` object does not bound a planar region. Use `Loop` to indicate region bounding.\r\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\r\n * @public\r\n */\r\nexport class Path extends CurveChain {\r\n /** String name for schema properties */\r\n public readonly curveCollectionType = \"path\";\r\n /** Test if `other` is an instance of `Path` */\r\n public isSameGeometryClass(other: GeometryQuery): boolean {\r\n return other instanceof Path;\r\n }\r\n /** Invoke `processor.announcePath(this, indexInParent)` */\r\n public announceToCurveProcessor(processor: RecursiveCurveProcessor, indexInParent: number = -1): void {\r\n return processor.announcePath(this, indexInParent);\r\n }\r\n /** Construct an empty path. */\r\n public constructor() {\r\n super();\r\n }\r\n /**\r\n * Create a path from a variable length list of curve primitives\r\n * * CurvePrimitive params are captured.\r\n * @param curves variable length list of individual curve primitives or point arrays.\r\n */\r\n public static create(...curves: Array<CurvePrimitive | Point3d[]>): Path {\r\n const result = new Path();\r\n for (const curve of curves) {\r\n if (curve instanceof CurveChainWithDistanceIndex)\r\n result.children.push(...curve.path.children);\r\n else if (curve instanceof CurvePrimitive)\r\n result.children.push(curve);\r\n else if (Array.isArray(curve) && curve.length > 0 && curve[0] instanceof Point3d) {\r\n result.children.push(LineString3d.create(curve));\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a path from a an array of curve primitives.\r\n * @param curves array of individual curve primitives.\r\n */\r\n public static createArray(curves: CurvePrimitive[]): Path {\r\n return this.create(...curves);\r\n }\r\n /** Return a deep copy, with leaf-level curve primitives stroked. */\r\n public cloneStroked(options?: StrokeOptions): Path {\r\n const strokes = LineString3d.create();\r\n for (const curve of this.children)\r\n curve.emitStrokes(strokes, options);\r\n return Path.create(strokes);\r\n }\r\n /**\r\n * Return the closest point on the contained curves.\r\n * @param spacePoint point in space.\r\n * @param extend compute the closest point to the path extended according to variant type:\r\n * * false: do not extend the path\r\n * * true: extend the path at both start and end\r\n * * CurveExtendOptions: extend the path in the specified manner at both start and end\r\n * * CurveExtendOptions[]: first entry applies to path start; second, to path end; any other entries ignored\r\n * @param result optional pre-allocated detail to populate and return.\r\n * @returns details of the closest point.\r\n */\r\n public override closestPoint(\r\n spacePoint: Point3d, extend: VariantCurveExtendParameter = false, result?: CurveLocationDetail,\r\n ): CurveLocationDetail | undefined {\r\n let detailA: CurveLocationDetail | undefined;\r\n const detailB = new CurveLocationDetail();\r\n if (this.children !== undefined) {\r\n for (let i = 0; i < this.children.length; i++) {\r\n const child = this.children[i]; // head only extends at start; tail, only at end. NOTE: child may be both head and tail!\r\n const mode0 = (i === 0) ? CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0) : CurveExtendMode.None;\r\n const mode1 = (i === this.children.length - 1) ? CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1) : CurveExtendMode.None;\r\n if (child.closestPoint(spacePoint, [mode0, mode1], detailB))\r\n detailA = result = CurveLocationDetail.chooseSmallerA(detailA, detailB)!.clone(result);\r\n }\r\n }\r\n return detailA;\r\n }\r\n /** Return the boundary type (1) of a corresponding MicroStation CurveVector */\r\n public dgnBoundaryType(): number {\r\n return 1;\r\n }\r\n /** Clone as a new `Path` with no primitives */\r\n public cloneEmptyPeer(): Path {\r\n return new Path();\r\n }\r\n /** Second step of double dispatch: call `handler.handlePath(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handlePath(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Path.js","sourceRoot":"","sources":["../../../src/curve/Path.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 Curve\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { CurveChainWithDistanceIndex } from \"./CurveChainWithDistanceIndex\";\r\nimport { CurveChain } from \"./CurveCollection\";\r\nimport { CurveExtendMode, CurveExtendOptions, VariantCurveExtendParameter } from \"./CurveExtendMode\";\r\nimport { CurveLocationDetail } from \"./CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { RecursiveCurveProcessor } from \"./CurveProcessor\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * * A `Path` object is a collection of curves that join head-to-tail to form a path.\r\n * * A `Path` object does not bound a planar region. Use `Loop` to indicate region bounding.\r\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\r\n * @public\r\n */\r\nexport class Path extends CurveChain {\r\n /** String name for schema properties */\r\n public readonly curveCollectionType = \"path\";\r\n /** Test if `other` is an instance of `Path` */\r\n public isSameGeometryClass(other: GeometryQuery): boolean {\r\n return other instanceof Path;\r\n }\r\n /** Invoke `processor.announcePath(this, indexInParent)` */\r\n public announceToCurveProcessor(processor: RecursiveCurveProcessor, indexInParent: number = -1): void {\r\n return processor.announcePath(this, indexInParent);\r\n }\r\n /** Construct an empty path. */\r\n public constructor() {\r\n super();\r\n }\r\n /**\r\n * Create a path from a variable length list of curve primitives\r\n * * CurvePrimitive params are captured.\r\n * @param curves variable length list of individual curve primitives or point arrays.\r\n */\r\n public static create(...curves: Array<CurvePrimitive | Point3d[]>): Path {\r\n const result = new Path();\r\n for (const curve of curves) {\r\n if (curve instanceof CurveChainWithDistanceIndex)\r\n result.children.push(...curve.path.children);\r\n else if (curve instanceof CurvePrimitive)\r\n result.children.push(curve);\r\n else if (Array.isArray(curve) && curve.length > 0 && curve[0] instanceof Point3d) {\r\n result.children.push(LineString3d.create(curve));\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a path from a an array of curve primitives.\r\n * @param curves array of individual curve primitives.\r\n */\r\n public static createArray(curves: CurvePrimitive[]): Path {\r\n return this.create(...curves);\r\n }\r\n /** Return a deep copy, with leaf-level curve primitives stroked. */\r\n public cloneStroked(options?: StrokeOptions): Path {\r\n const strokes = LineString3d.create();\r\n for (const curve of this.children)\r\n curve.emitStrokes(strokes, options);\r\n return Path.create(strokes);\r\n }\r\n /**\r\n * Return the closest point on the contained curves.\r\n * @param spacePoint point in space.\r\n * @param extend compute the closest point to the path extended according to variant type:\r\n * * false: do not extend the path\r\n * * true: extend the path at both start and end\r\n * * CurveExtendOptions: extend the path in the specified manner at both start and end\r\n * * CurveExtendOptions[]: first entry applies to path start; second, to path end; any other entries ignored\r\n * @param result optional pre-allocated detail to populate and return.\r\n * @returns details of the closest point.\r\n */\r\n public override closestPoint(\r\n spacePoint: Point3d, extend: VariantCurveExtendParameter = false, result?: CurveLocationDetail,\r\n ): CurveLocationDetail | undefined {\r\n let detailA: CurveLocationDetail | undefined;\r\n const detailB = new CurveLocationDetail();\r\n if (this.children !== undefined) {\r\n for (let i = 0; i < this.children.length; i++) {\r\n const child = this.children[i]; // head only extends at start; tail, only at end. NOTE: child may be both head and tail!\r\n const mode0 = (i === 0) ? CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0) : CurveExtendMode.None;\r\n const mode1 = (i === this.children.length - 1) ? CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1) : CurveExtendMode.None;\r\n if (child.closestPoint(spacePoint, [mode0, mode1], detailB)) {\r\n const smaller = CurveLocationDetail.chooseSmallerA(detailA, detailB);\r\n assert(undefined !== smaller, \"expect defined because detailB is always defined\");\r\n detailA = result = smaller.clone(result);\r\n }\r\n }\r\n }\r\n return detailA;\r\n }\r\n /** Return the boundary type (1) of a corresponding MicroStation CurveVector */\r\n public dgnBoundaryType(): number {\r\n return 1;\r\n }\r\n /** Clone as a new `Path` with no primitives */\r\n public cloneEmptyPeer(): Path {\r\n return new Path();\r\n }\r\n /** Second step of double dispatch: call `handler.handlePath(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handlePath(this);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"InOutTests.js","sourceRoot":"","sources":["../../../../src/curve/Query/InOutTests.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 Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { AnyRegion } from \"../CurveTypes\";\r\nimport { CurveIntervalRole, CurveLocationDetail } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { Loop } from \"../Loop\";\r\nimport { ParityRegion } from \"../ParityRegion\";\r\nimport { UnionRegion } from \"../UnionRegion\";\r\n\r\n/**\r\n * Context for testing containment in Loop, ParityRegion and UnionRegion.\r\n * @internal\r\n */\r\nexport class PointInOnOutContext {\r\n /**\r\n * In-out test for a single loop.\r\n * * Test by finding intersections with an xy line (xyz plane) in \"some\" direction.\r\n * * Test logic gets complicated if the plane has a vertex hit.\r\n * * If that happens, don't try to figure out the cases. Just move on to another plane.\r\n * * Any \"on\" point triggers immediate 0 return.\r\n * * (Hence if there are overlapping lines their self-canceling effect might be wrong.)\r\n * @param loop\r\n * @param x tested x coordinate\r\n * @param y tested y coordinate\r\n */\r\n public static testPointInOnOutLoopXY(loop: Loop, x: number, y: number): number {\r\n let plane: Plane3dByOriginAndUnitNormal;\r\n const xy = Point3d.create(x, y);\r\n for (let radians = 0.0; Math.abs(radians) < 6.0; radians = -1.2313 * (radians + 0.3212897)) {\r\n plane = Plane3dByOriginAndUnitNormal.createXYAngle(x, y, Angle.createRadians(radians))!;\r\n const normal = plane.getNormalRef();\r\n const intersections: CurveLocationDetail[] = [];\r\n for (const cp of loop.children) {\r\n if (cp instanceof CurvePrimitive)\r\n cp.appendPlaneIntersectionPoints(plane, intersections);\r\n }\r\n CurvePrimitive.snapAndRestrictDetails(intersections, false, true);\r\n let numLeft = 0;\r\n let numRight = 0;\r\n let numTricky = 0;\r\n let wx, wy;\r\n // Count simple crossings to left and right.\r\n // Also count tricky crossings (vertex hits, onEdge)\r\n // If there are any tricky ones, go around with a different plane.\r\n // A intently devious tester could make every plane hit tricky things.\r\n for (const intersection of intersections) {\r\n if (intersection.intervalRole !== CurveIntervalRole.isolated\r\n && intersection.intervalRole !== undefined) {\r\n numTricky++;\r\n }\r\n wx = intersection.point.x - x;\r\n wy = intersection.point.y - y;\r\n if (Geometry.isSameCoordinateXY(wx, wy, 0, 0))\r\n return 0;\r\n const cross = Geometry.crossProductXYXY(normal.x, normal.y, wx, wy);\r\n if (xy.isAlmostEqualXY(intersection.point))\r\n return 0;\r\n if (cross < 0.0)\r\n numLeft++;\r\n else if (cross > 0.0)\r\n numRight++;\r\n }\r\n if (numTricky !== 0) // try another angle !!\r\n continue;\r\n const leftParity = numLeft & (0x01);\r\n const rightParity = numRight & (0x01);\r\n if (leftParity === rightParity)\r\n return leftParity === 1 ? 1 : -1;\r\n }\r\n return -1;\r\n }\r\n /**\r\n * strongly-typed parity region handling: XOR of all loops. (But any ON is returned as edge hit.)\r\n * @param parent\r\n * @param x\r\n * @param y\r\n */\r\n public static testPointInOnOutParityRegionXY(parent: ParityRegion, x: number, y: number): number {\r\n let result = -1;\r\n for (const loop of parent.children) {\r\n if (loop instanceof Loop) {\r\n const q = this.testPointInOnOutLoopXY(loop, x, y);\r\n if (q === 0)\r\n return 0;\r\n if (q > 0)\r\n result = - result;\r\n }\r\n }\r\n return result;\r\n }\r\n public static testPointInOnOutUnionRegionXY(parent: UnionRegion, x: number, y: number): number {\r\n for (const loop of parent.children) {\r\n const classify = this.testPointInOnOutRegionXY(loop, x, y);\r\n if (classify >= 0)\r\n return classify;\r\n }\r\n return -1;\r\n }\r\n public static testPointInOnOutRegionXY(parent: AnyRegion, x: number, y: number): number {\r\n if (parent instanceof Loop)\r\n return this.testPointInOnOutLoopXY(parent, x, y);\r\n else if (parent instanceof ParityRegion)\r\n return this.testPointInOnOutParityRegionXY(parent, x, y);\r\n else if (parent instanceof UnionRegion)\r\n return this.testPointInOnOutUnionRegionXY(parent, x, y);\r\n return -1;\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"InOutTests.js","sourceRoot":"","sources":["../../../../src/curve/Query/InOutTests.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 Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { AnyRegion } from \"../CurveTypes\";\r\nimport { CurveIntervalRole, CurveLocationDetail } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { Loop } from \"../Loop\";\r\nimport { ParityRegion } from \"../ParityRegion\";\r\nimport { UnionRegion } from \"../UnionRegion\";\r\n\r\n/**\r\n * Context for testing containment in Loop, ParityRegion and UnionRegion.\r\n * @internal\r\n */\r\nexport class PointInOnOutContext {\r\n /**\r\n * In-out test for a single loop.\r\n * * Test by finding intersections with an xy line (xyz plane) in \"some\" direction.\r\n * * Test logic gets complicated if the plane has a vertex hit.\r\n * * If that happens, don't try to figure out the cases. Just move on to another plane.\r\n * * Any \"on\" point triggers immediate 0 return.\r\n * * (Hence if there are overlapping lines their self-canceling effect might be wrong.)\r\n * @param loop\r\n * @param x tested x coordinate\r\n * @param y tested y coordinate\r\n */\r\n public static testPointInOnOutLoopXY(loop: Loop, x: number, y: number): number {\r\n let plane: Plane3dByOriginAndUnitNormal;\r\n const xy = Point3d.create(x, y);\r\n for (let radians = 0.0; Math.abs(radians) < 6.0; radians = -1.2313 * (radians + 0.3212897)) {\r\n plane = Plane3dByOriginAndUnitNormal.createXYAngle(x, y, Angle.createRadians(radians));\r\n const normal = plane.getNormalRef();\r\n const intersections: CurveLocationDetail[] = [];\r\n for (const cp of loop.children) {\r\n if (cp instanceof CurvePrimitive)\r\n cp.appendPlaneIntersectionPoints(plane, intersections);\r\n }\r\n CurvePrimitive.snapAndRestrictDetails(intersections, false, true);\r\n let numLeft = 0;\r\n let numRight = 0;\r\n let numTricky = 0;\r\n let wx, wy;\r\n // Count simple crossings to left and right.\r\n // Also count tricky crossings (vertex hits, onEdge)\r\n // If there are any tricky ones, go around with a different plane.\r\n // A intently devious tester could make every plane hit tricky things.\r\n for (const intersection of intersections) {\r\n if (intersection.intervalRole !== CurveIntervalRole.isolated\r\n && intersection.intervalRole !== undefined) {\r\n numTricky++;\r\n }\r\n wx = intersection.point.x - x;\r\n wy = intersection.point.y - y;\r\n if (Geometry.isSameCoordinateXY(wx, wy, 0, 0))\r\n return 0;\r\n const cross = Geometry.crossProductXYXY(normal.x, normal.y, wx, wy);\r\n if (xy.isAlmostEqualXY(intersection.point))\r\n return 0;\r\n if (cross < 0.0)\r\n numLeft++;\r\n else if (cross > 0.0)\r\n numRight++;\r\n }\r\n if (numTricky !== 0) // try another angle !!\r\n continue;\r\n const leftParity = numLeft & (0x01);\r\n const rightParity = numRight & (0x01);\r\n if (leftParity === rightParity)\r\n return leftParity === 1 ? 1 : -1;\r\n }\r\n return -1;\r\n }\r\n /**\r\n * strongly-typed parity region handling: XOR of all loops. (But any ON is returned as edge hit.)\r\n * @param parent\r\n * @param x\r\n * @param y\r\n */\r\n public static testPointInOnOutParityRegionXY(parent: ParityRegion, x: number, y: number): number {\r\n let result = -1;\r\n for (const loop of parent.children) {\r\n if (loop instanceof Loop) {\r\n const q = this.testPointInOnOutLoopXY(loop, x, y);\r\n if (q === 0)\r\n return 0;\r\n if (q > 0)\r\n result = - result;\r\n }\r\n }\r\n return result;\r\n }\r\n public static testPointInOnOutUnionRegionXY(parent: UnionRegion, x: number, y: number): number {\r\n for (const loop of parent.children) {\r\n const classify = this.testPointInOnOutRegionXY(loop, x, y);\r\n if (classify >= 0)\r\n return classify;\r\n }\r\n return -1;\r\n }\r\n public static testPointInOnOutRegionXY(parent: AnyRegion, x: number, y: number): number {\r\n if (parent instanceof Loop)\r\n return this.testPointInOnOutLoopXY(parent, x, y);\r\n else if (parent instanceof ParityRegion)\r\n return this.testPointInOnOutParityRegionXY(parent, x, y);\r\n else if (parent instanceof UnionRegion)\r\n return this.testPointInOnOutUnionRegionXY(parent, x, y);\r\n return -1;\r\n }\r\n\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarSubdivision.d.ts","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI7E,OAAO,EAAuB,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,EAAE,IAAI,EAAsB,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA6F/C;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;WACW,qBAAqB,CACjC,UAAU,EAAE,cAAc,EAAE,EAC5B,QAAQ,EAAE,uBAAuB,EAAE,EACnC,cAAc,GAAE,MAAqC,GACpD,aAAa;IA4ChB;;;MAGE;IACF,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAwB1B;;;;;;OAMG;WACW,iBAAiB,CAC7B,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,GAAE,MAAgB,EAAE,YAAY,CAAC,EAAE,OAAO,GAC7F,MAAM;IAeT,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAUtC,kDAAkD;IAClD,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAYhC;;;;;OAKG;WACW,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,yBAAyB,GAAG,IAAI,GAAG,SAAS;IAwBpI;;;;;;OAMG;WACW,8BAA8B,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,yBAAyB,GAAG,IAAI,GAAG,YAAY,GAAG,SAAS;IAqCpJ,yGAAyG;IACzG,OAAO,CAAC,MAAM,CAAC,UAAU;IAWzB,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,kBAAkB;WAWnB,oCAAoC,CAAC,KAAK,EAAE,aAAa,EAAE,iBAAiB,GAAE,MAAgB,GAAG,WAAW,EAAE;CAkC7H;AAED;;EAEE;AACF,yBAAiB,iBAAiB,CAAC;IACjC,0HAA0H;IAC1H,UAAiB,yBAAyB;QACxC;;;WAGG;QACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;QAC3E;;;WAGG;QACH,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,wHAAwH;QACxH,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;WAGG;QACH,UAAU,CAAC,EAAE,YAAY,CAAC;QAC1B,8IAA8I;QAC9I,SAAS,CAAC,EAAE,YAAY,CAAC;QACzB;;;WAGG;QACH,CAAC,CAAC,EAAE,MAAM,CAAC;KACZ;CACF"}
1
+ {"version":3,"file":"PlanarSubdivision.d.ts","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI7E,OAAO,EAAuB,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,EAAE,IAAI,EAAsB,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyE/C;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;WACW,qBAAqB,CACjC,UAAU,EAAE,cAAc,EAAE,EAC5B,QAAQ,EAAE,uBAAuB,EAAE,EACnC,cAAc,GAAE,MAAqC,GACpD,aAAa;IAoDhB;;;MAGE;IACF,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IA6B1B;;;;;;OAMG;WACW,iBAAiB,CAC7B,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,GAAE,MAAgB,EAAE,YAAY,CAAC,EAAE,OAAO,GAC7F,MAAM;IAeT,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAUtC,kDAAkD;IAClD,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAYhC;;;;;OAKG;WACW,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,yBAAyB,GAAG,IAAI,GAAG,SAAS;IAwBpI;;;;;;OAMG;WACW,8BAA8B,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,yBAAyB,GAAG,IAAI,GAAG,YAAY,GAAG,SAAS;IAqCpJ,yGAAyG;IACzG,OAAO,CAAC,MAAM,CAAC,UAAU;IAWzB,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,kBAAkB;WAWnB,oCAAoC,CAAC,KAAK,EAAE,aAAa,EAAE,iBAAiB,GAAE,MAAgB,GAAG,WAAW,EAAE;CAkC7H;AAED;;EAEE;AACF,yBAAiB,iBAAiB,CAAC;IACjC,0HAA0H;IAC1H,UAAiB,yBAAyB;QACxC;;;WAGG;QACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;QAC3E;;;WAGG;QACH,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,wHAAwH;QACxH,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;WAGG;QACH,UAAU,CAAC,EAAE,YAAY,CAAC;QAC1B,8IAA8I;QAC9I,SAAS,CAAC,EAAE,YAAY,CAAC;QACzB;;;WAGG;QACH,CAAC,CAAC,EAAE,MAAM,CAAC;KACZ;CACF"}
@@ -19,25 +19,6 @@ import { RegionGroupMember, RegionGroupOpType } from "../RegionOpsClassification
19
19
  /** @packageDocumentation
20
20
  * @module Curve
21
21
  */
22
- function computeSortAngle(curve, fraction, reverse) {
23
- const ray = curve.fractionToPointAndDerivative(fraction);
24
- const s = reverse ? -1.0 : 1.0;
25
- return Math.atan2(s * ray.direction.y, s * ray.direction.x);
26
- }
27
- function getFractionOnCurve(pair, curve) {
28
- if (pair.detailA.curve === curve)
29
- return pair.detailA.fraction;
30
- if (pair.detailB.curve === curve)
31
- return pair.detailB.fraction;
32
- return undefined;
33
- }
34
- function getDetailOnCurve(pair, curve) {
35
- if (pair.detailA.curve === curve)
36
- return pair.detailA;
37
- if (pair.detailB.curve === curve)
38
- return pair.detailB;
39
- return undefined;
40
- }
41
22
  class MapCurvePrimitiveToCurveLocationDetailPairArray {
42
23
  primitiveToPair = new Map();
43
24
  // index assigned to this primitive (for debugging)
@@ -115,21 +96,29 @@ export class PlanarSubdivision {
115
96
  // otherwise, these single-primitive loops are missing from the graph
116
97
  detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance);
117
98
  }
99
+ // these helper lambdas assume exactly one of the paired details is on the input curve
100
+ const getFractionOnCurve = (pair, curve) => {
101
+ return (pair.detailA.curve === curve) ? pair.detailA.fraction : pair.detailB.fraction;
102
+ };
103
+ const getDetailOnCurve = (pair, curve) => {
104
+ return (pair.detailA.curve === curve) ? pair.detailA : pair.detailB;
105
+ };
118
106
  const graph = new HalfEdgeGraph();
119
107
  for (const entry of detailByPrimitive.primitiveToPair.entries()) {
120
108
  const p = entry[0];
121
109
  // convert each interval intersection into two isolated intersections
122
110
  const details = entry[1].reduce((accumulator, detailPair) => {
123
- if (!detailPair.detailA.hasFraction1)
124
- return [...accumulator, detailPair];
125
111
  const detail = getDetailOnCurve(detailPair, p);
126
- const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);
127
- const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1, detail.point1);
128
- return [
129
- ...accumulator,
130
- CurveLocationDetailPair.createCapture(detail0, detail0),
131
- CurveLocationDetailPair.createCapture(detail1, detail1),
132
- ];
112
+ if (detail.isInterval()) {
113
+ const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);
114
+ const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1, detail.point1);
115
+ return [
116
+ ...accumulator,
117
+ CurveLocationDetailPair.createCapture(detail0, detail0),
118
+ CurveLocationDetailPair.createCapture(detail1, detail1),
119
+ ];
120
+ }
121
+ return [...accumulator, detailPair];
133
122
  }, []);
134
123
  // lexical sort on p intersection fraction
135
124
  details.sort((pairA, pairB) => {
@@ -185,8 +174,13 @@ export class PlanarSubdivision {
185
174
  halfEdge.sortData = 1.0;
186
175
  mate.edgeTag = detail01;
187
176
  mate.sortData = -1.0;
188
- halfEdge.sortAngle = computeSortAngle(p, fraction0, false);
189
- mate.sortAngle = computeSortAngle(p, fraction1, true);
177
+ const computeSortAngle = (f, reverse) => {
178
+ const ray = p.fractionToPointAndDerivative(f);
179
+ const s = reverse ? -1.0 : 1.0;
180
+ return Math.atan2(s * ray.direction.y, s * ray.direction.x);
181
+ };
182
+ halfEdge.sortAngle = computeSortAngle(fraction0, false);
183
+ mate.sortAngle = computeSortAngle(fraction1, true);
190
184
  }
191
185
  return { point: point1, fraction: fraction1 }; // where the next curve fragment starts
192
186
  }
@@ -227,7 +221,7 @@ export class PlanarSubdivision {
227
221
  static createCurveInEdge(edge, z) {
228
222
  let result;
229
223
  const info = this.extractGeometryFromEdge(edge);
230
- if (info && info.detail.curve && info.detail.fraction1) {
224
+ if (info && info.detail.curve && info.detail.isInterval()) {
231
225
  const f0 = info.reversed ? info.detail.fraction1 : info.detail.fraction;
232
226
  const f1 = info.reversed ? info.detail.fraction : info.detail.fraction1;
233
227
  result = info.detail.curve.clonePartialCurve(f0, f1);
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.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\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { AnyRegion } from \"../CurveTypes\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\r\nimport { ParityRegion } from \"../ParityRegion\";\r\nimport { ConsolidateAdjacentCurvePrimitivesOptions, RegionOps } from \"../RegionOps\";\r\nimport { RegionGroupMember, RegionGroupOpType } from \"../RegionOpsClassificationSweeps\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nfunction computeSortAngle(curve: CurvePrimitive, fraction: number, reverse: boolean): number {\r\n const ray = curve.fractionToPointAndDerivative(fraction);\r\n const s = reverse ? -1.0 : 1.0;\r\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\r\n}\r\nfunction getFractionOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): number | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA.fraction;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB.fraction;\r\n return undefined;\r\n}\r\nfunction getDetailOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB;\r\n return undefined;\r\n}\r\n\r\nclass MapCurvePrimitiveToCurveLocationDetailPairArray {\r\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\r\n // index assigned to this primitive (for debugging)\r\n public primitiveToIndex = new Map<CurvePrimitive, number>();\r\n private _numIndexedPrimitives: number = 0;\r\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\r\n if (primitive !== undefined) {\r\n const index = this.primitiveToIndex.get(primitive);\r\n if (index === undefined) {\r\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\r\n }\r\n }\r\n }\r\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\r\n if (primitive) {\r\n const priorPairs = this.primitiveToPair.get(primitive);\r\n this.assignPrimitiveIndex(primitive);\r\n if (!priorPairs) {\r\n this.primitiveToPair.set(primitive, [pair]);\r\n } else {\r\n priorPairs.push(pair);\r\n }\r\n }\r\n }\r\n public insertPair(pair: CurveLocationDetailPair) {\r\n const primitiveA = pair.detailA.curve;\r\n if (primitiveA)\r\n this.insertPrimitiveToPair(primitiveA, pair);\r\n const primitiveB = pair.detailB.curve;\r\n if (primitiveB)\r\n this.insertPrimitiveToPair(primitiveB, pair);\r\n }\r\n /**\r\n * Split closed missing primitives in half and add new intersection pairs.\r\n * * When bridge edges aren't included in the primitives array, a closed primitive with no intersections will not be\r\n * added to the graph because it isn't in the `primitiveToPair` map. By splitting such a missing primitive in two, we\r\n * introduce two intersections for each half, which allows the primitive to be represented in the map.\r\n */\r\n public splitAndAppendMissingClosedPrimitives(\r\n primitives: CurvePrimitive[], tolerance: number = Geometry.smallMetricDistance,\r\n ): void {\r\n for (const p of primitives) {\r\n let closedCurveSplitCandidate = false;\r\n if (p instanceof Arc3d)\r\n closedCurveSplitCandidate = p.sweep.isFullCircle;\r\n else if (!(p instanceof LineSegment3d) && !(p instanceof LineString3d)) // TODO: probably should do this for all types. Lots of spline-type primitives can be closed.\r\n closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);\r\n if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {\r\n const p0 = p.clonePartialCurve(0.0, 0.5);\r\n const p1 = p.clonePartialCurve(0.5, 1.0);\r\n if (p0 && p1) {\r\n this.insertPair(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0),\r\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0),\r\n ));\r\n this.insertPair(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0),\r\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0),\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class PlanarSubdivision {\r\n /**\r\n * Create a graph from curves and precomputed intersections.\r\n * * Z-coordinates are ignored.\r\n * @param primitives input curves\r\n * @param allPairs array of curve-curve xy-intersections\r\n * @param mergeTolerance optional distance tolerance for clustering vertices. Default value is [[Geometry.smallMetricDistance]].\r\n */\r\n public static assembleHalfEdgeGraph(\r\n primitives: CurvePrimitive[],\r\n allPairs: CurveLocationDetailPair[],\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): HalfEdgeGraph {\r\n // map from key CurvePrimitive to CurveLocationDetailPair\r\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray();\r\n for (const pair of allPairs)\r\n detailByPrimitive.insertPair(pair);\r\n if (primitives.length > detailByPrimitive.primitiveToPair.size) {\r\n // otherwise, these single-primitive loops are missing from the graph\r\n detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance);\r\n }\r\n const graph = new HalfEdgeGraph();\r\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\r\n const p = entry[0];\r\n // convert each interval intersection into two isolated intersections\r\n const details = entry[1].reduce((accumulator: CurveLocationDetailPair[], detailPair) => {\r\n if (!detailPair.detailA.hasFraction1)\r\n return [...accumulator, detailPair];\r\n const detail = getDetailOnCurve(detailPair, p)!;\r\n const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);\r\n const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1!, detail.point1!);\r\n return [\r\n ...accumulator,\r\n CurveLocationDetailPair.createCapture(detail0, detail0),\r\n CurveLocationDetailPair.createCapture(detail1, detail1),\r\n ];\r\n }, []);\r\n // lexical sort on p intersection fraction\r\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\r\n const fractionA = getFractionOnCurve(pairA, p)!;\r\n const fractionB = getFractionOnCurve(pairB, p)!;\r\n return fractionA - fractionB;\r\n });\r\n let last = { point: p.startPoint(), fraction: 0.0 };\r\n for (const detailPair of details) {\r\n const detail = getDetailOnCurve(detailPair, p)!;\r\n const detailFraction = Geometry.restrictToInterval(detail.fraction, 0, 1); // truncate fraction, but don't snap point; clustering happens later\r\n last = this.addHalfEdge(graph, p, last.point, last.fraction, detail.point, detailFraction, mergeTolerance);\r\n }\r\n this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);\r\n }\r\n // every edge got its sortAngle defined by addHalfEdge\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle ?? 0, mergeTolerance);\r\n return graph;\r\n }\r\n\r\n /**\r\n * Filter for trivial curve fragment: fast computation if line segment; otherwise clip, flatten, and measure.\r\n * * Different metrics are employed for expedience.\r\n */\r\n private static isCurveTrivialXY(p: CurvePrimitive, point0: Point3d, fraction0: number, point1: Point3d, fraction1: number, mergeTolerance: number): boolean {\r\n if (Geometry.isSmallRelative(fraction0 - fraction1))\r\n return true;\r\n if (!(p instanceof LineSegment3d)) {\r\n const p0 = p.clonePartialCurve(fraction0, fraction1);\r\n if (p0?.tryTransformInPlace(Transform.createRowValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0))) // flatten\r\n return p0.curveLength() <= mergeTolerance; // Euclidean\r\n }\r\n return point0.isAlmostEqualXY(point1, mergeTolerance); // Manhattan\r\n }\r\n\r\n /**\r\n * Create a pair of mated half edges referencing a non-trivial interval of a primitive.\r\n * @param graph containing graph\r\n * @param p the curve\r\n * @param point0 start point\r\n * @param fraction0 starting fraction\r\n * @param point1 end point\r\n * @param fraction1 end fraction\r\n * @param mergeTolerance optional maximum xy-length of a trivial edge\r\n * @returns end point and fraction\r\n */\r\n private static addHalfEdge(\r\n graph: HalfEdgeGraph,\r\n p: CurvePrimitive,\r\n point0: Point3d,\r\n fraction0: number,\r\n point1: Point3d,\r\n fraction1: number,\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): { point: Point3d, fraction: number } {\r\n if (!this.isCurveTrivialXY(p, point0, fraction0, point1, fraction1, mergeTolerance)) {\r\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\r\n if (p.parent && p.parent instanceof RegionGroupMember && p.parent.parentGroup.groupOpType === RegionGroupOpType.NonBounding)\r\n halfEdge.setMaskAroundEdge(HalfEdgeMask.BRIDGE_EDGE);\r\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\r\n const mate = halfEdge.edgeMate;\r\n halfEdge.edgeTag = detail01;\r\n halfEdge.sortData = 1.0;\r\n mate.edgeTag = detail01;\r\n mate.sortData = -1.0;\r\n halfEdge.sortAngle = computeSortAngle(p, fraction0, false);\r\n mate.sortAngle = computeSortAngle(p, fraction1, true);\r\n }\r\n return { point: point1, fraction: fraction1 }; // where the next curve fragment starts\r\n }\r\n /**\r\n * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative,\r\n * or sliver loops.\r\n * @param zeroAreaTolerance absolute area tolerance for sliver face detection\r\n * @param isSliverFace whether the loop is known a priori (e.g., via topology) to have zero area\r\n * @returns the area (forced to zero if within tolerance)\r\n */\r\n public static collectSignedLoop(\r\n loop: Loop, outLoops: SignedLoops, zeroAreaTolerance: number = 1.0e-10, isSliverFace?: boolean,\r\n ): number {\r\n let area = isSliverFace ? 0.0 : RegionOps.computeXYArea(loop);\r\n if (area === undefined)\r\n area = 0;\r\n if (Math.abs(area) < zeroAreaTolerance)\r\n area = 0.0;\r\n (loop as any).computedAreaInPlanarSubdivision = area;\r\n if (area > 0)\r\n outLoops.positiveAreaLoops.push(loop);\r\n else if (area < 0)\r\n outLoops.negativeAreaLoops.push(loop);\r\n else\r\n outLoops.slivers.push(loop);\r\n return area;\r\n }\r\n /** Extract geometric info from a topological edge. */\r\n private static extractGeometryFromEdge(edge: HalfEdge): { detail: CurveLocationDetail, reversed: boolean } | undefined {\r\n if (edge.sortData !== undefined && edge.edgeTag && edge.edgeTag instanceof CurveLocationDetail) {\r\n const detail = edge.edgeTag;\r\n if (detail.curve && detail.fraction1 !== undefined) {\r\n const reversed = edge.sortData < 0;\r\n return { detail, reversed };\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Create the geometry for a topological edge. */\r\n private static createCurveInEdge(edge: HalfEdge, z?: number): CurvePrimitive | undefined {\r\n let result: CurvePrimitive | undefined;\r\n const info = this.extractGeometryFromEdge(edge);\r\n if (info && info.detail.curve && info.detail.fraction1) {\r\n const f0 = info.reversed ? info.detail.fraction1 : info.detail.fraction;\r\n const f1 = info.reversed ? info.detail.fraction : info.detail.fraction1;\r\n result = info.detail.curve.clonePartialCurve(f0, f1);\r\n if (result && z !== undefined)\r\n result.tryTransformInPlace(Transform.createRowValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, z));\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a [[Loop]] for the given face or super face.\r\n * @param face a node in the face loop, or an array of HalfEdges that comprise a loop (e.g., a super face).\r\n * @param options bundle of options.\r\n * @returns the Loop, or `undefined` if it is not closed within xy-tolerance.\r\n */\r\n public static createLoopInFace(face: HalfEdge | HalfEdge[], options?: PlanarSubdivision.CreateRegionInFaceOptions): Loop | undefined {\r\n const consolidate = options?.announceEdge ? false : options?.compress ?? false; // can't compress if announcing\r\n const loop = Loop.create();\r\n const addEdgeCurve = (edge: HalfEdge): void => {\r\n const curve = this.createCurveInEdge(edge, options?.z);\r\n if (curve) {\r\n options?.announceEdge?.(edge, curve, loop);\r\n loop.tryAddChild(curve);\r\n }\r\n };\r\n if (Array.isArray(face))\r\n face.forEach(addEdgeCurve);\r\n else\r\n face.announceEdgesInFace(addEdgeCurve);\r\n if (consolidate) {\r\n const consolidateOptions = new ConsolidateAdjacentCurvePrimitivesOptions();\r\n consolidateOptions.consolidateLoopSeam = true;\r\n RegionOps.consolidateAdjacentPrimitives(loop, consolidateOptions);\r\n }\r\n if (loop.isPhysicallyClosedCurve(options?.closureTol, true))\r\n return loop;\r\n assert(() => false, \"face is not physically closed\");\r\n return undefined;\r\n }\r\n /**\r\n * Create a [[Loop]] or [[ParityRegion]] for the given face.\r\n * * A ParityRegion is created for a split-washer type face by removing bridge edges.\r\n * @param face a node in the face loop.\r\n * @param options bundle of options.\r\n * @returns the Loop or ParityRegion, or `undefined` if one could not be computed.\r\n */\r\n public static createLoopOrParityRegionInFace(face: HalfEdge, options?: PlanarSubdivision.CreateRegionInFaceOptions): Loop | ParityRegion | undefined {\r\n let region: AnyRegion | undefined;\r\n const visitMask = options?.visitMask ?? HalfEdgeMask.VISITED;\r\n const bridgeMask = options?.bridgeMask ?? HalfEdgeMask.BRIDGE_EDGE;\r\n let startBridgeEdge: HalfEdge | undefined;\r\n // is it a split-washer face?\r\n if (face.isSplitWasherFace(bridgeMask) && (startBridgeEdge = face.findMaskAroundFace(bridgeMask, true))) {\r\n const loops: Loop[] = [];\r\n const loopEdges: HalfEdge[] = [];\r\n const bridgeStack: HalfEdge[] = [startBridgeEdge];\r\n const announceEdge = (he: HalfEdge) => { he.setMask(visitMask); loopEdges.push(he); };\r\n const announceBridge = (he: HalfEdge) => { if (!he.isMaskSet(visitMask)) bridgeStack.push(he); };\r\n face.clearMaskAroundFace(visitMask);\r\n let bridge: HalfEdge | undefined;\r\n while (undefined !== (bridge = bridgeStack.pop())) {\r\n bridge.setMask(visitMask);\r\n const loopSeed = bridge.findMaskAroundFace(bridgeMask, false); // advance to next loop\r\n if (loopSeed) {\r\n if (loopSeed.isMaskSet(visitMask))\r\n continue;\r\n loopEdges.length = 0;\r\n if (loopSeed.announceEdgesInSuperFace(bridgeMask, announceEdge, announceBridge)) {\r\n const loop = this.createLoopInFace(loopEdges, options);\r\n if (loop) {\r\n loops.push(loop);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n region = RegionOps.sortOuterAndHoleLoopsXY(loops);\r\n region = RegionOps.simplifyRegion(region);\r\n } else {\r\n region = this.createLoopInFace(face, options);\r\n }\r\n return (region && (region instanceof Loop || region instanceof ParityRegion)) ? region : undefined;\r\n }\r\n /** Return true if there are only two edges in the face loop, and their start curvatures are the same. */\r\n private static isNullFace(he: HalfEdge): boolean {\r\n const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);\r\n let faceIsBanana = false;\r\n if (faceHasTwoEdges) {\r\n const c0 = HalfEdgeGraphMerge.curvatureSortKey(he);\r\n const c1 = HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);\r\n if (!Geometry.isSameCoordinate(c0, c1)) // default tol!\r\n faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...\r\n }\r\n return faceHasTwoEdges && !faceIsBanana;\r\n }\r\n /** Look across edge mates (possibly several) for a non-null mate face. */\r\n private static getNonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\r\n if (this.isNullFace(e))\r\n return undefined;\r\n let e1 = e.edgeMate;\r\n while (this.isNullFace(e1)) {\r\n e1 = e1.faceSuccessor.edgeMate;\r\n if (e1 === e)\r\n return undefined;\r\n }\r\n return e1;\r\n }\r\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\r\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\r\n const result: SignedLoops[] = [];\r\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\r\n for (const faceSeeds of q) {\r\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\r\n const edges: LoopCurveLoopCurve[] = [];\r\n for (const faceSeed of faceSeeds) {\r\n const isNullFace = this.isNullFace(faceSeed);\r\n const announceEdge = isNullFace ? undefined : (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\r\n const mate = this.getNonNullEdgeMate(graph, he);\r\n if (mate !== undefined) {\r\n const e = edgeMap.get(mate);\r\n if (e === undefined) {\r\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\r\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\r\n edgeMap.set(he, e1);\r\n } else if (e instanceof LoopCurveLoopCurve) {\r\n e.setB(loopC, curveC);\r\n edges.push(e);\r\n edgeMap.delete(mate);\r\n }\r\n }\r\n };\r\n const loop = this.createLoopInFace(faceSeed, { announceEdge });\r\n if (loop)\r\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance, isNullFace);\r\n }\r\n componentAreas.edges = edges;\r\n result.push(componentAreas);\r\n edgeMap.clear();\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n*/\r\nexport namespace PlanarSubdivision {\r\n /** Options bundle for [[PlanarSubdivision.createLoopInFace]] and [[PlanarSubdivision.createLoopOrParityRegionInFace]]. */\r\n export interface CreateRegionInFaceOptions {\r\n /**\r\n * Optional callback invoked on each `edge` before its `curve` is added to `loop`.\r\n * * Note that if a [[ParityRegion]] is being constructed, `curve` and `loop` may subsequently be reversed.\r\n */\r\n announceEdge?: (edge: HalfEdge, curve: CurvePrimitive, loop: Loop) => void;\r\n /**\r\n * Whether to consolidate adjacent curves in an output [[Loop]]. Default value is `false`.\r\n * * If `announce` is defined, no compression is performed, as edges and curves would no longer be in 1-1 correspondence.\r\n */\r\n compress?: boolean;\r\n /** Absolute xy-distance for confirming a returned Loop is closed. Default value is [[Geometry.smallMetricDistance]]. */\r\n closureTol?: number;\r\n /**\r\n * Mask preset on bridge edges. Default value is `HalfEdgeMask.BRIDGE_EDGE`.\r\n * * This mask is used to distinguish a split-washer type face, which can result in a [[ParityRegion]].\r\n */\r\n bridgeMask?: HalfEdgeMask;\r\n /** Mask to use for visiting edges when creating a [[ParityRegion]] from a split-washer type face. Default value is `HalfEdgeMask.VISITED`. */\r\n visitMask?: HalfEdgeMask;\r\n /**\r\n * Optional z-coordinate for the result region.\r\n * * If undefined, graph z-coordinates are used, but this may result in a non-planar region if the graph is not planar!\r\n */\r\n z?: number;\r\n }\r\n}"]}
1
+ {"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.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\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { AnyRegion } from \"../CurveTypes\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\r\nimport { ParityRegion } from \"../ParityRegion\";\r\nimport { ConsolidateAdjacentCurvePrimitivesOptions, RegionOps } from \"../RegionOps\";\r\nimport { RegionGroupMember, RegionGroupOpType } from \"../RegionOpsClassificationSweeps\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nclass MapCurvePrimitiveToCurveLocationDetailPairArray {\r\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\r\n // index assigned to this primitive (for debugging)\r\n public primitiveToIndex = new Map<CurvePrimitive, number>();\r\n private _numIndexedPrimitives: number = 0;\r\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\r\n if (primitive !== undefined) {\r\n const index = this.primitiveToIndex.get(primitive);\r\n if (index === undefined) {\r\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\r\n }\r\n }\r\n }\r\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\r\n if (primitive) {\r\n const priorPairs = this.primitiveToPair.get(primitive);\r\n this.assignPrimitiveIndex(primitive);\r\n if (!priorPairs) {\r\n this.primitiveToPair.set(primitive, [pair]);\r\n } else {\r\n priorPairs.push(pair);\r\n }\r\n }\r\n }\r\n public insertPair(pair: CurveLocationDetailPair) {\r\n const primitiveA = pair.detailA.curve;\r\n if (primitiveA)\r\n this.insertPrimitiveToPair(primitiveA, pair);\r\n const primitiveB = pair.detailB.curve;\r\n if (primitiveB)\r\n this.insertPrimitiveToPair(primitiveB, pair);\r\n }\r\n /**\r\n * Split closed missing primitives in half and add new intersection pairs.\r\n * * When bridge edges aren't included in the primitives array, a closed primitive with no intersections will not be\r\n * added to the graph because it isn't in the `primitiveToPair` map. By splitting such a missing primitive in two, we\r\n * introduce two intersections for each half, which allows the primitive to be represented in the map.\r\n */\r\n public splitAndAppendMissingClosedPrimitives(\r\n primitives: CurvePrimitive[], tolerance: number = Geometry.smallMetricDistance,\r\n ): void {\r\n for (const p of primitives) {\r\n let closedCurveSplitCandidate = false;\r\n if (p instanceof Arc3d)\r\n closedCurveSplitCandidate = p.sweep.isFullCircle;\r\n else if (!(p instanceof LineSegment3d) && !(p instanceof LineString3d)) // TODO: probably should do this for all types. Lots of spline-type primitives can be closed.\r\n closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);\r\n if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {\r\n const p0 = p.clonePartialCurve(0.0, 0.5);\r\n const p1 = p.clonePartialCurve(0.5, 1.0);\r\n if (p0 && p1) {\r\n this.insertPair(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0),\r\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0),\r\n ));\r\n this.insertPair(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0),\r\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0),\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class PlanarSubdivision {\r\n /**\r\n * Create a graph from curves and precomputed intersections.\r\n * * Z-coordinates are ignored.\r\n * @param primitives input curves\r\n * @param allPairs array of curve-curve xy-intersections\r\n * @param mergeTolerance optional distance tolerance for clustering vertices. Default value is [[Geometry.smallMetricDistance]].\r\n */\r\n public static assembleHalfEdgeGraph(\r\n primitives: CurvePrimitive[],\r\n allPairs: CurveLocationDetailPair[],\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): HalfEdgeGraph {\r\n // map from key CurvePrimitive to CurveLocationDetailPair\r\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray();\r\n for (const pair of allPairs)\r\n detailByPrimitive.insertPair(pair);\r\n if (primitives.length > detailByPrimitive.primitiveToPair.size) {\r\n // otherwise, these single-primitive loops are missing from the graph\r\n detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance);\r\n }\r\n // these helper lambdas assume exactly one of the paired details is on the input curve\r\n const getFractionOnCurve = (pair: CurveLocationDetailPair, curve: CurvePrimitive): number => {\r\n return (pair.detailA.curve === curve) ? pair.detailA.fraction : pair.detailB.fraction;\r\n };\r\n const getDetailOnCurve = (pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail => {\r\n return (pair.detailA.curve === curve) ? pair.detailA : pair.detailB;\r\n };\r\n const graph = new HalfEdgeGraph();\r\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\r\n const p = entry[0];\r\n // convert each interval intersection into two isolated intersections\r\n const details = entry[1].reduce((accumulator: CurveLocationDetailPair[], detailPair) => {\r\n const detail = getDetailOnCurve(detailPair, p);\r\n if (detail.isInterval()) {\r\n const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);\r\n const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1, detail.point1);\r\n return [\r\n ...accumulator,\r\n CurveLocationDetailPair.createCapture(detail0, detail0),\r\n CurveLocationDetailPair.createCapture(detail1, detail1),\r\n ];\r\n }\r\n return [...accumulator, detailPair];\r\n }, []);\r\n // lexical sort on p intersection fraction\r\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\r\n const fractionA = getFractionOnCurve(pairA, p);\r\n const fractionB = getFractionOnCurve(pairB, p);\r\n return fractionA - fractionB;\r\n });\r\n let last = { point: p.startPoint(), fraction: 0.0 };\r\n for (const detailPair of details) {\r\n const detail = getDetailOnCurve(detailPair, p);\r\n const detailFraction = Geometry.restrictToInterval(detail.fraction, 0, 1); // truncate fraction, but don't snap point; clustering happens later\r\n last = this.addHalfEdge(graph, p, last.point, last.fraction, detail.point, detailFraction, mergeTolerance);\r\n }\r\n this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);\r\n }\r\n // every edge got its sortAngle defined by addHalfEdge\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle ?? 0, mergeTolerance);\r\n return graph;\r\n }\r\n\r\n /**\r\n * Filter for trivial curve fragment: fast computation if line segment; otherwise clip, flatten, and measure.\r\n * * Different metrics are employed for expedience.\r\n */\r\n private static isCurveTrivialXY(p: CurvePrimitive, point0: Point3d, fraction0: number, point1: Point3d, fraction1: number, mergeTolerance: number): boolean {\r\n if (Geometry.isSmallRelative(fraction0 - fraction1))\r\n return true;\r\n if (!(p instanceof LineSegment3d)) {\r\n const p0 = p.clonePartialCurve(fraction0, fraction1);\r\n if (p0?.tryTransformInPlace(Transform.createRowValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0))) // flatten\r\n return p0.curveLength() <= mergeTolerance; // Euclidean\r\n }\r\n return point0.isAlmostEqualXY(point1, mergeTolerance); // Manhattan\r\n }\r\n\r\n /**\r\n * Create a pair of mated half edges referencing a non-trivial interval of a primitive.\r\n * @param graph containing graph\r\n * @param p the curve\r\n * @param point0 start point\r\n * @param fraction0 starting fraction\r\n * @param point1 end point\r\n * @param fraction1 end fraction\r\n * @param mergeTolerance optional maximum xy-length of a trivial edge\r\n * @returns end point and fraction\r\n */\r\n private static addHalfEdge(\r\n graph: HalfEdgeGraph,\r\n p: CurvePrimitive,\r\n point0: Point3d,\r\n fraction0: number,\r\n point1: Point3d,\r\n fraction1: number,\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): { point: Point3d, fraction: number } {\r\n if (!this.isCurveTrivialXY(p, point0, fraction0, point1, fraction1, mergeTolerance)) {\r\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\r\n if (p.parent && p.parent instanceof RegionGroupMember && p.parent.parentGroup.groupOpType === RegionGroupOpType.NonBounding)\r\n halfEdge.setMaskAroundEdge(HalfEdgeMask.BRIDGE_EDGE);\r\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\r\n const mate = halfEdge.edgeMate;\r\n halfEdge.edgeTag = detail01;\r\n halfEdge.sortData = 1.0;\r\n mate.edgeTag = detail01;\r\n mate.sortData = -1.0;\r\n const computeSortAngle = (f: number, reverse: boolean): number => {\r\n const ray = p.fractionToPointAndDerivative(f);\r\n const s = reverse ? -1.0 : 1.0;\r\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\r\n };\r\n halfEdge.sortAngle = computeSortAngle(fraction0, false);\r\n mate.sortAngle = computeSortAngle(fraction1, true);\r\n }\r\n return { point: point1, fraction: fraction1 }; // where the next curve fragment starts\r\n }\r\n /**\r\n * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative,\r\n * or sliver loops.\r\n * @param zeroAreaTolerance absolute area tolerance for sliver face detection\r\n * @param isSliverFace whether the loop is known a priori (e.g., via topology) to have zero area\r\n * @returns the area (forced to zero if within tolerance)\r\n */\r\n public static collectSignedLoop(\r\n loop: Loop, outLoops: SignedLoops, zeroAreaTolerance: number = 1.0e-10, isSliverFace?: boolean,\r\n ): number {\r\n let area = isSliverFace ? 0.0 : RegionOps.computeXYArea(loop);\r\n if (area === undefined)\r\n area = 0;\r\n if (Math.abs(area) < zeroAreaTolerance)\r\n area = 0.0;\r\n (loop as any).computedAreaInPlanarSubdivision = area;\r\n if (area > 0)\r\n outLoops.positiveAreaLoops.push(loop);\r\n else if (area < 0)\r\n outLoops.negativeAreaLoops.push(loop);\r\n else\r\n outLoops.slivers.push(loop);\r\n return area;\r\n }\r\n /** Extract geometric info from a topological edge. */\r\n private static extractGeometryFromEdge(edge: HalfEdge): { detail: CurveLocationDetail, reversed: boolean } | undefined {\r\n if (edge.sortData !== undefined && edge.edgeTag && edge.edgeTag instanceof CurveLocationDetail) {\r\n const detail = edge.edgeTag;\r\n if (detail.curve && detail.fraction1 !== undefined) {\r\n const reversed = edge.sortData < 0;\r\n return { detail, reversed };\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** Create the geometry for a topological edge. */\r\n private static createCurveInEdge(edge: HalfEdge, z?: number): CurvePrimitive | undefined {\r\n let result: CurvePrimitive | undefined;\r\n const info = this.extractGeometryFromEdge(edge);\r\n if (info && info.detail.curve && info.detail.isInterval()) {\r\n const f0 = info.reversed ? info.detail.fraction1 : info.detail.fraction;\r\n const f1 = info.reversed ? info.detail.fraction : info.detail.fraction1;\r\n result = info.detail.curve.clonePartialCurve(f0, f1);\r\n if (result && z !== undefined)\r\n result.tryTransformInPlace(Transform.createRowValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, z));\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a [[Loop]] for the given face or super face.\r\n * @param face a node in the face loop, or an array of HalfEdges that comprise a loop (e.g., a super face).\r\n * @param options bundle of options.\r\n * @returns the Loop, or `undefined` if it is not closed within xy-tolerance.\r\n */\r\n public static createLoopInFace(face: HalfEdge | HalfEdge[], options?: PlanarSubdivision.CreateRegionInFaceOptions): Loop | undefined {\r\n const consolidate = options?.announceEdge ? false : options?.compress ?? false; // can't compress if announcing\r\n const loop = Loop.create();\r\n const addEdgeCurve = (edge: HalfEdge): void => {\r\n const curve = this.createCurveInEdge(edge, options?.z);\r\n if (curve) {\r\n options?.announceEdge?.(edge, curve, loop);\r\n loop.tryAddChild(curve);\r\n }\r\n };\r\n if (Array.isArray(face))\r\n face.forEach(addEdgeCurve);\r\n else\r\n face.announceEdgesInFace(addEdgeCurve);\r\n if (consolidate) {\r\n const consolidateOptions = new ConsolidateAdjacentCurvePrimitivesOptions();\r\n consolidateOptions.consolidateLoopSeam = true;\r\n RegionOps.consolidateAdjacentPrimitives(loop, consolidateOptions);\r\n }\r\n if (loop.isPhysicallyClosedCurve(options?.closureTol, true))\r\n return loop;\r\n assert(() => false, \"face is not physically closed\");\r\n return undefined;\r\n }\r\n /**\r\n * Create a [[Loop]] or [[ParityRegion]] for the given face.\r\n * * A ParityRegion is created for a split-washer type face by removing bridge edges.\r\n * @param face a node in the face loop.\r\n * @param options bundle of options.\r\n * @returns the Loop or ParityRegion, or `undefined` if one could not be computed.\r\n */\r\n public static createLoopOrParityRegionInFace(face: HalfEdge, options?: PlanarSubdivision.CreateRegionInFaceOptions): Loop | ParityRegion | undefined {\r\n let region: AnyRegion | undefined;\r\n const visitMask = options?.visitMask ?? HalfEdgeMask.VISITED;\r\n const bridgeMask = options?.bridgeMask ?? HalfEdgeMask.BRIDGE_EDGE;\r\n let startBridgeEdge: HalfEdge | undefined;\r\n // is it a split-washer face?\r\n if (face.isSplitWasherFace(bridgeMask) && (startBridgeEdge = face.findMaskAroundFace(bridgeMask, true))) {\r\n const loops: Loop[] = [];\r\n const loopEdges: HalfEdge[] = [];\r\n const bridgeStack: HalfEdge[] = [startBridgeEdge];\r\n const announceEdge = (he: HalfEdge) => { he.setMask(visitMask); loopEdges.push(he); };\r\n const announceBridge = (he: HalfEdge) => { if (!he.isMaskSet(visitMask)) bridgeStack.push(he); };\r\n face.clearMaskAroundFace(visitMask);\r\n let bridge: HalfEdge | undefined;\r\n while (undefined !== (bridge = bridgeStack.pop())) {\r\n bridge.setMask(visitMask);\r\n const loopSeed = bridge.findMaskAroundFace(bridgeMask, false); // advance to next loop\r\n if (loopSeed) {\r\n if (loopSeed.isMaskSet(visitMask))\r\n continue;\r\n loopEdges.length = 0;\r\n if (loopSeed.announceEdgesInSuperFace(bridgeMask, announceEdge, announceBridge)) {\r\n const loop = this.createLoopInFace(loopEdges, options);\r\n if (loop) {\r\n loops.push(loop);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n region = RegionOps.sortOuterAndHoleLoopsXY(loops);\r\n region = RegionOps.simplifyRegion(region);\r\n } else {\r\n region = this.createLoopInFace(face, options);\r\n }\r\n return (region && (region instanceof Loop || region instanceof ParityRegion)) ? region : undefined;\r\n }\r\n /** Return true if there are only two edges in the face loop, and their start curvatures are the same. */\r\n private static isNullFace(he: HalfEdge): boolean {\r\n const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);\r\n let faceIsBanana = false;\r\n if (faceHasTwoEdges) {\r\n const c0 = HalfEdgeGraphMerge.curvatureSortKey(he);\r\n const c1 = HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);\r\n if (!Geometry.isSameCoordinate(c0, c1)) // default tol!\r\n faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...\r\n }\r\n return faceHasTwoEdges && !faceIsBanana;\r\n }\r\n /** Look across edge mates (possibly several) for a non-null mate face. */\r\n private static getNonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\r\n if (this.isNullFace(e))\r\n return undefined;\r\n let e1 = e.edgeMate;\r\n while (this.isNullFace(e1)) {\r\n e1 = e1.faceSuccessor.edgeMate;\r\n if (e1 === e)\r\n return undefined;\r\n }\r\n return e1;\r\n }\r\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\r\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\r\n const result: SignedLoops[] = [];\r\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\r\n for (const faceSeeds of q) {\r\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\r\n const edges: LoopCurveLoopCurve[] = [];\r\n for (const faceSeed of faceSeeds) {\r\n const isNullFace = this.isNullFace(faceSeed);\r\n const announceEdge = isNullFace ? undefined : (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\r\n const mate = this.getNonNullEdgeMate(graph, he);\r\n if (mate !== undefined) {\r\n const e = edgeMap.get(mate);\r\n if (e === undefined) {\r\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\r\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\r\n edgeMap.set(he, e1);\r\n } else if (e instanceof LoopCurveLoopCurve) {\r\n e.setB(loopC, curveC);\r\n edges.push(e);\r\n edgeMap.delete(mate);\r\n }\r\n }\r\n };\r\n const loop = this.createLoopInFace(faceSeed, { announceEdge });\r\n if (loop)\r\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance, isNullFace);\r\n }\r\n componentAreas.edges = edges;\r\n result.push(componentAreas);\r\n edgeMap.clear();\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n*/\r\nexport namespace PlanarSubdivision {\r\n /** Options bundle for [[PlanarSubdivision.createLoopInFace]] and [[PlanarSubdivision.createLoopOrParityRegionInFace]]. */\r\n export interface CreateRegionInFaceOptions {\r\n /**\r\n * Optional callback invoked on each `edge` before its `curve` is added to `loop`.\r\n * * Note that if a [[ParityRegion]] is being constructed, `curve` and `loop` may subsequently be reversed.\r\n */\r\n announceEdge?: (edge: HalfEdge, curve: CurvePrimitive, loop: Loop) => void;\r\n /**\r\n * Whether to consolidate adjacent curves in an output [[Loop]]. Default value is `false`.\r\n * * If `announce` is defined, no compression is performed, as edges and curves would no longer be in 1-1 correspondence.\r\n */\r\n compress?: boolean;\r\n /** Absolute xy-distance for confirming a returned Loop is closed. Default value is [[Geometry.smallMetricDistance]]. */\r\n closureTol?: number;\r\n /**\r\n * Mask preset on bridge edges. Default value is `HalfEdgeMask.BRIDGE_EDGE`.\r\n * * This mask is used to distinguish a split-washer type face, which can result in a [[ParityRegion]].\r\n */\r\n bridgeMask?: HalfEdgeMask;\r\n /** Mask to use for visiting edges when creating a [[ParityRegion]] from a split-washer type face. Default value is `HalfEdgeMask.VISITED`. */\r\n visitMask?: HalfEdgeMask;\r\n /**\r\n * Optional z-coordinate for the result region.\r\n * * If undefined, graph z-coordinates are used, but this may result in a non-planar region if the graph is not planar!\r\n */\r\n z?: number;\r\n }\r\n}\r\n"]}
@@ -146,7 +146,13 @@ export declare class StrokeCountSection {
146
146
  * * In expected use, (a0,a1) are (0,a) where a is the (previously computed) max length among corresponding maps up and down the section arrays.
147
147
  */
148
148
  static remapa0a1WithinEachChain(sections: StrokeCountSection[]): void;
149
- private static applyMultipassVisitorCallbackNoComponents;
149
+ /**
150
+ * Invoke callback on each (component of) each primitive of each chain of each section.
151
+ * * Caller ensures the input sections all have the same structure, e.g., by calling `areSectionsCompatible(sections, false)`.
152
+ * * Caller ensures all input indices are valid.
153
+ * @param componentIndex optional component index; if defined, caller ensures each primitive's [[StrokeCountMap]] has a `componentData`.
154
+ */
155
+ private static applyMultipassVisitorCallback;
150
156
  /**
151
157
  * Walk through the sections, emitting callbacks delimiting groups of corresponding primitives.
152
158
  * @param sections array of sections (possibly a single path or loop at each section, or possibly a set of parity loops.)
@@ -1 +1 @@
1
- {"version":3,"file":"StrokeCountChain.d.ts","sourceRoot":"","sources":["../../../../src/curve/Query/StrokeCountChain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StrokeCountChain.d.ts","sourceRoot":"","sources":["../../../../src/curve/Query/StrokeCountChain.ts"],"names":[],"mappings":"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"}
@@ -261,7 +261,7 @@ export class StrokeCountSection {
261
261
  if (sections[i].chains.length !== numChains)
262
262
  return false;
263
263
  // second level: must have same number of primitives in each path or loop
264
- for (let j = 0; j < sections[0].chains.length; j++) {
264
+ for (let j = 0; j < numChains; j++) {
265
265
  const numPrimitive = sections[0].chains[j].maps.length;
266
266
  if (sections[i].chains[j].maps.length !== numPrimitive)
267
267
  return false;
@@ -283,38 +283,30 @@ export class StrokeCountSection {
283
283
  }
284
284
  }
285
285
  }
286
- static applyMultipassVisitorCallbackNoComponents(sections, chainIndex, primitiveIndex, componentIndex, callback) {
286
+ /**
287
+ * Invoke callback on each (component of) each primitive of each chain of each section.
288
+ * * Caller ensures the input sections all have the same structure, e.g., by calling `areSectionsCompatible(sections, false)`.
289
+ * * Caller ensures all input indices are valid.
290
+ * @param componentIndex optional component index; if defined, caller ensures each primitive's [[StrokeCountMap]] has a `componentData`.
291
+ */
292
+ static applyMultipassVisitorCallback(sections, chainIndex, primitiveIndex, componentIndex, callback) {
287
293
  const numSection = sections.length;
288
294
  if (!callback.startSweeps(chainIndex, primitiveIndex, componentIndex))
289
295
  return false;
290
- if (componentIndex === undefined) {
291
- // there are corresponding primitives directly at the section, chain, primitive index:
292
- for (let pass = 0;; pass++) {
293
- if (!callback.startPass(pass))
294
- break;
295
- for (let sectionIndex = 0; sectionIndex < numSection; sectionIndex++)
296
- if (!callback.visit(pass, sections[sectionIndex].chains[chainIndex].maps[primitiveIndex]))
297
- return false;
298
- if (!callback.endPass(pass))
299
- return false;
300
- }
301
- }
302
- else {
303
- // there are corresponding primitives at the section, chain, primitive,componentIndex
304
- // there are corresponding primitives directly at the section, chain, primitive index:
305
- for (let pass = 0;; pass++) {
306
- if (!callback.startPass(pass))
307
- break;
308
- for (let sectionIndex = 0; sectionIndex < numSection; sectionIndex++)
309
- if (!callback.visit(pass, sections[sectionIndex].chains[chainIndex].maps[primitiveIndex].componentData[componentIndex]))
310
- return false;
311
- if (!callback.endPass(pass))
296
+ for (let pass = 0;; pass++) {
297
+ if (!callback.startPass(pass))
298
+ break;
299
+ for (let sectionIndex = 0; sectionIndex < numSection; sectionIndex++) {
300
+ let map = sections[sectionIndex].chains[chainIndex].maps[primitiveIndex];
301
+ if (map.componentData && componentIndex !== undefined)
302
+ map = map.componentData[componentIndex];
303
+ if (!callback.visit(pass, map))
312
304
  return false;
313
305
  }
306
+ if (!callback.endPass(pass))
307
+ return false;
314
308
  }
315
- if (!callback.endSweeps(chainIndex, primitiveIndex, componentIndex))
316
- return false;
317
- return true;
309
+ return callback.endSweeps(chainIndex, primitiveIndex, componentIndex);
318
310
  }
319
311
  /**
320
312
  * Walk through the sections, emitting callbacks delimiting groups of corresponding primitives.
@@ -322,6 +314,9 @@ export class StrokeCountSection {
322
314
  * @param callback object to be notified during the traversal
323
315
  */
324
316
  static runMultiPassVisitorAtCorrespondingPrimitives(sections, callback) {
317
+ const enforceCounts = false; // StrokeCountMap.numStroke counts are allowed to differ
318
+ if (!StrokeCountSection.areSectionsCompatible(sections, enforceCounts))
319
+ return false;
325
320
  const numChainPerSection = sections[0].chains.length;
326
321
  for (let chainIndex = 0; chainIndex < numChainPerSection; chainIndex++) {
327
322
  const numPrimitive = sections[0].chains[chainIndex].maps.length;
@@ -329,12 +324,12 @@ export class StrokeCountSection {
329
324
  const numComponent = sections[0].chains[chainIndex].maps[primitiveIndex].componentData?.length ?? 0;
330
325
  if (numComponent > 0) {
331
326
  for (let i = 0; i < numComponent; i++) {
332
- if (!this.applyMultipassVisitorCallbackNoComponents(sections, chainIndex, primitiveIndex, i, callback))
327
+ if (!this.applyMultipassVisitorCallback(sections, chainIndex, primitiveIndex, i, callback))
333
328
  return false;
334
329
  }
335
330
  }
336
331
  else {
337
- if (!this.applyMultipassVisitorCallbackNoComponents(sections, chainIndex, primitiveIndex, undefined, callback))
332
+ if (!this.applyMultipassVisitorCallback(sections, chainIndex, primitiveIndex, undefined, callback))
338
333
  return false;
339
334
  }
340
335
  }
@@ -349,11 +344,8 @@ export class StrokeCountSection {
349
344
  static enforceStrokeCountCompatibility(sections) {
350
345
  if (sections.length < 2)
351
346
  return true;
352
- if (!StrokeCountSection.areSectionsCompatible(sections, false))
353
- return false;
354
347
  const visitor = new StrokeCountMapVisitorApplyMaxCount();
355
- this.runMultiPassVisitorAtCorrespondingPrimitives(sections, visitor);
356
- return true;
348
+ return this.runMultiPassVisitorAtCorrespondingPrimitives(sections, visitor);
357
349
  }
358
350
  /**
359
351
  * * Confirm that all sections in the array have the same structure.
@@ -364,10 +356,9 @@ export class StrokeCountSection {
364
356
  static enforceCompatibleDistanceSums(sections) {
365
357
  if (sections.length < 2)
366
358
  return true;
367
- if (!StrokeCountSection.areSectionsCompatible(sections, false))
368
- return false;
369
359
  const visitor = new StrokeCountMapVisitorApplyMaxCurveLength();
370
- this.runMultiPassVisitorAtCorrespondingPrimitives(sections, visitor);
360
+ if (!this.runMultiPassVisitorAtCorrespondingPrimitives(sections, visitor))
361
+ return false;
371
362
  this.remapa0a1WithinEachChain(sections);
372
363
  return true;
373
364
  }