@itwin/core-geometry 5.1.0-dev.9 → 5.2.0-dev.2

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 (598) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/lib/cjs/Geometry.d.ts +18 -10
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +13 -3
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/BSpline1dNd.d.ts +1 -1
  7. package/lib/cjs/bspline/BSpline1dNd.js +1 -1
  8. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  10. package/lib/cjs/bspline/BSplineCurve.js +7 -1
  11. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  12. package/lib/cjs/bspline/BSplineSurface.d.ts +4 -3
  13. package/lib/cjs/bspline/BSplineSurface.d.ts.map +1 -1
  14. package/lib/cjs/bspline/BSplineSurface.js +4 -5
  15. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  16. package/lib/cjs/clipping/ClipPlane.d.ts +7 -5
  17. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  18. package/lib/cjs/clipping/ClipPlane.js +9 -5
  19. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  20. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  21. package/lib/cjs/clipping/ClipUtils.js +5 -3
  22. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  23. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +1 -2
  24. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  25. package/lib/cjs/clipping/ConvexClipPlaneSet.js +13 -25
  26. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  27. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +1 -2
  28. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  29. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +1 -2
  30. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  31. package/lib/cjs/core-geometry.d.ts +2 -0
  32. package/lib/cjs/core-geometry.d.ts.map +1 -1
  33. package/lib/cjs/core-geometry.js +2 -0
  34. package/lib/cjs/core-geometry.js.map +1 -1
  35. package/lib/cjs/curve/Arc3d.d.ts +54 -32
  36. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  37. package/lib/cjs/curve/Arc3d.js +56 -37
  38. package/lib/cjs/curve/Arc3d.js.map +1 -1
  39. package/lib/cjs/curve/CurveCollection.d.ts +40 -1
  40. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  41. package/lib/cjs/curve/CurveCollection.js +90 -0
  42. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  43. package/lib/cjs/curve/CurveFactory.d.ts +3 -2
  44. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  45. package/lib/cjs/curve/CurveFactory.js +6 -5
  46. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  47. package/lib/cjs/curve/CurveLocationDetail.d.ts +27 -25
  48. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  49. package/lib/cjs/curve/CurveLocationDetail.js +30 -25
  50. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  51. package/lib/cjs/curve/CurvePrimitive.d.ts +9 -2
  52. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  53. package/lib/cjs/curve/CurvePrimitive.js +11 -0
  54. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  55. package/lib/cjs/curve/CurveTypes.d.ts +1 -1
  56. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  57. package/lib/cjs/curve/LineSegment3d.d.ts +2 -0
  58. package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
  59. package/lib/cjs/curve/LineSegment3d.js +4 -0
  60. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  61. package/lib/cjs/curve/LineString3d.d.ts +7 -0
  62. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  63. package/lib/cjs/curve/LineString3d.js +15 -3
  64. package/lib/cjs/curve/LineString3d.js.map +1 -1
  65. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  66. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +37 -8
  67. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  68. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +34 -8
  69. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  70. package/lib/cjs/curve/Query/PlanarSubdivision.js +129 -33
  71. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  72. package/lib/cjs/curve/Query/StrokeCountChain.d.ts +4 -3
  73. package/lib/cjs/curve/Query/StrokeCountChain.d.ts.map +1 -1
  74. package/lib/cjs/curve/Query/StrokeCountChain.js +20 -9
  75. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  76. package/lib/cjs/curve/RegionMomentsXY.d.ts +2 -1
  77. package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
  78. package/lib/cjs/curve/RegionMomentsXY.js +26 -41
  79. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  80. package/lib/cjs/curve/RegionOps.d.ts +74 -39
  81. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  82. package/lib/cjs/curve/RegionOps.js +146 -46
  83. package/lib/cjs/curve/RegionOps.js.map +1 -1
  84. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +36 -27
  85. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  86. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +161 -55
  87. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  88. package/lib/cjs/curve/StrokeOptions.d.ts +1 -1
  89. package/lib/cjs/curve/StrokeOptions.js +1 -1
  90. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  91. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  92. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +2 -2
  93. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +6 -6
  94. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  95. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +0 -1
  96. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  97. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +58 -32
  98. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  99. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  100. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +0 -1
  101. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  102. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.d.ts +14 -0
  103. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.d.ts.map +1 -0
  104. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js +34 -0
  105. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -0
  106. package/lib/cjs/geometry3d/AngleSweep.d.ts +25 -18
  107. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  108. package/lib/cjs/geometry3d/AngleSweep.js +32 -18
  109. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  110. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts +8 -7
  111. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  112. package/lib/cjs/geometry3d/CoincidentGeometryOps.js +19 -25
  113. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  114. package/lib/cjs/geometry3d/Ellipsoid.js +1 -1
  115. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  116. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
  117. package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
  118. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  119. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +8 -3
  120. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  121. package/lib/cjs/geometry3d/GrowableXYZArray.js +21 -3
  122. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  123. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +11 -1
  124. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  125. package/lib/cjs/geometry3d/IndexedXYZCollection.js +21 -3
  126. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  127. package/lib/cjs/geometry3d/Plane3d.d.ts +2 -0
  128. package/lib/cjs/geometry3d/Plane3d.d.ts.map +1 -1
  129. package/lib/cjs/geometry3d/Plane3d.js +6 -1
  130. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  131. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  132. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  133. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  134. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  135. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  136. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  137. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  138. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  139. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  140. package/lib/cjs/geometry3d/Point2dVector2d.js +0 -2
  141. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  142. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +4 -4
  143. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  144. package/lib/cjs/geometry3d/Point3dVector3d.js +4 -5
  145. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  146. package/lib/cjs/geometry3d/PointHelpers.d.ts +7 -7
  147. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  148. package/lib/cjs/geometry3d/PointHelpers.js +66 -26
  149. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  150. package/lib/cjs/geometry3d/PolygonOps.d.ts +49 -2
  151. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  152. package/lib/cjs/geometry3d/PolygonOps.js +38 -2
  153. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  154. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  155. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  156. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  157. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  158. package/lib/cjs/geometry3d/PolylineOps.d.ts +5 -4
  159. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  160. package/lib/cjs/geometry3d/PolylineOps.js +5 -4
  161. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  162. package/lib/cjs/geometry3d/Range.d.ts +18 -10
  163. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  164. package/lib/cjs/geometry3d/Range.js +32 -10
  165. package/lib/cjs/geometry3d/Range.js.map +1 -1
  166. package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
  167. package/lib/cjs/geometry3d/Ray2d.js +0 -1
  168. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  169. package/lib/cjs/geometry3d/Ray3d.d.ts +7 -9
  170. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  171. package/lib/cjs/geometry3d/Ray3d.js +23 -45
  172. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  173. package/lib/cjs/geometry3d/ReusableObjectCache.d.ts +39 -29
  174. package/lib/cjs/geometry3d/ReusableObjectCache.d.ts.map +1 -1
  175. package/lib/cjs/geometry3d/ReusableObjectCache.js +49 -35
  176. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  177. package/lib/cjs/geometry3d/SortablePolygon.d.ts +1 -4
  178. package/lib/cjs/geometry3d/SortablePolygon.d.ts.map +1 -1
  179. package/lib/cjs/geometry3d/SortablePolygon.js +48 -43
  180. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  181. package/lib/cjs/geometry3d/Transform.d.ts +21 -2
  182. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  183. package/lib/cjs/geometry3d/Transform.js +32 -13
  184. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  185. package/lib/cjs/geometry4d/Point4d.d.ts +8 -5
  186. package/lib/cjs/geometry4d/Point4d.d.ts.map +1 -1
  187. package/lib/cjs/geometry4d/Point4d.js +27 -16
  188. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  189. package/lib/cjs/numerics/BezierPolynomials.d.ts +2 -0
  190. package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
  191. package/lib/cjs/numerics/BezierPolynomials.js +11 -0
  192. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  193. package/lib/cjs/numerics/SmallSystem.d.ts +77 -36
  194. package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
  195. package/lib/cjs/numerics/SmallSystem.js +129 -73
  196. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  197. package/lib/cjs/polyface/FacetOrientation.d.ts +1 -1
  198. package/lib/cjs/polyface/FacetOrientation.js +1 -1
  199. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  200. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts +55 -40
  201. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  202. package/lib/cjs/polyface/IndexedEdgeMatcher.js +83 -75
  203. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  204. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  205. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  206. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +47 -38
  207. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  208. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  209. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  210. package/lib/cjs/polyface/IndexedPolyfaceWalker.js +51 -32
  211. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  212. package/lib/cjs/polyface/Polyface.d.ts +19 -5
  213. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  214. package/lib/cjs/polyface/Polyface.js +18 -2
  215. package/lib/cjs/polyface/Polyface.js.map +1 -1
  216. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +1 -1
  217. package/lib/cjs/polyface/PolyfaceBuilder.js +6 -6
  218. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  219. package/lib/cjs/polyface/PolyfaceClip.d.ts +19 -18
  220. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  221. package/lib/cjs/polyface/PolyfaceClip.js +39 -42
  222. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  223. package/lib/cjs/polyface/PolyfaceData.d.ts +1 -1
  224. package/lib/cjs/polyface/PolyfaceData.js +1 -1
  225. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  226. package/lib/cjs/polyface/PolyfaceQuery.d.ts +119 -78
  227. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  228. package/lib/cjs/polyface/PolyfaceQuery.js +315 -231
  229. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  230. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  231. package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  232. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +3 -3
  233. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  234. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  235. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  236. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  237. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  238. package/lib/cjs/serialization/BGFBReader.d.ts.map +1 -1
  239. package/lib/cjs/serialization/BGFBReader.js +2 -3
  240. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  241. package/lib/cjs/serialization/BGFBWriter.d.ts.map +1 -1
  242. package/lib/cjs/serialization/BGFBWriter.js +2 -4
  243. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  244. package/lib/cjs/serialization/GeometrySamples.d.ts +1 -1
  245. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  246. package/lib/cjs/serialization/GeometrySamples.js +3 -3
  247. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  248. package/lib/cjs/serialization/IModelJsonSchema.d.ts +3 -3
  249. package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
  250. package/lib/cjs/serialization/IModelJsonSchema.js +5 -5
  251. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  252. package/lib/cjs/solid/Box.d.ts.map +1 -1
  253. package/lib/cjs/solid/Box.js +7 -0
  254. package/lib/cjs/solid/Box.js.map +1 -1
  255. package/lib/cjs/solid/Cone.d.ts.map +1 -1
  256. package/lib/cjs/solid/Cone.js +6 -0
  257. package/lib/cjs/solid/Cone.js.map +1 -1
  258. package/lib/cjs/solid/LinearSweep.d.ts +2 -3
  259. package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
  260. package/lib/cjs/solid/LinearSweep.js +11 -7
  261. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  262. package/lib/cjs/solid/RotationalSweep.d.ts +2 -2
  263. package/lib/cjs/solid/RotationalSweep.js +2 -2
  264. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  265. package/lib/cjs/solid/RuledSweep.d.ts +1 -1
  266. package/lib/cjs/solid/RuledSweep.d.ts.map +1 -1
  267. package/lib/cjs/solid/RuledSweep.js +5 -1
  268. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  269. package/lib/cjs/solid/Sphere.d.ts.map +1 -1
  270. package/lib/cjs/solid/Sphere.js +6 -3
  271. package/lib/cjs/solid/Sphere.js.map +1 -1
  272. package/lib/cjs/solid/SweepContour.d.ts +1 -1
  273. package/lib/cjs/solid/SweepContour.js +1 -1
  274. package/lib/cjs/solid/SweepContour.js.map +1 -1
  275. package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
  276. package/lib/cjs/solid/TorusPipe.js +4 -0
  277. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  278. package/lib/cjs/topology/ChainMerge.d.ts +1 -1
  279. package/lib/cjs/topology/ChainMerge.js +1 -1
  280. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  281. package/lib/cjs/topology/Graph.d.ts +64 -14
  282. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  283. package/lib/cjs/topology/Graph.js +149 -32
  284. package/lib/cjs/topology/Graph.js.map +1 -1
  285. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +3 -2
  286. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  287. package/lib/cjs/topology/HalfEdgeGraphSearch.js +3 -2
  288. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  289. package/lib/cjs/topology/Merging.d.ts +0 -1
  290. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  291. package/lib/cjs/topology/Merging.js +49 -46
  292. package/lib/cjs/topology/Merging.js.map +1 -1
  293. package/lib/cjs/topology/RegularizeFace.d.ts.map +1 -1
  294. package/lib/cjs/topology/RegularizeFace.js +2 -1
  295. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  296. package/lib/cjs/topology/Triangulation.d.ts +9 -14
  297. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  298. package/lib/cjs/topology/Triangulation.js +29 -22
  299. package/lib/cjs/topology/Triangulation.js.map +1 -1
  300. package/lib/esm/Geometry.d.ts +18 -10
  301. package/lib/esm/Geometry.d.ts.map +1 -1
  302. package/lib/esm/Geometry.js +13 -3
  303. package/lib/esm/Geometry.js.map +1 -1
  304. package/lib/esm/bspline/BSpline1dNd.d.ts +1 -1
  305. package/lib/esm/bspline/BSpline1dNd.js +1 -1
  306. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  307. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  308. package/lib/esm/bspline/BSplineCurve.js +7 -1
  309. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  310. package/lib/esm/bspline/BSplineSurface.d.ts +4 -3
  311. package/lib/esm/bspline/BSplineSurface.d.ts.map +1 -1
  312. package/lib/esm/bspline/BSplineSurface.js +4 -5
  313. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  314. package/lib/esm/clipping/ClipPlane.d.ts +7 -5
  315. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  316. package/lib/esm/clipping/ClipPlane.js +9 -5
  317. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  318. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  319. package/lib/esm/clipping/ClipUtils.js +5 -3
  320. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  321. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +1 -2
  322. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  323. package/lib/esm/clipping/ConvexClipPlaneSet.js +13 -25
  324. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  325. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +1 -2
  326. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
  327. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +1 -2
  328. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  329. package/lib/esm/core-geometry.d.ts +2 -0
  330. package/lib/esm/core-geometry.d.ts.map +1 -1
  331. package/lib/esm/core-geometry.js +2 -0
  332. package/lib/esm/core-geometry.js.map +1 -1
  333. package/lib/esm/curve/Arc3d.d.ts +54 -32
  334. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  335. package/lib/esm/curve/Arc3d.js +56 -37
  336. package/lib/esm/curve/Arc3d.js.map +1 -1
  337. package/lib/esm/curve/CurveCollection.d.ts +40 -1
  338. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  339. package/lib/esm/curve/CurveCollection.js +90 -0
  340. package/lib/esm/curve/CurveCollection.js.map +1 -1
  341. package/lib/esm/curve/CurveFactory.d.ts +3 -2
  342. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  343. package/lib/esm/curve/CurveFactory.js +6 -5
  344. package/lib/esm/curve/CurveFactory.js.map +1 -1
  345. package/lib/esm/curve/CurveLocationDetail.d.ts +27 -25
  346. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  347. package/lib/esm/curve/CurveLocationDetail.js +30 -25
  348. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  349. package/lib/esm/curve/CurvePrimitive.d.ts +9 -2
  350. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  351. package/lib/esm/curve/CurvePrimitive.js +11 -0
  352. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  353. package/lib/esm/curve/CurveTypes.d.ts +1 -1
  354. package/lib/esm/curve/CurveTypes.js.map +1 -1
  355. package/lib/esm/curve/LineSegment3d.d.ts +2 -0
  356. package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
  357. package/lib/esm/curve/LineSegment3d.js +4 -0
  358. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  359. package/lib/esm/curve/LineString3d.d.ts +7 -0
  360. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  361. package/lib/esm/curve/LineString3d.js +15 -3
  362. package/lib/esm/curve/LineString3d.js.map +1 -1
  363. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
  364. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +37 -8
  365. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  366. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +34 -8
  367. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  368. package/lib/esm/curve/Query/PlanarSubdivision.js +131 -35
  369. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  370. package/lib/esm/curve/Query/StrokeCountChain.d.ts +4 -3
  371. package/lib/esm/curve/Query/StrokeCountChain.d.ts.map +1 -1
  372. package/lib/esm/curve/Query/StrokeCountChain.js +20 -9
  373. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  374. package/lib/esm/curve/RegionMomentsXY.d.ts +2 -1
  375. package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
  376. package/lib/esm/curve/RegionMomentsXY.js +26 -41
  377. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  378. package/lib/esm/curve/RegionOps.d.ts +74 -39
  379. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  380. package/lib/esm/curve/RegionOps.js +146 -46
  381. package/lib/esm/curve/RegionOps.js.map +1 -1
  382. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +36 -27
  383. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  384. package/lib/esm/curve/RegionOpsClassificationSweeps.js +161 -56
  385. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  386. package/lib/esm/curve/StrokeOptions.d.ts +1 -1
  387. package/lib/esm/curve/StrokeOptions.js +1 -1
  388. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  389. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  390. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +2 -2
  391. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +6 -6
  392. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  393. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +0 -1
  394. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  395. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +58 -32
  396. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  397. package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
  398. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +0 -1
  399. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  400. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.d.ts +14 -0
  401. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.d.ts.map +1 -0
  402. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js +30 -0
  403. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -0
  404. package/lib/esm/geometry3d/AngleSweep.d.ts +25 -18
  405. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  406. package/lib/esm/geometry3d/AngleSweep.js +32 -18
  407. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  408. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts +8 -7
  409. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  410. package/lib/esm/geometry3d/CoincidentGeometryOps.js +19 -25
  411. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  412. package/lib/esm/geometry3d/Ellipsoid.js +1 -1
  413. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  414. package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
  415. package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
  416. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  417. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +8 -3
  418. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  419. package/lib/esm/geometry3d/GrowableXYZArray.js +21 -3
  420. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  421. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +11 -1
  422. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  423. package/lib/esm/geometry3d/IndexedXYZCollection.js +21 -3
  424. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  425. package/lib/esm/geometry3d/Plane3d.d.ts +2 -0
  426. package/lib/esm/geometry3d/Plane3d.d.ts.map +1 -1
  427. package/lib/esm/geometry3d/Plane3d.js +6 -1
  428. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  429. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts +2 -0
  430. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.d.ts.map +1 -1
  431. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +6 -1
  432. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  433. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts +8 -2
  434. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
  435. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js +18 -10
  436. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  437. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  438. package/lib/esm/geometry3d/Point2dVector2d.js +0 -2
  439. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  440. package/lib/esm/geometry3d/Point3dVector3d.d.ts +4 -4
  441. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  442. package/lib/esm/geometry3d/Point3dVector3d.js +4 -5
  443. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  444. package/lib/esm/geometry3d/PointHelpers.d.ts +7 -7
  445. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  446. package/lib/esm/geometry3d/PointHelpers.js +66 -26
  447. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  448. package/lib/esm/geometry3d/PolygonOps.d.ts +49 -2
  449. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  450. package/lib/esm/geometry3d/PolygonOps.js +38 -2
  451. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  452. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +13 -6
  453. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
  454. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +16 -9
  455. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  456. package/lib/esm/geometry3d/PolylineOps.d.ts +5 -4
  457. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  458. package/lib/esm/geometry3d/PolylineOps.js +5 -4
  459. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  460. package/lib/esm/geometry3d/Range.d.ts +18 -10
  461. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  462. package/lib/esm/geometry3d/Range.js +32 -10
  463. package/lib/esm/geometry3d/Range.js.map +1 -1
  464. package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
  465. package/lib/esm/geometry3d/Ray2d.js +0 -1
  466. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  467. package/lib/esm/geometry3d/Ray3d.d.ts +7 -9
  468. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  469. package/lib/esm/geometry3d/Ray3d.js +23 -45
  470. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  471. package/lib/esm/geometry3d/ReusableObjectCache.d.ts +39 -29
  472. package/lib/esm/geometry3d/ReusableObjectCache.d.ts.map +1 -1
  473. package/lib/esm/geometry3d/ReusableObjectCache.js +47 -33
  474. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  475. package/lib/esm/geometry3d/SortablePolygon.d.ts +1 -4
  476. package/lib/esm/geometry3d/SortablePolygon.d.ts.map +1 -1
  477. package/lib/esm/geometry3d/SortablePolygon.js +48 -43
  478. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  479. package/lib/esm/geometry3d/Transform.d.ts +21 -2
  480. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  481. package/lib/esm/geometry3d/Transform.js +32 -13
  482. package/lib/esm/geometry3d/Transform.js.map +1 -1
  483. package/lib/esm/geometry4d/Point4d.d.ts +8 -5
  484. package/lib/esm/geometry4d/Point4d.d.ts.map +1 -1
  485. package/lib/esm/geometry4d/Point4d.js +27 -16
  486. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  487. package/lib/esm/numerics/BezierPolynomials.d.ts +2 -0
  488. package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
  489. package/lib/esm/numerics/BezierPolynomials.js +11 -0
  490. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  491. package/lib/esm/numerics/SmallSystem.d.ts +77 -36
  492. package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
  493. package/lib/esm/numerics/SmallSystem.js +129 -73
  494. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  495. package/lib/esm/polyface/FacetOrientation.d.ts +1 -1
  496. package/lib/esm/polyface/FacetOrientation.js +1 -1
  497. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  498. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts +55 -40
  499. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  500. package/lib/esm/polyface/IndexedEdgeMatcher.js +83 -75
  501. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  502. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +15 -14
  503. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  504. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +47 -38
  505. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  506. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts +26 -19
  507. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts.map +1 -1
  508. package/lib/esm/polyface/IndexedPolyfaceWalker.js +51 -32
  509. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  510. package/lib/esm/polyface/Polyface.d.ts +19 -5
  511. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  512. package/lib/esm/polyface/Polyface.js +18 -2
  513. package/lib/esm/polyface/Polyface.js.map +1 -1
  514. package/lib/esm/polyface/PolyfaceBuilder.d.ts +1 -1
  515. package/lib/esm/polyface/PolyfaceBuilder.js +6 -6
  516. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  517. package/lib/esm/polyface/PolyfaceClip.d.ts +19 -18
  518. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  519. package/lib/esm/polyface/PolyfaceClip.js +39 -42
  520. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  521. package/lib/esm/polyface/PolyfaceData.d.ts +1 -1
  522. package/lib/esm/polyface/PolyfaceData.js +1 -1
  523. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  524. package/lib/esm/polyface/PolyfaceQuery.d.ts +119 -78
  525. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  526. package/lib/esm/polyface/PolyfaceQuery.js +316 -232
  527. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  528. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +3 -3
  529. package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
  530. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +3 -3
  531. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  532. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +7 -6
  533. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  534. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +8 -9
  535. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  536. package/lib/esm/serialization/BGFBReader.d.ts.map +1 -1
  537. package/lib/esm/serialization/BGFBReader.js +2 -3
  538. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  539. package/lib/esm/serialization/BGFBWriter.d.ts.map +1 -1
  540. package/lib/esm/serialization/BGFBWriter.js +2 -4
  541. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  542. package/lib/esm/serialization/GeometrySamples.d.ts +1 -1
  543. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  544. package/lib/esm/serialization/GeometrySamples.js +3 -3
  545. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  546. package/lib/esm/serialization/IModelJsonSchema.d.ts +3 -3
  547. package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
  548. package/lib/esm/serialization/IModelJsonSchema.js +5 -5
  549. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  550. package/lib/esm/solid/Box.d.ts.map +1 -1
  551. package/lib/esm/solid/Box.js +7 -0
  552. package/lib/esm/solid/Box.js.map +1 -1
  553. package/lib/esm/solid/Cone.d.ts.map +1 -1
  554. package/lib/esm/solid/Cone.js +6 -0
  555. package/lib/esm/solid/Cone.js.map +1 -1
  556. package/lib/esm/solid/LinearSweep.d.ts +2 -3
  557. package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
  558. package/lib/esm/solid/LinearSweep.js +11 -7
  559. package/lib/esm/solid/LinearSweep.js.map +1 -1
  560. package/lib/esm/solid/RotationalSweep.d.ts +2 -2
  561. package/lib/esm/solid/RotationalSweep.js +2 -2
  562. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  563. package/lib/esm/solid/RuledSweep.d.ts +1 -1
  564. package/lib/esm/solid/RuledSweep.d.ts.map +1 -1
  565. package/lib/esm/solid/RuledSweep.js +5 -1
  566. package/lib/esm/solid/RuledSweep.js.map +1 -1
  567. package/lib/esm/solid/Sphere.d.ts.map +1 -1
  568. package/lib/esm/solid/Sphere.js +6 -3
  569. package/lib/esm/solid/Sphere.js.map +1 -1
  570. package/lib/esm/solid/SweepContour.d.ts +1 -1
  571. package/lib/esm/solid/SweepContour.js +1 -1
  572. package/lib/esm/solid/SweepContour.js.map +1 -1
  573. package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
  574. package/lib/esm/solid/TorusPipe.js +4 -0
  575. package/lib/esm/solid/TorusPipe.js.map +1 -1
  576. package/lib/esm/topology/ChainMerge.d.ts +1 -1
  577. package/lib/esm/topology/ChainMerge.js +1 -1
  578. package/lib/esm/topology/ChainMerge.js.map +1 -1
  579. package/lib/esm/topology/Graph.d.ts +64 -14
  580. package/lib/esm/topology/Graph.d.ts.map +1 -1
  581. package/lib/esm/topology/Graph.js +149 -32
  582. package/lib/esm/topology/Graph.js.map +1 -1
  583. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +3 -2
  584. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
  585. package/lib/esm/topology/HalfEdgeGraphSearch.js +3 -2
  586. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  587. package/lib/esm/topology/Merging.d.ts +0 -1
  588. package/lib/esm/topology/Merging.d.ts.map +1 -1
  589. package/lib/esm/topology/Merging.js +49 -46
  590. package/lib/esm/topology/Merging.js.map +1 -1
  591. package/lib/esm/topology/RegularizeFace.d.ts.map +1 -1
  592. package/lib/esm/topology/RegularizeFace.js +2 -1
  593. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  594. package/lib/esm/topology/Triangulation.d.ts +9 -14
  595. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  596. package/lib/esm/topology/Triangulation.js +29 -22
  597. package/lib/esm/topology/Triangulation.js.map +1 -1
  598. package/package.json +7 -6
