@itwin/core-geometry 5.2.0-dev.3 → 5.2.0-dev.30

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 (772) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/lib/cjs/Constant.js.map +1 -1
  3. package/lib/cjs/Geometry.d.ts +30 -10
  4. package/lib/cjs/Geometry.d.ts.map +1 -1
  5. package/lib/cjs/Geometry.js +74 -10
  6. package/lib/cjs/Geometry.js.map +1 -1
  7. package/lib/cjs/bspline/AkimaCurve3d.d.ts +19 -6
  8. package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
  9. package/lib/cjs/bspline/AkimaCurve3d.js +21 -5
  10. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  11. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  12. package/lib/cjs/bspline/BSplineCurve.d.ts +3 -3
  13. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  14. package/lib/cjs/bspline/BSplineCurve.js +6 -6
  15. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  16. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  17. package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
  18. package/lib/cjs/bspline/BSplineCurveOps.js +1 -1
  19. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  20. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  21. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  22. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  23. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  24. package/lib/cjs/bspline/BezierCurveBase.d.ts +2 -2
  25. package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
  26. package/lib/cjs/bspline/BezierCurveBase.js +4 -6
  27. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  28. package/lib/cjs/bspline/InterpolationCurve3d.d.ts +27 -17
  29. package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
  30. package/lib/cjs/bspline/InterpolationCurve3d.js +17 -7
  31. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  32. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  33. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  34. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  35. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  36. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  37. package/lib/cjs/clipping/ClipPlane.d.ts +19 -6
  38. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  39. package/lib/cjs/clipping/ClipPlane.js +17 -2
  40. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  41. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  42. package/lib/cjs/clipping/ClipUtils.d.ts +14 -1
  43. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  44. package/lib/cjs/clipping/ClipUtils.js +21 -3
  45. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  46. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  47. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +14 -11
  48. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  49. package/lib/cjs/clipping/ConvexClipPlaneSet.js +23 -16
  50. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  51. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
  52. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  53. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +22 -5
  54. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  55. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  56. package/lib/cjs/core-geometry.js.map +1 -1
  57. package/lib/cjs/curve/Arc3d.d.ts +27 -17
  58. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  59. package/lib/cjs/curve/Arc3d.js +61 -35
  60. package/lib/cjs/curve/Arc3d.js.map +1 -1
  61. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  62. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  63. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  64. package/lib/cjs/curve/CurveCollection.d.ts +1 -0
  65. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  66. package/lib/cjs/curve/CurveCollection.js +1 -0
  67. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  68. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  69. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  70. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  71. package/lib/cjs/curve/CurveLocationDetail.d.ts +8 -7
  72. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  73. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  74. package/lib/cjs/curve/CurveOps.d.ts +51 -1
  75. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  76. package/lib/cjs/curve/CurveOps.js +97 -3
  77. package/lib/cjs/curve/CurveOps.js.map +1 -1
  78. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  79. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  80. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  81. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  82. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  83. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  84. package/lib/cjs/curve/LineString3d.d.ts +4 -4
  85. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  86. package/lib/cjs/curve/LineString3d.js +8 -8
  87. package/lib/cjs/curve/LineString3d.js.map +1 -1
  88. package/lib/cjs/curve/Loop.js.map +1 -1
  89. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  90. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  91. package/lib/cjs/curve/Path.js.map +1 -1
  92. package/lib/cjs/curve/PointString3d.js.map +1 -1
  93. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  94. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
  95. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  96. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  97. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  98. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  99. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +6 -2
  100. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  101. package/lib/cjs/curve/Query/PlanarSubdivision.js +12 -7
  102. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  103. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  104. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  105. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  106. package/lib/cjs/curve/RegionOps.d.ts +9 -4
  107. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  108. package/lib/cjs/curve/RegionOps.js +10 -5
  109. package/lib/cjs/curve/RegionOps.js.map +1 -1
  110. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  111. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  112. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  113. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  114. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  115. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  116. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  117. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  118. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  119. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  120. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  121. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  122. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +2 -1
  123. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  124. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  125. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  126. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  127. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  128. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  129. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +4 -4
  130. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  131. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +21 -18
  132. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  133. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  134. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  135. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  136. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +30 -50
  137. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  138. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  139. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  140. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  141. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  142. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  143. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  144. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  145. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  146. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +2 -2
  147. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  148. package/lib/cjs/curve/spiral/DirectSpiral3d.js +6 -2
  149. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  150. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
  151. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  152. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +6 -2
  153. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  154. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  155. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  156. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  157. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  158. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +5 -1
  159. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  160. package/lib/cjs/curve/spiral/TransitionSpiral3d.js +0 -3
  161. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  162. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  163. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  164. package/lib/cjs/geometry3d/AngleSweep.d.ts +6 -2
  165. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  166. package/lib/cjs/geometry3d/AngleSweep.js +12 -3
  167. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  168. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  169. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  170. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  171. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  172. package/lib/cjs/geometry3d/FrameBuilder.d.ts +2 -1
  173. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  174. package/lib/cjs/geometry3d/FrameBuilder.js +14 -18
  175. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  176. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  177. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  178. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  179. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  180. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  181. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  182. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  183. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  184. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  185. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  186. package/lib/cjs/geometry3d/Matrix3d.d.ts +1 -1
  187. package/lib/cjs/geometry3d/Matrix3d.js +1 -1
  188. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  189. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  190. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  191. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  192. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  193. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  194. package/lib/cjs/geometry3d/Point2dVector2d.d.ts +18 -2
  195. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  196. package/lib/cjs/geometry3d/Point2dVector2d.js +37 -4
  197. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  198. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  199. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  200. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  201. package/lib/cjs/geometry3d/Point3dVector3d.js +1 -0
  202. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  203. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  204. package/lib/cjs/geometry3d/PointStreaming.d.ts +8 -0
  205. package/lib/cjs/geometry3d/PointStreaming.d.ts.map +1 -1
  206. package/lib/cjs/geometry3d/PointStreaming.js +18 -2
  207. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  208. package/lib/cjs/geometry3d/PolygonOps.d.ts +18 -9
  209. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  210. package/lib/cjs/geometry3d/PolygonOps.js +53 -26
  211. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  212. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
  213. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  214. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
  215. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  216. package/lib/cjs/geometry3d/PolylineOps.d.ts +14 -3
  217. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  218. package/lib/cjs/geometry3d/PolylineOps.js +20 -4
  219. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  220. package/lib/cjs/geometry3d/Range.d.ts +34 -32
  221. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  222. package/lib/cjs/geometry3d/Range.js +28 -21
  223. package/lib/cjs/geometry3d/Range.js.map +1 -1
  224. package/lib/cjs/geometry3d/Ray2d.d.ts +16 -6
  225. package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
  226. package/lib/cjs/geometry3d/Ray2d.js +28 -4
  227. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  228. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  229. package/lib/cjs/geometry3d/Ray3d.js +3 -4
  230. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  231. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  232. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  233. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  234. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  235. package/lib/cjs/geometry3d/Transform.js +1 -1
  236. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  237. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  238. package/lib/cjs/geometry3d/XYZProps.d.ts +12 -1
  239. package/lib/cjs/geometry3d/XYZProps.d.ts.map +1 -1
  240. package/lib/cjs/geometry3d/XYZProps.js +17 -2
  241. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  242. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  243. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  244. package/lib/cjs/geometry4d/Matrix4d.d.ts +16 -0
  245. package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
  246. package/lib/cjs/geometry4d/Matrix4d.js +26 -0
  247. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  248. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  249. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  250. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  251. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  252. package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
  253. package/lib/cjs/numerics/BezierPolynomials.js +5 -9
  254. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  255. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  256. package/lib/cjs/numerics/Complex.js.map +1 -1
  257. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  258. package/lib/cjs/numerics/Newton.js.map +1 -1
  259. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  260. package/lib/cjs/numerics/PolarData.js.map +1 -1
  261. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  262. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  263. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  264. package/lib/cjs/numerics/SmallSystem.d.ts +13 -7
  265. package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
  266. package/lib/cjs/numerics/SmallSystem.js +13 -7
  267. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  268. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  269. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  270. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  271. package/lib/cjs/polyface/AuxData.js.map +1 -1
  272. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  273. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  274. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  275. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  276. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  277. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  278. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  279. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  280. package/lib/cjs/polyface/Polyface.d.ts +1 -3
  281. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  282. package/lib/cjs/polyface/Polyface.js +2 -6
  283. package/lib/cjs/polyface/Polyface.js.map +1 -1
  284. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +25 -6
  285. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  286. package/lib/cjs/polyface/PolyfaceBuilder.js +59 -8
  287. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  288. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  289. package/lib/cjs/polyface/PolyfaceData.d.ts +2 -0
  290. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  291. package/lib/cjs/polyface/PolyfaceData.js +7 -3
  292. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  293. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  294. package/lib/cjs/polyface/PolyfaceQuery.js +8 -10
  295. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  296. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  297. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  298. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  299. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
  300. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
  301. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
  302. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  303. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
  304. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
  305. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
  306. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  307. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
  308. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  309. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +9 -12
  310. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  311. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
  312. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  313. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
  314. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  315. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  316. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  317. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  318. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  319. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  320. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  321. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  322. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  323. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  324. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  325. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  326. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  327. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  328. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  329. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  330. package/lib/cjs/serialization/DeepCompare.js +1 -1
  331. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  332. package/lib/cjs/serialization/GeometrySamples.d.ts +2 -1
  333. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  334. package/lib/cjs/serialization/GeometrySamples.js +2 -1
  335. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  336. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  337. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  338. package/lib/cjs/solid/Box.js.map +1 -1
  339. package/lib/cjs/solid/Cone.js.map +1 -1
  340. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  341. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  342. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  343. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  344. package/lib/cjs/solid/Sphere.js.map +1 -1
  345. package/lib/cjs/solid/SweepContour.js.map +1 -1
  346. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  347. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  348. package/lib/cjs/topology/Graph.d.ts +38 -12
  349. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  350. package/lib/cjs/topology/Graph.js +91 -23
  351. package/lib/cjs/topology/Graph.js.map +1 -1
  352. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
  353. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
  354. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
  355. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  356. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +20 -11
  357. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  358. package/lib/cjs/topology/HalfEdgeGraphSearch.js +43 -39
  359. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  360. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  361. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  362. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  363. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  364. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  365. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  366. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  367. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  368. package/lib/cjs/topology/MaskManager.js.map +1 -1
  369. package/lib/cjs/topology/Merging.d.ts +7 -4
  370. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  371. package/lib/cjs/topology/Merging.js +16 -11
  372. package/lib/cjs/topology/Merging.js.map +1 -1
  373. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  374. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  375. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  376. package/lib/cjs/topology/Triangulation.d.ts +13 -11
  377. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  378. package/lib/cjs/topology/Triangulation.js +40 -36
  379. package/lib/cjs/topology/Triangulation.js.map +1 -1
  380. package/lib/cjs/topology/Voronoi.d.ts +195 -0
  381. package/lib/cjs/topology/Voronoi.d.ts.map +1 -0
  382. package/lib/cjs/topology/Voronoi.js +700 -0
  383. package/lib/cjs/topology/Voronoi.js.map +1 -0
  384. package/lib/cjs/topology/XYParitySearchContext.d.ts +1 -1
  385. package/lib/cjs/topology/XYParitySearchContext.d.ts.map +1 -1
  386. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  387. package/lib/esm/Constant.js.map +1 -1
  388. package/lib/esm/Geometry.d.ts +30 -10
  389. package/lib/esm/Geometry.d.ts.map +1 -1
  390. package/lib/esm/Geometry.js +74 -10
  391. package/lib/esm/Geometry.js.map +1 -1
  392. package/lib/esm/bspline/AkimaCurve3d.d.ts +19 -6
  393. package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
  394. package/lib/esm/bspline/AkimaCurve3d.js +21 -5
  395. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  396. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  397. package/lib/esm/bspline/BSplineCurve.d.ts +3 -3
  398. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  399. package/lib/esm/bspline/BSplineCurve.js +6 -6
  400. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  401. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  402. package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
  403. package/lib/esm/bspline/BSplineCurveOps.js +1 -1
  404. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  405. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  406. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  407. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  408. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  409. package/lib/esm/bspline/BezierCurveBase.d.ts +2 -2
  410. package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
  411. package/lib/esm/bspline/BezierCurveBase.js +4 -6
  412. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  413. package/lib/esm/bspline/InterpolationCurve3d.d.ts +27 -17
  414. package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
  415. package/lib/esm/bspline/InterpolationCurve3d.js +17 -7
  416. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  417. package/lib/esm/bspline/KnotVector.js.map +1 -1
  418. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  419. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  420. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  421. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  422. package/lib/esm/clipping/ClipPlane.d.ts +19 -6
  423. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  424. package/lib/esm/clipping/ClipPlane.js +17 -2
  425. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  426. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  427. package/lib/esm/clipping/ClipUtils.d.ts +14 -1
  428. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  429. package/lib/esm/clipping/ClipUtils.js +21 -3
  430. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  431. package/lib/esm/clipping/ClipVector.js.map +1 -1
  432. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +14 -11
  433. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  434. package/lib/esm/clipping/ConvexClipPlaneSet.js +23 -16
  435. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  436. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
  437. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  438. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +22 -5
  439. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  440. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  441. package/lib/esm/core-geometry.js.map +1 -1
  442. package/lib/esm/curve/Arc3d.d.ts +27 -17
  443. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  444. package/lib/esm/curve/Arc3d.js +61 -35
  445. package/lib/esm/curve/Arc3d.js.map +1 -1
  446. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  447. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  448. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  449. package/lib/esm/curve/CurveCollection.d.ts +1 -0
  450. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  451. package/lib/esm/curve/CurveCollection.js +1 -0
  452. package/lib/esm/curve/CurveCollection.js.map +1 -1
  453. package/lib/esm/curve/CurveCurve.js.map +1 -1
  454. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  455. package/lib/esm/curve/CurveFactory.js.map +1 -1
  456. package/lib/esm/curve/CurveLocationDetail.d.ts +8 -7
  457. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  458. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  459. package/lib/esm/curve/CurveOps.d.ts +51 -1
  460. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  461. package/lib/esm/curve/CurveOps.js +98 -4
  462. package/lib/esm/curve/CurveOps.js.map +1 -1
  463. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  464. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  465. package/lib/esm/curve/CurveTypes.js.map +1 -1
  466. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  467. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  468. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  469. package/lib/esm/curve/LineString3d.d.ts +4 -4
  470. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  471. package/lib/esm/curve/LineString3d.js +8 -8
  472. package/lib/esm/curve/LineString3d.js.map +1 -1
  473. package/lib/esm/curve/Loop.js.map +1 -1
  474. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  475. package/lib/esm/curve/ParityRegion.js.map +1 -1
  476. package/lib/esm/curve/Path.js.map +1 -1
  477. package/lib/esm/curve/PointString3d.js.map +1 -1
  478. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  479. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
  480. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  481. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  482. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  483. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  484. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +6 -2
  485. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  486. package/lib/esm/curve/Query/PlanarSubdivision.js +12 -7
  487. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  488. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  489. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  490. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  491. package/lib/esm/curve/RegionOps.d.ts +9 -4
  492. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  493. package/lib/esm/curve/RegionOps.js +10 -5
  494. package/lib/esm/curve/RegionOps.js.map +1 -1
  495. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  496. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  497. package/lib/esm/curve/UnionRegion.js.map +1 -1
  498. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  499. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  500. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  501. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  502. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  503. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  504. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  505. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  506. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  507. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +2 -1
  508. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  509. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  510. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  511. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  512. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  513. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  514. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +4 -4
  515. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  516. package/lib/esm/curve/internalContexts/MultiChainCollector.js +21 -18
  517. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  518. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  519. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  520. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  521. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +30 -50
  522. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  523. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  524. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  525. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  526. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  527. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  528. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  529. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  530. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  531. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +2 -2
  532. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  533. package/lib/esm/curve/spiral/DirectSpiral3d.js +6 -2
  534. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  535. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
  536. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  537. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +6 -2
  538. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  539. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  540. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  541. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  542. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  543. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +5 -1
  544. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  545. package/lib/esm/curve/spiral/TransitionSpiral3d.js +0 -3
  546. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  547. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  548. package/lib/esm/geometry3d/Angle.js.map +1 -1
  549. package/lib/esm/geometry3d/AngleSweep.d.ts +6 -2
  550. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  551. package/lib/esm/geometry3d/AngleSweep.js +12 -3
  552. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  553. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  554. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  555. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  556. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  557. package/lib/esm/geometry3d/FrameBuilder.d.ts +2 -1
  558. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  559. package/lib/esm/geometry3d/FrameBuilder.js +14 -18
  560. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  561. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  562. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  563. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  564. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  565. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  566. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  567. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  568. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  569. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  570. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  571. package/lib/esm/geometry3d/Matrix3d.d.ts +1 -1
  572. package/lib/esm/geometry3d/Matrix3d.js +1 -1
  573. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  574. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  575. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  576. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  577. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  578. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  579. package/lib/esm/geometry3d/Point2dVector2d.d.ts +18 -2
  580. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  581. package/lib/esm/geometry3d/Point2dVector2d.js +37 -4
  582. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  583. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  584. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  585. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  586. package/lib/esm/geometry3d/Point3dVector3d.js +1 -0
  587. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  588. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  589. package/lib/esm/geometry3d/PointStreaming.d.ts +8 -0
  590. package/lib/esm/geometry3d/PointStreaming.d.ts.map +1 -1
  591. package/lib/esm/geometry3d/PointStreaming.js +18 -2
  592. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  593. package/lib/esm/geometry3d/PolygonOps.d.ts +18 -9
  594. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  595. package/lib/esm/geometry3d/PolygonOps.js +53 -26
  596. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  597. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
  598. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  599. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
  600. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  601. package/lib/esm/geometry3d/PolylineOps.d.ts +14 -3
  602. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  603. package/lib/esm/geometry3d/PolylineOps.js +20 -4
  604. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  605. package/lib/esm/geometry3d/Range.d.ts +34 -32
  606. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  607. package/lib/esm/geometry3d/Range.js +28 -21
  608. package/lib/esm/geometry3d/Range.js.map +1 -1
  609. package/lib/esm/geometry3d/Ray2d.d.ts +16 -6
  610. package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
  611. package/lib/esm/geometry3d/Ray2d.js +28 -4
  612. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  613. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  614. package/lib/esm/geometry3d/Ray3d.js +3 -4
  615. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  616. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  617. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  618. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  619. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  620. package/lib/esm/geometry3d/Transform.js +1 -1
  621. package/lib/esm/geometry3d/Transform.js.map +1 -1
  622. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  623. package/lib/esm/geometry3d/XYZProps.d.ts +12 -1
  624. package/lib/esm/geometry3d/XYZProps.d.ts.map +1 -1
  625. package/lib/esm/geometry3d/XYZProps.js +16 -1
  626. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  627. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  628. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  629. package/lib/esm/geometry4d/Matrix4d.d.ts +16 -0
  630. package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
  631. package/lib/esm/geometry4d/Matrix4d.js +26 -0
  632. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  633. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  634. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  635. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  636. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  637. package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
  638. package/lib/esm/numerics/BezierPolynomials.js +5 -9
  639. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  640. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  641. package/lib/esm/numerics/Complex.js.map +1 -1
  642. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  643. package/lib/esm/numerics/Newton.js.map +1 -1
  644. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  645. package/lib/esm/numerics/PolarData.js.map +1 -1
  646. package/lib/esm/numerics/Polynomials.js.map +1 -1
  647. package/lib/esm/numerics/Quadrature.js.map +1 -1
  648. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  649. package/lib/esm/numerics/SmallSystem.d.ts +13 -7
  650. package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
  651. package/lib/esm/numerics/SmallSystem.js +13 -7
  652. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  653. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  654. package/lib/esm/numerics/UnionFind.js.map +1 -1
  655. package/lib/esm/numerics/UsageSums.js.map +1 -1
  656. package/lib/esm/polyface/AuxData.js.map +1 -1
  657. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  658. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  659. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  660. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  661. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  662. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  663. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  664. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  665. package/lib/esm/polyface/Polyface.d.ts +1 -3
  666. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  667. package/lib/esm/polyface/Polyface.js +2 -6
  668. package/lib/esm/polyface/Polyface.js.map +1 -1
  669. package/lib/esm/polyface/PolyfaceBuilder.d.ts +25 -6
  670. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  671. package/lib/esm/polyface/PolyfaceBuilder.js +59 -8
  672. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  673. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  674. package/lib/esm/polyface/PolyfaceData.d.ts +2 -0
  675. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  676. package/lib/esm/polyface/PolyfaceData.js +7 -3
  677. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  678. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  679. package/lib/esm/polyface/PolyfaceQuery.js +8 -10
  680. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  681. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  682. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  683. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  684. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
  685. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
  686. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
  687. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  688. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
  689. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
  690. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
  691. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  692. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
  693. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  694. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +9 -12
  695. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  696. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
  697. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
  698. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
  699. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  700. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  701. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  702. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  703. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  704. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  705. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  706. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  707. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  708. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  709. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  710. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  711. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  712. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  713. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  714. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  715. package/lib/esm/serialization/DeepCompare.js +1 -1
  716. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  717. package/lib/esm/serialization/GeometrySamples.d.ts +2 -1
  718. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  719. package/lib/esm/serialization/GeometrySamples.js +2 -1
  720. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  721. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  722. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  723. package/lib/esm/solid/Box.js.map +1 -1
  724. package/lib/esm/solid/Cone.js.map +1 -1
  725. package/lib/esm/solid/LinearSweep.js.map +1 -1
  726. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  727. package/lib/esm/solid/RuledSweep.js.map +1 -1
  728. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  729. package/lib/esm/solid/Sphere.js.map +1 -1
  730. package/lib/esm/solid/SweepContour.js.map +1 -1
  731. package/lib/esm/solid/TorusPipe.js.map +1 -1
  732. package/lib/esm/topology/ChainMerge.js.map +1 -1
  733. package/lib/esm/topology/Graph.d.ts +38 -12
  734. package/lib/esm/topology/Graph.d.ts.map +1 -1
  735. package/lib/esm/topology/Graph.js +92 -24
  736. package/lib/esm/topology/Graph.js.map +1 -1
  737. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
  738. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
  739. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
  740. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  741. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +20 -11
  742. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  743. package/lib/esm/topology/HalfEdgeGraphSearch.js +43 -39
  744. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  745. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  746. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  747. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  748. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  749. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  750. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  751. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  752. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  753. package/lib/esm/topology/MaskManager.js.map +1 -1
  754. package/lib/esm/topology/Merging.d.ts +7 -4
  755. package/lib/esm/topology/Merging.d.ts.map +1 -1
  756. package/lib/esm/topology/Merging.js +17 -12
  757. package/lib/esm/topology/Merging.js.map +1 -1
  758. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  759. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  760. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  761. package/lib/esm/topology/Triangulation.d.ts +13 -11
  762. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  763. package/lib/esm/topology/Triangulation.js +40 -36
  764. package/lib/esm/topology/Triangulation.js.map +1 -1
  765. package/lib/esm/topology/Voronoi.d.ts +195 -0
  766. package/lib/esm/topology/Voronoi.d.ts.map +1 -0
  767. package/lib/esm/topology/Voronoi.js +696 -0
  768. package/lib/esm/topology/Voronoi.js.map +1 -0
  769. package/lib/esm/topology/XYParitySearchContext.d.ts +1 -1
  770. package/lib/esm/topology/XYParitySearchContext.d.ts.map +1 -1
  771. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  772. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"RegularizeFace.js","sourceRoot":"","sources":["../../../src/topology/RegularizeFace.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\nimport { HalfEdgeGraphOps } from \"./Merging\";\n\n/**\n * * Context for regularizing single faces.\n * @internal\n */\nexport class RegularizationContext {\n // For debugging use ... \"almost always\" undefined.\n // If defined, it is called with each inserted node pair.\n // scale will be either plus or minus one.\n // when it is negative, the node coordinates (both x and y) have been negated.\n // The call is made after full insertion into vertex loop.\n public static announceEdge?: (graph: HalfEdgeGraph, nodeA: HalfEdge, nodeB: HalfEdge, scale: number) => void;\n public constructor(graph: HalfEdgeGraph) {\n this.graph = graph;\n this.upEdges = [];\n this.downEdges = [];\n this.bottomPeaks = [];\n this.topPeaks = [];\n this.localMin = [];\n this.localMax = [];\n }\n\n /**\n * These are public only for testing.\n */\n public graph: HalfEdgeGraph;\n /** array of edges directed upward. Turn can be left or right, but is not large enough to be a min or max */\n public upEdges: HalfEdge[];\n /** array of edges directed downward, Turn can be left or right, but is not large enough to be a min or max */\n public downEdges: HalfEdge[];\n /** Array of edges whose start is an upward peak (right turn, inbound up, outbound down) */\n public topPeaks: HalfEdge[];\n /** Array of edges whose start is an downward peak (right turn, inbound down, outbound up) */\n public bottomPeaks: HalfEdge[];\n\n /** Array of edges at local minima (left turn, inbound down, outbound up). Ensuing chain is up */\n public localMin: HalfEdge[];\n /** Array of edges at local maxima (left turn, inbound up, outbound down). Ensuing chain is down */\n public localMax: HalfEdge[];\n /**\n * Collect (and classify) all the edges around a single face.\n * * The various arrays are collected: upEdges, downEdges, topPeaks, bottomPeaks, upChains, downChains\n * @param faceSeed face to examine\n */\n public collectVerticalEventsAroundFace(faceSeed: HalfEdge) {\n let nodeA = faceSeed;\n let nodeB;\n let nodeC;\n let abUp;\n let bcUp;\n this.upEdges.length = 0;\n this.downEdges.length = 0;\n this.topPeaks.length = 0;\n this.bottomPeaks.length = 0;\n this.localMin.length = 0;\n this.localMax.length = 0;\n do {\n nodeB = nodeA.faceSuccessor;\n nodeC = nodeB.faceSuccessor;\n abUp = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB) < 0;\n bcUp = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC) < 0;\n if (abUp) {\n this.upEdges.push(nodeA);\n if (!bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) < 0)\n this.localMax.push(nodeB);\n else\n this.topPeaks.push(nodeB);\n }\n\n } else { // ab is DOWN\n this.downEdges.push(nodeA);\n if (bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) > 0)\n this.bottomPeaks.push(nodeB);\n else\n this.localMin.push(nodeB);\n }\n }\n nodeA = nodeB;\n } while (nodeA !== faceSeed);\n }\n\n /**\n * Collect (and classify) all the edges in an array.\n * * The various arrays are collected: upEdges, downEdges, topPeaks, bottomPeaks, upChains, downChains\n * @param candidateEdges array of edges.\n */\n public collectVerticalEventFromEdgesInAndArray(candidateEdges: HalfEdge[]) {\n let nodeA;\n let nodeB;\n let nodeC;\n let abUp;\n let bcUp;\n this.upEdges.length = 0;\n this.downEdges.length = 0;\n this.topPeaks.length = 0;\n this.bottomPeaks.length = 0;\n this.localMin.length = 0;\n this.localMax.length = 0;\n for (nodeA of candidateEdges) {\n nodeB = nodeA.faceSuccessor;\n nodeC = nodeB.faceSuccessor;\n abUp = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB) < 0;\n bcUp = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC) < 0;\n if (abUp) {\n this.upEdges.push(nodeA);\n if (!bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) < 0)\n this.localMax.push(nodeB);\n else\n this.topPeaks.push(nodeB);\n }\n\n } else { // ab is DOWN\n this.downEdges.push(nodeA);\n if (bcUp) {\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) > 0)\n this.bottomPeaks.push(nodeB);\n else\n this.localMin.push(nodeB);\n }\n }\n }\n }\n\n private swapArrays() {\n let save = this.downEdges; this.downEdges = this.upEdges; this.upEdges = save;\n save = this.localMax; this.localMax = this.localMin; this.localMin = save;\n save = this.topPeaks; this.topPeaks = this.bottomPeaks; this.bottomPeaks = save;\n }\n\n /**\n * Find the edge (among candidates) which is first struck by a \"rightward\" scan from node\n * * comparisonFunction determines scan sense\n * * HalfEdge.compareNodeYXTheta is an upward scan.\n * * HalfEdge.compareNodeYXThetaDownward is a downward scan.\n * @param node\n * @param candidates Array of nodes to search\n * @param nodeComparisonFunction function for lexical comparison.\n */\n private findTopVisibleEdge(node: HalfEdge, candidates: HalfEdge[],\n directionSign: number) {\n const y0 = node.y;\n const x0 = node.x;\n let dx;\n let distanceRight = Number.MAX_SAFE_INTEGER;\n let result: HalfEdge | undefined;\n for (const rightBase of candidates) {\n const rightTop = rightBase.faceSuccessor;\n if (rightBase === node || rightTop === node)\n continue;\n // for horizontal edge cases -- require edges ends to have strict sign change (no zeros!!)\n const cRight = HalfEdgeGraphOps.compareNodesYXUp(node, rightBase);\n const cTop = HalfEdgeGraphOps.compareNodesYXUp(node, rightTop);\n // GeometryCoreTestIO.consoleLog(node.id, rightBase.id, rightTop.id, cRight, cTop);\n if (cRight * cTop >= 0)\n continue;\n const fraction = HalfEdge.horizontalScanFraction01(rightBase, y0);\n if (fraction !== undefined) {\n dx = directionSign * (rightBase.fractionToX(fraction) - x0);\n if (dx > 0 && dx < distanceRight) {\n result = rightBase;\n distanceRight = dx;\n }\n }\n }\n return result;\n }\n /**\n *\n * @param downPeak a \"bottom\" node where the interior CCW loop has a local min\n * @param downEdgeStart (optional) node at the start (heading downwards!) of an edge that brackets downPeak on the left.\n * @param upEdgeStart (optional) node at the start (heading up!) of the edge that brackets downPeak on the right.\n */\n private highestUpPeakConnection(downPeak: HalfEdge, downEdgeStart: HalfEdge | undefined, upEdgeStart: HalfEdge | undefined): HalfEdge | undefined {\n let highestPeak;\n\n for (const upPeak of this.topPeaks) {\n const y0 = upPeak.y;\n const x0 = upPeak.x;\n // is upPeak higher than prior upPeak?\n if (highestPeak !== undefined && HalfEdgeGraphOps.compareNodesYXUp(upPeak, highestPeak) < 0)\n continue;\n // is upPeak BELOW downPeak, ABOVE both limit edges lower node, and between limit edge interiors.\n if (HalfEdgeGraphOps.compareNodesYXUp(upPeak, downPeak) < 0) {\n if (downEdgeStart) {\n const fraction = HalfEdge.horizontalScanFraction01(downEdgeStart, y0);\n if (fraction === undefined)\n continue;\n if (x0 <= downEdgeStart.fractionToX(fraction))\n continue;\n }\n if (upEdgeStart) {\n const fraction = HalfEdge.horizontalScanFraction01(upEdgeStart, y0);\n if (fraction === undefined)\n continue;\n if (upEdgeStart.fractionToX(fraction) <= x0)\n continue;\n }\n highestPeak = upPeak;\n }\n }\n return highestPeak;\n }\n\n private updateMaxNode(maxNode: HalfEdge | undefined, candidate: HalfEdge | undefined, compare: (a: HalfEdge, b: HalfEdge) => number): HalfEdge | undefined {\n if (!maxNode)\n return candidate;\n if (!candidate)\n return maxNode;\n // both are defined .. look for positive compare ...\n if (compare(maxNode, candidate) < 0)\n return candidate;\n return maxNode;\n }\n private negateXY() {\n for (const node of this.graph.allHalfEdges) {\n node.x *= -1;\n node.y *= -1;\n }\n }\n private downwardConnectionFromBottomPeak(node: HalfEdge): HalfEdge | undefined {\n let connectTo;\n const upFunction = (a: HalfEdge, b: HalfEdge) => HalfEdgeGraphOps.compareNodesYXUp(a, b);\n const upEdgeBase = this.findTopVisibleEdge(node, this.upEdges, 1.0)!;\n const downEdgeBase = this.findTopVisibleEdge(node, this.downEdges, -1.0)!;\n connectTo = this.updateMaxNode(connectTo, upEdgeBase, upFunction);\n if (downEdgeBase)\n connectTo = this.updateMaxNode(connectTo, downEdgeBase.faceSuccessor, upFunction);\n const upPeakConnection = this.highestUpPeakConnection(node, downEdgeBase, upEdgeBase);\n if (upPeakConnection !== undefined)\n connectTo = this.updateMaxNode(connectTo, upPeakConnection, upFunction);\n return connectTo;\n }\n /** Search around the vertex of nodeA for a nodeA1 such that nodeB is visible in the sector at nodeA1 */\n private findVisibleSector(nodeA: HalfEdge, nodeB: HalfEdge): HalfEdge | undefined {\n let nodeA1 = nodeA;\n do {\n if (HalfEdge.isNodeVisibleInSector(nodeB, nodeA1))\n return nodeA1;\n nodeA1 = nodeA1.vertexSuccessor;\n } while (nodeA1 !== nodeA);\n return undefined;\n }\n /**\n * Create an edge from (some node around the vertex of) nodeA to (some node around the vertex of) nodeB.\n * * looking around the vertex for alternate insertion corrects cusp insertion errors.\n * @param nodeA\n * @param nodeB\n */\n private joinNodes(nodeA: HalfEdge, nodeB: HalfEdge, direction: number): HalfEdge | undefined {\n const nodeC = this.graph.createEdgeXYZXYZ(nodeA.x, nodeA.y, nodeA.z, 0, nodeB.x, nodeB.y, nodeB.z, 0);\n const nodeA1 = this.findVisibleSector(nodeA, nodeB);\n const nodeB1 = this.findVisibleSector(nodeB, nodeA);\n if (nodeA1 !== undefined && nodeB1 !== undefined) {\n HalfEdge.pinch(nodeA1, nodeC);\n HalfEdge.pinch(nodeB1, nodeC.edgeMate);\n nodeC.setMaskAroundEdge(HalfEdgeMask.REGULARIZED_EDGE);\n if (RegularizationContext.announceEdge)\n RegularizationContext.announceEdge(this.graph, nodeC, nodeC.edgeMate, direction);\n return nodeC;\n }\n return undefined;\n }\n /**\n * Regularize a single face.\n * * Insert edge from any downward interior vertex to something lower\n * * Insert an edge from each upward interior vertex to something higher.\n * * The face is split into smaller faces\n * * Each final face has at most one \"min\" and one \"max\", and is easy to triangulate with a bottom to top sweep.\n * * Normal usage is to sweep in both directions, i.e. use the default (true,true) for the upSweep and downSweep parameters.\n * @param faceSeed any representative half edge on the face\n * @param upSweep true to do the upward sweep.\n * @param downSweep true to do the downward sweep.\n */\n private runRegularization(upSweep: boolean = true, downSweep: boolean = true) {\n if (upSweep) {\n this.bottomPeaks.sort((a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b));\n for (const bottomPeak of this.bottomPeaks) {\n // GeometryCoreTestIO.consoleLog(\"SEARCH\", bottomPeak.id, [bottomPeak.x, bottomPeak.y]);\n if (!HalfEdgeGraphOps.isDownPeak(bottomPeak))\n continue;\n const target = this.downwardConnectionFromBottomPeak(bottomPeak);\n if (target !== undefined) {\n // GeometryCoreTestIO.consoleLog(\"join\", bottomPeak.id, [bottomPeak.x, bottomPeak.y], target.id, [target.x, target.y]);\n this.joinNodes(bottomPeak, target, 1);\n }\n }\n }\n if (downSweep) {\n // flip the whole graph (ouch)\n this.negateXY();\n // swap the various p and down seeds ....\n this.swapArrays();\n this.bottomPeaks.sort((a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b));\n for (const bottomPeak of this.bottomPeaks) {\n if (!HalfEdgeGraphOps.isDownPeak(bottomPeak))\n continue;\n const target = this.downwardConnectionFromBottomPeak(bottomPeak);\n if (target !== undefined) {\n this.joinNodes(bottomPeak, target, -1);\n }\n }\n this.negateXY();\n this.swapArrays();\n }\n }\n\n /**\n * Regularize a single face.\n * * Insert edge from any downward interior vertex to something lower\n * * Insert an edge from each upward interior vertex to something higher.\n * * The face is split into smaller faces\n * * Each final face has at most one \"min\" and one \"max\", and is easy to triangulate with a bottom to top sweep.\n * * Normal usage is to sweep in both directions, i.e. use the default (true,true) for the upSweep and downSweep parameters.\n * @param faceSeed any representative half edge on the face\n * @param upSweep true to do the upward sweep.\n * @param downSweep true to do the downward sweep.\n */\n public regularizeFace(faceSeed: HalfEdge, upSweep: boolean = true, downSweep: boolean = true) {\n this.collectVerticalEventsAroundFace(faceSeed);\n this.runRegularization(upSweep, downSweep);\n }\n\n public regularizeGraph(upSweep: boolean = true, downSweep: boolean = true) {\n this.collectVerticalEventFromEdgesInAndArray(this.graph.allHalfEdges);\n this.runRegularization(upSweep, downSweep);\n }\n\n /** test if a single face is monotone; if so, return its (single) min */\n public static isMonotoneFace(seed: HalfEdge): HalfEdge | undefined {\n let numMin = 0;\n let numMax = 0;\n let nodeMin: HalfEdge | undefined;\n let nodeA = seed;\n do {\n const nodeB = nodeA.faceSuccessor;\n const nodeC = nodeB.faceSuccessor;\n const ab = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB);\n const bc = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC);\n if (ab * bc <= 0) {\n if (ab > 0) {\n numMin++;\n nodeMin = nodeB;\n }\n if (bc > 0) {\n numMax++;\n }\n }\n } while ((nodeA = nodeA.faceSuccessor) !== seed);\n return numMin === 1 && numMax === 1 ? nodeMin : undefined;\n }\n /** Return faces filtered by area and test function.\n * * find one arbitrary representative of each face\n * * offer the candidate to the mutate function.\n * * collect results\n * @param mappedSeeds when filter returns a HalfEdge, collect it here\n * @param unmappedSeeds when filter does not return a half edge, collect the candidate.\n */\n public static collectMappedFaceRepresentatives(\n graph: HalfEdgeGraph,\n positiveAreaOnly: boolean,\n mutate: (seed: HalfEdge) => HalfEdge | undefined,\n mappedEdges: HalfEdge[] | undefined,\n unMappedSeeds: HalfEdge[] | undefined) {\n if (mappedEdges)\n mappedEdges.length = 0;\n if (unMappedSeeds)\n unMappedSeeds.length = 0;\n const mask = HalfEdgeMask.VISITED;\n graph.clearMask(mask);\n for (const seed of graph.allHalfEdges) {\n if (!seed.getMask(mask)) {\n seed.setMaskAroundFace(mask);\n if (!positiveAreaOnly || seed.signedFaceArea() > 0) {\n const edge = mutate(seed);\n if (edge) {\n if (mappedEdges)\n mappedEdges.push(edge);\n } else {\n if (unMappedSeeds)\n unMappedSeeds.push(seed);\n }\n }\n }\n }\n }\n\n}\n"]}
1
+ {"version":3,"file":"RegularizeFace.js","sourceRoot":"","sources":["../../../src/topology/RegularizeFace.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { HalfEdgeGraphOps } from \"./Merging\";\r\n\r\n/**\r\n * * Context for regularizing single faces.\r\n * @internal\r\n */\r\nexport class RegularizationContext {\r\n // For debugging use ... \"almost always\" undefined.\r\n // If defined, it is called with each inserted node pair.\r\n // scale will be either plus or minus one.\r\n // when it is negative, the node coordinates (both x and y) have been negated.\r\n // The call is made after full insertion into vertex loop.\r\n public static announceEdge?: (graph: HalfEdgeGraph, nodeA: HalfEdge, nodeB: HalfEdge, scale: number) => void;\r\n public constructor(graph: HalfEdgeGraph) {\r\n this.graph = graph;\r\n this.upEdges = [];\r\n this.downEdges = [];\r\n this.bottomPeaks = [];\r\n this.topPeaks = [];\r\n this.localMin = [];\r\n this.localMax = [];\r\n }\r\n\r\n /**\r\n * These are public only for testing.\r\n */\r\n public graph: HalfEdgeGraph;\r\n /** array of edges directed upward. Turn can be left or right, but is not large enough to be a min or max */\r\n public upEdges: HalfEdge[];\r\n /** array of edges directed downward, Turn can be left or right, but is not large enough to be a min or max */\r\n public downEdges: HalfEdge[];\r\n /** Array of edges whose start is an upward peak (right turn, inbound up, outbound down) */\r\n public topPeaks: HalfEdge[];\r\n /** Array of edges whose start is an downward peak (right turn, inbound down, outbound up) */\r\n public bottomPeaks: HalfEdge[];\r\n\r\n /** Array of edges at local minima (left turn, inbound down, outbound up). Ensuing chain is up */\r\n public localMin: HalfEdge[];\r\n /** Array of edges at local maxima (left turn, inbound up, outbound down). Ensuing chain is down */\r\n public localMax: HalfEdge[];\r\n /**\r\n * Collect (and classify) all the edges around a single face.\r\n * * The various arrays are collected: upEdges, downEdges, topPeaks, bottomPeaks, upChains, downChains\r\n * @param faceSeed face to examine\r\n */\r\n public collectVerticalEventsAroundFace(faceSeed: HalfEdge) {\r\n let nodeA = faceSeed;\r\n let nodeB;\r\n let nodeC;\r\n let abUp;\r\n let bcUp;\r\n this.upEdges.length = 0;\r\n this.downEdges.length = 0;\r\n this.topPeaks.length = 0;\r\n this.bottomPeaks.length = 0;\r\n this.localMin.length = 0;\r\n this.localMax.length = 0;\r\n do {\r\n nodeB = nodeA.faceSuccessor;\r\n nodeC = nodeB.faceSuccessor;\r\n abUp = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB) < 0;\r\n bcUp = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC) < 0;\r\n if (abUp) {\r\n this.upEdges.push(nodeA);\r\n if (!bcUp) {\r\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) < 0)\r\n this.localMax.push(nodeB);\r\n else\r\n this.topPeaks.push(nodeB);\r\n }\r\n\r\n } else { // ab is DOWN\r\n this.downEdges.push(nodeA);\r\n if (bcUp) {\r\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) > 0)\r\n this.bottomPeaks.push(nodeB);\r\n else\r\n this.localMin.push(nodeB);\r\n }\r\n }\r\n nodeA = nodeB;\r\n } while (nodeA !== faceSeed);\r\n }\r\n\r\n /**\r\n * Collect (and classify) all the edges in an array.\r\n * * The various arrays are collected: upEdges, downEdges, topPeaks, bottomPeaks, upChains, downChains\r\n * @param candidateEdges array of edges.\r\n */\r\n public collectVerticalEventFromEdgesInAndArray(candidateEdges: HalfEdge[]) {\r\n let nodeA;\r\n let nodeB;\r\n let nodeC;\r\n let abUp;\r\n let bcUp;\r\n this.upEdges.length = 0;\r\n this.downEdges.length = 0;\r\n this.topPeaks.length = 0;\r\n this.bottomPeaks.length = 0;\r\n this.localMin.length = 0;\r\n this.localMax.length = 0;\r\n for (nodeA of candidateEdges) {\r\n nodeB = nodeA.faceSuccessor;\r\n nodeC = nodeB.faceSuccessor;\r\n abUp = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB) < 0;\r\n bcUp = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC) < 0;\r\n if (abUp) {\r\n this.upEdges.push(nodeA);\r\n if (!bcUp) {\r\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) < 0)\r\n this.localMax.push(nodeB);\r\n else\r\n this.topPeaks.push(nodeB);\r\n }\r\n\r\n } else { // ab is DOWN\r\n this.downEdges.push(nodeA);\r\n if (bcUp) {\r\n if (HalfEdgeGraphOps.crossProductToTargets(nodeB, nodeA, nodeC) > 0)\r\n this.bottomPeaks.push(nodeB);\r\n else\r\n this.localMin.push(nodeB);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private swapArrays() {\r\n let save = this.downEdges; this.downEdges = this.upEdges; this.upEdges = save;\r\n save = this.localMax; this.localMax = this.localMin; this.localMin = save;\r\n save = this.topPeaks; this.topPeaks = this.bottomPeaks; this.bottomPeaks = save;\r\n }\r\n\r\n /**\r\n * Find the edge (among candidates) which is first struck by a \"rightward\" scan from node\r\n * * comparisonFunction determines scan sense\r\n * * HalfEdge.compareNodeYXTheta is an upward scan.\r\n * * HalfEdge.compareNodeYXThetaDownward is a downward scan.\r\n * @param node\r\n * @param candidates Array of nodes to search\r\n * @param nodeComparisonFunction function for lexical comparison.\r\n */\r\n private findTopVisibleEdge(node: HalfEdge, candidates: HalfEdge[],\r\n directionSign: number) {\r\n const y0 = node.y;\r\n const x0 = node.x;\r\n let dx;\r\n let distanceRight = Number.MAX_SAFE_INTEGER;\r\n let result: HalfEdge | undefined;\r\n for (const rightBase of candidates) {\r\n const rightTop = rightBase.faceSuccessor;\r\n if (rightBase === node || rightTop === node)\r\n continue;\r\n // for horizontal edge cases -- require edges ends to have strict sign change (no zeros!!)\r\n const cRight = HalfEdgeGraphOps.compareNodesYXUp(node, rightBase);\r\n const cTop = HalfEdgeGraphOps.compareNodesYXUp(node, rightTop);\r\n // GeometryCoreTestIO.consoleLog(node.id, rightBase.id, rightTop.id, cRight, cTop);\r\n if (cRight * cTop >= 0)\r\n continue;\r\n const fraction = HalfEdge.horizontalScanFraction01(rightBase, y0);\r\n if (fraction !== undefined) {\r\n dx = directionSign * (rightBase.fractionToX(fraction) - x0);\r\n if (dx > 0 && dx < distanceRight) {\r\n result = rightBase;\r\n distanceRight = dx;\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n *\r\n * @param downPeak a \"bottom\" node where the interior CCW loop has a local min\r\n * @param downEdgeStart (optional) node at the start (heading downwards!) of an edge that brackets downPeak on the left.\r\n * @param upEdgeStart (optional) node at the start (heading up!) of the edge that brackets downPeak on the right.\r\n */\r\n private highestUpPeakConnection(downPeak: HalfEdge, downEdgeStart: HalfEdge | undefined, upEdgeStart: HalfEdge | undefined): HalfEdge | undefined {\r\n let highestPeak;\r\n\r\n for (const upPeak of this.topPeaks) {\r\n const y0 = upPeak.y;\r\n const x0 = upPeak.x;\r\n // is upPeak higher than prior upPeak?\r\n if (highestPeak !== undefined && HalfEdgeGraphOps.compareNodesYXUp(upPeak, highestPeak) < 0)\r\n continue;\r\n // is upPeak BELOW downPeak, ABOVE both limit edges lower node, and between limit edge interiors.\r\n if (HalfEdgeGraphOps.compareNodesYXUp(upPeak, downPeak) < 0) {\r\n if (downEdgeStart) {\r\n const fraction = HalfEdge.horizontalScanFraction01(downEdgeStart, y0);\r\n if (fraction === undefined)\r\n continue;\r\n if (x0 <= downEdgeStart.fractionToX(fraction))\r\n continue;\r\n }\r\n if (upEdgeStart) {\r\n const fraction = HalfEdge.horizontalScanFraction01(upEdgeStart, y0);\r\n if (fraction === undefined)\r\n continue;\r\n if (upEdgeStart.fractionToX(fraction) <= x0)\r\n continue;\r\n }\r\n highestPeak = upPeak;\r\n }\r\n }\r\n return highestPeak;\r\n }\r\n\r\n private updateMaxNode(maxNode: HalfEdge | undefined, candidate: HalfEdge | undefined, compare: (a: HalfEdge, b: HalfEdge) => number): HalfEdge | undefined {\r\n if (!maxNode)\r\n return candidate;\r\n if (!candidate)\r\n return maxNode;\r\n // both are defined .. look for positive compare ...\r\n if (compare(maxNode, candidate) < 0)\r\n return candidate;\r\n return maxNode;\r\n }\r\n private negateXY() {\r\n for (const node of this.graph.allHalfEdges) {\r\n node.x *= -1;\r\n node.y *= -1;\r\n }\r\n }\r\n private downwardConnectionFromBottomPeak(node: HalfEdge): HalfEdge | undefined {\r\n let connectTo;\r\n const upFunction = (a: HalfEdge, b: HalfEdge) => HalfEdgeGraphOps.compareNodesYXUp(a, b);\r\n const upEdgeBase = this.findTopVisibleEdge(node, this.upEdges, 1.0)!;\r\n const downEdgeBase = this.findTopVisibleEdge(node, this.downEdges, -1.0)!;\r\n connectTo = this.updateMaxNode(connectTo, upEdgeBase, upFunction);\r\n if (downEdgeBase)\r\n connectTo = this.updateMaxNode(connectTo, downEdgeBase.faceSuccessor, upFunction);\r\n const upPeakConnection = this.highestUpPeakConnection(node, downEdgeBase, upEdgeBase);\r\n if (upPeakConnection !== undefined)\r\n connectTo = this.updateMaxNode(connectTo, upPeakConnection, upFunction);\r\n return connectTo;\r\n }\r\n /** Search around the vertex of nodeA for a nodeA1 such that nodeB is visible in the sector at nodeA1 */\r\n private findVisibleSector(nodeA: HalfEdge, nodeB: HalfEdge): HalfEdge | undefined {\r\n let nodeA1 = nodeA;\r\n do {\r\n if (HalfEdge.isNodeVisibleInSector(nodeB, nodeA1))\r\n return nodeA1;\r\n nodeA1 = nodeA1.vertexSuccessor;\r\n } while (nodeA1 !== nodeA);\r\n return undefined;\r\n }\r\n /**\r\n * Create an edge from (some node around the vertex of) nodeA to (some node around the vertex of) nodeB.\r\n * * looking around the vertex for alternate insertion corrects cusp insertion errors.\r\n * @param nodeA\r\n * @param nodeB\r\n */\r\n private joinNodes(nodeA: HalfEdge, nodeB: HalfEdge, direction: number): HalfEdge | undefined {\r\n const nodeC = this.graph.createEdgeXYZXYZ(nodeA.x, nodeA.y, nodeA.z, 0, nodeB.x, nodeB.y, nodeB.z, 0);\r\n const nodeA1 = this.findVisibleSector(nodeA, nodeB);\r\n const nodeB1 = this.findVisibleSector(nodeB, nodeA);\r\n if (nodeA1 !== undefined && nodeB1 !== undefined) {\r\n HalfEdge.pinch(nodeA1, nodeC);\r\n HalfEdge.pinch(nodeB1, nodeC.edgeMate);\r\n nodeC.setMaskAroundEdge(HalfEdgeMask.REGULARIZED_EDGE);\r\n if (RegularizationContext.announceEdge)\r\n RegularizationContext.announceEdge(this.graph, nodeC, nodeC.edgeMate, direction);\r\n return nodeC;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Regularize a single face.\r\n * * Insert edge from any downward interior vertex to something lower\r\n * * Insert an edge from each upward interior vertex to something higher.\r\n * * The face is split into smaller faces\r\n * * Each final face has at most one \"min\" and one \"max\", and is easy to triangulate with a bottom to top sweep.\r\n * * Normal usage is to sweep in both directions, i.e. use the default (true,true) for the upSweep and downSweep parameters.\r\n * @param faceSeed any representative half edge on the face\r\n * @param upSweep true to do the upward sweep.\r\n * @param downSweep true to do the downward sweep.\r\n */\r\n private runRegularization(upSweep: boolean = true, downSweep: boolean = true) {\r\n if (upSweep) {\r\n this.bottomPeaks.sort((a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b));\r\n for (const bottomPeak of this.bottomPeaks) {\r\n // GeometryCoreTestIO.consoleLog(\"SEARCH\", bottomPeak.id, [bottomPeak.x, bottomPeak.y]);\r\n if (!HalfEdgeGraphOps.isDownPeak(bottomPeak))\r\n continue;\r\n const target = this.downwardConnectionFromBottomPeak(bottomPeak);\r\n if (target !== undefined) {\r\n // GeometryCoreTestIO.consoleLog(\"join\", bottomPeak.id, [bottomPeak.x, bottomPeak.y], target.id, [target.x, target.y]);\r\n this.joinNodes(bottomPeak, target, 1);\r\n }\r\n }\r\n }\r\n if (downSweep) {\r\n // flip the whole graph (ouch)\r\n this.negateXY();\r\n // swap the various p and down seeds ....\r\n this.swapArrays();\r\n this.bottomPeaks.sort((a, b) => HalfEdgeGraphOps.compareNodesYXUp(a, b));\r\n for (const bottomPeak of this.bottomPeaks) {\r\n if (!HalfEdgeGraphOps.isDownPeak(bottomPeak))\r\n continue;\r\n const target = this.downwardConnectionFromBottomPeak(bottomPeak);\r\n if (target !== undefined) {\r\n this.joinNodes(bottomPeak, target, -1);\r\n }\r\n }\r\n this.negateXY();\r\n this.swapArrays();\r\n }\r\n }\r\n\r\n /**\r\n * Regularize a single face.\r\n * * Insert edge from any downward interior vertex to something lower\r\n * * Insert an edge from each upward interior vertex to something higher.\r\n * * The face is split into smaller faces\r\n * * Each final face has at most one \"min\" and one \"max\", and is easy to triangulate with a bottom to top sweep.\r\n * * Normal usage is to sweep in both directions, i.e. use the default (true,true) for the upSweep and downSweep parameters.\r\n * @param faceSeed any representative half edge on the face\r\n * @param upSweep true to do the upward sweep.\r\n * @param downSweep true to do the downward sweep.\r\n */\r\n public regularizeFace(faceSeed: HalfEdge, upSweep: boolean = true, downSweep: boolean = true) {\r\n this.collectVerticalEventsAroundFace(faceSeed);\r\n this.runRegularization(upSweep, downSweep);\r\n }\r\n\r\n public regularizeGraph(upSweep: boolean = true, downSweep: boolean = true) {\r\n this.collectVerticalEventFromEdgesInAndArray(this.graph.allHalfEdges);\r\n this.runRegularization(upSweep, downSweep);\r\n }\r\n\r\n /** test if a single face is monotone; if so, return its (single) min */\r\n public static isMonotoneFace(seed: HalfEdge): HalfEdge | undefined {\r\n let numMin = 0;\r\n let numMax = 0;\r\n let nodeMin: HalfEdge | undefined;\r\n let nodeA = seed;\r\n do {\r\n const nodeB = nodeA.faceSuccessor;\r\n const nodeC = nodeB.faceSuccessor;\r\n const ab = HalfEdgeGraphOps.compareNodesYXUp(nodeA, nodeB);\r\n const bc = HalfEdgeGraphOps.compareNodesYXUp(nodeB, nodeC);\r\n if (ab * bc <= 0) {\r\n if (ab > 0) {\r\n numMin++;\r\n nodeMin = nodeB;\r\n }\r\n if (bc > 0) {\r\n numMax++;\r\n }\r\n }\r\n } while ((nodeA = nodeA.faceSuccessor) !== seed);\r\n return numMin === 1 && numMax === 1 ? nodeMin : undefined;\r\n }\r\n /** Return faces filtered by area and test function.\r\n * * find one arbitrary representative of each face\r\n * * offer the candidate to the mutate function.\r\n * * collect results\r\n * @param mappedSeeds when filter returns a HalfEdge, collect it here\r\n * @param unmappedSeeds when filter does not return a half edge, collect the candidate.\r\n */\r\n public static collectMappedFaceRepresentatives(\r\n graph: HalfEdgeGraph,\r\n positiveAreaOnly: boolean,\r\n mutate: (seed: HalfEdge) => HalfEdge | undefined,\r\n mappedEdges: HalfEdge[] | undefined,\r\n unMappedSeeds: HalfEdge[] | undefined) {\r\n if (mappedEdges)\r\n mappedEdges.length = 0;\r\n if (unMappedSeeds)\r\n unMappedSeeds.length = 0;\r\n const mask = HalfEdgeMask.VISITED;\r\n graph.clearMask(mask);\r\n for (const seed of graph.allHalfEdges) {\r\n if (!seed.getMask(mask)) {\r\n seed.setMaskAroundFace(mask);\r\n if (!positiveAreaOnly || seed.signedFaceArea() > 0) {\r\n const edge = mutate(seed);\r\n if (edge) {\r\n if (mappedEdges)\r\n mappedEdges.push(edge);\r\n } else {\r\n if (unMappedSeeds)\r\n unMappedSeeds.push(seed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SignedDataSummary.js","sourceRoot":"","sources":["../../../src/topology/SignedDataSummary.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAC5B,sCAAsC;IAC/B,WAAW,CAAS;IAC3B,qCAAqC;IAC9B,WAAW,CAAS;IAC3B,kCAAkC;IAC3B,WAAW,CAAS;IAC3B,qCAAqC;IAC9B,WAAW,CAAS;IAC3B,iCAAiC;IAC1B,OAAO,CAAS;IACvB,wDAAwD;IACjD,mBAAmB,CAAK;IAC/B,qDAAqD;IAC9C,mBAAmB,CAAK;IACxB,oBAAoB,CAAS;IAC7B,oBAAoB,CAAS;IACpC,wCAAwC;IACjC,iBAAiB,CAAO;IAC/B,gCAAgC;IACzB,aAAa,CAAO;IAC3B,oCAAoC;IAC7B,iBAAiB,CAAO;IAC/B,gDAAgD;IAChD,YAAmB,YAAqB;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACzD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAC5D,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,8CAA8C;IACvC,YAAY,CAAC,IAAO,EAAE,IAAY;QACvC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,iBAAiB;gBACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,iBAAiB;gBACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,aAAa;gBACpB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n/**\n * Class to accumulate statistics about a stream of signed numbers with tag items.\n * * All sums, counts, extrema, and item values are initialized to zero in the constructor.\n * * Each call to `announceItem(item, value)` updates the various sums, counts, and extrema.\n */\nexport class SignedDataSummary<T> {\n /** Sum of all positive area items. */\n public positiveSum: number;\n /** Number of positive area items. */\n public numPositive: number;\n /** Sum of negative area items. */\n public negativeSum: number;\n /** Number of negative area items. */\n public numNegative: number;\n /** Number of zero area items. */\n public numZero: number;\n /** The tag item item with the largest positive data. */\n public largestPositiveItem?: T;\n /** The tag item item with the most negative data. */\n public largestNegativeItem?: T;\n public largestPositiveValue: number;\n public largestNegativeValue: number;\n /** Array of all negative area items. */\n public negativeItemArray?: T[];\n /** Array of zero area items. */\n public zeroItemArray?: T[];\n /** Array of positive area items. */\n public positiveItemArray?: T[];\n /** Setup with zero sums and optional arrays. */\n public constructor(createArrays: boolean) {\n this.positiveSum = this.negativeSum = 0.0;\n this.numPositive = this.numNegative = this.numZero = 0.0;\n this.largestPositiveValue = this.largestNegativeValue = 0.0;\n if (createArrays) {\n this.negativeItemArray = [];\n this.positiveItemArray = [];\n this.zeroItemArray = [];\n }\n }\n /** Update with an item and its data value. */\n public announceItem(item: T, data: number) {\n if (data < 0) {\n this.numNegative++;\n this.negativeSum += data;\n if (this.negativeItemArray)\n this.negativeItemArray.push(item);\n if (data < this.largestNegativeValue) {\n this.largestNegativeValue = data;\n this.largestNegativeItem = item;\n }\n } else if (data > 0) {\n this.numPositive++;\n this.positiveSum += data;\n if (this.positiveItemArray)\n this.positiveItemArray.push(item);\n if (data > this.largestPositiveValue) {\n this.largestPositiveValue = data;\n this.largestPositiveItem = item;\n }\n } else {\n this.numZero++;\n if (this.zeroItemArray)\n this.zeroItemArray.push(item);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"SignedDataSummary.js","sourceRoot":"","sources":["../../../src/topology/SignedDataSummary.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAC5B,sCAAsC;IAC/B,WAAW,CAAS;IAC3B,qCAAqC;IAC9B,WAAW,CAAS;IAC3B,kCAAkC;IAC3B,WAAW,CAAS;IAC3B,qCAAqC;IAC9B,WAAW,CAAS;IAC3B,iCAAiC;IAC1B,OAAO,CAAS;IACvB,wDAAwD;IACjD,mBAAmB,CAAK;IAC/B,qDAAqD;IAC9C,mBAAmB,CAAK;IACxB,oBAAoB,CAAS;IAC7B,oBAAoB,CAAS;IACpC,wCAAwC;IACjC,iBAAiB,CAAO;IAC/B,gCAAgC;IACzB,aAAa,CAAO;IAC3B,oCAAoC;IAC7B,iBAAiB,CAAO;IAC/B,gDAAgD;IAChD,YAAmB,YAAqB;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACzD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAC5D,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,8CAA8C;IACvC,YAAY,CAAC,IAAO,EAAE,IAAY;QACvC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,iBAAiB;gBACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,iBAAiB;gBACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,aAAa;gBACpB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n/**\r\n * Class to accumulate statistics about a stream of signed numbers with tag items.\r\n * * All sums, counts, extrema, and item values are initialized to zero in the constructor.\r\n * * Each call to `announceItem(item, value)` updates the various sums, counts, and extrema.\r\n */\r\nexport class SignedDataSummary<T> {\r\n /** Sum of all positive area items. */\r\n public positiveSum: number;\r\n /** Number of positive area items. */\r\n public numPositive: number;\r\n /** Sum of negative area items. */\r\n public negativeSum: number;\r\n /** Number of negative area items. */\r\n public numNegative: number;\r\n /** Number of zero area items. */\r\n public numZero: number;\r\n /** The tag item item with the largest positive data. */\r\n public largestPositiveItem?: T;\r\n /** The tag item item with the most negative data. */\r\n public largestNegativeItem?: T;\r\n public largestPositiveValue: number;\r\n public largestNegativeValue: number;\r\n /** Array of all negative area items. */\r\n public negativeItemArray?: T[];\r\n /** Array of zero area items. */\r\n public zeroItemArray?: T[];\r\n /** Array of positive area items. */\r\n public positiveItemArray?: T[];\r\n /** Setup with zero sums and optional arrays. */\r\n public constructor(createArrays: boolean) {\r\n this.positiveSum = this.negativeSum = 0.0;\r\n this.numPositive = this.numNegative = this.numZero = 0.0;\r\n this.largestPositiveValue = this.largestNegativeValue = 0.0;\r\n if (createArrays) {\r\n this.negativeItemArray = [];\r\n this.positiveItemArray = [];\r\n this.zeroItemArray = [];\r\n }\r\n }\r\n /** Update with an item and its data value. */\r\n public announceItem(item: T, data: number) {\r\n if (data < 0) {\r\n this.numNegative++;\r\n this.negativeSum += data;\r\n if (this.negativeItemArray)\r\n this.negativeItemArray.push(item);\r\n if (data < this.largestNegativeValue) {\r\n this.largestNegativeValue = data;\r\n this.largestNegativeItem = item;\r\n }\r\n } else if (data > 0) {\r\n this.numPositive++;\r\n this.positiveSum += data;\r\n if (this.positiveItemArray)\r\n this.positiveItemArray.push(item);\r\n if (data > this.largestPositiveValue) {\r\n this.largestPositiveValue = data;\r\n this.largestPositiveItem = item;\r\n }\r\n } else {\r\n this.numZero++;\r\n if (this.zeroItemArray)\r\n this.zeroItemArray.push(item);\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SpaceTriangulation.js","sourceRoot":"","sources":["../../../src/topology/SpaceTriangulation.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAGtD;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAEpC;;;;;;;;;OASG;IACI,MAAM,CAAC,wBAAwB,CAAC,MAAe,EAAE,MAAe,EAAE,MAAe;QACpF,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB,CAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,GAAG,GAAG,YAAY,CAAC,SAAS,EAAG,CAAC;QAC7C,MAAM,iBAAiB,GAAG,MAAM,CAAC,eAAe,CAAE,MAAM,CAAC,GAAG,MAAM,CAAC,eAAe,CAAE,MAAM,CAAC,GAAG,MAAM,CAAC,eAAe,CAAE,MAAM,CAAC,CAAC;QAC9H,OAAO,QAAQ,CAAC,kBAAkB,CAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,4BAA4B,CAAC,MAAe,EAAE,MAAe,EAAE,MAAe,EAAE,MAAe;QAC3G,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,GAAG,CAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,qJAAqJ;IAC9I,MAAM,CAAC,uBAAuB,CAAC,MAAiB,EAAE,wBAA0D;QACjH,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAgB,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAG,CAAC;QACjC,WAAW,CAAC,kBAAkB,CAAE,QAAQ,CAAC,CAAC;QAC1C,sCAAsC;QACtC,gCAAgC;QAChC,OAAM,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAE,CAAC;YAC1B,uHAAuH;YACvH,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC;YACrB,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvF,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/E,IAAI,OAAO,CAAC,UAAU,CAAE,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,SAAS,EAAC,CAAC;oBACzD,SAAS,GAAG,KAAK,CAAC;oBAClB,eAAe,GAAG,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,IAAI,SAAS,IAAI,GAAG;gBAClB,OAAO,KAAK,CAAC;YACf,4BAA4B;YAC5B,EAAE,GAAG,eAAe,CAAC;YACrB,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;YAChC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;YAChC,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,CAAC,CAAC,IAAI,CAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,0BAA0B;YAC1B,QAAQ,CAAC,MAAM,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,wBAAwB,CAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,8BAA8B,CAAC,MAAiB,EAAE,wBAA0D,EACzH,YAAgC;QAChC,MAAM,CAAC,GAAG,YAAY,CAAC,kBAAkB,CAAE,MAAM,CAAC,CAAC;QACrD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,cAAc,CAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,YAAY;YAC1F,OAAO,KAAK,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC;YACP,OAAO,KAAK,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,EAAC,CAAC;YACX,IAAI,IAAI,CAAC,wBAAwB,CAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACvE,OAAO,KAAK,CAAC;YACf,2BAA2B;YAC3B,wBAAwB,CAAE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,EAAG,CAAC,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,EAAC,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,4BAA4B,CAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3F,MAAM,GAAG,GAAG,IAAI,CAAC,4BAA4B,CAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3F,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG;gBAC5B,OAAO,KAAK,CAAC;YACf,4DAA4D;YAC5D,IAAI,GAAG,GAAG,GAAG,EAAC,CAAC;gBACb,wBAAwB,CAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1G,OAAO,IAAI,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,wBAAwB,CAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1G,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACvE,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,4BAA4B,CAAC,IAA+B,EACxE,wBAA0D,EAC1D,YAAqB;QACrB,IAAI,IAAI,YAAY,YAAY;YAC9B,OAAO,IAAI,CAAC,8BAA8B,CAAE,IAAI,CAAC,MAAM,EAAE,wBAAwB,EAAE,YAAY,CAAC,CAAC;QACjG,6BAA6B;QAC/B,OAAO,IAAI,CAAC,8BAA8B,CAAE,IAAI,EAAE,wBAAwB,EAAE,YAAY,CAAC,CAAC;IAC5F,CAAC;CAEF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Topology\n */\n\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Geometry } from \"../Geometry\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\nimport {PolygonOps} from \"../geometry3d/PolygonOps\";\nimport {PolylineOps} from \"../geometry3d/PolylineOps\";\ntype AnnounceLoopAndTrianglesFunction = (loop: Point3d[], triangles: Point3d[][]) => void;\n\n/**\n * Class with static methods to triangulate various forms of possibly non-planar polygons.\n * @public\n */\nexport class SpacePolygonTriangulation {\n\n /**\n * * Return a number which is:\n * * 0 for collapsed (zero area) triangle\n * * positive for non-zero area\n * * larger is \"better\"\n * * Specifically, return (if well defined) the area divided by summed squares of edge lengths.\n * @param point0\n * @param point1\n * @param point2\n */\n public static spaceTriangleAspectRatio(point0: Point3d, point1: Point3d, point2: Point3d): number {\n const crossProduct = point0.crossProductToPoints (point1, point2);\n const area = 0.5 * crossProduct.magnitude ();\n const summedEdgeSquares = point0.distanceSquared (point1) + point1.distanceSquared (point2) + point2.distanceSquared (point0);\n return Geometry.safeDivideFraction (area, summedEdgeSquares, 0.0);\n }\n /**\n * * Treat a space quad as two triangles with interior diagonal from point0 to point2\n * * Return the smaller of the aspect ratios of the two triangles.\n * * The quad edges proceed in the order [point0, point1, point2, point3]\n * @param point0 first point of quad\n * @param point1 second point of quad (diagonally opposite of point3)\n * @param point2 third point (diagonally opposite point0)\n * @param point3 fourth point\n */\n public static spaceQuadDiagonalAspectRatio(point0: Point3d, point1: Point3d, point2: Point3d, point3: Point3d): number{\n const q012 = this.spaceTriangleAspectRatio (point0, point1, point2);\n const q023 = this.spaceTriangleAspectRatio (point0, point2, point3);\n return Math.max (q012, q023);\n }\n /** \"Triangulate\" by cutting of the ear with best aspect ratio. Reject if successive normals have negative dot product with PolygonOps.AreaNormal */\n public static triangulateGreedyEarCut(points: Point3d[], announceLoopAndTriangles: AnnounceLoopAndTrianglesFunction): boolean{\n const normalA = PolygonOps.areaNormal (points);\n const triangles: Point3d[][] = [];\n const myPoints = points.slice ();\n PolylineOps.removeClosurePoint (myPoints);\n // first pass deals with entire array.\n // each pass lops off one point.\n for (;myPoints.length > 2;){\n // Find the ear candidate whose cross product vector has largest dot product (large area, best alignment with overall).\n let bestRatio = -1.0;\n let bestRatioIndex0 = 0;\n let i0 = myPoints.length - 2;\n let i1 = myPoints.length - 1;\n let i2;\n for (i2 = 0; i2 < myPoints.length; i0 = i1, i1 = i2, i2++){\n const ratio = this.spaceTriangleAspectRatio (myPoints[i0], myPoints[i1], myPoints[i2]);\n const normalB = myPoints[i0].crossProductToPoints (myPoints[i1], myPoints[i2]);\n if (normalB.dotProduct (normalA) > 0 && ratio > bestRatio){\n bestRatio = ratio;\n bestRatioIndex0 = i0;\n }\n }\n if (bestRatio <= 0.0)\n return false;\n // add the ear to the result\n i0 = bestRatioIndex0;\n i1 = (i0 + 1) % myPoints.length;\n i2 = (i1 + 1) % myPoints.length;\n const t = [];\n t.push (myPoints[i0], myPoints[i1], myPoints[i2]);\n // remove the middle point\n myPoints.splice (i1, 1);\n triangles.push(t);\n }\n announceLoopAndTriangles (points, triangles);\n return true;\n }\n\n private static triangulateSimplestSpaceLoopGo(points: Point3d[], announceLoopAndTriangles: AnnounceLoopAndTrianglesFunction,\n maxPerimeter: number | undefined): boolean{\n const n = Point3dArray.countNonDuplicates (points);\n if (maxPerimeter !== undefined && Point3dArray.sumEdgeLengths (points, true, n) > maxPerimeter)\n return false;\n if (n < 3)\n return false;\n if (n === 3){\n if (this.spaceTriangleAspectRatio (points[0], points[1], points[2]) === 0)\n return false;\n // already a triangle . . .\n announceLoopAndTriangles (points, [points.slice ()]);\n return true;\n }\n if (n === 4){\n const d02 = this.spaceQuadDiagonalAspectRatio (points[0], points[1], points[2], points[3]);\n const d13 = this.spaceQuadDiagonalAspectRatio (points[1], points[2], points[3], points[0]);\n if (d02 === 0.0 && d13 === 0.0)\n return false;\n // announce the two triangles with better aspect ratios ....\n if (d02 > d13){\n announceLoopAndTriangles (points, [[points[0], points[1], points[2]], [points[2], points[3], points[0]]]);\n return true;\n } else {\n announceLoopAndTriangles (points, [[points[0], points[1], points[3]], [points[3], points[1], points[2]]]);\n return true;\n }\n }\n return this.triangulateGreedyEarCut (points, announceLoopAndTriangles);\n }\n /**\n * * Emit triangles for a (possibly non-planar) loop for various simple cases:\n * * only 3 points: just emit that triangle.\n * * only 4 points: split across a diagonal, choosing the one with better aspect ratios of its two triangles.\n * * BUT\n * * do not complete the triangulation if perimeter is larger than maxPerimeter (i.e. only consider small areas)\n * * Hence it is expected that the caller will use this as the first attempt, possibly followed by calls to other more adventurous methods.\n */\n public static triangulateSimplestSpaceLoop(loop: Point3d [] | LineString3d,\n announceLoopAndTriangles: AnnounceLoopAndTrianglesFunction,\n maxPerimeter?: number): boolean{\n if (loop instanceof LineString3d)\n return this.triangulateSimplestSpaceLoopGo (loop.points, announceLoopAndTriangles, maxPerimeter);\n // (array case by exhaustion)\n return this.triangulateSimplestSpaceLoopGo (loop, announceLoopAndTriangles, maxPerimeter);\n }\n\n}\n"]}
1
+ {"version":3,"file":"SpaceTriangulation.js","sourceRoot":"","sources":["../../../src/topology/SpaceTriangulation.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport {PolygonOps} from \"../geometry3d/PolygonOps\";\r\nimport {PolylineOps} from \"../geometry3d/PolylineOps\";\r\ntype AnnounceLoopAndTrianglesFunction = (loop: Point3d[], triangles: Point3d[][]) => void;\r\n\r\n/**\r\n * Class with static methods to triangulate various forms of possibly non-planar polygons.\r\n * @public\r\n */\r\nexport class SpacePolygonTriangulation {\r\n\r\n /**\r\n * * Return a number which is:\r\n * * 0 for collapsed (zero area) triangle\r\n * * positive for non-zero area\r\n * * larger is \"better\"\r\n * * Specifically, return (if well defined) the area divided by summed squares of edge lengths.\r\n * @param point0\r\n * @param point1\r\n * @param point2\r\n */\r\n public static spaceTriangleAspectRatio(point0: Point3d, point1: Point3d, point2: Point3d): number {\r\n const crossProduct = point0.crossProductToPoints (point1, point2);\r\n const area = 0.5 * crossProduct.magnitude ();\r\n const summedEdgeSquares = point0.distanceSquared (point1) + point1.distanceSquared (point2) + point2.distanceSquared (point0);\r\n return Geometry.safeDivideFraction (area, summedEdgeSquares, 0.0);\r\n }\r\n /**\r\n * * Treat a space quad as two triangles with interior diagonal from point0 to point2\r\n * * Return the smaller of the aspect ratios of the two triangles.\r\n * * The quad edges proceed in the order [point0, point1, point2, point3]\r\n * @param point0 first point of quad\r\n * @param point1 second point of quad (diagonally opposite of point3)\r\n * @param point2 third point (diagonally opposite point0)\r\n * @param point3 fourth point\r\n */\r\n public static spaceQuadDiagonalAspectRatio(point0: Point3d, point1: Point3d, point2: Point3d, point3: Point3d): number{\r\n const q012 = this.spaceTriangleAspectRatio (point0, point1, point2);\r\n const q023 = this.spaceTriangleAspectRatio (point0, point2, point3);\r\n return Math.max (q012, q023);\r\n }\r\n /** \"Triangulate\" by cutting of the ear with best aspect ratio. Reject if successive normals have negative dot product with PolygonOps.AreaNormal */\r\n public static triangulateGreedyEarCut(points: Point3d[], announceLoopAndTriangles: AnnounceLoopAndTrianglesFunction): boolean{\r\n const normalA = PolygonOps.areaNormal (points);\r\n const triangles: Point3d[][] = [];\r\n const myPoints = points.slice ();\r\n PolylineOps.removeClosurePoint (myPoints);\r\n // first pass deals with entire array.\r\n // each pass lops off one point.\r\n for (;myPoints.length > 2;){\r\n // Find the ear candidate whose cross product vector has largest dot product (large area, best alignment with overall).\r\n let bestRatio = -1.0;\r\n let bestRatioIndex0 = 0;\r\n let i0 = myPoints.length - 2;\r\n let i1 = myPoints.length - 1;\r\n let i2;\r\n for (i2 = 0; i2 < myPoints.length; i0 = i1, i1 = i2, i2++){\r\n const ratio = this.spaceTriangleAspectRatio (myPoints[i0], myPoints[i1], myPoints[i2]);\r\n const normalB = myPoints[i0].crossProductToPoints (myPoints[i1], myPoints[i2]);\r\n if (normalB.dotProduct (normalA) > 0 && ratio > bestRatio){\r\n bestRatio = ratio;\r\n bestRatioIndex0 = i0;\r\n }\r\n }\r\n if (bestRatio <= 0.0)\r\n return false;\r\n // add the ear to the result\r\n i0 = bestRatioIndex0;\r\n i1 = (i0 + 1) % myPoints.length;\r\n i2 = (i1 + 1) % myPoints.length;\r\n const t = [];\r\n t.push (myPoints[i0], myPoints[i1], myPoints[i2]);\r\n // remove the middle point\r\n myPoints.splice (i1, 1);\r\n triangles.push(t);\r\n }\r\n announceLoopAndTriangles (points, triangles);\r\n return true;\r\n }\r\n\r\n private static triangulateSimplestSpaceLoopGo(points: Point3d[], announceLoopAndTriangles: AnnounceLoopAndTrianglesFunction,\r\n maxPerimeter: number | undefined): boolean{\r\n const n = Point3dArray.countNonDuplicates (points);\r\n if (maxPerimeter !== undefined && Point3dArray.sumEdgeLengths (points, true, n) > maxPerimeter)\r\n return false;\r\n if (n < 3)\r\n return false;\r\n if (n === 3){\r\n if (this.spaceTriangleAspectRatio (points[0], points[1], points[2]) === 0)\r\n return false;\r\n // already a triangle . . .\r\n announceLoopAndTriangles (points, [points.slice ()]);\r\n return true;\r\n }\r\n if (n === 4){\r\n const d02 = this.spaceQuadDiagonalAspectRatio (points[0], points[1], points[2], points[3]);\r\n const d13 = this.spaceQuadDiagonalAspectRatio (points[1], points[2], points[3], points[0]);\r\n if (d02 === 0.0 && d13 === 0.0)\r\n return false;\r\n // announce the two triangles with better aspect ratios ....\r\n if (d02 > d13){\r\n announceLoopAndTriangles (points, [[points[0], points[1], points[2]], [points[2], points[3], points[0]]]);\r\n return true;\r\n } else {\r\n announceLoopAndTriangles (points, [[points[0], points[1], points[3]], [points[3], points[1], points[2]]]);\r\n return true;\r\n }\r\n }\r\n return this.triangulateGreedyEarCut (points, announceLoopAndTriangles);\r\n }\r\n /**\r\n * * Emit triangles for a (possibly non-planar) loop for various simple cases:\r\n * * only 3 points: just emit that triangle.\r\n * * only 4 points: split across a diagonal, choosing the one with better aspect ratios of its two triangles.\r\n * * BUT\r\n * * do not complete the triangulation if perimeter is larger than maxPerimeter (i.e. only consider small areas)\r\n * * Hence it is expected that the caller will use this as the first attempt, possibly followed by calls to other more adventurous methods.\r\n */\r\n public static triangulateSimplestSpaceLoop(loop: Point3d [] | LineString3d,\r\n announceLoopAndTriangles: AnnounceLoopAndTrianglesFunction,\r\n maxPerimeter?: number): boolean{\r\n if (loop instanceof LineString3d)\r\n return this.triangulateSimplestSpaceLoopGo (loop.points, announceLoopAndTriangles, maxPerimeter);\r\n // (array case by exhaustion)\r\n return this.triangulateSimplestSpaceLoopGo (loop, announceLoopAndTriangles, maxPerimeter);\r\n }\r\n\r\n}\r\n"]}
@@ -5,6 +5,7 @@ import { MarkedEdgeSet } from "./HalfEdgeMarkSet";
5
5
  import { InsertedVertexZOptions } from "./InsertAndRetriangulateContext";
6
6
  /**
7
7
  * Static methods for triangulating polygons and points.
8
+ * * Tolerances and tolerance usage are currently inconsistent, and not exposed to callers.
8
9
  * * @internal
9
10
  */
10
11
  export declare class Triangulator {
@@ -39,13 +40,12 @@ export declare class Triangulator {
39
40
  */
40
41
  static flipTrianglesInEdgeSet(graph: HalfEdgeGraph, edgeSet: MarkedEdgeSet): number;
41
42
  /**
42
- * Create a graph from an xy-triangulation of the given points.
43
+ * Create a graph from an xy-triangulation of the given points. The triangulation is Delaunay.
43
44
  * * The outer boundary of the graph is the xy-convex hull of the points; it is marked `HalfEdgeMask.EXTERIOR`.
44
- * @param points the points to triangulate
45
+ * @param points the points to triangulate.
45
46
  * @param zRule optional rule for updating the z-coordinate of an existing vertex when an xy-duplicate point is
46
47
  * inserted into the graph. Default is `InsertedVertexZOptions.ReplaceIfLarger`.
47
- * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is
48
- * `Geometry.smallMetricDistance`.
48
+ * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is `Geometry.smallMetricDistance`.
49
49
  */
50
50
  static createTriangulatedGraphFromPoints(points: Point3d[], zRule?: InsertedVertexZOptions, pointTolerance?: number): HalfEdgeGraph | undefined;
51
51
  /**
@@ -68,12 +68,14 @@ export declare class Triangulator {
68
68
  * * A random node is checked for each face; if it has the `HalfEdgeMask.EXTERIOR` mask, the face is ignored.
69
69
  * @param useLocalCoords whether to transform each face into local coords before triangulating.
70
70
  * This is useful if the graph has z-coordinates.
71
+ * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio.
72
+ * Ignored if `useLocalCoords` is true, in which case flipping is not performed to avoid out-of-plane effects.
71
73
  * @returns whether all indicated faces were triangulated successfully
72
74
  * @see [[triangulateAllPositiveAreaFaces]]
73
75
  */
74
- static triangulateAllInteriorFaces(graph: HalfEdgeGraph, useLocalCoords?: boolean): boolean;
76
+ static triangulateAllInteriorFaces(graph: HalfEdgeGraph, useLocalCoords?: boolean, noFlips?: boolean): boolean;
75
77
  /**
76
- * Triangulate the polygon made up of by a series of points.
78
+ * Triangulate the polygon made up of by a series of points. The triangulation is Delaunay.
77
79
  * * The loop may be either CCW or CW -- CCW order will be used for triangles.
78
80
  * * To triangulate a polygon with holes, use createTriangulatedGraphFromLoops.
79
81
  */
@@ -139,14 +141,15 @@ export declare class Triangulator {
139
141
  /**
140
142
  * Perform 0, 1, or more edge flips to improve aspect ratio just behind an ear that was just cut.
141
143
  * @param ear the triangle corner which just served as the ear node.
142
- * @returns the node at the back corner after flipping."appropriately positioned" node for the usual advance to ear.faceSuccessor.edgeMate.faceSuccessor.
144
+ * @returns the node at the back corner after flipping, "appropriately positioned" for the usual advance to `ear.faceSuccessor.edgeMate.faceSuccessor`.
143
145
  */
144
146
  private static doPostCutFlips;
145
147
  /**
146
148
  * Main ear slicing loop which triangulates the face starting at `ear`.
147
149
  * @param graph containing graph to receive new edges
148
150
  * @param ear sector at which to start triangulation of the containing face.
149
- * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio. Pass true if your graph isn't planar.
151
+ * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio.
152
+ * Pass true if your graph isn't planar; otherwise, an edge can be flipped out of plane if the neighboring triangle is non-coplanar.
150
153
  */
151
154
  private static triangulateSingleFace;
152
155
  /** @internal */
@@ -202,7 +205,7 @@ export declare class Triangulator {
202
205
  private static findHoleBridge;
203
206
  private static getLeftmost;
204
207
  /**
205
- * Check if a point lies within a triangle.
208
+ * Check if a point lies within or on a triangle.
206
209
  * * In other words, the areas of the 3 triangles formed by an edge of abc and p all have zero or positive area.
207
210
  */
208
211
  private static pointInTriangle;
@@ -213,8 +216,7 @@ export declare class Triangulator {
213
216
  * (This originates in classic earcut code.)
214
217
  */
215
218
  private static signedCWTriangleArea;
216
- /** signed area of a triangle, with small positive corrected to zero by relTol
217
- */
219
+ /** signed area of a triangle, with small positive corrected to zero by relTol */
218
220
  private static signedTolerancedCCWTriangleArea;
219
221
  /** check if two points are equal */
220
222
  private static isAlmostEqualXAndYXY;
@@ -1 +1 @@
1
- {"version":3,"file":"Triangulation.d.ts","sourceRoot":"","sources":["../../../src/topology/Triangulation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Triangulation.d.ts","sourceRoot":"","sources":["../../../src/topology/Triangulation.ts"],"names":[],"mappings":"AAYA,OAAO,EAAwB,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAE7H,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAMxD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAiC,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAExG;;;;GAIG;AACH,qBAAa,YAAY;IAEvB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAiBvC;;;;;;;;;;OAUG;WACW,8CAA8C,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAqDtF;;;;OAIG;WACW,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IASzD;;;;OAIG;WACW,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM;IA6B1F;;;;;;;OAOG;WACW,iCAAiC,CAC7C,MAAM,EAAE,OAAO,EAAE,EACjB,KAAK,GAAE,sBAA+D,EACtE,cAAc,GAAE,MAAqC,GACpD,aAAa,GAAG,SAAS;IAqB5B;;;;;OAKG;WACW,gCAAgC,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,aAAa,GAAG,SAAS;IA+CzG;;;;;OAKG;WACW,+BAA+B,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAc5E,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAY;IAE1C;;;;;;;;;OASG;WACW,2BAA2B,CAAC,KAAK,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO;IA+BrH;;;;OAIG;WACW,qCAAqC,CAAC,IAAI,EAAE,qBAAqB,GAAG,aAAa,GAAG,SAAS;IAW3G;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAkBhC,oEAAoE;IACpE,OAAO,CAAC,MAAM,CAAC,kBAAkB;IA2BjC;;;OAGG;WACW,mCAAmC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,qBAAqB,GAAG,QAAQ,GAAG,SAAS;IAgB1H;;;;;;OAMG;WACW,iCAAiC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,GAAE,MAAU,GAAG,QAAQ,EAAE;IAMnI;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAwBvC;;;;;;OAMG;WACW,6BAA6B,CACzC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,GACxG,QAAQ,GAAG,SAAS;IAUvB;;;;;;;;OAQG;WACW,qCAAqC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,OAAO,EACpI,gBAAgB,EAAE,YAAY,EAC9B,gBAAgB,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS;IAKvD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAWjC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAYjC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA0C7B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAkEpC,iBAAiB;IACjB,OAAO,CAAC,MAAM,CAAC,WAAW,CAA4B;IACtD,gBAAgB;IAChB,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAS;IAEhD;;;;mBAIe;WACD,eAAe,IAAI,aAAa,GAAG,SAAS;IAM1D;;;;mBAIe;WACD,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS;IAC5D;;;;;;;;;mBASe;WACD,+BAA+B,CAAC,KAAK,EAAE,OAAO;IAK5D;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAOnC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAwB;IACpD,OAAO,CAAC,MAAM,CAAC,SAAS,CAAwB;IAChD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAwB;IACjD,OAAO,CAAC,MAAM,CAAC,OAAO,CAIpB;IACF,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,KAAK;IA0DpB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAYzC,mEAAmE;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB,2FAA2F;IAC3F,OAAO,CAAC,MAAM,CAAC,aAAa;IAQ5B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA+D7B,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAK9B,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,cAAc;IAK7B;;;MAGE;IACF,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAInC,iFAAiF;IACjF,OAAO,CAAC,MAAM,CAAC,+BAA+B;IAe9C,oCAAoC;IACpC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAInC,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAAC,aAAa;IAM5B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAWxB;;;OAGG;WACW,6BAA6B,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO;CAuI5F"}
@@ -19,6 +19,7 @@ import { MarkedEdgeSet } from "./HalfEdgeMarkSet";
19
19
  import { InsertAndRetriangulateContext, InsertedVertexZOptions } from "./InsertAndRetriangulateContext";
20
20
  /**
21
21
  * Static methods for triangulating polygons and points.
22
+ * * Tolerances and tolerance usage are currently inconsistent, and not exposed to callers.
22
23
  * * @internal
23
24
  */
24
25
  export class Triangulator {
@@ -147,13 +148,12 @@ export class Triangulator {
147
148
  return numFlip;
148
149
  }
149
150
  /**
150
- * Create a graph from an xy-triangulation of the given points.
151
+ * Create a graph from an xy-triangulation of the given points. The triangulation is Delaunay.
151
152
  * * The outer boundary of the graph is the xy-convex hull of the points; it is marked `HalfEdgeMask.EXTERIOR`.
152
- * @param points the points to triangulate
153
+ * @param points the points to triangulate.
153
154
  * @param zRule optional rule for updating the z-coordinate of an existing vertex when an xy-duplicate point is
154
155
  * inserted into the graph. Default is `InsertedVertexZOptions.ReplaceIfLarger`.
155
- * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is
156
- * `Geometry.smallMetricDistance`.
156
+ * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is `Geometry.smallMetricDistance`.
157
157
  */
158
158
  static createTriangulatedGraphFromPoints(points, zRule = InsertedVertexZOptions.ReplaceIfLarger, pointTolerance = Geometry.smallMetricDistance) {
159
159
  if (points.length < 3)
@@ -253,12 +253,15 @@ export class Triangulator {
253
253
  * * A random node is checked for each face; if it has the `HalfEdgeMask.EXTERIOR` mask, the face is ignored.
254
254
  * @param useLocalCoords whether to transform each face into local coords before triangulating.
255
255
  * This is useful if the graph has z-coordinates.
256
+ * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio.
257
+ * Ignored if `useLocalCoords` is true, in which case flipping is not performed to avoid out-of-plane effects.
256
258
  * @returns whether all indicated faces were triangulated successfully
257
259
  * @see [[triangulateAllPositiveAreaFaces]]
258
260
  */
259
- static triangulateAllInteriorFaces(graph, useLocalCoords) {
261
+ static triangulateAllInteriorFaces(graph, useLocalCoords, noFlips) {
260
262
  const seeds = graph.collectFaceLoops();
261
263
  const visited = useLocalCoords ? graph.grabMask() : HalfEdgeMask.NULL_MASK;
264
+ noFlips = useLocalCoords || noFlips; // don't flip if using local coords
262
265
  let localToWorld;
263
266
  let nodes;
264
267
  let nodeCount = 0;
@@ -273,8 +276,7 @@ export class Triangulator {
273
276
  localToWorld = this._workTransform = FrameBuilder.createRightHandedLocalToWorld(nodes, this._workTransform);
274
277
  localToWorld?.multiplyInversePoint3dArrayInPlace(nodes);
275
278
  }
276
- // don't flip triangles if using local coords; an edge of this face can be flipped out of plane if the neighboring triangle is non-coplanar.
277
- if (!Triangulator.triangulateSingleFace(graph, face, useLocalCoords))
279
+ if (!Triangulator.triangulateSingleFace(graph, face, noFlips))
278
280
  numFail++;
279
281
  if (localToWorld && nodes) {
280
282
  for (let iNewNode = nodeCount; iNewNode < graph.countNodes(); ++iNewNode)
@@ -287,7 +289,7 @@ export class Triangulator {
287
289
  return numFail === 0;
288
290
  }
289
291
  /**
290
- * Triangulate the polygon made up of by a series of points.
292
+ * Triangulate the polygon made up of by a series of points. The triangulation is Delaunay.
291
293
  * * The loop may be either CCW or CW -- CCW order will be used for triangles.
292
294
  * * To triangulate a polygon with holes, use createTriangulatedGraphFromLoops.
293
295
  */
@@ -472,31 +474,32 @@ export class Triangulator {
472
474
  /**
473
475
  * Perform 0, 1, or more edge flips to improve aspect ratio just behind an ear that was just cut.
474
476
  * @param ear the triangle corner which just served as the ear node.
475
- * @returns the node at the back corner after flipping."appropriately positioned" node for the usual advance to ear.faceSuccessor.edgeMate.faceSuccessor.
477
+ * @returns the node at the back corner after flipping, "appropriately positioned" for the usual advance to `ear.faceSuccessor.edgeMate.faceSuccessor`.
476
478
  */
477
479
  static doPostCutFlips(ear) {
478
- // B is the ear -- inside a (probably newly created) triangle ABC
479
- // CA is the recently added cut edge.
480
- // AB is the candidate to be flipped.
481
- // triangle B1 A1 D is on the other side of AB
482
- // The condition for flipping is:
483
- // ! both triangles must be TRIANGULATED_NODE_MASK
484
- // ! circumcircle condition flags D as in the circle of ABC
485
- // after flip, node A moves to the vertex of D, and is the effective "ear", with the cap edge C A1
486
- // after flip, consider the A1 D (whose nodes are A1 and flipped A!!!)
480
+ // B0 is at the ear vertex, inside ear triangle T = A0 B0 C.
481
+ // C is the recently cut edge added to form the ear cap.
482
+ // A0/B1 is the quad diagonal edge candidate to be flipped.
483
+ // Triangle T' = B1 A1 D1 is on the other side of the quad diagonal.
484
+ // The conditions for flipping are:
485
+ // * both triangles T, T' must be masked with TRIANGULATED_FACE
486
+ // * the Delaunay circumcircle condition flags the vertex at D1 as in the circumcircle of T
487
+ // After flip, node A0 becomes D1.vertexSuccessor, and is the effective "ear", with (same) cap edge C.
488
+ // The next quad diagonal edge candidate to consider in the loop is A1/D0.
487
489
  //
488
- // * *
489
- // . C0| . / |
490
- // . | . C0 /B1|
491
- // . | . /v |
492
- // . ^| . / |
493
- // . A0 ----> B0| . / ^|
494
- // *=======================* --> * A1 / B0*
495
- // \ A1 <---- B1/ \ / /
496
- // \ / \ / /
497
- // \ / \ ^/ D1/
498
- // \ D1 / \A0/ /
499
- // * *
490
+ // * *
491
+ // . C| . / |
492
+ // . | . C/B1|
493
+ // . | . / |
494
+ // . | . / |
495
+ // . A0 ----> B0| . / |
496
+ // *=====================* --> * A1 / B0 *
497
+ // \ A1 <---- B1 / \ / /
498
+ // \ / \ / /
499
+ // \ / \ / /
500
+ // \ / \ A0/D1/
501
+ // D0 \D1/ D0 \/ /
502
+ // * *
500
503
  let b0 = ear;
501
504
  let a0 = b0.facePredecessor;
502
505
  let b1 = a0.edgeMate;
@@ -510,6 +513,7 @@ export class Triangulator {
510
513
  b0 = a0;
511
514
  a0 = b0.facePredecessor;
512
515
  b1 = a0.edgeMate;
516
+ // Move to next quad with diagonal a0/b1
513
517
  }
514
518
  return b0;
515
519
  }
@@ -517,7 +521,8 @@ export class Triangulator {
517
521
  * Main ear slicing loop which triangulates the face starting at `ear`.
518
522
  * @param graph containing graph to receive new edges
519
523
  * @param ear sector at which to start triangulation of the containing face.
520
- * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio. Pass true if your graph isn't planar.
524
+ * @param noFlips if false (default) perform edge-flipping after each ear cut for better aspect ratio.
525
+ * Pass true if your graph isn't planar; otherwise, an edge can be flipped out of plane if the neighboring triangle is non-coplanar.
521
526
  */
522
527
  static triangulateSingleFace(graph, ear, noFlips = false) {
523
528
  if (!ear) {
@@ -545,7 +550,7 @@ export class Triangulator {
545
550
  // The earcut algorithm does not support self intersections, however we do handle the re-entrant triangle
546
551
  // case by pinching a bridge/hole into existence when vertices i and i+3 live in the same face loop, but not
547
552
  // the same vertex loop. Earcut whittles larger faces down into triangles, so this is the only case needed.
548
- if (Geometry.isAlmostEqualXAndY(next2, pred) && !next2.findAroundVertex(pred)) {
553
+ if (Triangulator.isAlmostEqualXAndYXY(next2, pred.x, pred.y) && !next2.findAroundVertex(pred)) {
549
554
  const next3 = next2.faceSuccessor;
550
555
  const hasBridgeEdgeOrHoleInside = this.nodeInTriangle(pred, ear, next, next3);
551
556
  if (hasBridgeEdgeOrHoleInside) {
@@ -628,7 +633,7 @@ export class Triangulator {
628
633
  static findAroundOrAtVertex(a, b) {
629
634
  if (a.findAroundVertex(b))
630
635
  return true;
631
- return Geometry.isAlmostEqualXAndY(a, b);
636
+ return Triangulator.isAlmostEqualXAndYXY(a, b.x, b.y);
632
637
  }
633
638
  // for reuse over all calls to isEar ....
634
639
  static _edgeInterval = Range1d.createNull();
@@ -795,7 +800,7 @@ export class Triangulator {
795
800
  return leftmost;
796
801
  }
797
802
  /**
798
- * Check if a point lies within a triangle.
803
+ * Check if a point lies within or on a triangle.
799
804
  * * In other words, the areas of the 3 triangles formed by an edge of abc and p all have zero or positive area.
800
805
  */
801
806
  static pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
@@ -816,8 +821,7 @@ export class Triangulator {
816
821
  static signedCWTriangleArea(p, q, r) {
817
822
  return 0.5 * ((q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y));
818
823
  }
819
- /** signed area of a triangle, with small positive corrected to zero by relTol
820
- */
824
+ /** signed area of a triangle, with small positive corrected to zero by relTol */
821
825
  static signedTolerancedCCWTriangleArea(p, q, r, relTol = 1.0e-12) {
822
826
  const ux = q.x - p.x;
823
827
  const uy = q.y - p.y;