@@ -1 +1 @@
1
- {"version":3,"file":"AngleSweep.js","sourceRoot":"","sources":["../../../src/geometry3d/AngleSweep.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/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { AngleSweepProps, BeJSONFunctions, Geometry } from \"../Geometry\";\nimport { Angle } from \"./Angle\";\nimport { GrowableFloat64Array } from \"./GrowableFloat64Array\";\n\n/**\n * An `AngleSweep` is a pair of angles at start and end of an interval.\n *\n * * For stroking purposes, the \"included interval\" is all angles numerically reached\n * by theta = start + f*(end-start), where f is between 0 and 1.\n * * This stroking formula is simple numbers -- 2PI shifts are not involved.\n * * 2PI shifts do become important in the reverse mapping of an angle to a fraction.\n * * If \"start < end\" the angle proceeds CCW around the unit circle.\n * * If \"end < start\" the angle proceeds CW around the unit circle.\n * * Angles beyond 360 are fine as endpoints.\n * * (350,370) covers the same unit angles as (-10,10).\n * * (370,350) covers the same unit angles as (10,-10).\n * * math details related fraction API can be found at docs/learning/geometry/Angle.md\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/AngleSweep\n * @public\n */\nexport class AngleSweep implements BeJSONFunctions {\n private _radians0: number;\n private _radians1: number;\n /** Read-property for degrees at the start of this AngleSweep. */\n public get startDegrees() {\n return Angle.radiansToDegrees(this._radians0);\n }\n /** Read-property for degrees at the end of this AngleSweep. */\n public get endDegrees() {\n return Angle.radiansToDegrees(this._radians1);\n }\n /** Read-property for signed start-to-end sweep in degrees. */\n public get sweepDegrees() {\n return Angle.radiansToDegrees(this.sweepRadians);\n }\n /** Read-property for degrees at the start of this AngleSweep. */\n public get startRadians() {\n return this._radians0;\n }\n /** Read-property for degrees at the end of this AngleSweep. */\n public get endRadians() {\n return this._radians1;\n }\n /** Read-property for signed start-to-end sweep in radians. */\n public get sweepRadians() {\n return this._radians1 - this._radians0;\n }\n /** Whether the sweep angles are within smallAngle tolerance, without period shift. */\n public get isEmpty() {\n return Angle.isAlmostEqualRadiansNoPeriodShift(0, this.sweepRadians);\n }\n /** Return the (strongly typed) start angle */\n public get startAngle() {\n return Angle.createRadians(this._radians0);\n }\n /** Return the (strongly typed) end angle */\n public get endAngle() {\n return Angle.createRadians(this._radians1);\n }\n /**\n * Create a sweep as one of\n * * A clone of a given sweep\n * * 0 to given angle\n * * full circle if no arg given (sweep 0 to 360 degrees)\n */\n public static create(data?: AngleSweep | Angle): AngleSweep {\n if (data instanceof AngleSweep)\n return data.clone();\n if (data instanceof Angle)\n return new AngleSweep(0, data.radians);\n return AngleSweep.create360();\n }\n /**\n * (private) constructor with start and end angles in radians.\n * * Use explicitly named static methods to clarify intent and units of inputs:\n *\n * * createStartEndRadians (startRadians:number, endRadians:number)\n * * createStartEndDegrees (startDegrees:number, endDegrees:number)\n * * createStartEnd (startAngle:Angle, endAngle:Angle)\n * * createStartSweepRadians (startRadians:number, sweepRadians:number)\n * * createStartSweepDegrees (startDegrees:number, sweepDegrees:number)\n * * createStartSweep (startAngle:Angle, sweepAngle:Angle)\n */\n private constructor(startRadians: number = 0, endRadians: number = 0) {\n this._radians0 = startRadians;\n this._radians1 = endRadians;\n }\n /**\n * Directly set the start and end angles in radians\n * * If the difference between startRadians and endRadians is greater than 360, the function limits the angle sweep to 360.\n */\n public setStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI) {\n const delta = endRadians - startRadians;\n if (Angle.isFullCircleRadians(delta)) {\n endRadians = startRadians + (delta > 0 ? 2.0 : -2.0) * Math.PI;\n }\n this._radians0 = startRadians;\n this._radians1 = endRadians;\n }\n /** Directly set the start and end angles in degrees */\n public setStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360.0) {\n this.setStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(endDegrees));\n }\n /**\n * Create an AngleSweep from start and end angles given in radians.\n * * If the difference between startRadians and endRadians is greater than 360, the function limits the angle sweep to 360.\n */\n public static createStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI, result?: AngleSweep): AngleSweep {\n result = result ? result : new AngleSweep();\n result.setStartEndRadians(startRadians, endRadians);\n return result;\n }\n /** Return the angle obtained by subtracting radians from this angle. */\n public cloneMinusRadians(radians: number): AngleSweep {\n return new AngleSweep(this._radians0 - radians, this._radians1 - radians);\n }\n /** Create an AngleSweep from start and end angles given in degrees. */\n public static createStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360, result?: AngleSweep): AngleSweep {\n return AngleSweep.createStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(endDegrees), result);\n }\n /** Create an angle sweep from strongly typed start and end angles */\n public static createStartEnd(startAngle: Angle, endAngle: Angle, result?: AngleSweep): AngleSweep {\n result = result ? result : new AngleSweep();\n result.setStartEndRadians(startAngle.radians, endAngle.radians);\n return result;\n }\n /** Create an AngleSweep from start and end angles given in radians. */\n public static createStartSweepRadians(startRadians: number = 0, sweepRadians: number = Math.PI, result?: AngleSweep): AngleSweep {\n result = result ? result : new AngleSweep();\n result.setStartEndRadians(startRadians, startRadians + sweepRadians);\n return result;\n }\n /** Create an AngleSweep from start and sweep given in degrees. */\n public static createStartSweepDegrees(startDegrees: number = 0, sweepDegrees: number = 360, result?: AngleSweep): AngleSweep {\n return AngleSweep.createStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(startDegrees + sweepDegrees), result);\n }\n /** Create an angle sweep with limits given as (strongly typed) angles for start and sweep */\n public static createStartSweep(startAngle: Angle, sweepAngle: Angle, result?: AngleSweep): AngleSweep {\n return AngleSweep.createStartSweepRadians(startAngle.radians, sweepAngle.radians, result);\n }\n /** Return a sweep with limits interpolated between this and other. */\n public interpolate(fraction: number, other: AngleSweep): AngleSweep {\n return new AngleSweep(\n Geometry.interpolate(this._radians0, fraction, other._radians0),\n Geometry.interpolate(this._radians1, fraction, other._radians1),\n );\n }\n /** Copy from other AngleSweep. */\n public setFrom(other: AngleSweep) {\n this._radians0 = other._radians0;\n this._radians1 = other._radians1;\n }\n /** Create a full circle sweep (CCW). startRadians defaults to 0 */\n public static create360(startRadians?: number): AngleSweep {\n startRadians = startRadians ? startRadians : 0.0;\n return new AngleSweep(startRadians, startRadians + 2.0 * Math.PI);\n }\n /** Create a sweep from the south pole to the north pole (-90 to +90). */\n public static createFullLatitude() {\n return AngleSweep.createStartEndRadians(-0.5 * Math.PI, 0.5 * Math.PI);\n }\n /** Reverse the start and end angle in place. */\n public reverseInPlace() {\n const tmp = this._radians0;\n this._radians0 = this._radians1;\n this._radians1 = tmp;\n }\n /**\n * Return a sweep for the \"other\" part of the circle.\n * @param reverseDirection true to move backwards (CW) from start to end, false to more forwards (CCW) from start to end.\n */\n public cloneComplement(reverseDirection: boolean = false, result?: AngleSweep): AngleSweep {\n const s = this.sweepRadians >= 0 ? 2.0 : -2.0;\n if (reverseDirection)\n return AngleSweep.createStartEndRadians(this.startRadians, this.endRadians - s * Math.PI, result);\n else\n return AngleSweep.createStartEndRadians(this.endRadians, this.startRadians + s * Math.PI, result);\n }\n /** Restrict start and end angles to the degree range [-90,+90]. */\n public capLatitudeInPlace(): void {\n const limit = 0.5 * Math.PI;\n this._radians0 = Geometry.clampToStartEnd(this._radians0, -limit, limit);\n this._radians1 = Geometry.clampToStartEnd(this._radians1, -limit, limit);\n }\n /**\n * Restrict [[sweepDegrees]] to the range [-360, 360].\n * The start angle and sign of the sweep angle are unchanged.\n */\n public clampToFullCircle(result?: AngleSweep): AngleSweep {\n result = result ?? new AngleSweep();\n const sweepRadians = Geometry.clampToStartEnd(this.sweepRadians, -Angle.pi2Radians, Angle.pi2Radians);\n result.setStartEndRadians(this._radians0, this._radians0 + sweepRadians);\n return result;\n }\n /** Ask if the sweep is counterclockwise, i.e. positive sweep. */\n public get isCCW(): boolean {\n return this._radians1 >= this._radians0;\n }\n /** Ask if the sweep is a full circle. */\n public get isFullCircle(): boolean {\n return Angle.isFullCircleRadians(this.sweepRadians);\n }\n /** Ask if the sweep is a full sweep from south pole to north pole. */\n public get isFullLatitudeSweep(): boolean {\n const a = Math.PI * 0.5;\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians0, -a)\n && Angle.isAlmostEqualRadiansNoPeriodShift(this._radians1, a);\n }\n /** Return a clone of this sweep. */\n public clone(): AngleSweep {\n return new AngleSweep(this._radians0, this._radians1);\n }\n /** Convert fractional position in the sweep to radians. */\n public fractionToRadians(fraction: number): number {\n return fraction < 0.5 ?\n this._radians0 + fraction * this.sweepRadians :\n this._radians1 + (fraction - 1.0) * this.sweepRadians;\n }\n /** Convert fractional position in the sweep to strongly typed Angle object. */\n public fractionToAngle(fraction: number) {\n return Angle.createRadians(this.fractionToRadians(fraction));\n }\n /**\n * Return 2PI divided by the sweep radians.\n * * This is the number of fractional intervals required to cover a whole circle.\n * @returns period of the sweep, or 1 if sweep is empty.\n */\n public fractionPeriod(): number {\n return this.isEmpty ? 1.0 : Angle.pi2Radians / Math.abs(this.sweepRadians);\n }\n /**\n * Return the fractionalized position of the given angle (as Angle) computed without consideration of\n * 2PI period and without consideration of angle sweep direction (CW or CCW).\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * negative fraction for angles \"before\" the start angle if start < end\n * * fraction larger than one for angles \"after\" the end angle if start < end\n * * fraction larger than one for angles \"before\" the start angle if start > end\n * * negative fraction for angles \"after\" the end angle if start > end\n * * does not allow period shift\n * @returns unbounded fraction, or 1 if sweep is empty.\n */\n public angleToUnboundedFraction(theta: Angle): number {\n return this.isEmpty ? 1.0 : (theta.radians - this._radians0) / this.sweepRadians;\n }\n\n /**\n * Convert a sweep fraction to the equivalent period-shifted fraction inside the sweep, or within one period of zero\n * on the desired side.\n * @param fraction fraction of the sweep.\n * @param radians0 start angle of sweep (in radians).\n * @param radians1 end angle of sweep (in radians).\n * @param toNegativeFraction return an exterior fraction period-shifted to within one period of the start (true) or\n * end (false) of the sweep.\n * @returns period-shifted fraction. If `fraction` is already in [0,1], or the sweep is empty, then `fraction` is\n * returned unchanged.\n */\n public static fractionToSignedPeriodicFractionStartEnd(fraction: number, radians0: number, radians1: number, toNegativeFraction: boolean): number {\n const sweep = radians1 - radians0;\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, sweep))\n return fraction; // empty sweep\n if (Geometry.isIn01(fraction))\n return fraction;\n const period = Angle.pi2Radians / Math.abs(sweep);\n fraction = fraction % period; // period-shifted equivalent fraction closest to 0 with same sign as fraction\n if (fraction + period < 1)\n fraction += period; // it's really an interior fraction\n if (Geometry.isIn01(fraction) || (toNegativeFraction && fraction < 0) || (!toNegativeFraction && fraction > 1))\n return fraction;\n return toNegativeFraction ? fraction - period : fraction + period; // shift to other side of sweep\n }\n /**\n * Convert a sweep fraction to the equivalent period-shifted fraction inside this sweep, or within one period of\n * zero on the desired side.\n * @param fraction fraction of the sweep.\n * @param toNegativeFraction return an exterior fraction period-shifted to within one period of the start (true) or\n * end (false) of the sweep.\n * @returns period-shifted fraction. If `fraction` is already in [0,1], or the sweep is empty, then `fraction` is\n * returned unchanged.\n */\n public fractionToSignedPeriodicFraction(fraction: number, toNegativeFraction: boolean): number {\n return AngleSweep.fractionToSignedPeriodicFractionStartEnd(fraction, this._radians0, this._radians1, toNegativeFraction);\n }\n\n /**\n * Return the fractionalized position of the given angle (as radians), computed with consideration of 2PI period.\n * * consider radians0 as `start` angle of the sweep and radians1 as `end` angle of the sweep\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * all exterior angles are at fractions greater than 1\n * * allows period shift\n * @param radians input angle (in radians)\n * @param radians0 start angle of sweep (in radians)\n * @param radians1 end angle of sweep (in radians)\n * @param zeroSweepDefault return value when the sweep is empty (default 0)\n * @returns nonnegative fraction, or `zeroSweepDefault` if the sweep is empty.\n */\n public static radiansToPositivePeriodicFractionStartEnd(radians: number, radians0: number, radians1: number, zeroSweepDefault: number = 0.0): number {\n const zeroSweepMarker = Geometry.largeCoordinateResult;\n let fraction = this.radiansToSignedPeriodicFractionStartEnd(radians, radians0, radians1, zeroSweepMarker);\n if (fraction === zeroSweepMarker)\n return zeroSweepDefault;\n if (fraction < 0) {\n const period = Angle.pi2Radians / Math.abs(radians1 - radians0);\n fraction += period;\n }\n return fraction;\n }\n /**\n * Return the fractionalized position of the given angle (as radians), computed with consideration of 2PI period.\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * all exterior angles are at fractions greater than 1\n * * allows period shift\n * @param radians input angle (in radians)\n * @param zeroSweepDefault return value when this sweep is empty (default 0)\n * @returns nonnegative fraction, or `zeroSweepDefault` if the sweep is empty.\n */\n public radiansToPositivePeriodicFraction(radians: number, zeroSweepDefault: number = 0.0): number {\n return AngleSweep.radiansToPositivePeriodicFractionStartEnd(radians, this._radians0, this._radians1, zeroSweepDefault);\n }\n /**\n * Return the fractionalized position of the given angle (as Angle), computed with consideration of 2PI period.\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * all exterior angles are at fractions greater than 1\n * * allows period shift\n * @param theta input angle\n * @param zeroSweepDefault return value when this sweep is empty (default 0)\n * @returns nonnegative fraction, or `zeroSweepDefault` if the sweep is empty.\n */\n public angleToPositivePeriodicFraction(theta: Angle, zeroSweepDefault: number = 0.0): number {\n return this.radiansToPositivePeriodicFraction(theta.radians, zeroSweepDefault);\n }\n /**\n * Return the fractionalized position of the given array of angles (as radian), computed with consideration of 2PI period.\n * * fraction is always positive\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * all exterior angles are at fractions greater than 1\n * * allows period shift\n */\n public radiansArrayToPositivePeriodicFractions(data: GrowableFloat64Array) {\n const n = data.length;\n for (let i = 0; i < n; i++) {\n data.reassign(i, this.radiansToPositivePeriodicFraction(data.atUncheckedIndex(i)));\n }\n }\n /**\n * Return the fractionalized position of the given angle (as radians) computed with consideration of\n * 2PI period and with consideration of angle sweep direction (CW or CCW).\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * negative fraction for angles \"before\" the start angle\n * * fraction larger than one for angles \"after\" the end angle\n * * allows period shift\n * @param radians input angle (in radians)\n * @param radians0 start angle of sweep (in radians)\n * @param radians1 end angle of sweep (in radians)\n * @param zeroSweepDefault return value when the sweep is empty (default 0)\n * @returns fraction, or `zeroSweepDefault` if the sweep is empty.\n */\n public static radiansToSignedPeriodicFractionStartEnd(radians: number, radians0: number, radians1: number, zeroSweepDefault: number = 0.0): number {\n const sweep = radians1 - radians0;\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, sweep))\n return zeroSweepDefault;\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians0, radians1)) {\n // for sweep = 2nPi !== 0, allow matching without period shift, else we never return 1.0\n if (Angle.isAlmostEqualRadiansNoPeriodShift(radians, radians0))\n return 0.0;\n if (Angle.isAlmostEqualRadiansNoPeriodShift(radians, radians1))\n return 1.0;\n } else {\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians0))\n return 0.0;\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians1))\n return 1.0;\n }\n const fraction = (radians - radians0) / sweep;\n return this.fractionToSignedPeriodicFractionStartEnd(fraction, radians0, radians1, fraction < 0);\n }\n /**\n * Return the fractionalized position of the given angle (as radians) computed with consideration of\n * 2PI period and with consideration of angle sweep direction (CW or CCW).\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * negative fraction for angles \"before\" the start angle\n * * fraction larger than one for angles \"after\" the end angle\n * * allows period shift\n * @param radians input angle (in radians)\n * @param zeroSweepDefault return value when this sweep is empty (default 0)\n * @returns fraction, or `zeroSweepDefault` if this sweep is empty.\n */\n public radiansToSignedPeriodicFraction(radians: number, zeroSweepDefault: number = 0.0): number {\n return AngleSweep.radiansToSignedPeriodicFractionStartEnd(radians, this._radians0, this._radians1, zeroSweepDefault);\n }\n /**\n * Return the fractionalized position of the given angle (as Angle) computed with consideration of\n * 2PI period and with consideration of angle sweep direction (CW or CCW).\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * negative fraction for angles \"before\" the start angle\n * * fraction larger than one for angles \"after\" the end angle\n * * allows period shift\n * @param theta input angle\n * @param zeroSweepDefault return value when this sweep is empty (default 0)\n * @returns fraction, or `zeroSweepDefault` if this sweep is empty.\n */\n public angleToSignedPeriodicFraction(theta: Angle, zeroSweepDefault: number = 0.0): number {\n return this.radiansToSignedPeriodicFraction(theta.radians, zeroSweepDefault);\n }\n\n /**\n * Return the fractionalized position of the given radian angle with respect to the sweep.\n * * The start angle returns fraction 0\n * * The end angle returns fraction 1\n * * Interior angles (and their multiples of 2PI) return fractions in [0,1].\n * * Exterior angles return fractions outside [0,1] according to `toNegativeFraction`.\n * @param radians input angle (in radians)\n * @param radians0 start angle of sweep (in radians)\n * @param radians1 end angle of sweep (in radians)\n * @param toNegativeFraction convert an exterior angle to a negative number (true), or to\n * a number greater than one (false, default). If false, this is just [[radiansToPositivePeriodicFractionStartEnd]].\n * @param zeroSweepDefault return value when the sweep is empty (default 0).\n * @returns fraction, or `zeroSweepDefault` if the sweep is empty\n */\n public static radiansToSignedFractionStartEnd(radians: number, radians0: number, radians1: number, toNegativeFraction: boolean = false, zeroSweepDefault: number = 0.0): number {\n const zeroSweepMarker = Geometry.largeCoordinateResult;\n let fraction = this.radiansToSignedPeriodicFractionStartEnd(radians, radians0, radians1, zeroSweepMarker);\n if (fraction === zeroSweepMarker)\n return zeroSweepDefault;\n if ((toNegativeFraction && fraction > 1) || (!toNegativeFraction && fraction < 0)) {\n let period = Angle.pi2Radians / Math.abs(radians1 - radians0);\n if (toNegativeFraction)\n period = -period;\n fraction += period;\n }\n return fraction;\n }\n /**\n * Return the fractionalized position of the given radian angle with respect to this sweep.\n * * The start angle returns fraction 0\n * * The end angle returns fraction 1\n * * Interior angles (and their multiples of 2PI) return fractions in [0,1].\n * * Exterior angles return fractions outside [0,1] according to `toNegativeFraction`.\n * @param radians input angle (in radians)\n * @param toNegativeFraction convert an exterior angle to a negative number (true), or to\n * a number greater than one (false, default). If false, this is just [[radiansToPositivePeriodicFraction]].\n * @param zeroSweepDefault return value when this sweep is empty (default 0).\n * @returns fraction, or `zeroSweepDefault` if this sweep is empty\n */\n public radiansToSignedFraction(radians: number, toNegativeFraction: boolean = false, zeroSweepDefault: number = 0.0): number {\n return AngleSweep.radiansToSignedFractionStartEnd(radians, this._radians0, this._radians1, toNegativeFraction, zeroSweepDefault);\n }\n /**\n * Return the fractionalized position of the given angle with respect to this sweep.\n * * The start angle returns fraction 0\n * * The end angle returns fraction 1\n * * Interior angles (and their multiples of 2PI) return fractions in [0,1].\n * * Exterior angles return fractions outside [0,1] according to `toNegativeFraction`.\n * @param theta input angle\n * @param toNegativeFraction convert an exterior angle to a negative number (true), or to\n * a number greater than one (false, default). If false, this is just [[angleToPositivePeriodicFraction]].\n * @param zeroSweepDefault return value when this sweep is empty (default 0).\n * @returns fraction, or `zeroSweepDefault` if this sweep is empty\n */\n public angleToSignedFraction(theta: Angle, toNegativeFraction: boolean = false, zeroSweepDefault: number = 0.0): number {\n return this.radiansToSignedFraction(theta.radians, toNegativeFraction, zeroSweepDefault);\n }\n\n /** Test if the given angle (as radians) is within sweep (between radians0 and radians1) */\n public static isRadiansInStartEnd(radians: number, radians0: number, radians1: number, allowPeriodShift: boolean = true): boolean {\n const delta0 = radians - radians0;\n const delta1 = radians - radians1;\n if (delta0 * delta1 <= 0.0)\n return true;\n if (radians0 === radians1)\n return allowPeriodShift ? Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians0) : Angle.isAlmostEqualRadiansNoPeriodShift(radians, radians0);\n return allowPeriodShift ? this.radiansToPositivePeriodicFractionStartEnd(radians, radians0, radians1, 1000.0) <= 1.0 : false;\n }\n /** Test if the given angle (as radians) is within sweep */\n public isRadiansInSweep(radians: number, allowPeriodShift: boolean = true): boolean {\n return AngleSweep.isRadiansInStartEnd(radians, this.startRadians, this.endRadians, allowPeriodShift);\n }\n /** Test if the given angle (as Angle) is within the sweep */\n public isAngleInSweep(angle: Angle): boolean {\n return this.isRadiansInSweep(angle.radians);\n }\n /**\n * Set this AngleSweep from various sources:\n * * if json is undefined, a full-circle sweep is returned.\n * * If json is an AngleSweep object, it is cloned\n * * If json is an array of 2 numbers, those numbers are start and end angles in degrees.\n * * If `json.degrees` is an array of 2 numbers, those numbers are start and end angles in degrees.\n * * If `json.radians` is an array of 2 numbers, those numbers are start and end angles in radians.\n * * Otherwise, a full-circle sweep is returned.\n */\n public setFromJSON(json?: any) {\n if (!json)\n this.setStartEndRadians(); // default full circle\n else if (json instanceof AngleSweep)\n this.setFrom(json);\n else if (Geometry.isNumberArray(json.degrees, 2))\n this.setStartEndDegrees(json.degrees[0], json.degrees[1]);\n else if (Geometry.isNumberArray(json.radians, 2))\n this.setStartEndRadians(json.radians[0], json.radians[1]);\n else if (Geometry.isNumberArray(json, 2))\n this.setStartEndDegrees(json[0], json[1]);\n else\n this.setStartEndRadians(); // default full circle\n }\n /** Create an AngleSweep from a json object. */\n public static fromJSON(json?: AngleSweepProps): AngleSweep {\n const result = AngleSweep.create360();\n result.setFromJSON(json);\n return result;\n }\n /**\n * Convert an AngleSweep to a JSON object.\n * @return {*} [startAngleInDegrees, endAngleInDegrees]\n */\n public toJSON(): any {\n return [this.startDegrees, this.endDegrees];\n }\n /**\n * Test if two angle sweeps match within the given tolerance.\n * * Period shifts are allowed, but orientations must be the same.\n * @param other sweep to compare to this instance\n * @param radianTol optional radian tolerance, default value `Geometry.smallAngleRadians`\n */\n public isAlmostEqualAllowPeriodShift(other: AngleSweep, radianTol: number = Geometry.smallAngleRadians): boolean {\n return this.isCCW === other.isCCW // this rules out equating opposite sweeps like [0,-100] and [0,260]\n && Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians0, other._radians0, radianTol)\n && Angle.isAlmostEqualRadiansAllowPeriodShift(this.sweepRadians, other.sweepRadians, radianTol);\n }\n /**\n * Test if two angle sweeps match within the given tolerance.\n * * Period shifts are not allowed.\n * @param other sweep to compare to this instance\n * @param radianTol optional radian tolerance, default value `Geometry.smallAngleRadians`\n */\n public isAlmostEqualNoPeriodShift(other: AngleSweep, radianTol: number = Geometry.smallAngleRadians): boolean {\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians0, other._radians0, radianTol)\n && Angle.isAlmostEqualRadiansNoPeriodShift(this.sweepRadians, other.sweepRadians, radianTol);\n }\n /**\n * Test if start and end angles match with radians tolerance.\n * * Period shifts are not allowed.\n * * This function is equivalent to isAlmostEqualNoPeriodShift. It is present for consistency with other classes.\n * However, it is recommended to use isAlmostEqualNoPeriodShift which has a clearer name.\n */\n public isAlmostEqual(other: AngleSweep): boolean {\n return this.isAlmostEqualNoPeriodShift(other);\n }\n}\n"]}
1
+ {"version":3,"file":"AngleSweep.js","sourceRoot":"","sources":["../../../src/geometry3d/AngleSweep.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/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { AngleSweepProps, BeJSONFunctions, Geometry } from \"../Geometry\";\nimport { Angle } from \"./Angle\";\nimport { GrowableFloat64Array } from \"./GrowableFloat64Array\";\n\n/**\n * An `AngleSweep` is a pair of angles at start and end of an interval.\n *\n * * For stroking purposes, the \"included interval\" is all angles numerically reached\n * by `theta = start + f * (end - start)`, where `0 <= f <= 1`.\n * * This stroking formula is simple numbers -- 2PI shifts are not involved.\n * * 2PI shifts do become important in the reverse mapping of an angle to a fraction.\n * * Angles greater than 360 and less than 0 are fine as endpoints.\n * * An AngleSweep determines orientation only _in concert with a reference vector_, e.g., a plane normal like (0,0,1).\n * * Be careful reading orientation from an AngleSweep without a reference vector!\n * * If \"start < end\" the angles in the sweep proceed counterclockwise around the reference vector.\n * * If \"start > end\" the angles in the sweep proceed clockwise around the reference vector.\n * * (350,370) covers the same angles as (-10,10), and both sweeps are counterclockwise around the reference vector.\n * * (370,350) covers the same angles as (10,-10), and both sweeps are clockwise around the reference vector.\n * * (370,350) covers the same angles as (-10,10), but the sweeps have opposite orientation.\n * * Math details can be found at docs/learning/geometry/Angle.md .\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/AngleSweep .\n * @public\n */\nexport class AngleSweep implements BeJSONFunctions {\n private _radians0: number;\n private _radians1: number;\n /** Read-property for degrees at the start of this AngleSweep. */\n public get startDegrees() {\n return Angle.radiansToDegrees(this._radians0);\n }\n /** Read-property for degrees at the end of this AngleSweep. */\n public get endDegrees() {\n return Angle.radiansToDegrees(this._radians1);\n }\n /** Read-property for signed start-to-end sweep in degrees. */\n public get sweepDegrees() {\n return Angle.radiansToDegrees(this.sweepRadians);\n }\n /** Read-property for degrees at the start of this AngleSweep. */\n public get startRadians() {\n return this._radians0;\n }\n /** Read-property for degrees at the end of this AngleSweep. */\n public get endRadians() {\n return this._radians1;\n }\n /** Read-property for signed start-to-end sweep in radians. */\n public get sweepRadians() {\n return this._radians1 - this._radians0;\n }\n /** Whether the sweep angles are within smallAngle tolerance, without period shift. */\n public get isEmpty() {\n return Angle.isAlmostEqualRadiansNoPeriodShift(0, this.sweepRadians);\n }\n /** Return the (strongly typed) start angle */\n public get startAngle() {\n return Angle.createRadians(this._radians0);\n }\n /** Return the (strongly typed) end angle */\n public get endAngle() {\n return Angle.createRadians(this._radians1);\n }\n /**\n * Create a sweep as one of\n * * A clone of a given sweep\n * * 0 to given angle\n * * full circle if no arg given (sweep 0 to 360 degrees)\n */\n public static create(data?: AngleSweep | Angle): AngleSweep {\n if (data instanceof AngleSweep)\n return data.clone();\n if (data instanceof Angle)\n return new AngleSweep(0, data.radians);\n return AngleSweep.create360();\n }\n /**\n * (private) constructor with start and end angles in radians.\n * * Use explicitly named static methods to clarify intent and units of inputs:\n *\n * * createStartEndRadians (startRadians:number, endRadians:number)\n * * createStartEndDegrees (startDegrees:number, endDegrees:number)\n * * createStartEnd (startAngle:Angle, endAngle:Angle)\n * * createStartSweepRadians (startRadians:number, sweepRadians:number)\n * * createStartSweepDegrees (startDegrees:number, sweepDegrees:number)\n * * createStartSweep (startAngle:Angle, sweepAngle:Angle)\n */\n private constructor(startRadians: number = 0, endRadians: number = 0) {\n this._radians0 = startRadians;\n this._radians1 = endRadians;\n }\n /**\n * Directly set the start and end angles in radians\n * * If the difference between startRadians and endRadians is greater than 360, the function limits the angle sweep to 360.\n */\n public setStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI) {\n const delta = endRadians - startRadians;\n if (Angle.isFullCircleRadians(delta)) {\n endRadians = startRadians + (delta > 0 ? 2.0 : -2.0) * Math.PI;\n }\n this._radians0 = startRadians;\n this._radians1 = endRadians;\n }\n /** Directly set the start and end angles in degrees */\n public setStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360.0) {\n this.setStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(endDegrees));\n }\n /**\n * Create an AngleSweep from start and end angles given in radians.\n * * If the difference between startRadians and endRadians is greater than 360, the function limits the angle sweep to 360.\n */\n public static createStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI, result?: AngleSweep): AngleSweep {\n result = result ? result : new AngleSweep();\n result.setStartEndRadians(startRadians, endRadians);\n return result;\n }\n /** Return the AngleSweep obtained by subtracting radians from the start and end angles of this sweep. */\n public cloneMinusRadians(radians: number): AngleSweep {\n return new AngleSweep(this._radians0 - radians, this._radians1 - radians);\n }\n /** Create an AngleSweep from start and end angles given in degrees. */\n public static createStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360, result?: AngleSweep): AngleSweep {\n return AngleSweep.createStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(endDegrees), result);\n }\n /** Create an angle sweep from strongly typed start and end angles */\n public static createStartEnd(startAngle: Angle, endAngle: Angle, result?: AngleSweep): AngleSweep {\n result = result ? result : new AngleSweep();\n result.setStartEndRadians(startAngle.radians, endAngle.radians);\n return result;\n }\n /** Create an AngleSweep from start and end angles given in radians. */\n public static createStartSweepRadians(startRadians: number = 0, sweepRadians: number = Math.PI, result?: AngleSweep): AngleSweep {\n result = result ? result : new AngleSweep();\n result.setStartEndRadians(startRadians, startRadians + sweepRadians);\n return result;\n }\n /** Create an AngleSweep from start and sweep given in degrees. */\n public static createStartSweepDegrees(startDegrees: number = 0, sweepDegrees: number = 360, result?: AngleSweep): AngleSweep {\n return AngleSweep.createStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(startDegrees + sweepDegrees), result);\n }\n /** Create an angle sweep with limits given as (strongly typed) angles for start and sweep */\n public static createStartSweep(startAngle: Angle, sweepAngle: Angle, result?: AngleSweep): AngleSweep {\n return AngleSweep.createStartSweepRadians(startAngle.radians, sweepAngle.radians, result);\n }\n /** Return a sweep with limits interpolated between this and other. */\n public interpolate(fraction: number, other: AngleSweep): AngleSweep {\n return new AngleSweep(\n Geometry.interpolate(this._radians0, fraction, other._radians0),\n Geometry.interpolate(this._radians1, fraction, other._radians1),\n );\n }\n /** Copy from other AngleSweep. */\n public setFrom(other: AngleSweep) {\n this._radians0 = other._radians0;\n this._radians1 = other._radians1;\n }\n /** Create a full circle sweep (CCW). startRadians defaults to 0 */\n public static create360(startRadians?: number): AngleSweep {\n startRadians = startRadians ? startRadians : 0.0;\n return new AngleSweep(startRadians, startRadians + 2.0 * Math.PI);\n }\n /** Create a sweep from the south pole to the north pole (-90 to +90). */\n public static createFullLatitude() {\n return AngleSweep.createStartEndRadians(-0.5 * Math.PI, 0.5 * Math.PI);\n }\n /** Reverse the start and end angle in place. */\n public reverseInPlace() {\n const tmp = this._radians0;\n this._radians0 = this._radians1;\n this._radians1 = tmp;\n }\n /**\n * Return a sweep for the \"other\" part of the circle.\n * @param reverseDirection true to move backwards (CW) from start to end, false to more forwards (CCW) from start to end.\n */\n public cloneComplement(reverseDirection: boolean = false, result?: AngleSweep): AngleSweep {\n const s = this.sweepRadians >= 0 ? 2.0 : -2.0;\n if (reverseDirection)\n return AngleSweep.createStartEndRadians(this.startRadians, this.endRadians - s * Math.PI, result);\n else\n return AngleSweep.createStartEndRadians(this.endRadians, this.startRadians + s * Math.PI, result);\n }\n /** Restrict start and end angles to the degree range [-90,+90]. */\n public capLatitudeInPlace(): void {\n const limit = 0.5 * Math.PI;\n this._radians0 = Geometry.clampToStartEnd(this._radians0, -limit, limit);\n this._radians1 = Geometry.clampToStartEnd(this._radians1, -limit, limit);\n }\n /**\n * Restrict [[sweepDegrees]] to the range [-360, 360].\n * The start angle and sign of the sweep angle are unchanged.\n */\n public clampToFullCircle(result?: AngleSweep): AngleSweep {\n result = result ?? new AngleSweep();\n const sweepRadians = Geometry.clampToStartEnd(this.sweepRadians, -Angle.pi2Radians, Angle.pi2Radians);\n result.setStartEndRadians(this._radians0, this._radians0 + sweepRadians);\n return result;\n }\n /** Ask if the sweep is counterclockwise, i.e. positive sweep. */\n public get isCCW(): boolean {\n return this._radians1 >= this._radians0;\n }\n /** Ask if the sweep is a full circle. */\n public get isFullCircle(): boolean {\n return Angle.isFullCircleRadians(this.sweepRadians);\n }\n /** Ask if the sweep is a full sweep from south pole to north pole. */\n public get isFullLatitudeSweep(): boolean {\n const a = Math.PI * 0.5;\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians0, -a)\n && Angle.isAlmostEqualRadiansNoPeriodShift(this._radians1, a);\n }\n /** Return a clone of this sweep. */\n public clone(): AngleSweep {\n return new AngleSweep(this._radians0, this._radians1);\n }\n /** Convert fractional position in the sweep to radians. */\n public fractionToRadians(fraction: number): number {\n return fraction < 0.5 ?\n this._radians0 + fraction * this.sweepRadians :\n this._radians1 + (fraction - 1.0) * this.sweepRadians;\n }\n /** Convert fractional position in the sweep to strongly typed Angle object. */\n public fractionToAngle(fraction: number) {\n return Angle.createRadians(this.fractionToRadians(fraction));\n }\n /**\n * Return 2PI divided by the sweep radians.\n * * This is the number of fractional intervals required to cover a whole circle.\n * @returns period of the sweep, or 1 if sweep is empty.\n */\n public fractionPeriod(): number {\n return this.isEmpty ? 1.0 : Angle.pi2Radians / Math.abs(this.sweepRadians);\n }\n /**\n * Return the fractionalized position of the given angle (as Angle) computed without consideration of\n * 2PI period and without consideration of angle sweep direction (CW or CCW).\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * negative fraction for angles \"before\" the start angle if start < end\n * * fraction larger than one for angles \"after\" the end angle if start < end\n * * fraction larger than one for angles \"before\" the start angle if start > end\n * * negative fraction for angles \"after\" the end angle if start > end\n * * does not allow period shift\n * @returns unbounded fraction, or 1 if sweep is empty.\n */\n public angleToUnboundedFraction(theta: Angle): number {\n return this.isEmpty ? 1.0 : (theta.radians - this._radians0) / this.sweepRadians;\n }\n\n /**\n * Convert a sweep fraction to the equivalent period-shifted fraction inside the sweep, or within one period of zero\n * on the desired side.\n * @param fraction fraction of the sweep.\n * @param radians0 start angle of sweep (in radians).\n * @param radians1 end angle of sweep (in radians).\n * @param toNegativeFraction exterior fraction handling:\n * * if true, return `fraction` period-shifted to within one period of the start\n * * if false, return `fraction` period-shifted to within one period of the end\n * * if undefined, return the period-shift of `fraction` closest to [0,1].\n * @returns period-shifted fraction. If `fraction` is already in [0,1], or the sweep is empty, then `fraction` is\n * returned unchanged.\n */\n public static fractionToSignedPeriodicFractionStartEnd(fraction: number, radians0: number, radians1: number, toNegativeFraction?: boolean): number {\n const sweep = radians1 - radians0;\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, sweep))\n return fraction; // empty sweep\n if (Geometry.isIn01(fraction))\n return fraction;\n const period = Angle.pi2Radians / Math.abs(sweep);\n fraction = fraction % period; // period-shifted equivalent fraction closest to 0 with same sign as fraction\n if (fraction + period < 1)\n fraction += period; // it's really an interior fraction\n if (Geometry.isIn01(fraction))\n return fraction;\n if (toNegativeFraction === true)\n return fraction < 0 ? fraction : fraction - period;\n if (toNegativeFraction === false)\n return fraction > 1 ? fraction : fraction + period;\n const fractionDistFrom01 = fraction < 0 ? -fraction : fraction - 1;\n const fraction2 = fraction < 0 ? fraction + period : fraction - period; // period-shift with opposite sign\n const fraction2DistFrom01 = fraction2 < 0 ? -fraction2 : fraction2 - 1;\n return fractionDistFrom01 < fraction2DistFrom01 ? fraction : fraction2; // choose the period-shift closer to [0,1]\n }\n /**\n * Convert a sweep fraction to the equivalent period-shifted fraction inside this sweep, or within one period of\n * zero on the desired side.\n * @param fraction fraction of the sweep.\n * @param toNegativeFraction exterior fraction handling:\n * * if true, return `fraction` period-shifted to within one period of the start\n * * if false, return `fraction` period-shifted to within one period of the end\n * * if undefined, return the period-shift of `fraction` closest to [0,1].\n * @returns period-shifted fraction. If `fraction` is already in [0,1], or the sweep is empty, then `fraction` is\n * returned unchanged.\n */\n public fractionToSignedPeriodicFraction(fraction: number, toNegativeFraction?: boolean): number {\n return AngleSweep.fractionToSignedPeriodicFractionStartEnd(fraction, this._radians0, this._radians1, toNegativeFraction);\n }\n\n /**\n * Return the fractionalized position of the given angle (as radians), computed with consideration of 2PI period.\n * * consider radians0 as `start` angle of the sweep and radians1 as `end` angle of the sweep\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * all exterior angles are at fractions greater than 1\n * * allows period shift\n * @param radians input angle (in radians)\n * @param radians0 start angle of sweep (in radians)\n * @param radians1 end angle of sweep (in radians)\n * @param zeroSweepDefault return value when the sweep is empty (default 0)\n * @returns nonnegative fraction, or `zeroSweepDefault` if the sweep is empty.\n */\n public static radiansToPositivePeriodicFractionStartEnd(radians: number, radians0: number, radians1: number, zeroSweepDefault: number = 0.0): number {\n const zeroSweepMarker = Geometry.largeCoordinateResult;\n let fraction = this.radiansToSignedPeriodicFractionStartEnd(radians, radians0, radians1, zeroSweepMarker);\n if (fraction === zeroSweepMarker)\n return zeroSweepDefault;\n if (fraction < 0) {\n const period = Angle.pi2Radians / Math.abs(radians1 - radians0);\n fraction += period;\n }\n return fraction;\n }\n /**\n * Return the fractionalized position of the given angle (as radians), computed with consideration of 2PI period.\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * all exterior angles are at fractions greater than 1\n * * allows period shift\n * @param radians input angle (in radians)\n * @param zeroSweepDefault return value when this sweep is empty (default 0)\n * @returns nonnegative fraction, or `zeroSweepDefault` if the sweep is empty.\n */\n public radiansToPositivePeriodicFraction(radians: number, zeroSweepDefault: number = 0.0): number {\n return AngleSweep.radiansToPositivePeriodicFractionStartEnd(radians, this._radians0, this._radians1, zeroSweepDefault);\n }\n /**\n * Return the fractionalized position of the given angle (as Angle), computed with consideration of 2PI period.\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * all exterior angles are at fractions greater than 1\n * * allows period shift\n * @param theta input angle\n * @param zeroSweepDefault return value when this sweep is empty (default 0)\n * @returns nonnegative fraction, or `zeroSweepDefault` if the sweep is empty.\n */\n public angleToPositivePeriodicFraction(theta: Angle, zeroSweepDefault: number = 0.0): number {\n return this.radiansToPositivePeriodicFraction(theta.radians, zeroSweepDefault);\n }\n /**\n * Return the fractionalized position of the given array of angles (as radian), computed with consideration of 2PI period.\n * * fraction is always positive\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * all exterior angles are at fractions greater than 1\n * * allows period shift\n */\n public radiansArrayToPositivePeriodicFractions(data: GrowableFloat64Array) {\n const n = data.length;\n for (let i = 0; i < n; i++) {\n data.reassign(i, this.radiansToPositivePeriodicFraction(data.atUncheckedIndex(i)));\n }\n }\n /**\n * Return the fractionalized position of the given angle (as radians) computed with consideration of\n * 2PI period and with consideration of angle sweep direction (CW or CCW).\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * negative fraction for angles \"before\" the start angle\n * * fraction larger than one for angles \"after\" the end angle\n * * allows period shift\n * @param radians input angle (in radians)\n * @param radians0 start angle of sweep (in radians)\n * @param radians1 end angle of sweep (in radians)\n * @param zeroSweepDefault return value when the sweep is empty (default 0)\n * @returns fraction, or `zeroSweepDefault` if the sweep is empty.\n */\n public static radiansToSignedPeriodicFractionStartEnd(radians: number, radians0: number, radians1: number, zeroSweepDefault: number = 0.0): number {\n const sweep = radians1 - radians0;\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, sweep))\n return zeroSweepDefault;\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians0, radians1)) {\n // for sweep = 2nPi !== 0, allow matching without period shift, else we never return 1.0\n if (Angle.isAlmostEqualRadiansNoPeriodShift(radians, radians0))\n return 0.0;\n if (Angle.isAlmostEqualRadiansNoPeriodShift(radians, radians1))\n return 1.0;\n } else {\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians0))\n return 0.0;\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians1))\n return 1.0;\n }\n const fraction = (radians - radians0) / sweep;\n return this.fractionToSignedPeriodicFractionStartEnd(fraction, radians0, radians1, fraction < 0);\n }\n /**\n * Return the fractionalized position of the given angle (as radians) computed with consideration of\n * 2PI period and with consideration of angle sweep direction (CW or CCW).\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * negative fraction for angles \"before\" the start angle\n * * fraction larger than one for angles \"after\" the end angle\n * * allows period shift\n * @param radians input angle (in radians)\n * @param zeroSweepDefault return value when this sweep is empty (default 0)\n * @returns fraction, or `zeroSweepDefault` if this sweep is empty.\n */\n public radiansToSignedPeriodicFraction(radians: number, zeroSweepDefault: number = 0.0): number {\n return AngleSweep.radiansToSignedPeriodicFractionStartEnd(radians, this._radians0, this._radians1, zeroSweepDefault);\n }\n /**\n * Return the fractionalized position of the given angle (as Angle) computed with consideration of\n * 2PI period and with consideration of angle sweep direction (CW or CCW).\n * * the start angle is at fraction 0\n * * the end angle is at fraction 1\n * * interior angles are between 0 and 1\n * * negative fraction for angles \"before\" the start angle\n * * fraction larger than one for angles \"after\" the end angle\n * * allows period shift\n * @param theta input angle\n * @param zeroSweepDefault return value when this sweep is empty (default 0)\n * @returns fraction, or `zeroSweepDefault` if this sweep is empty.\n */\n public angleToSignedPeriodicFraction(theta: Angle, zeroSweepDefault: number = 0.0): number {\n return this.radiansToSignedPeriodicFraction(theta.radians, zeroSweepDefault);\n }\n\n /**\n * Return the fractionalized position of the given radian angle with respect to the sweep.\n * * The start angle returns fraction 0\n * * The end angle returns fraction 1\n * * Interior angles (and their multiples of 2PI) return fractions in [0,1].\n * * Exterior angles return fractions outside [0,1] according to `toNegativeFraction`.\n * @param radians input angle (in radians)\n * @param radians0 start angle of sweep (in radians)\n * @param radians1 end angle of sweep (in radians)\n * @param toNegativeFraction convert an exterior angle to a negative number (true), or to\n * a number greater than one (false, default). If false, this is just [[radiansToPositivePeriodicFractionStartEnd]].\n * @param zeroSweepDefault return value when the sweep is empty (default 0).\n * @returns fraction, or `zeroSweepDefault` if the sweep is empty\n */\n public static radiansToSignedFractionStartEnd(radians: number, radians0: number, radians1: number, toNegativeFraction: boolean = false, zeroSweepDefault: number = 0.0): number {\n const zeroSweepMarker = Geometry.largeCoordinateResult;\n let fraction = this.radiansToSignedPeriodicFractionStartEnd(radians, radians0, radians1, zeroSweepMarker);\n if (fraction === zeroSweepMarker)\n return zeroSweepDefault;\n if ((toNegativeFraction && fraction > 1) || (!toNegativeFraction && fraction < 0)) {\n let period = Angle.pi2Radians / Math.abs(radians1 - radians0);\n if (toNegativeFraction)\n period = -period;\n fraction += period;\n }\n return fraction;\n }\n /**\n * Return the fractionalized position of the given radian angle with respect to this sweep.\n * * The start angle returns fraction 0\n * * The end angle returns fraction 1\n * * Interior angles (and their multiples of 2PI) return fractions in [0,1].\n * * Exterior angles return fractions outside [0,1] according to `toNegativeFraction`.\n * @param radians input angle (in radians)\n * @param toNegativeFraction convert an exterior angle to a negative number (true), or to\n * a number greater than one (false, default). If false, this is just [[radiansToPositivePeriodicFraction]].\n * @param zeroSweepDefault return value when this sweep is empty (default 0).\n * @returns fraction, or `zeroSweepDefault` if this sweep is empty\n */\n public radiansToSignedFraction(radians: number, toNegativeFraction: boolean = false, zeroSweepDefault: number = 0.0): number {\n return AngleSweep.radiansToSignedFractionStartEnd(radians, this._radians0, this._radians1, toNegativeFraction, zeroSweepDefault);\n }\n /**\n * Return the fractionalized position of the given angle with respect to this sweep.\n * * The start angle returns fraction 0\n * * The end angle returns fraction 1\n * * Interior angles (and their multiples of 2PI) return fractions in [0,1].\n * * Exterior angles return fractions outside [0,1] according to `toNegativeFraction`.\n * @param theta input angle\n * @param toNegativeFraction convert an exterior angle to a negative number (true), or to\n * a number greater than one (false, default). If false, this is just [[angleToPositivePeriodicFraction]].\n * @param zeroSweepDefault return value when this sweep is empty (default 0).\n * @returns fraction, or `zeroSweepDefault` if this sweep is empty\n */\n public angleToSignedFraction(theta: Angle, toNegativeFraction: boolean = false, zeroSweepDefault: number = 0.0): number {\n return this.radiansToSignedFraction(theta.radians, toNegativeFraction, zeroSweepDefault);\n }\n\n /** Test if the given angle (as radians) is within sweep (between radians0 and radians1) */\n public static isRadiansInStartEnd(radians: number, radians0: number, radians1: number, allowPeriodShift: boolean = true): boolean {\n const delta0 = radians - radians0;\n const delta1 = radians - radians1;\n if (delta0 * delta1 <= 0.0)\n return true;\n if (radians0 === radians1)\n return allowPeriodShift ? Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians0) : Angle.isAlmostEqualRadiansNoPeriodShift(radians, radians0);\n return allowPeriodShift ? this.radiansToPositivePeriodicFractionStartEnd(radians, radians0, radians1, 1000.0) <= 1.0 : false;\n }\n /** Test if the given angle (as radians) is within sweep */\n public isRadiansInSweep(radians: number, allowPeriodShift: boolean = true): boolean {\n return AngleSweep.isRadiansInStartEnd(radians, this.startRadians, this.endRadians, allowPeriodShift);\n }\n /** Test if the given angle (as Angle) is within the sweep */\n public isAngleInSweep(angle: Angle): boolean {\n return this.isRadiansInSweep(angle.radians);\n }\n /**\n * Set this AngleSweep from various sources:\n * * if json is undefined, a full-circle sweep is returned.\n * * If json is an AngleSweep object, it is cloned\n * * If json is an array of 2 numbers, those numbers are start and end angles in degrees.\n * * If `json.degrees` is an array of 2 numbers, those numbers are start and end angles in degrees.\n * * If `json.radians` is an array of 2 numbers, those numbers are start and end angles in radians.\n * * Otherwise, a full-circle sweep is returned.\n */\n public setFromJSON(json?: any) {\n if (!json)\n this.setStartEndRadians(); // default full circle\n else if (json instanceof AngleSweep)\n this.setFrom(json);\n else if (Geometry.isNumberArray(json.degrees, 2))\n this.setStartEndDegrees(json.degrees[0], json.degrees[1]);\n else if (Geometry.isNumberArray(json.radians, 2))\n this.setStartEndRadians(json.radians[0], json.radians[1]);\n else if (Geometry.isNumberArray(json, 2))\n this.setStartEndDegrees(json[0], json[1]);\n else\n this.setStartEndRadians(); // default full circle\n }\n /** Create an AngleSweep from a json object. */\n public static fromJSON(json?: AngleSweepProps): AngleSweep {\n const result = AngleSweep.create360();\n result.setFromJSON(json);\n return result;\n }\n /**\n * Convert an AngleSweep to a JSON object.\n * @return {*} [startAngleInDegrees, endAngleInDegrees]\n */\n public toJSON(): any {\n return [this.startDegrees, this.endDegrees];\n }\n /**\n * Test if two angle sweeps match within the given tolerance.\n * * Period shifts are allowed, but orientations must be the same.\n * @param other sweep to compare to this instance\n * @param radianTol optional radian tolerance, default value `Geometry.smallAngleRadians`\n */\n public isAlmostEqualAllowPeriodShift(other: AngleSweep, radianTol: number = Geometry.smallAngleRadians): boolean {\n return this.isCCW === other.isCCW // this rules out equating opposite sweeps like [0,-100] and [0,260]\n && Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians0, other._radians0, radianTol)\n && Angle.isAlmostEqualRadiansAllowPeriodShift(this.sweepRadians, other.sweepRadians, radianTol);\n }\n /**\n * Test if two angle sweeps match within the given tolerance.\n * * Period shifts are not allowed.\n * @param other sweep to compare to this instance\n * @param radianTol optional radian tolerance, default value `Geometry.smallAngleRadians`\n */\n public isAlmostEqualNoPeriodShift(other: AngleSweep, radianTol: number = Geometry.smallAngleRadians): boolean {\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians0, other._radians0, radianTol)\n && Angle.isAlmostEqualRadiansNoPeriodShift(this.sweepRadians, other.sweepRadians, radianTol);\n }\n /**\n * Test if start and end angles match with radians tolerance.\n * * Period shifts are not allowed.\n * * This function is equivalent to isAlmostEqualNoPeriodShift. It is present for consistency with other classes.\n * However, it is recommended to use isAlmostEqualNoPeriodShift which has a clearer name.\n */\n public isAlmostEqual(other: AngleSweep): boolean {\n return this.isAlmostEqualNoPeriodShift(other);\n }\n}\n"]}
@@ -26,7 +26,7 @@ export declare class CoincidentGeometryQuery {
26
26
  /**
27
27
  * Given a detail pair representing the projection of each of two colinear line segments onto the other,
28
28
  * clamp the details (in place) to the line segments' endpoints according to the given flags.
29
- * @param overlap segment overlap as returned by [[coincidentSegmentRangeXY]], modified on return
29
+ * @param overlap unbounded segment overlap as returned by [[coincidentSegmentRangeXY]], modified and returned
30
30
  * @param pointA0 start point of segment A
31
31
  * @param pointA1 end point of segment A
32
32
  * @param pointB0 start point of segment B
@@ -35,21 +35,22 @@ export declare class CoincidentGeometryQuery {
35
35
  * @param extendA1 whether to extend segment A beyond its end
36
36
  * @param extendB0 whether to extend segment B beyond its start
37
37
  * @param extendB1 whether to extend segment B beyond its end
38
- * @return reference to the input clamped in place, or undefined (leaving interval untouched) if clamping would result in empty interval.
38
+ * @return reference to the modified input, or undefined (leaving input untouched) if clamping would result in empty interval.
39
39
  */
40
40
  clampCoincidentOverlapToSegmentBounds(overlap: CurveLocationDetailPair, pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d, extendA0?: boolean, extendA1?: boolean, extendB0?: boolean, extendB1?: boolean): CurveLocationDetailPair | undefined;
41
41
  /**
42
42
  * Compute whether two line segments have a coincident overlap in xy.
43
- * * Project `pointA0` and `pointA1` onto the line formed by `pointB0` and `pointB1` and vice versa
44
- * * If all projection distances are sufficiently small, return a detail pair recording the coincident interval, optionally clipped to segment bounds.
43
+ * * Project `pointA0` and `pointA1` onto the (infinite) line formed by `pointB0` and `pointB1` and vice versa.
44
+ * * If all projection distances are sufficiently small, return a detail pair recording the coincident interval.
45
+ * * Caller can follow up with [[clampCoincidentOverlapToSegmentBounds]] to restrict the returned interval by the segments' ranges.
45
46
  * @param pointA0 start point of segment A
46
47
  * @param pointA1 end point of segment A
47
48
  * @param pointB0 start point of segment B
48
49
  * @param pointB1 end point of segment B
49
- * @param restrictToBounds whether to clip the coincident segment details to the segment bounds
50
- * @return detail pair for the coincident interval (`detailA` has fractions along segment A, and `detailB` has fractions along segment B), or undefined if no coincidence
50
+ * @return detail pair for the coincident interval (`detailA` has fractions along segment A, and `detailB` has
51
+ * fractions along segment B), or `undefined` if no coincidence.
51
52
  */
52
- coincidentSegmentRangeXY(pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d, restrictToBounds?: boolean): CurveLocationDetailPair | undefined;
53
+ coincidentSegmentRangeXY(pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d): CurveLocationDetailPair | undefined;
53
54
  /**
54
55
  * Create a CurveLocationDetailPair for a coincident interval of two overlapping curves
55
56
  * @param cpA curveA
@@ -1 +1 @@
1
- {"version":3,"file":"CoincidentGeometryOps.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/CoincidentGeometryOps.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAI5F,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AAGtD;;;;;GAKG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,IAAW,SAAS,IAAI,MAAM,CAE7B;IACD,OAAO;WAGO,MAAM,CAAC,SAAS,GAAE,MAAqC,GAAG,uBAAuB;IAG/F;;;OAGG;WACW,0CAA0C,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAC1G,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAE,OAAe;IAazD,sHAAsH;IAC/G,uBAAuB,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,mBAAmB;IAS1G;;;;;;;;;;;;;OAaG;IACI,qCAAqC,CAAC,OAAO,EAAE,uBAAuB,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,QAAQ,GAAE,OAAe,EAAE,QAAQ,GAAE,OAAe,EAAE,QAAQ,GAAE,OAAe,EAAE,QAAQ,GAAE,OAAe,GACzG,uBAAuB,GAAG,SAAS;IAoDtC;;;;;;;;;;OAUG;IACI,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAE,OAAc,GAAG,uBAAuB,GAAG,SAAS;IAuB9K;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,gBAAgB;IAQxB;;;;;;OAMG;IACI,2BAA2B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,GAAE,OAAc,GAAG,uBAAuB,EAAE,GAAG,SAAS;CAgEvI"}
1
+ {"version":3,"file":"CoincidentGeometryOps.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/CoincidentGeometryOps.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAK5F,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AAGtD;;;;;GAKG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,IAAW,SAAS,IAAI,MAAM,CAE7B;IACD,OAAO;WAGO,MAAM,CAAC,SAAS,GAAE,MAAqC,GAAG,uBAAuB;IAG/F;;;OAGG;WACW,0CAA0C,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAC1G,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAE,OAAe;IAazD,sHAAsH;IAC/G,uBAAuB,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,mBAAmB;IAS1G;;;;;;;;;;;;;OAaG;IACI,qCAAqC,CAAC,OAAO,EAAE,uBAAuB,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,QAAQ,GAAE,OAAe,EAAE,QAAQ,GAAE,OAAe,EAAE,QAAQ,GAAE,OAAe,EAAE,QAAQ,GAAE,OAAe,GACzG,uBAAuB,GAAG,SAAS;IAoDtC;;;;;;;;;;;OAWG;IACI,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,uBAAuB,GAAG,SAAS;IAY5I;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,gBAAgB;IAQxB;;;;;;OAMG;IACI,2BAA2B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,GAAE,OAAc,GAAG,uBAAuB,EAAE,GAAG,SAAS;CAgEvI"}
@@ -8,6 +8,7 @@
8
8
  import { assert } from "@itwin/core-bentley";
9
9
  import { CurveLocationDetail, CurveLocationDetailPair } from "../curve/CurveLocationDetail";
10
10
  import { Geometry } from "../Geometry";
11
+ import { SmallSystem } from "../numerics/SmallSystem";
11
12
  import { AngleSweep } from "./AngleSweep";
12
13
  import { Vector3d } from "./Point3dVector3d";
13
14
  import { Segment1d } from "./Segment1d";
@@ -60,7 +61,7 @@ export class CoincidentGeometryQuery {
60
61
  /**
61
62
  * Given a detail pair representing the projection of each of two colinear line segments onto the other,
62
63
  * clamp the details (in place) to the line segments' endpoints according to the given flags.
63
- * @param overlap segment overlap as returned by [[coincidentSegmentRangeXY]], modified on return
64
+ * @param overlap unbounded segment overlap as returned by [[coincidentSegmentRangeXY]], modified and returned
64
65
  * @param pointA0 start point of segment A
65
66
  * @param pointA1 end point of segment A
66
67
  * @param pointB0 start point of segment B
@@ -69,7 +70,7 @@ export class CoincidentGeometryQuery {
69
70
  * @param extendA1 whether to extend segment A beyond its end
70
71
  * @param extendB0 whether to extend segment B beyond its start
71
72
  * @param extendB1 whether to extend segment B beyond its end
72
- * @return reference to the input clamped in place, or undefined (leaving interval untouched) if clamping would result in empty interval.
73
+ * @return reference to the modified input, or undefined (leaving input untouched) if clamping would result in empty interval.
73
74
  */
74
75
  clampCoincidentOverlapToSegmentBounds(overlap, pointA0, pointA1, pointB0, pointB1, extendA0 = false, extendA1 = false, extendB0 = false, extendB1 = false) {
75
76
  const rangeA = Segment1d.create(overlap.detailA.fraction, overlap.detailA.hasFraction1 ? overlap.detailA.fraction1 : overlap.detailA.fraction);
@@ -122,34 +123,27 @@ export class CoincidentGeometryQuery {
122
123
  }
123
124
  /**
124
125
  * Compute whether two line segments have a coincident overlap in xy.
125
- * * Project `pointA0` and `pointA1` onto the line formed by `pointB0` and `pointB1` and vice versa
126
- * * If all projection distances are sufficiently small, return a detail pair recording the coincident interval, optionally clipped to segment bounds.
126
+ * * Project `pointA0` and `pointA1` onto the (infinite) line formed by `pointB0` and `pointB1` and vice versa.
127
+ * * If all projection distances are sufficiently small, return a detail pair recording the coincident interval.
128
+ * * Caller can follow up with [[clampCoincidentOverlapToSegmentBounds]] to restrict the returned interval by the segments' ranges.
127
129
  * @param pointA0 start point of segment A
128
130
  * @param pointA1 end point of segment A
129
131
  * @param pointB0 start point of segment B
130
132
  * @param pointB1 end point of segment B
131
- * @param restrictToBounds whether to clip the coincident segment details to the segment bounds
132
- * @return detail pair for the coincident interval (`detailA` has fractions along segment A, and `detailB` has fractions along segment B), or undefined if no coincidence
133
+ * @return detail pair for the coincident interval (`detailA` has fractions along segment A, and `detailB` has
134
+ * fractions along segment B), or `undefined` if no coincidence.
133
135
  */
134
- coincidentSegmentRangeXY(pointA0, pointA1, pointB0, pointB1, restrictToBounds = true) {
135
- const detailA0OnB = this.projectPointToSegmentXY(pointA0, pointB0, pointB1);
136
- if (pointA0.distanceXY(detailA0OnB.point) > this._tolerance)
137
- return undefined;
138
- const detailA1OnB = this.projectPointToSegmentXY(pointA1, pointB0, pointB1);
139
- if (pointA1.distanceXY(detailA1OnB.point) > this._tolerance)
140
- return undefined;
141
- const detailB0OnA = this.projectPointToSegmentXY(pointB0, pointA0, pointA1);
142
- if (pointB0.distanceXY(detailB0OnA.point) > this._tolerance)
143
- return undefined;
144
- const detailB1OnA = this.projectPointToSegmentXY(pointB1, pointA0, pointA1);
145
- if (pointB1.distanceXY(detailB1OnA.point) > this._tolerance)
146
- return undefined;
147
- detailA0OnB.fraction1 = detailA1OnB.fraction;
148
- detailA0OnB.point1 = detailA1OnB.point; // capture -- detailA1OnB is not reused.
149
- detailB0OnA.fraction1 = detailB1OnA.fraction;
150
- detailB0OnA.point1 = detailB1OnA.point;
151
- const interval = CurveLocationDetailPair.createCapture(detailB0OnA, detailA0OnB);
152
- return restrictToBounds ? this.clampCoincidentOverlapToSegmentBounds(interval, pointA0, pointA1, pointB0, pointB1) : interval;
136
+ coincidentSegmentRangeXY(pointA0, pointA1, pointB0, pointB1) {
137
+ const aDir = { x: pointA1.x - pointA0.x, y: pointA1.y - pointA0.y };
138
+ const bDir = { x: pointB1.x - pointB0.x, y: pointB1.y - pointB0.y };
139
+ const fractions = SmallSystem.lineSegmentXYUVOverlapUnbounded(pointA0, aDir, pointB0, bDir, this._tolerance);
140
+ if (!fractions || !fractions.f1)
141
+ return undefined; // no overlap
142
+ const detailA = CurveLocationDetail.createCurveFractionPoint(undefined, fractions.f0.x, pointA0.interpolate(fractions.f0.x, pointA1));
143
+ detailA.captureFraction1Point1(fractions.f1.x, pointA0.interpolate(fractions.f1.x, pointA1));
144
+ const detailB = CurveLocationDetail.createCurveFractionPoint(undefined, fractions.f0.y, pointB0.interpolate(fractions.f0.y, pointB1));
145
+ detailB.captureFraction1Point1(fractions.f1.y, pointB0.interpolate(fractions.f1.y, pointB1));
146
+ return CurveLocationDetailPair.createCapture(detailA, detailB);
153
147
  }
154
148
  /**
155
149
  * Create a CurveLocationDetailPair for a coincident interval of two overlapping curves
@@ -1 +1 @@
1
- {"version":3,"file":"CoincidentGeometryOps.js","sourceRoot":"","sources":["../../../src/geometry3d/CoincidentGeometryOps.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 CartesianGeometry\n */\nimport { assert } from \"@itwin/core-bentley\";\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { Geometry } from \"../Geometry\";\nimport { AngleSweep } from \"./AngleSweep\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { Segment1d } from \"./Segment1d\";\n\n/**\n * `CoincidentGeometryQuery` has methods useful in testing for overlapping geometry.\n * * Each instance carries tolerance information that can be reused over extended call sequences.\n * * These methods are expected to be called internally by CurveCurve intersection methods.\n * @internal\n */\nexport class CoincidentGeometryQuery {\n private _vectorU?: Vector3d;\n private _vectorV?: Vector3d;\n private _point0?: Point3d;\n private _point1?: Point3d;\n private _tolerance: number;\n public get tolerance(): number {\n return this._tolerance;\n }\n private constructor(tolerance: number = Geometry.smallMetricDistance) {\n this._tolerance = tolerance;\n }\n public static create(tolerance: number = Geometry.smallMetricDistance): CoincidentGeometryQuery {\n return new CoincidentGeometryQuery(tolerance);\n }\n /**\n * * Assign both the fraction and fraction1 values in the detail, possibly swapped.\n * * reevaluate the points as simple interpolation between given points.\n */\n public static assignDetailInterpolatedFractionsAndPoints(detail: CurveLocationDetail, f0: number, f1: number,\n pointA: Point3d, pointB: Point3d, swap: boolean = false) {\n if (swap) {\n detail.fraction = f1;\n detail.fraction1 = f0;\n } else {\n detail.fraction = f0;\n detail.fraction1 = f1;\n }\n detail.point = pointA.interpolate(detail.fraction, pointB, detail.point);\n detail.point1 = pointA.interpolate(detail.fraction1, pointB, detail.point1);\n\n }\n\n /** Return a curve location detail with projection of a `spacePoint` to the line segment with `pointA` and `pointB` */\n public projectPointToSegmentXY(spacePoint: Point3d, pointA: Point3d, pointB: Point3d): CurveLocationDetail {\n this._vectorU = Vector3d.createStartEnd(pointA, pointB, this._vectorU);\n this._vectorV = Vector3d.createStartEnd(pointA, spacePoint, this._vectorV);\n const uDotU = this._vectorU.dotProductXY(this._vectorU);\n const uDotV = this._vectorU.dotProductXY(this._vectorV);\n const fraction = Geometry.safeDivideFraction(uDotV, uDotU, 0.0);\n return CurveLocationDetail.createCurveFractionPoint(undefined, fraction,\n pointA.interpolate(fraction, pointB));\n }\n /**\n * Given a detail pair representing the projection of each of two colinear line segments onto the other,\n * clamp the details (in place) to the line segments' endpoints according to the given flags.\n * @param overlap segment overlap as returned by [[coincidentSegmentRangeXY]], modified on return\n * @param pointA0 start point of segment A\n * @param pointA1 end point of segment A\n * @param pointB0 start point of segment B\n * @param pointB1 end point of segment B\n * @param extendA0 whether to extend segment A beyond its start\n * @param extendA1 whether to extend segment A beyond its end\n * @param extendB0 whether to extend segment B beyond its start\n * @param extendB1 whether to extend segment B beyond its end\n * @return reference to the input clamped in place, or undefined (leaving interval untouched) if clamping would result in empty interval.\n */\n public clampCoincidentOverlapToSegmentBounds(overlap: CurveLocationDetailPair,\n pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d,\n extendA0: boolean = false, extendA1: boolean = false, extendB0: boolean = false, extendB1: boolean = false,\n ): CurveLocationDetailPair | undefined {\n const rangeA = Segment1d.create(overlap.detailA.fraction, overlap.detailA.hasFraction1 ? overlap.detailA.fraction1 : overlap.detailA.fraction);\n const rangeB = Segment1d.create(overlap.detailB.fraction, overlap.detailB.hasFraction1 ? overlap.detailB.fraction1 : overlap.detailB.fraction);\n const reversed = rangeA.signedDelta() < 0.0;\n\n const updateIntervalFromRangesAndInterpolatedPoints = (): CurveLocationDetailPair => {\n const a0 = rangeA.x0;\n const a1 = rangeA.x1;\n const b0 = rangeB.x0;\n const b1 = rangeB.x1;\n CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(overlap.detailA, a0, a1, pointA0, pointA1, a0 > a1);\n CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(overlap.detailB, b0, b1, pointB0, pointB1, b0 > b1);\n return overlap;\n };\n\n const haveIntervalA = rangeA.clampDirectedTo01(!extendA0, !extendA1, false);\n const haveIntervalB = rangeB.clampDirectedTo01(!extendB0, !extendB1, false);\n if (haveIntervalA && haveIntervalB) {\n if (Geometry.isAlmostEqualNumber(rangeA.absoluteDelta(), rangeB.absoluteDelta(), Geometry.smallFraction))\n return updateIntervalFromRangesAndInterpolatedPoints(); // intersection of partially clamped ranges\n else if (rangeA.clampDirectedTo01(true, true, false) && rangeB.clampDirectedTo01(true, true, false))\n return updateIntervalFromRangesAndInterpolatedPoints(); // intersection of fully clamped ranges\n }\n\n const collapseToSingleton = (pointA: Point3d, pointB: Point3d, atStartA: boolean, atStartB: boolean): CurveLocationDetailPair => {\n pointA.clone(overlap.detailA.point);\n pointB.clone(overlap.detailB.point);\n overlap.detailA.fraction = atStartA ? 0.0 : 1.0;\n overlap.detailB.fraction = atStartB ? 0.0 : 1.0;\n overlap.detailA.collapseToStart();\n overlap.detailB.collapseToStart();\n return overlap;\n };\n\n const haveSingletonA = rangeA.clampDirectedTo01(true, true, true);\n const haveSingletonB = rangeB.clampDirectedTo01(true, true, true);\n if (haveSingletonA && haveSingletonB) { // intersection is a single point\n const point1 = overlap.detailA.point1 ?? overlap.detailA.point;\n if (reversed) {\n if (overlap.detailA.point.isAlmostEqual(pointA0, this.tolerance))\n return collapseToSingleton(pointA0, pointB0, true, true);\n else if (point1.isAlmostEqual(pointA1, this.tolerance))\n return collapseToSingleton(pointA1, pointB1, false, false);\n } else {\n if (point1.isAlmostEqual(pointA0, this.tolerance))\n return collapseToSingleton(pointA0, pointB1, true, false);\n else if (overlap.detailA.point.isAlmostEqual(pointA1, this.tolerance))\n return collapseToSingleton(pointA1, pointB0, false, true);\n }\n }\n return undefined; // no intersection\n }\n /**\n * Compute whether two line segments have a coincident overlap in xy.\n * * Project `pointA0` and `pointA1` onto the line formed by `pointB0` and `pointB1` and vice versa\n * * If all projection distances are sufficiently small, return a detail pair recording the coincident interval, optionally clipped to segment bounds.\n * @param pointA0 start point of segment A\n * @param pointA1 end point of segment A\n * @param pointB0 start point of segment B\n * @param pointB1 end point of segment B\n * @param restrictToBounds whether to clip the coincident segment details to the segment bounds\n * @return detail pair for the coincident interval (`detailA` has fractions along segment A, and `detailB` has fractions along segment B), or undefined if no coincidence\n */\n public coincidentSegmentRangeXY(pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d, restrictToBounds: boolean = true): CurveLocationDetailPair | undefined {\n const detailA0OnB = this.projectPointToSegmentXY(pointA0, pointB0, pointB1);\n if (pointA0.distanceXY(detailA0OnB.point) > this._tolerance)\n return undefined;\n const detailA1OnB = this.projectPointToSegmentXY(pointA1, pointB0, pointB1);\n if (pointA1.distanceXY(detailA1OnB.point) > this._tolerance)\n return undefined;\n\n const detailB0OnA = this.projectPointToSegmentXY(pointB0, pointA0, pointA1);\n if (pointB0.distanceXY(detailB0OnA.point) > this._tolerance)\n return undefined;\n const detailB1OnA = this.projectPointToSegmentXY(pointB1, pointA0, pointA1);\n if (pointB1.distanceXY(detailB1OnA.point) > this._tolerance)\n return undefined;\n\n detailA0OnB.fraction1 = detailA1OnB.fraction;\n detailA0OnB.point1 = detailA1OnB.point; // capture -- detailA1OnB is not reused.\n detailB0OnA.fraction1 = detailB1OnA.fraction;\n detailB0OnA.point1 = detailB1OnA.point;\n const interval = CurveLocationDetailPair.createCapture(detailB0OnA, detailA0OnB);\n\n return restrictToBounds ? this.clampCoincidentOverlapToSegmentBounds(interval, pointA0, pointA1, pointB0, pointB1) : interval;\n }\n /**\n * Create a CurveLocationDetailPair for a coincident interval of two overlapping curves\n * @param cpA curveA\n * @param cpB curveB\n * @param fractionsOnA coincident interval of curveB in fraction space of curveA\n * @param fractionB0 curveB start in fraction space of curveA\n * @param fractionB1 curveB end in fraction space of curveA\n * @param reverse whether curveB and curveA have opposite direction\n */\n private createDetailPair(cpA: CurvePrimitive, cpB: CurvePrimitive, fractionsOnA: Segment1d, fractionB0: number, fractionB1: number, reverse: boolean): CurveLocationDetailPair | undefined {\n const deltaB = fractionB1 - fractionB0;\n const g0 = Geometry.conditionalDivideFraction(fractionsOnA.x0 - fractionB0, deltaB);\n const g1 = Geometry.conditionalDivideFraction(fractionsOnA.x1 - fractionB0, deltaB);\n if (g0 !== undefined && g1 !== undefined) {\n const detailA = CurveLocationDetail.createCurveEvaluatedFractionFraction(cpA, fractionsOnA.x0, fractionsOnA.x1);\n const detailB = CurveLocationDetail.createCurveEvaluatedFractionFraction(cpB, g0, g1);\n if (reverse)\n detailA.swapFractionsAndPoints();\n return CurveLocationDetailPair.createCapture(detailA, detailB);\n }\n return undefined;\n }\n private appendDetailPair(result: CurveLocationDetailPair[] | undefined, pair: CurveLocationDetailPair | undefined): CurveLocationDetailPair[] | undefined {\n if (pair === undefined)\n return result;\n if (result === undefined)\n return [pair];\n result.push(pair);\n return result;\n }\n /**\n * Test if 2 arcs have coinciding portions.\n * @param arcA\n * @param arcB\n * @param _restrictToBounds\n * @return 0, 1, or 2 overlap points/intervals\n */\n public coincidentArcIntersectionXY(arcA: Arc3d, arcB: Arc3d, _restrictToBounds: boolean = true): CurveLocationDetailPair[] | undefined {\n let result: CurveLocationDetailPair[] | undefined;\n if (arcA.center.isAlmostEqual(arcB.center, this.tolerance)) {\n const matrixBToA = arcA.matrixRef.multiplyMatrixInverseMatrix(arcB.matrixRef);\n if (matrixBToA) {\n const ux = matrixBToA.at(0, 0); const uy = matrixBToA.at(1, 0);\n const vx = matrixBToA.at(0, 1); const vy = matrixBToA.at(1, 1);\n const ru = Geometry.hypotenuseXY(ux, uy);\n const rv = Geometry.hypotenuseXY(vx, vy);\n const dot = Geometry.dotProductXYXY(ux, uy, vx, vy);\n const cross = Geometry.crossProductXYXY(ux, uy, vx, vy);\n if (Geometry.isAlmostEqualNumber(ru, 1.0)\n && Geometry.isAlmostEqualNumber(rv, 1.0)\n && Geometry.isAlmostEqualNumber(0, dot)) {\n const alphaB0Radians = Math.atan2(uy, ux); // angular position of arcB 0 point in arcA sweep\n const sweepDirection = cross > 0 ? 1.0 : -1.0; // 1 if arcB parameter space sweeps in same direction as arcA, -1 if opposite\n const betaStartRadians = alphaB0Radians + sweepDirection * arcB.sweep.startRadians; // arcB start in arcA parameter space\n const betaEndRadians = alphaB0Radians + sweepDirection * arcB.sweep.endRadians; // arcB end in arcA parameter space\n const fractionSpacesReversed = (sweepDirection * arcA.sweep.sweepRadians * arcB.sweep.sweepRadians) < 0;\n const sweepB = AngleSweep.createStartEndRadians(betaStartRadians, betaEndRadians);\n const sweepA = arcA.sweep;\n const fractionPeriodA = sweepA.fractionPeriod();\n const fractionB0 = sweepA.radiansToPositivePeriodicFraction(sweepB.startRadians); // arcB start in arcA fraction space\n assert(fractionB0 >= 0.0);\n const fractionSweep = sweepB.sweepRadians / sweepA.sweepRadians; // arcB sweep in arcA fraction space\n const fractionB1 = fractionB0 + fractionSweep; // arcB end in arcA fraction space\n const fractionSweepB = Segment1d.create(fractionB0, fractionB1);\n\n /** lambda to add a coincident interval or isolated intersection, given inputs in arcA fraction space\n * @param arcBInArcAFractionSpace span of arcB in arcA fraction space. On return, clamped to [0,1] if nontrivial.\n * @param testStartOfArcA if no nontrivial coincident interval was found, look for an isolated intersection at the start (true) or end (false) of arcA\n * @returns whether a detail pair was appended to result\n */\n const appendCoincidentIntersection = (arcBInArcAFractionSpace: Segment1d, testStartOfArcA: boolean): boolean => {\n const size = result ? result.length : 0;\n const arcBStart = arcBInArcAFractionSpace.x0;\n const arcBEnd = arcBInArcAFractionSpace.x1;\n if (arcBInArcAFractionSpace.clampDirectedTo01() && !Geometry.isSmallRelative(arcBInArcAFractionSpace.absoluteDelta())) {\n result = this.appendDetailPair(result, this.createDetailPair(arcA, arcB, arcBInArcAFractionSpace, arcBStart, arcBEnd, fractionSpacesReversed));\n } else { // test isolated intersection\n const testStartOfArcB = fractionSpacesReversed ? testStartOfArcA : !testStartOfArcA;\n const arcAPt = this._point0 = testStartOfArcA ? arcA.startPoint(this._point0) : arcA.endPoint(this._point0);\n const arcBPt = this._point1 = testStartOfArcB ? arcB.startPoint(this._point1) : arcB.endPoint(this._point1);\n if (arcAPt.isAlmostEqual(arcBPt, this.tolerance)) {\n const detailA = CurveLocationDetail.createCurveFractionPoint(arcA, testStartOfArcA ? 0 : 1, arcAPt);\n const detailB = CurveLocationDetail.createCurveFractionPoint(arcB, testStartOfArcB ? 0 : 1, arcBPt);\n result = this.appendDetailPair(result, CurveLocationDetailPair.createCapture(detailA, detailB));\n }\n }\n return result !== undefined && result.length > size;\n };\n\n appendCoincidentIntersection(fractionSweepB, false); // compute overlap in strict interior, or at end of arcA\n\n // check overlap at start of arcA with a periodic shift of fractionSweepB\n if (fractionB1 >= fractionPeriodA)\n appendCoincidentIntersection(Segment1d.create(fractionB0 - fractionPeriodA, fractionB1 - fractionPeriodA), true);\n else if (fractionB0 === 0.0)\n appendCoincidentIntersection(Segment1d.create(fractionB0 + fractionPeriodA, fractionB1 + fractionPeriodA), true);\n }\n }\n }\n return result;\n }\n}\n"]}
1
+ {"version":3,"file":"CoincidentGeometryOps.js","sourceRoot":"","sources":["../../../src/geometry3d/CoincidentGeometryOps.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 CartesianGeometry\n */\nimport { assert } from \"@itwin/core-bentley\";\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { Geometry } from \"../Geometry\";\nimport { SmallSystem } from \"../numerics/SmallSystem\";\nimport { AngleSweep } from \"./AngleSweep\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { Segment1d } from \"./Segment1d\";\n\n/**\n * `CoincidentGeometryQuery` has methods useful in testing for overlapping geometry.\n * * Each instance carries tolerance information that can be reused over extended call sequences.\n * * These methods are expected to be called internally by CurveCurve intersection methods.\n * @internal\n */\nexport class CoincidentGeometryQuery {\n private _vectorU?: Vector3d;\n private _vectorV?: Vector3d;\n private _point0?: Point3d;\n private _point1?: Point3d;\n private _tolerance: number;\n public get tolerance(): number {\n return this._tolerance;\n }\n private constructor(tolerance: number = Geometry.smallMetricDistance) {\n this._tolerance = tolerance;\n }\n public static create(tolerance: number = Geometry.smallMetricDistance): CoincidentGeometryQuery {\n return new CoincidentGeometryQuery(tolerance);\n }\n /**\n * * Assign both the fraction and fraction1 values in the detail, possibly swapped.\n * * reevaluate the points as simple interpolation between given points.\n */\n public static assignDetailInterpolatedFractionsAndPoints(detail: CurveLocationDetail, f0: number, f1: number,\n pointA: Point3d, pointB: Point3d, swap: boolean = false) {\n if (swap) {\n detail.fraction = f1;\n detail.fraction1 = f0;\n } else {\n detail.fraction = f0;\n detail.fraction1 = f1;\n }\n detail.point = pointA.interpolate(detail.fraction, pointB, detail.point);\n detail.point1 = pointA.interpolate(detail.fraction1, pointB, detail.point1);\n\n }\n\n /** Return a curve location detail with projection of a `spacePoint` to the line segment with `pointA` and `pointB` */\n public projectPointToSegmentXY(spacePoint: Point3d, pointA: Point3d, pointB: Point3d): CurveLocationDetail {\n this._vectorU = Vector3d.createStartEnd(pointA, pointB, this._vectorU);\n this._vectorV = Vector3d.createStartEnd(pointA, spacePoint, this._vectorV);\n const uDotU = this._vectorU.dotProductXY(this._vectorU);\n const uDotV = this._vectorU.dotProductXY(this._vectorV);\n const fraction = Geometry.safeDivideFraction(uDotV, uDotU, 0.0);\n return CurveLocationDetail.createCurveFractionPoint(undefined, fraction,\n pointA.interpolate(fraction, pointB));\n }\n /**\n * Given a detail pair representing the projection of each of two colinear line segments onto the other,\n * clamp the details (in place) to the line segments' endpoints according to the given flags.\n * @param overlap unbounded segment overlap as returned by [[coincidentSegmentRangeXY]], modified and returned\n * @param pointA0 start point of segment A\n * @param pointA1 end point of segment A\n * @param pointB0 start point of segment B\n * @param pointB1 end point of segment B\n * @param extendA0 whether to extend segment A beyond its start\n * @param extendA1 whether to extend segment A beyond its end\n * @param extendB0 whether to extend segment B beyond its start\n * @param extendB1 whether to extend segment B beyond its end\n * @return reference to the modified input, or undefined (leaving input untouched) if clamping would result in empty interval.\n */\n public clampCoincidentOverlapToSegmentBounds(overlap: CurveLocationDetailPair,\n pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d,\n extendA0: boolean = false, extendA1: boolean = false, extendB0: boolean = false, extendB1: boolean = false,\n ): CurveLocationDetailPair | undefined {\n const rangeA = Segment1d.create(overlap.detailA.fraction, overlap.detailA.hasFraction1 ? overlap.detailA.fraction1 : overlap.detailA.fraction);\n const rangeB = Segment1d.create(overlap.detailB.fraction, overlap.detailB.hasFraction1 ? overlap.detailB.fraction1 : overlap.detailB.fraction);\n const reversed = rangeA.signedDelta() < 0.0;\n\n const updateIntervalFromRangesAndInterpolatedPoints = (): CurveLocationDetailPair => {\n const a0 = rangeA.x0;\n const a1 = rangeA.x1;\n const b0 = rangeB.x0;\n const b1 = rangeB.x1;\n CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(overlap.detailA, a0, a1, pointA0, pointA1, a0 > a1);\n CoincidentGeometryQuery.assignDetailInterpolatedFractionsAndPoints(overlap.detailB, b0, b1, pointB0, pointB1, b0 > b1);\n return overlap;\n };\n\n const haveIntervalA = rangeA.clampDirectedTo01(!extendA0, !extendA1, false);\n const haveIntervalB = rangeB.clampDirectedTo01(!extendB0, !extendB1, false);\n if (haveIntervalA && haveIntervalB) {\n if (Geometry.isAlmostEqualNumber(rangeA.absoluteDelta(), rangeB.absoluteDelta(), Geometry.smallFraction))\n return updateIntervalFromRangesAndInterpolatedPoints(); // intersection of partially clamped ranges\n else if (rangeA.clampDirectedTo01(true, true, false) && rangeB.clampDirectedTo01(true, true, false))\n return updateIntervalFromRangesAndInterpolatedPoints(); // intersection of fully clamped ranges\n }\n\n const collapseToSingleton = (pointA: Point3d, pointB: Point3d, atStartA: boolean, atStartB: boolean): CurveLocationDetailPair => {\n pointA.clone(overlap.detailA.point);\n pointB.clone(overlap.detailB.point);\n overlap.detailA.fraction = atStartA ? 0.0 : 1.0;\n overlap.detailB.fraction = atStartB ? 0.0 : 1.0;\n overlap.detailA.collapseToStart();\n overlap.detailB.collapseToStart();\n return overlap;\n };\n\n const haveSingletonA = rangeA.clampDirectedTo01(true, true, true);\n const haveSingletonB = rangeB.clampDirectedTo01(true, true, true);\n if (haveSingletonA && haveSingletonB) { // intersection is a single point\n const point1 = overlap.detailA.point1 ?? overlap.detailA.point;\n if (reversed) {\n if (overlap.detailA.point.isAlmostEqual(pointA0, this.tolerance))\n return collapseToSingleton(pointA0, pointB0, true, true);\n else if (point1.isAlmostEqual(pointA1, this.tolerance))\n return collapseToSingleton(pointA1, pointB1, false, false);\n } else {\n if (point1.isAlmostEqual(pointA0, this.tolerance))\n return collapseToSingleton(pointA0, pointB1, true, false);\n else if (overlap.detailA.point.isAlmostEqual(pointA1, this.tolerance))\n return collapseToSingleton(pointA1, pointB0, false, true);\n }\n }\n return undefined; // no intersection\n }\n /**\n * Compute whether two line segments have a coincident overlap in xy.\n * * Project `pointA0` and `pointA1` onto the (infinite) line formed by `pointB0` and `pointB1` and vice versa.\n * * If all projection distances are sufficiently small, return a detail pair recording the coincident interval.\n * * Caller can follow up with [[clampCoincidentOverlapToSegmentBounds]] to restrict the returned interval by the segments' ranges.\n * @param pointA0 start point of segment A\n * @param pointA1 end point of segment A\n * @param pointB0 start point of segment B\n * @param pointB1 end point of segment B\n * @return detail pair for the coincident interval (`detailA` has fractions along segment A, and `detailB` has\n * fractions along segment B), or `undefined` if no coincidence.\n */\n public coincidentSegmentRangeXY(pointA0: Point3d, pointA1: Point3d, pointB0: Point3d, pointB1: Point3d): CurveLocationDetailPair | undefined {\n const aDir = { x: pointA1.x - pointA0.x, y: pointA1.y - pointA0.y };\n const bDir = { x: pointB1.x - pointB0.x, y: pointB1.y - pointB0.y };\n const fractions = SmallSystem.lineSegmentXYUVOverlapUnbounded(pointA0, aDir, pointB0, bDir, this._tolerance);\n if (!fractions || !fractions.f1)\n return undefined; // no overlap\n const detailA = CurveLocationDetail.createCurveFractionPoint(undefined, fractions.f0.x, pointA0.interpolate(fractions.f0.x, pointA1));\n detailA.captureFraction1Point1(fractions.f1.x, pointA0.interpolate(fractions.f1.x, pointA1));\n const detailB = CurveLocationDetail.createCurveFractionPoint(undefined, fractions.f0.y, pointB0.interpolate(fractions.f0.y, pointB1));\n detailB.captureFraction1Point1(fractions.f1.y, pointB0.interpolate(fractions.f1.y, pointB1));\n return CurveLocationDetailPair.createCapture(detailA, detailB);\n }\n /**\n * Create a CurveLocationDetailPair for a coincident interval of two overlapping curves\n * @param cpA curveA\n * @param cpB curveB\n * @param fractionsOnA coincident interval of curveB in fraction space of curveA\n * @param fractionB0 curveB start in fraction space of curveA\n * @param fractionB1 curveB end in fraction space of curveA\n * @param reverse whether curveB and curveA have opposite direction\n */\n private createDetailPair(cpA: CurvePrimitive, cpB: CurvePrimitive, fractionsOnA: Segment1d, fractionB0: number, fractionB1: number, reverse: boolean): CurveLocationDetailPair | undefined {\n const deltaB = fractionB1 - fractionB0;\n const g0 = Geometry.conditionalDivideFraction(fractionsOnA.x0 - fractionB0, deltaB);\n const g1 = Geometry.conditionalDivideFraction(fractionsOnA.x1 - fractionB0, deltaB);\n if (g0 !== undefined && g1 !== undefined) {\n const detailA = CurveLocationDetail.createCurveEvaluatedFractionFraction(cpA, fractionsOnA.x0, fractionsOnA.x1);\n const detailB = CurveLocationDetail.createCurveEvaluatedFractionFraction(cpB, g0, g1);\n if (reverse)\n detailA.swapFractionsAndPoints();\n return CurveLocationDetailPair.createCapture(detailA, detailB);\n }\n return undefined;\n }\n private appendDetailPair(result: CurveLocationDetailPair[] | undefined, pair: CurveLocationDetailPair | undefined): CurveLocationDetailPair[] | undefined {\n if (pair === undefined)\n return result;\n if (result === undefined)\n return [pair];\n result.push(pair);\n return result;\n }\n /**\n * Test if 2 arcs have coinciding portions.\n * @param arcA\n * @param arcB\n * @param _restrictToBounds\n * @return 0, 1, or 2 overlap points/intervals\n */\n public coincidentArcIntersectionXY(arcA: Arc3d, arcB: Arc3d, _restrictToBounds: boolean = true): CurveLocationDetailPair[] | undefined {\n let result: CurveLocationDetailPair[] | undefined;\n if (arcA.center.isAlmostEqual(arcB.center, this.tolerance)) {\n const matrixBToA = arcA.matrixRef.multiplyMatrixInverseMatrix(arcB.matrixRef);\n if (matrixBToA) {\n const ux = matrixBToA.at(0, 0); const uy = matrixBToA.at(1, 0);\n const vx = matrixBToA.at(0, 1); const vy = matrixBToA.at(1, 1);\n const ru = Geometry.hypotenuseXY(ux, uy);\n const rv = Geometry.hypotenuseXY(vx, vy);\n const dot = Geometry.dotProductXYXY(ux, uy, vx, vy);\n const cross = Geometry.crossProductXYXY(ux, uy, vx, vy);\n if (Geometry.isAlmostEqualNumber(ru, 1.0)\n && Geometry.isAlmostEqualNumber(rv, 1.0)\n && Geometry.isAlmostEqualNumber(0, dot)) {\n const alphaB0Radians = Math.atan2(uy, ux); // angular position of arcB 0 point in arcA sweep\n const sweepDirection = cross > 0 ? 1.0 : -1.0; // 1 if arcB parameter space sweeps in same direction as arcA, -1 if opposite\n const betaStartRadians = alphaB0Radians + sweepDirection * arcB.sweep.startRadians; // arcB start in arcA parameter space\n const betaEndRadians = alphaB0Radians + sweepDirection * arcB.sweep.endRadians; // arcB end in arcA parameter space\n const fractionSpacesReversed = (sweepDirection * arcA.sweep.sweepRadians * arcB.sweep.sweepRadians) < 0;\n const sweepB = AngleSweep.createStartEndRadians(betaStartRadians, betaEndRadians);\n const sweepA = arcA.sweep;\n const fractionPeriodA = sweepA.fractionPeriod();\n const fractionB0 = sweepA.radiansToPositivePeriodicFraction(sweepB.startRadians); // arcB start in arcA fraction space\n assert(fractionB0 >= 0.0);\n const fractionSweep = sweepB.sweepRadians / sweepA.sweepRadians; // arcB sweep in arcA fraction space\n const fractionB1 = fractionB0 + fractionSweep; // arcB end in arcA fraction space\n const fractionSweepB = Segment1d.create(fractionB0, fractionB1);\n\n /** lambda to add a coincident interval or isolated intersection, given inputs in arcA fraction space\n * @param arcBInArcAFractionSpace span of arcB in arcA fraction space. On return, clamped to [0,1] if nontrivial.\n * @param testStartOfArcA if no nontrivial coincident interval was found, look for an isolated intersection at the start (true) or end (false) of arcA\n * @returns whether a detail pair was appended to result\n */\n const appendCoincidentIntersection = (arcBInArcAFractionSpace: Segment1d, testStartOfArcA: boolean): boolean => {\n const size = result ? result.length : 0;\n const arcBStart = arcBInArcAFractionSpace.x0;\n const arcBEnd = arcBInArcAFractionSpace.x1;\n if (arcBInArcAFractionSpace.clampDirectedTo01() && !Geometry.isSmallRelative(arcBInArcAFractionSpace.absoluteDelta())) {\n result = this.appendDetailPair(result, this.createDetailPair(arcA, arcB, arcBInArcAFractionSpace, arcBStart, arcBEnd, fractionSpacesReversed));\n } else { // test isolated intersection\n const testStartOfArcB = fractionSpacesReversed ? testStartOfArcA : !testStartOfArcA;\n const arcAPt = this._point0 = testStartOfArcA ? arcA.startPoint(this._point0) : arcA.endPoint(this._point0);\n const arcBPt = this._point1 = testStartOfArcB ? arcB.startPoint(this._point1) : arcB.endPoint(this._point1);\n if (arcAPt.isAlmostEqual(arcBPt, this.tolerance)) {\n const detailA = CurveLocationDetail.createCurveFractionPoint(arcA, testStartOfArcA ? 0 : 1, arcAPt);\n const detailB = CurveLocationDetail.createCurveFractionPoint(arcB, testStartOfArcB ? 0 : 1, arcBPt);\n result = this.appendDetailPair(result, CurveLocationDetailPair.createCapture(detailA, detailB));\n }\n }\n return result !== undefined && result.length > size;\n };\n\n appendCoincidentIntersection(fractionSweepB, false); // compute overlap in strict interior, or at end of arcA\n\n // check overlap at start of arcA with a periodic shift of fractionSweepB\n if (fractionB1 >= fractionPeriodA)\n appendCoincidentIntersection(Segment1d.create(fractionB0 - fractionPeriodA, fractionB1 - fractionPeriodA), true);\n else if (fractionB0 === 0.0)\n appendCoincidentIntersection(Segment1d.create(fractionB0 + fractionPeriodA, fractionB1 + fractionPeriodA), true);\n }\n }\n }\n return result;\n }\n}\n"]}
@@ -31,7 +31,7 @@ import { Transform } from "./Transform";
31
31
  * For the equator circle, phi=0, cos(phi) = 1, sin(phi)=0
32
32
  * f = u * cos(theta) + v * sin(theta).
33
33
  * with derivative
34
- * df / dTheta = = u * sin(theta) + v * cos(theta)
34
+ * df / dTheta = - u * sin(theta) + v * cos(theta)
35
35
  * whose zero is tan(theta) = v/u
36
36
  * (and that has two solutions 180 degrees apart)
37
37
  * Then with that theta let A = u * cos(theta) + v * sin(theta)