@itwin/core-geometry 5.12.0-dev.9 → 5.13.0-dev.1

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 (540) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/Constant.js.map +1 -1
  3. package/lib/cjs/Geometry.js.map +1 -1
  4. package/lib/cjs/bspline/AkimaCurve3d.d.ts +5 -0
  5. package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
  6. package/lib/cjs/bspline/AkimaCurve3d.js +8 -0
  7. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  8. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  10. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  11. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  12. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  13. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  14. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  15. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  16. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  17. package/lib/cjs/bspline/InterpolationCurve3d.d.ts +5 -0
  18. package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
  19. package/lib/cjs/bspline/InterpolationCurve3d.js +8 -0
  20. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  21. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  22. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  23. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  24. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  25. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  26. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  27. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  28. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  29. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  30. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  31. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  32. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  33. package/lib/cjs/core-geometry.js.map +1 -1
  34. package/lib/cjs/curve/Arc3d.js.map +1 -1
  35. package/lib/cjs/curve/ConstrainedCurve2d.js.map +1 -1
  36. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  37. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  38. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  39. package/lib/cjs/curve/CurveCollection.d.ts +2 -0
  40. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  41. package/lib/cjs/curve/CurveCollection.js +5 -0
  42. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  43. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  44. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  45. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  46. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  47. package/lib/cjs/curve/CurveOps.js.map +1 -1
  48. package/lib/cjs/curve/CurvePrimitive.d.ts +2 -0
  49. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  50. package/lib/cjs/curve/CurvePrimitive.js +5 -0
  51. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  52. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  53. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  54. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  55. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  56. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  57. package/lib/cjs/curve/LineString3d.js.map +1 -1
  58. package/lib/cjs/curve/Loop.js.map +1 -1
  59. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  60. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  61. package/lib/cjs/curve/Path.js.map +1 -1
  62. package/lib/cjs/curve/PointString3d.js.map +1 -1
  63. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  64. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  65. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  66. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  67. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  68. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +3 -3
  69. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  70. package/lib/cjs/curve/Query/PlanarSubdivision.js +6 -6
  71. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  72. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  73. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  74. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  75. package/lib/cjs/curve/RegionOps.d.ts +69 -8
  76. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  77. package/lib/cjs/curve/RegionOps.js +257 -86
  78. package/lib/cjs/curve/RegionOps.js.map +1 -1
  79. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +2 -3
  80. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  81. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +5 -6
  82. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  83. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  84. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  85. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  86. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  87. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  88. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  89. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  90. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  91. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  92. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  93. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -1
  94. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  95. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +82 -58
  96. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  97. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  98. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  99. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  100. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  101. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  102. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +3 -7
  103. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  104. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +48 -53
  105. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  106. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  107. package/lib/cjs/curve/internalContexts/PointToCurveTangentHandler.js.map +1 -1
  108. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  109. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  110. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  111. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  112. package/lib/cjs/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.js.map +1 -1
  113. package/lib/cjs/curve/internalContexts/geometry2d/ConstraintSet.js.map +1 -1
  114. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2d.js.map +1 -1
  115. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.js.map +1 -1
  116. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedCircle2d.js.map +1 -1
  117. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedEllipse2d.js.map +1 -1
  118. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedHyperbola2d.js.map +1 -1
  119. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedLine2d.js.map +1 -1
  120. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedParabola2d.js.map +1 -1
  121. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  122. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  123. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  124. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  125. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  126. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  127. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  128. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  129. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  130. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  131. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  132. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  133. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  134. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  135. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  136. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  137. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  138. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  139. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  140. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  141. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  142. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  143. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  144. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  145. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  146. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  147. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  148. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  149. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  150. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  151. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  152. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  153. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  154. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  155. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  156. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  157. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  158. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  159. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  160. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  161. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  162. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  163. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  164. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  165. package/lib/cjs/geometry3d/Range.js.map +1 -1
  166. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  167. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  168. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  169. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  170. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  171. package/lib/cjs/geometry3d/Transform.d.ts +1 -4
  172. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  173. package/lib/cjs/geometry3d/Transform.js +1 -4
  174. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  175. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  176. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  177. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  178. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  179. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  180. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  181. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  182. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  183. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  184. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  185. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  186. package/lib/cjs/numerics/Complex.js.map +1 -1
  187. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  188. package/lib/cjs/numerics/Newton.js.map +1 -1
  189. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  190. package/lib/cjs/numerics/PolarData.js.map +1 -1
  191. package/lib/cjs/numerics/Polynomials.d.ts +3 -3
  192. package/lib/cjs/numerics/Polynomials.js +5 -5
  193. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  194. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  195. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  196. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  197. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  198. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  199. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  200. package/lib/cjs/polyface/AuxData.js.map +1 -1
  201. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  202. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  203. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  204. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  205. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  206. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  207. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  208. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  209. package/lib/cjs/polyface/Polyface.js.map +1 -1
  210. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  211. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  212. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  213. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  214. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  215. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  216. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  217. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  218. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  219. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  220. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  221. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  222. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  223. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  224. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  225. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  226. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  227. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  228. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  229. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  230. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  231. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  232. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  233. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  234. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  235. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  236. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  237. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  238. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  239. package/lib/cjs/solid/Box.js.map +1 -1
  240. package/lib/cjs/solid/Cone.js.map +1 -1
  241. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  242. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  243. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  244. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  245. package/lib/cjs/solid/Sphere.js.map +1 -1
  246. package/lib/cjs/solid/SweepContour.js.map +1 -1
  247. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  248. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  249. package/lib/cjs/topology/Graph.d.ts +5 -2
  250. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  251. package/lib/cjs/topology/Graph.js +5 -2
  252. package/lib/cjs/topology/Graph.js.map +1 -1
  253. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  254. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  255. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  256. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  257. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  258. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  259. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  260. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  261. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  262. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  263. package/lib/cjs/topology/MaskManager.js.map +1 -1
  264. package/lib/cjs/topology/Merging.js.map +1 -1
  265. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  266. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  267. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  268. package/lib/cjs/topology/Triangulation.js.map +1 -1
  269. package/lib/cjs/topology/Voronoi.js.map +1 -1
  270. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  271. package/lib/esm/Constant.js.map +1 -1
  272. package/lib/esm/Geometry.js.map +1 -1
  273. package/lib/esm/bspline/AkimaCurve3d.d.ts +5 -0
  274. package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
  275. package/lib/esm/bspline/AkimaCurve3d.js +8 -0
  276. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  277. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  278. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  279. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  280. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  281. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  282. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  283. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  284. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  285. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  286. package/lib/esm/bspline/InterpolationCurve3d.d.ts +5 -0
  287. package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
  288. package/lib/esm/bspline/InterpolationCurve3d.js +8 -0
  289. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  290. package/lib/esm/bspline/KnotVector.js.map +1 -1
  291. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  292. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  293. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  294. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  295. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  296. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  297. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  298. package/lib/esm/clipping/ClipVector.js.map +1 -1
  299. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  300. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  301. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  302. package/lib/esm/core-geometry.js.map +1 -1
  303. package/lib/esm/curve/Arc3d.js.map +1 -1
  304. package/lib/esm/curve/ConstrainedCurve2d.js.map +1 -1
  305. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  306. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  307. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  308. package/lib/esm/curve/CurveCollection.d.ts +2 -0
  309. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  310. package/lib/esm/curve/CurveCollection.js +5 -0
  311. package/lib/esm/curve/CurveCollection.js.map +1 -1
  312. package/lib/esm/curve/CurveCurve.js.map +1 -1
  313. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  314. package/lib/esm/curve/CurveFactory.js.map +1 -1
  315. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  316. package/lib/esm/curve/CurveOps.js.map +1 -1
  317. package/lib/esm/curve/CurvePrimitive.d.ts +2 -0
  318. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  319. package/lib/esm/curve/CurvePrimitive.js +5 -0
  320. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  321. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  322. package/lib/esm/curve/CurveTypes.js.map +1 -1
  323. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  324. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  325. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  326. package/lib/esm/curve/LineString3d.js.map +1 -1
  327. package/lib/esm/curve/Loop.js.map +1 -1
  328. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  329. package/lib/esm/curve/ParityRegion.js.map +1 -1
  330. package/lib/esm/curve/Path.js.map +1 -1
  331. package/lib/esm/curve/PointString3d.js.map +1 -1
  332. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  333. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  334. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  335. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  336. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  337. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +3 -3
  338. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  339. package/lib/esm/curve/Query/PlanarSubdivision.js +6 -6
  340. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  341. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  342. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  343. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  344. package/lib/esm/curve/RegionOps.d.ts +69 -8
  345. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  346. package/lib/esm/curve/RegionOps.js +257 -86
  347. package/lib/esm/curve/RegionOps.js.map +1 -1
  348. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +2 -3
  349. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  350. package/lib/esm/curve/RegionOpsClassificationSweeps.js +5 -6
  351. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  352. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  353. package/lib/esm/curve/UnionRegion.js.map +1 -1
  354. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  355. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  356. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  357. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  358. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  359. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  360. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  361. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  362. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -1
  363. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  364. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +82 -58
  365. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  366. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  367. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  368. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  369. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  370. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  371. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +3 -7
  372. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  373. package/lib/esm/curve/internalContexts/MultiChainCollector.js +48 -53
  374. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  375. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  376. package/lib/esm/curve/internalContexts/PointToCurveTangentHandler.js.map +1 -1
  377. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  378. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  379. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  380. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  381. package/lib/esm/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.js.map +1 -1
  382. package/lib/esm/curve/internalContexts/geometry2d/ConstraintSet.js.map +1 -1
  383. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2d.js.map +1 -1
  384. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.js.map +1 -1
  385. package/lib/esm/curve/internalContexts/geometry2d/UnboundedCircle2d.js.map +1 -1
  386. package/lib/esm/curve/internalContexts/geometry2d/UnboundedEllipse2d.js.map +1 -1
  387. package/lib/esm/curve/internalContexts/geometry2d/UnboundedHyperbola2d.js.map +1 -1
  388. package/lib/esm/curve/internalContexts/geometry2d/UnboundedLine2d.js.map +1 -1
  389. package/lib/esm/curve/internalContexts/geometry2d/UnboundedParabola2d.js.map +1 -1
  390. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  391. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  392. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  393. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  394. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  395. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  396. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  397. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  398. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  399. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  400. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  401. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  402. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  403. package/lib/esm/geometry3d/Angle.js.map +1 -1
  404. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  405. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  406. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  407. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  408. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  409. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  410. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  411. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  412. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  413. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  414. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  415. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  416. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  417. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  418. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  419. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  420. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  421. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  422. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  423. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  424. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  425. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  426. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  427. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  428. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  429. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  430. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  431. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  432. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  433. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  434. package/lib/esm/geometry3d/Range.js.map +1 -1
  435. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  436. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  437. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  438. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  439. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  440. package/lib/esm/geometry3d/Transform.d.ts +1 -4
  441. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  442. package/lib/esm/geometry3d/Transform.js +1 -4
  443. package/lib/esm/geometry3d/Transform.js.map +1 -1
  444. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  445. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  446. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  447. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  448. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  449. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  450. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  451. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  452. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  453. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  454. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  455. package/lib/esm/numerics/Complex.js.map +1 -1
  456. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  457. package/lib/esm/numerics/Newton.js.map +1 -1
  458. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  459. package/lib/esm/numerics/PolarData.js.map +1 -1
  460. package/lib/esm/numerics/Polynomials.d.ts +3 -3
  461. package/lib/esm/numerics/Polynomials.js +5 -5
  462. package/lib/esm/numerics/Polynomials.js.map +1 -1
  463. package/lib/esm/numerics/Quadrature.js.map +1 -1
  464. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  465. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  466. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  467. package/lib/esm/numerics/UnionFind.js.map +1 -1
  468. package/lib/esm/numerics/UsageSums.js.map +1 -1
  469. package/lib/esm/polyface/AuxData.js.map +1 -1
  470. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  471. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  472. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  473. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  474. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  475. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  476. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  477. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  478. package/lib/esm/polyface/Polyface.js.map +1 -1
  479. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  480. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  481. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  482. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  483. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  484. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  485. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  486. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  487. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  488. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  489. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  490. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  491. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  492. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  493. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  494. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  495. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  496. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  497. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  498. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  499. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  500. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  501. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  502. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  503. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  504. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  505. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  506. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  507. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  508. package/lib/esm/solid/Box.js.map +1 -1
  509. package/lib/esm/solid/Cone.js.map +1 -1
  510. package/lib/esm/solid/LinearSweep.js.map +1 -1
  511. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  512. package/lib/esm/solid/RuledSweep.js.map +1 -1
  513. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  514. package/lib/esm/solid/Sphere.js.map +1 -1
  515. package/lib/esm/solid/SweepContour.js.map +1 -1
  516. package/lib/esm/solid/TorusPipe.js.map +1 -1
  517. package/lib/esm/topology/ChainMerge.js.map +1 -1
  518. package/lib/esm/topology/Graph.d.ts +5 -2
  519. package/lib/esm/topology/Graph.d.ts.map +1 -1
  520. package/lib/esm/topology/Graph.js +5 -2
  521. package/lib/esm/topology/Graph.js.map +1 -1
  522. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  523. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  524. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  525. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  526. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  527. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  528. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  529. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  530. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  531. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  532. package/lib/esm/topology/MaskManager.js.map +1 -1
  533. package/lib/esm/topology/Merging.js.map +1 -1
  534. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  535. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  536. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  537. package/lib/esm/topology/Triangulation.js.map +1 -1
  538. package/lib/esm/topology/Voronoi.js.map +1 -1
  539. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  540. package/package.json +5 -5
@@ -38,8 +38,6 @@ class MultiChainCollector {
38
38
  _chains;
39
39
  /** Largest gap distance to close. */
40
40
  _gapTolerance;
41
- /** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */
42
- _snapTolerance;
43
41
  /** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */
44
42
  _planeTolerance;
45
43
  static _staticPointA;
@@ -48,30 +46,28 @@ class MultiChainCollector {
48
46
  _xyzWork1;
49
47
  /** Initialize with an empty array of chains.
50
48
  * @param gapTolerance distance tolerance for calling endpoints identical
51
- * @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
49
+ * @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within this tolerance of a plane.
52
50
  */
53
51
  constructor(gapTolerance = Geometry_1.Geometry.smallMetricDistance, planeTolerance) {
54
52
  this._chains = [];
55
53
  this._gapTolerance = gapTolerance;
56
- this._snapTolerance = Geometry_1.Geometry.smallMetricDistance;
57
54
  this._planeTolerance = planeTolerance;
58
55
  }
59
56
  /**
60
57
  * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz
61
58
  * @param xyz endpoint to check
62
- * @param distanceTol absolute distance tolerance for equating endpoints
63
59
  * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.
64
60
  */
65
- findAnyChainToConnect(xyz, distanceTol, exceptChainIndex = -1) {
61
+ findAnyChainToConnect(xyz, exceptChainIndex = -1) {
66
62
  for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {
67
63
  if (exceptChainIndex === chainIndexA)
68
64
  continue;
69
65
  const chain = this._chains[chainIndexA];
70
66
  this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);
71
- if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))
67
+ if (this._xyzWork1.isAlmostEqual(xyz, this._gapTolerance))
72
68
  return { chainIndex: chainIndexA, atEnd: true };
73
69
  this._xyzWork1 = chain[0].startPoint(this._xyzWork1);
74
- if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))
70
+ if (this._xyzWork1.isAlmostEqual(xyz, this._gapTolerance))
75
71
  return { chainIndex: chainIndexA, atEnd: false };
76
72
  }
77
73
  return undefined;
@@ -83,11 +79,7 @@ class MultiChainCollector {
83
79
  * @param candidate curve to add to the context
84
80
  */
85
81
  captureCurvePrimitive(candidate) {
86
- if (this._snapTolerance < this._gapTolerance) {
87
- if (this.attachPrimitiveToAnyChain(candidate, this._snapTolerance))
88
- return;
89
- }
90
- if (this.attachPrimitiveToAnyChain(candidate, this._gapTolerance))
82
+ if (this.attachPrimitiveToAnyChain(candidate))
91
83
  return;
92
84
  this._chains.push([candidate]);
93
85
  }
@@ -106,7 +98,7 @@ class MultiChainCollector {
106
98
  }
107
99
  }
108
100
  /** If allowed by the geometry type, move an endpoint. */
109
- static simpleEndPointMove(curve, atEnd, to) {
101
+ simpleEndPointMove(curve, atEnd, to) {
110
102
  if (curve instanceof (LineSegment3d_1.LineSegment3d)) {
111
103
  if (atEnd) {
112
104
  curve.point1Ref.setFrom(to);
@@ -128,89 +120,92 @@ class MultiChainCollector {
128
120
  * * All z-coordinates are ignored.
129
121
  * @param curve0 first curve, assumed to end close to the start of curve1
130
122
  * @param curve1 second curve, assumed to start close to the end of curve0
131
- * @param gapTolerance max distance to move a curve start/end point
132
123
  * @returns whether curve start/end point(s) moved
133
124
  */
134
- static moveHeadOrTail(curve0, curve1, gapTolerance) {
125
+ moveHeadOrTail(curve0, curve1) {
135
126
  const xyz0 = curve0.endPoint();
136
127
  const xyz1 = curve1.startPoint();
137
128
  const minShift = Geometry_1.Geometry.smallMetricDistance * 0.001;
138
- const d01 = xyz0.distanceXY(xyz1);
139
- if (d01 < minShift)
129
+ let dist2 = xyz0.distanceSquaredXY(xyz1);
130
+ if (dist2 <= minShift * minShift)
131
+ return false; // if the move would be miniscule, don't bother
132
+ const gap2 = this._gapTolerance * this._gapTolerance;
133
+ if (dist2 > gap2)
140
134
  return false;
141
135
  // try lines and linestrings
142
- if (d01 < gapTolerance) {
143
- if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))
144
- return true;
145
- }
136
+ if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))
137
+ return true;
146
138
  // try other primitive types
139
+ if (!(curve0 instanceof Arc3d_1.Arc3d && curve1 instanceof Arc3d_1.Arc3d))
140
+ return false; // currently we only consider 2 arcs
147
141
  const intersections = CurveCurve_1.CurveCurve.intersectionXYPairs(curve0, true, curve1, true);
148
- const shiftFactor = 5.0;
149
- for (const pair of intersections) {
150
- const detail0 = pair.detailA;
151
- const detail1 = pair.detailB;
152
- const distance0 = detail0.point.distanceXY(xyz0);
153
- const distance1 = detail1.point.distanceXY(xyz1);
154
- if (distance0 < shiftFactor * gapTolerance && distance1 < shiftFactor * gapTolerance) {
155
- if (curve0 instanceof Arc3d_1.Arc3d && curve1 instanceof Arc3d_1.Arc3d) {
156
- const radians0End = curve0.sweep.fractionToRadians(detail0.fraction);
157
- curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);
158
- const radians1Start = curve1.sweep.fractionToRadians(detail1.fraction);
159
- curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);
160
- return true;
161
- }
162
- // TODO: other combinations of types
142
+ let iClosest = -1;
143
+ let minDist2 = Infinity;
144
+ for (let i = 0; i < intersections.length; ++i) { // find intersection closest to the joint
145
+ const dist20 = intersections[i].detailA.point.distanceSquaredXY(xyz0);
146
+ const dist21 = intersections[i].detailB.point.distanceSquaredXY(xyz1);
147
+ dist2 = dist20 + dist21;
148
+ if (dist20 <= gap2 && dist21 <= gap2 && dist2 < minDist2) {
149
+ minDist2 = dist2;
150
+ iClosest = i;
163
151
  }
164
152
  }
153
+ if (iClosest >= 0) { // move arc ends to the intersection point
154
+ const radians0End = curve0.sweep.fractionToRadians(intersections[iClosest].detailA.fraction);
155
+ curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);
156
+ const radians1Start = curve1.sweep.fractionToRadians(intersections[iClosest].detailB.fraction);
157
+ curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);
158
+ return true;
159
+ }
165
160
  return false;
166
161
  }
167
162
  /** Announce a curve primitive
168
163
  * * If a "nearby" connection is possible, insert the candidate in the chain and force endpoint match.
169
164
  * * Otherwise start a new chain.
170
165
  */
171
- attachPrimitiveToAnyChain(candidate, distanceTol) {
172
- if (candidate.curveLength() < distanceTol) {
166
+ attachPrimitiveToAnyChain(candidate) {
167
+ if (candidate.curveLength() < this._gapTolerance) {
173
168
  return true;
174
169
  }
175
170
  else {
176
171
  this._xyzWork0 = candidate.startPoint(this._xyzWork0);
177
- let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);
172
+ let connect = this.findAnyChainToConnect(this._xyzWork0);
178
173
  if (connect) {
179
174
  if (connect.atEnd) {
180
175
  const chain = this._chains[connect.chainIndex];
181
176
  const index0 = chain.length - 1;
182
177
  this._chains[connect.chainIndex].push(candidate);
183
- MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);
184
- this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
178
+ this.moveHeadOrTail(chain[index0], chain[index0 + 1]);
179
+ this.searchAndMergeChainIndex(connect.chainIndex);
185
180
  return true;
186
181
  }
187
182
  else {
188
183
  candidate.reverseInPlace();
189
184
  const chain = this._chains[connect.chainIndex];
190
185
  chain.splice(0, 0, candidate);
191
- MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);
192
- this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
186
+ this.moveHeadOrTail(chain[0], chain[1]);
187
+ this.searchAndMergeChainIndex(connect.chainIndex);
193
188
  return true;
194
189
  }
195
190
  }
196
191
  else {
197
192
  this._xyzWork0 = candidate.endPoint(this._xyzWork0);
198
- connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);
193
+ connect = this.findAnyChainToConnect(this._xyzWork0);
199
194
  if (connect) {
200
195
  if (connect.atEnd) {
201
196
  candidate.reverseInPlace();
202
197
  const chain = this._chains[connect.chainIndex];
203
198
  const index0 = chain.length - 1;
204
199
  this._chains[connect.chainIndex].push(candidate);
205
- MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);
206
- this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
200
+ this.moveHeadOrTail(chain[index0], chain[index0 + 1]);
201
+ this.searchAndMergeChainIndex(connect.chainIndex);
207
202
  return true;
208
203
  }
209
204
  else {
210
205
  const chain = this._chains[connect.chainIndex];
211
206
  chain.splice(0, 0, candidate);
212
- MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);
213
- this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
207
+ this.moveHeadOrTail(chain[0], chain[1]);
208
+ this.searchAndMergeChainIndex(connect.chainIndex);
214
209
  return true;
215
210
  }
216
211
  }
@@ -247,13 +242,13 @@ class MultiChainCollector {
247
242
  p.reverseInPlace();
248
243
  }
249
244
  /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */
250
- searchAndMergeChainIndex(chainIndex, distanceTol) {
245
+ searchAndMergeChainIndex(chainIndex) {
251
246
  // ASSUME valid index of non-empty chain
252
247
  const chain = this._chains[chainIndex];
253
248
  const lastIndexInChain = chain.length - 1;
254
249
  this._xyzWork0 = chain[0].startPoint(this._xyzWork0);
255
250
  // try start with any other chain
256
- let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);
251
+ let connect = this.findAnyChainToConnect(this._xyzWork0, chainIndex);
257
252
  if (connect) {
258
253
  if (!connect.atEnd)
259
254
  this.reverseChain(connect.chainIndex);
@@ -262,7 +257,7 @@ class MultiChainCollector {
262
257
  }
263
258
  // try end with any other chain
264
259
  this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);
265
- connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);
260
+ connect = this.findAnyChainToConnect(this._xyzWork0, chainIndex);
266
261
  if (connect) {
267
262
  if (connect.atEnd)
268
263
  this.reverseChain(connect.chainIndex);
@@ -284,7 +279,7 @@ class MultiChainCollector {
284
279
  const primitiveN = curves[curves.length - 1];
285
280
  MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);
286
281
  MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);
287
- if (MultiChainCollector.moveHeadOrTail(primitiveN, primitive0, this._gapTolerance)) {
282
+ if (this.moveHeadOrTail(primitiveN, primitive0)) {
288
283
  // get the corrected coordinates
289
284
  MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);
290
285
  MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);
@@ -1 +1 @@
1
- {"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,6CAA0C;AAC1C,gEAA6D;AAG7D,oCAAiC;AACjC,wDAAkE;AAClE,8CAA2C;AAC3C,sDAAmD;AAEnD,oDAAiD;AACjD,kDAA+C;AAC/C,kCAA+B;AAC/B,kCAA+B;AAC/B,4CAAyC;AAGzC;;;;;;;;;;;;;GAaG;AACH,MAAa,mBAAmB;IAC9B,0BAA0B;IAClB,OAAO,CAAqB;IACpC,qCAAqC;IAC7B,aAAa,CAAS;IAC9B,oFAAoF;IAC5E,cAAc,CAAS;IAC/B,gIAAgI;IACxH,eAAe,CAAqB;IAEpC,MAAM,CAAC,aAAa,CAAU;IAC9B,MAAM,CAAC,aAAa,CAAU;IAC9B,SAAS,CAAW;IACpB,SAAS,CAAW;IAE5B;;;OAGG;IACH,YAAmB,YAAY,GAAG,mBAAQ,CAAC,mBAAmB,EAAE,cAAuB;QACrF,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,mBAAQ,CAAC,mBAAmB,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACxC,CAAC;IACD;;;;;OAKG;IACK,qBAAqB,CAAC,GAAY,EAAE,WAAmB,EAAE,mBAA2B,CAAC,CAAC;QAC5F,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;YAC3E,IAAI,gBAAgB,KAAK,WAAW;gBAClC,SAAS;YACX,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC;gBAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC;gBAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;OAKG;IACI,qBAAqB,CAAC,SAAyB;QACpD,IAAI,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;gBAChE,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;YAC/D,OAAO;QACT,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACjC,CAAC;IACD;;;;;OAKG;IACI,YAAY,CAAC,SAAmB;QACrC,IAAI,SAAS,YAAY,+BAAc;YACrC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;aACnC,IAAI,SAAS,YAAY,iCAAe,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ;gBAChC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,yDAAyD;IACjD,MAAM,CAAC,kBAAkB,CAAC,KAAqB,EAAE,KAAc,EAAE,EAAU;QACjF,IAAI,KAAK,YAAY,CAAC,6BAAa,CAAC,EAAE,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,KAAK,YAAY,2BAAY,IAAI,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,KAAK,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;;OAOG;IACK,MAAM,CAAC,cAAc,CAAC,MAAsB,EAAE,MAAsB,EAAE,YAAoB;QAChG,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,mBAAQ,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG,GAAG,QAAQ;YAChB,OAAO,KAAK,CAAC;QACf,4BAA4B;QAC5B,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;gBAC7F,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,4BAA4B;QAC5B,MAAM,aAAa,GAAG,uBAAU,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,GAAG,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,SAAS,GAAG,WAAW,GAAG,YAAY,IAAI,SAAS,GAAG,WAAW,GAAG,YAAY,EAAE,CAAC;gBACrF,IAAI,MAAM,YAAY,aAAK,IAAI,MAAM,YAAY,aAAK,EAAE,CAAC;oBACvD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACrE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBACxE,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACvE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACxE,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,oCAAoC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;OAGG;IACK,yBAAyB,CAAC,SAAyB,EAAE,WAAmB;QAC9E,IAAI,SAAS,CAAC,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACtE,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;oBAChC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACjD,mBAAmB,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;oBACzF,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;oBAC/D,OAAO,IAAI,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,cAAc,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC/C,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;oBAC9B,mBAAmB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC3E,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;oBAC/D,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpD,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAClE,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;wBAClB,SAAS,CAAC,cAAc,EAAE,CAAC;wBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;wBAChC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBACjD,mBAAmB,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;wBACzF,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;wBAC/D,OAAO,IAAI,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBAC/C,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;wBAC9B,mBAAmB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;wBAC3E,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;wBAC/D,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;;;OAQG;IACK,yBAAyB,CAAC,WAAmB,EAAE,WAAmB;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,wBAAwB;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/C,IAAI,WAAW,KAAK,cAAc;YAChC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,wCAAwC;IAChC,YAAY,CAAC,UAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvC,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,KAAK;YACnB,CAAC,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC;IACD,qGAAqG;IAC7F,wBAAwB,CAAC,UAAkB,EAAE,WAAmB;QACtE,wCAAwC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,iCAAiC;QACjC,IAAI,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAClF,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,KAAK;gBAChB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,+BAA+B;QAC/B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClE,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9E,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,KAAK;gBACf,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;IACH,CAAC;IACD;;;;;OAKG;IACK,oBAAoB,CAAC,MAAwB,EAAE,gBAAyB;QAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7C,mBAAmB,CAAC,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YAC7F,mBAAmB,CAAC,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YAC3F,IAAI,mBAAmB,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACnF,gCAAgC;gBAChC,mBAAmB,CAAC,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;gBAC7F,mBAAmB,CAAC,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YAC7F,CAAC;YACD,IAAI,mBAAmB,CAAC,aAAa,CAAC,aAAa,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC3G,MAAM,YAAY,GAAG,2BAAY,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;gBACxE,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC5C,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,KAAK,GAAG,qBAAS,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;wBAC9D,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;4BAClF,OAAO,WAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;wBAClC,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO,WAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,WAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,wEAAwE;IAChE,mBAAmB,CAAC,KAAuB,EAAE,OAAuB;QAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,MAAM,UAAU,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,KAAK;YACvB,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACzC,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,8EAA8E;IACvE,UAAU,CAAC,mBAA4B,KAAK;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,6BAAW,CAAC,MAAM,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAC7D,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD;;;MAGE;IACK,4BAA4B,CAAC,aAAyC,EAAE,OAAuB;QACpG,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,EAAE;gBACJ,aAAa,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACpD,IAAI,EAAE;oBACJ,aAAa,CAAC,EAAE,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAxTD,kDAwTC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { BagOfCurves, CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { AnyChain, AnyCurve } from \"../CurveTypes\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\nimport { RegionOps } from \"../RegionOps\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\n\r\n/**\r\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\r\n * * The caller makes a sequence of calls to announce individual primitives.\r\n * * This collector (unlike the simpler [[ChainCollectorContext]]) expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\r\n * * When all curves have been announced, the call to `grabResult` restructures the various active chains into Paths (and optionally, Loops).\r\n * * Chain formation is dependent upon input fragment order, as a greedy algorithm is employed.\r\n * * Usage pattern is\r\n * * initialization: `context = new MultiChainCollector(gapTol, planeTol)`\r\n * * many times:\r\n * * `context.captureCurve(anyCurve)`\r\n * * `context.captureCurvePrimitive(primitive)`\r\n * * end: `result = context.grabResult(makeLoopIfClosed)`\r\n * @internal\r\n */\r\nexport class MultiChainCollector {\r\n /** Accumulated chains. */\r\n private _chains: CurvePrimitive[][];\r\n /** Largest gap distance to close. */\r\n private _gapTolerance: number;\r\n /** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */\r\n private _snapTolerance: number;\r\n /** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */\r\n private _planeTolerance: number | undefined;\r\n\r\n private static _staticPointA: Point3d;\r\n private static _staticPointB: Point3d;\r\n private _xyzWork0?: Point3d;\r\n private _xyzWork1?: Point3d;\r\n\r\n /** Initialize with an empty array of chains.\r\n * @param gapTolerance distance tolerance for calling endpoints identical\r\n * @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.\r\n */\r\n public constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance?: number) {\r\n this._chains = [];\r\n this._gapTolerance = gapTolerance;\r\n this._snapTolerance = Geometry.smallMetricDistance;\r\n this._planeTolerance = planeTolerance;\r\n }\r\n /**\r\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\r\n * @param xyz endpoint to check\r\n * @param distanceTol absolute distance tolerance for equating endpoints\r\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\r\n */\r\n private findAnyChainToConnect(xyz: Point3d, distanceTol: number, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\r\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\r\n if (exceptChainIndex === chainIndexA)\r\n continue;\r\n const chain = this._chains[chainIndexA];\r\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))\r\n return { chainIndex: chainIndexA, atEnd: true };\r\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))\r\n return { chainIndex: chainIndexA, atEnd: false };\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Insert a single curve primitive into the active chains.\r\n * * The primitive is captured (not cloned)\r\n * * The primitive may be reversed in place\r\n * @param candidate curve to add to the context\r\n */\r\n public captureCurvePrimitive(candidate: CurvePrimitive) {\r\n if (this._snapTolerance < this._gapTolerance) {\r\n if (this.attachPrimitiveToAnyChain(candidate, this._snapTolerance))\r\n return;\r\n }\r\n if (this.attachPrimitiveToAnyChain(candidate, this._gapTolerance))\r\n return;\r\n this._chains.push([candidate]);\r\n }\r\n /**\r\n * Insert any curve into the collection.\r\n * * This recurses into Path, Loop, BagOfCurves etc\r\n * * All primitives are captured, and may be reversed in place.\r\n * @param candidate curve to add to the context\r\n */\r\n public captureCurve(candidate: AnyCurve) {\r\n if (candidate instanceof CurvePrimitive)\r\n this.captureCurvePrimitive(candidate);\r\n else if (candidate instanceof CurveCollection) {\r\n for (const c of candidate.children)\r\n this.captureCurve(c);\r\n }\r\n }\r\n /** If allowed by the geometry type, move an endpoint. */\r\n private static simpleEndPointMove(curve: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\r\n if (curve instanceof (LineSegment3d)) {\r\n if (atEnd) {\r\n curve.point1Ref.setFrom(to);\r\n } else {\r\n curve.point0Ref.setFrom(to);\r\n }\r\n return true;\r\n } else if (curve instanceof LineString3d && curve.numPoints() > 0) {\r\n const i = atEnd ? curve.numPoints() - 1 : 0;\r\n curve.packedPoints.setAtCheckedPointIndex(i, to);\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * Try to move the end of curve0 and/or the start of curve1 to a common point.\r\n * * All z-coordinates are ignored.\r\n * @param curve0 first curve, assumed to end close to the start of curve1\r\n * @param curve1 second curve, assumed to start close to the end of curve0\r\n * @param gapTolerance max distance to move a curve start/end point\r\n * @returns whether curve start/end point(s) moved\r\n */\r\n private static moveHeadOrTail(curve0: CurvePrimitive, curve1: CurvePrimitive, gapTolerance: number): boolean {\r\n const xyz0 = curve0.endPoint();\r\n const xyz1 = curve1.startPoint();\r\n const minShift = Geometry.smallMetricDistance * 0.001;\r\n const d01 = xyz0.distanceXY(xyz1);\r\n if (d01 < minShift)\r\n return false;\r\n // try lines and linestrings\r\n if (d01 < gapTolerance) {\r\n if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))\r\n return true;\r\n }\r\n // try other primitive types\r\n const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);\r\n const shiftFactor = 5.0;\r\n for (const pair of intersections) {\r\n const detail0 = pair.detailA;\r\n const detail1 = pair.detailB;\r\n const distance0 = detail0.point.distanceXY(xyz0);\r\n const distance1 = detail1.point.distanceXY(xyz1);\r\n if (distance0 < shiftFactor * gapTolerance && distance1 < shiftFactor * gapTolerance) {\r\n if (curve0 instanceof Arc3d && curve1 instanceof Arc3d) {\r\n const radians0End = curve0.sweep.fractionToRadians(detail0.fraction);\r\n curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);\r\n const radians1Start = curve1.sweep.fractionToRadians(detail1.fraction);\r\n curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);\r\n return true;\r\n }\r\n // TODO: other combinations of types\r\n }\r\n }\r\n return false;\r\n }\r\n /** Announce a curve primitive\r\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\r\n * * Otherwise start a new chain.\r\n */\r\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive, distanceTol: number): boolean {\r\n if (candidate.curveLength() < distanceTol) {\r\n return true;\r\n } else {\r\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);\r\n if (connect) {\r\n if (connect.atEnd) {\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\r\n return true;\r\n } else {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\r\n return true;\r\n }\r\n } else {\r\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);\r\n if (connect) {\r\n if (connect.atEnd) {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\r\n return true;\r\n } else {\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Merge two entries in the chain array.\r\n * * Move each primitive from chainB to the end of chainA.\r\n * * Clear chainB.\r\n * * Move the final chain to chainB index.\r\n * * Decrement the array length.\r\n * @param chainIndexA index of chainA\r\n * @param chainIndexB index of chainB\r\n */\r\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\r\n const chainA = this._chains[chainIndexA];\r\n const chainB = this._chains[chainIndexB];\r\n for (const p of chainB) {\r\n chainA.push(p);\r\n }\r\n chainB.length = 0; // chainIndexB is unused\r\n const lastChainIndex = this._chains.length - 1;\r\n if (chainIndexB !== lastChainIndex)\r\n this._chains[chainIndexB] = this._chains[lastChainIndex];\r\n this._chains.pop();\r\n }\r\n /** Reverse the curve chain in place. */\r\n private reverseChain(chainIndex: number) {\r\n const chain = this._chains[chainIndex];\r\n chain.reverse();\r\n for (const p of chain)\r\n p.reverseInPlace();\r\n }\r\n /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */\r\n private searchAndMergeChainIndex(chainIndex: number, distanceTol: number): void {\r\n // ASSUME valid index of non-empty chain\r\n const chain = this._chains[chainIndex];\r\n const lastIndexInChain = chain.length - 1;\r\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\r\n // try start with any other chain\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);\r\n if (connect) {\r\n if (!connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\r\n return;\r\n }\r\n // try end with any other chain\r\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);\r\n if (connect) {\r\n if (connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\r\n return;\r\n }\r\n }\r\n /**\r\n * Convert an array of curve primitives into the simplest possible strongly typed curve structure.\r\n * @param curves input array, assembled correctly into a single contiguous path, captured by returned object\r\n * @param makeLoopIfClosed whether to return a Loop from physically closed coplanar curves, otherwise Path\r\n * @return Loop or Path if multiple curves; the primitive if only one curve; undefined if no curves\r\n */\r\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\r\n if (curves.length === 0)\r\n return undefined;\r\n if (makeLoopIfClosed) {\r\n const primitive0 = curves[0];\r\n const primitiveN = curves[curves.length - 1];\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n if (MultiChainCollector.moveHeadOrTail(primitiveN, primitive0, this._gapTolerance)) {\r\n // get the corrected coordinates\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n }\r\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB, this._gapTolerance)) {\r\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\r\n if (localToWorld) {\r\n const worldToLocal = localToWorld.inverse();\r\n if (worldToLocal) {\r\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\r\n if (this._planeTolerance !== undefined && range.zLength() <= this._planeTolerance) {\r\n return Loop.createArray(curves);\r\n }\r\n }\r\n }\r\n return Path.createArray(curves);\r\n }\r\n }\r\n if (curves.length === 1)\r\n return curves[0];\r\n return Path.createArray(curves);\r\n }\r\n /** Stroke the curve chain to a line string, de-duplicate the points. */\r\n private chainToLineString3d(chain: CurvePrimitive[], options?: StrokeOptions): LineString3d | undefined {\r\n if (chain.length === 0)\r\n return undefined;\r\n const linestring = LineString3d.create();\r\n for (const curve of chain)\r\n curve.emitStrokes(linestring, options);\r\n linestring.removeDuplicatePoints(this._gapTolerance);\r\n return linestring;\r\n }\r\n /** Return the collected results, structured as the simplest possible type. */\r\n public grabResult(makeLoopIfClosed: boolean = false): AnyChain | undefined {\r\n const chains = this._chains;\r\n if (chains.length === 0)\r\n return undefined;\r\n if (chains.length === 1)\r\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\r\n const bag = BagOfCurves.create();\r\n for (const chain of chains) {\r\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\r\n bag.tryAddChild(q);\r\n }\r\n return bag;\r\n }\r\n /**\r\n * Return chains as individual calls to announceChain.\r\n * * Does not use planeTolerance.\r\n */\r\n public announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void {\r\n const chains = this._chains;\r\n if (chains.length === 1) {\r\n const ls = this.chainToLineString3d(chains[0], options);\r\n if (ls)\r\n announceChain(ls);\r\n } else if (chains.length > 1) {\r\n for (const chain of chains) {\r\n const ls = this.chainToLineString3d(chain, options);\r\n if (ls)\r\n announceChain(ls);\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.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 Curve\n */\n\nimport { Geometry } from \"../../Geometry\";\nimport { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\nimport { Arc3d } from \"../Arc3d\";\nimport { BagOfCurves, CurveCollection } from \"../CurveCollection\";\nimport { CurveCurve } from \"../CurveCurve\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { AnyChain, AnyCurve } from \"../CurveTypes\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop } from \"../Loop\";\nimport { Path } from \"../Path\";\nimport { RegionOps } from \"../RegionOps\";\nimport { StrokeOptions } from \"../StrokeOptions\";\n\n/**\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\n * * The caller makes a sequence of calls to announce individual primitives.\n * * This collector (unlike the simpler [[ChainCollectorContext]]) expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\n * * When all curves have been announced, the call to `grabResult` restructures the various active chains into Paths (and optionally, Loops).\n * * Chain formation is dependent upon input fragment order, as a greedy algorithm is employed.\n * * Usage pattern is\n * * initialization: `context = new MultiChainCollector(gapTol, planeTol)`\n * * many times:\n * * `context.captureCurve(anyCurve)`\n * * `context.captureCurvePrimitive(primitive)`\n * * end: `result = context.grabResult(makeLoopIfClosed)`\n * @internal\n */\nexport class MultiChainCollector {\n /** Accumulated chains. */\n private _chains: CurvePrimitive[][];\n /** Largest gap distance to close. */\n private _gapTolerance: number;\n /** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */\n private _planeTolerance: number | undefined;\n\n private static _staticPointA: Point3d;\n private static _staticPointB: Point3d;\n private _xyzWork0?: Point3d;\n private _xyzWork1?: Point3d;\n\n /** Initialize with an empty array of chains.\n * @param gapTolerance distance tolerance for calling endpoints identical\n * @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within this tolerance of a plane.\n */\n public constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance?: number) {\n this._chains = [];\n this._gapTolerance = gapTolerance;\n this._planeTolerance = planeTolerance;\n }\n /**\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\n * @param xyz endpoint to check\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\n */\n private findAnyChainToConnect(xyz: Point3d, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\n if (exceptChainIndex === chainIndexA)\n continue;\n const chain = this._chains[chainIndexA];\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, this._gapTolerance))\n return { chainIndex: chainIndexA, atEnd: true };\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, this._gapTolerance))\n return { chainIndex: chainIndexA, atEnd: false };\n }\n return undefined;\n }\n /**\n * Insert a single curve primitive into the active chains.\n * * The primitive is captured (not cloned)\n * * The primitive may be reversed in place\n * @param candidate curve to add to the context\n */\n public captureCurvePrimitive(candidate: CurvePrimitive) {\n if (this.attachPrimitiveToAnyChain(candidate))\n return;\n this._chains.push([candidate]);\n }\n /**\n * Insert any curve into the collection.\n * * This recurses into Path, Loop, BagOfCurves etc\n * * All primitives are captured, and may be reversed in place.\n * @param candidate curve to add to the context\n */\n public captureCurve(candidate: AnyCurve) {\n if (candidate instanceof CurvePrimitive)\n this.captureCurvePrimitive(candidate);\n else if (candidate instanceof CurveCollection) {\n for (const c of candidate.children)\n this.captureCurve(c);\n }\n }\n /** If allowed by the geometry type, move an endpoint. */\n private simpleEndPointMove(curve: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\n if (curve instanceof (LineSegment3d)) {\n if (atEnd) {\n curve.point1Ref.setFrom(to);\n } else {\n curve.point0Ref.setFrom(to);\n }\n return true;\n } else if (curve instanceof LineString3d && curve.numPoints() > 0) {\n const i = atEnd ? curve.numPoints() - 1 : 0;\n curve.packedPoints.setAtCheckedPointIndex(i, to);\n return true;\n }\n return false;\n }\n /**\n * Try to move the end of curve0 and/or the start of curve1 to a common point.\n * * All z-coordinates are ignored.\n * @param curve0 first curve, assumed to end close to the start of curve1\n * @param curve1 second curve, assumed to start close to the end of curve0\n * @returns whether curve start/end point(s) moved\n */\n private moveHeadOrTail(curve0: CurvePrimitive, curve1: CurvePrimitive): boolean {\n const xyz0 = curve0.endPoint();\n const xyz1 = curve1.startPoint();\n const minShift = Geometry.smallMetricDistance * 0.001;\n let dist2 = xyz0.distanceSquaredXY(xyz1);\n if (dist2 <= minShift * minShift)\n return false; // if the move would be miniscule, don't bother\n const gap2 = this._gapTolerance * this._gapTolerance;\n if (dist2 > gap2)\n return false;\n // try lines and linestrings\n if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))\n return true;\n\n // try other primitive types\n if (!(curve0 instanceof Arc3d && curve1 instanceof Arc3d))\n return false; // currently we only consider 2 arcs\n\n const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);\n let iClosest = -1;\n let minDist2 = Infinity;\n for (let i = 0; i < intersections.length; ++i) { // find intersection closest to the joint\n const dist20 = intersections[i].detailA.point.distanceSquaredXY(xyz0);\n const dist21 = intersections[i].detailB.point.distanceSquaredXY(xyz1);\n dist2 = dist20 + dist21;\n if (dist20 <= gap2 && dist21 <= gap2 && dist2 < minDist2) {\n minDist2 = dist2;\n iClosest = i;\n }\n }\n if (iClosest >= 0) { // move arc ends to the intersection point\n const radians0End = curve0.sweep.fractionToRadians(intersections[iClosest].detailA.fraction);\n curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);\n const radians1Start = curve1.sweep.fractionToRadians(intersections[iClosest].detailB.fraction);\n curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);\n return true;\n }\n return false;\n }\n /** Announce a curve primitive\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\n * * Otherwise start a new chain.\n */\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive): boolean {\n if (candidate.curveLength() < this._gapTolerance) {\n return true;\n } else {\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\n let connect = this.findAnyChainToConnect(this._xyzWork0);\n if (connect) {\n if (connect.atEnd) {\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n this.moveHeadOrTail(chain[index0], chain[index0 + 1]);\n this.searchAndMergeChainIndex(connect.chainIndex);\n return true;\n } else {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n this.moveHeadOrTail(chain[0], chain[1]);\n this.searchAndMergeChainIndex(connect.chainIndex);\n return true;\n }\n } else {\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0);\n if (connect) {\n if (connect.atEnd) {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n this.moveHeadOrTail(chain[index0], chain[index0 + 1]);\n this.searchAndMergeChainIndex(connect.chainIndex);\n return true;\n } else {\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n this.moveHeadOrTail(chain[0], chain[1]);\n this.searchAndMergeChainIndex(connect.chainIndex);\n return true;\n }\n }\n }\n }\n return false;\n }\n /**\n * Merge two entries in the chain array.\n * * Move each primitive from chainB to the end of chainA.\n * * Clear chainB.\n * * Move the final chain to chainB index.\n * * Decrement the array length.\n * @param chainIndexA index of chainA\n * @param chainIndexB index of chainB\n */\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\n const chainA = this._chains[chainIndexA];\n const chainB = this._chains[chainIndexB];\n for (const p of chainB) {\n chainA.push(p);\n }\n chainB.length = 0; // chainIndexB is unused\n const lastChainIndex = this._chains.length - 1;\n if (chainIndexB !== lastChainIndex)\n this._chains[chainIndexB] = this._chains[lastChainIndex];\n this._chains.pop();\n }\n /** Reverse the curve chain in place. */\n private reverseChain(chainIndex: number) {\n const chain = this._chains[chainIndex];\n chain.reverse();\n for (const p of chain)\n p.reverseInPlace();\n }\n /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */\n private searchAndMergeChainIndex(chainIndex: number): void {\n // ASSUME valid index of non-empty chain\n const chain = this._chains[chainIndex];\n const lastIndexInChain = chain.length - 1;\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\n // try start with any other chain\n let connect = this.findAnyChainToConnect(this._xyzWork0, chainIndex);\n if (connect) {\n if (!connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\n return;\n }\n // try end with any other chain\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0, chainIndex);\n if (connect) {\n if (connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\n return;\n }\n }\n /**\n * Convert an array of curve primitives into the simplest possible strongly typed curve structure.\n * @param curves input array, assembled correctly into a single contiguous path, captured by returned object\n * @param makeLoopIfClosed whether to return a Loop from physically closed coplanar curves, otherwise Path\n * @return Loop or Path if multiple curves; the primitive if only one curve; undefined if no curves\n */\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\n if (curves.length === 0)\n return undefined;\n if (makeLoopIfClosed) {\n const primitive0 = curves[0];\n const primitiveN = curves[curves.length - 1];\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n if (this.moveHeadOrTail(primitiveN, primitive0)) {\n // get the corrected coordinates\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n }\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB, this._gapTolerance)) {\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\n if (localToWorld) {\n const worldToLocal = localToWorld.inverse();\n if (worldToLocal) {\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\n if (this._planeTolerance !== undefined && range.zLength() <= this._planeTolerance) {\n return Loop.createArray(curves);\n }\n }\n }\n return Path.createArray(curves);\n }\n }\n if (curves.length === 1)\n return curves[0];\n return Path.createArray(curves);\n }\n /** Stroke the curve chain to a line string, de-duplicate the points. */\n private chainToLineString3d(chain: CurvePrimitive[], options?: StrokeOptions): LineString3d | undefined {\n if (chain.length === 0)\n return undefined;\n const linestring = LineString3d.create();\n for (const curve of chain)\n curve.emitStrokes(linestring, options);\n linestring.removeDuplicatePoints(this._gapTolerance);\n return linestring;\n }\n /** Return the collected results, structured as the simplest possible type. */\n public grabResult(makeLoopIfClosed: boolean = false): AnyChain | undefined {\n const chains = this._chains;\n if (chains.length === 0)\n return undefined;\n if (chains.length === 1)\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\n const bag = BagOfCurves.create();\n for (const chain of chains) {\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\n bag.tryAddChild(q);\n }\n return bag;\n }\n /**\n * Return chains as individual calls to announceChain.\n * * Does not use planeTolerance.\n */\n public announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void {\n const chains = this._chains;\n if (chains.length === 1) {\n const ls = this.chainToLineString3d(chains[0], options);\n if (ls)\n announceChain(ls);\n } else if (chains.length > 1) {\n for (const chain of chains) {\n const ls = this.chainToLineString3d(chain, options);\n if (ls)\n announceChain(ls);\n }\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PlaneAltitudeRangeContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PlaneAltitudeRangeContext.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAQ/F,6CAAkE;AAClE,kDAA+C;AAC/C,sEAAkF;AAClF,wEAAqE;AACrE,gGAA6F;AAC7F,sEAAqE;AACrE,kDAAiD;AACjD,kDAA+C;AAG/C,oDAAiD;AACjD,oDAAiD;AACjD,kDAA+C;AAC/C,oDAAiD;AAEjD;;;GAGG;AACH,MAAa,yBAA0B,SAAQ,gDAA8B;IACpE,KAAK,CAAyB;IAC9B,KAAK,CAAU;IACf,QAAQ,CAAsB;IAC9B,SAAS,CAAsB;IACtC,YAAoB,KAA6B;QAC/C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAEM,aAAa,CAAC,KAAc;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAEM,cAAc,CAAC,MAAwB;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,MAAM,CAAC,mCAAmC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3E,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,KAA6B;QACvD,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEe,mBAAmB,CAAC,OAAsB;QACxD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAEe,kBAAkB,CAAC,UAAwB;QACzD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAEO,cAAc,CAAiB;IAE/B,iBAAiB;QACvB,kEAAkE;QAClE,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,GAAG,IAAI,6BAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,aAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEe,oBAAoB,CAAC,MAAsB;QACzD,kFAAkF;QAClF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAEe,qBAAqB,CAAC,MAAuB;QAC3D,kFAAkF;QAClF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAEO,qBAAqB,CAAwB;IAE7C,UAAU,CAAW;IAEb,WAAW,CAAC,CAAQ;QAClC,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,oCAAoC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5G,IAAI,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,CAAC;QAClE,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAEO,MAAM,CAAC,uBAAuB,CACpC,QAAsD,EAAE,SAA2B;QAEnF,MAAM,MAAM,GAAG,SAAS,YAAY,aAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAO,CAAC,UAAU,EAAE,CAAC;QACpF,MAAM,MAAM,GAAG,SAAS,YAAY,aAAK,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,MAAM,KAAK,GAAG,2DAA4B,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAE,mDAAmD;QACvH,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,QAAQ,YAAY,6BAAa,EAAE,CAAC;gBACtC,QAAQ,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,QAAQ,YAAY,mCAAgB,EAAE,CAAC;gBAChD,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,EAAE,IAAI,QAAQ;oBACvB,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;MAOE;IACK,MAAM,CAAC,4BAA4B,CACxC,QAAsD,EAAE,SAA2B,EAAE,OAAuB;QAE5G,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClE,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ;YAClD,OAAO,6BAAa,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;MAOE;IACK,MAAM,CAAC,+BAA+B,CAC3C,QAAsD,EAAE,SAA2B,EAAE,OAAiB;QAEtG,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClE,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;YAClC,OAAO,eAAO,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,kCAAkC,CAC9C,QAAsD,EAAE,SAA2B,EAAE,OAAiB;QAEtG,MAAM,KAAK,GAAG,IAAI,CAAC,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACjF,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,CAAC,SAAS,YAAY,0BAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YACtG,MAAM,eAAe,GAAG,mBAAQ,CAAC,2BAA2B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvE,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;gBAClC,KAAK,CAAC,GAAG,IAAI,eAAe,CAAC;gBAC7B,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAtKD,8DAsKC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { BSplineCurve3d } from \"../../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../../bspline/BSplineCurve3dH\";\r\nimport { Geometry, PlaneAltitudeEvaluator } from \"../../Geometry\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { GrowableXYZArray } from \"../../geometry3d/GrowableXYZArray\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range1d } from \"../../geometry3d/Range\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { SineCosinePolynomial } from \"../../numerics/Polynomials\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { GeometryQuery } from \"../GeometryQuery\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\n\r\n/**\r\n * Accumulator context for searching for extrema of geometry along a plane.\r\n * @internal\r\n */\r\nexport class PlaneAltitudeRangeContext extends RecurseToCurvesGeometryHandler {\r\n public plane: PlaneAltitudeEvaluator;\r\n public range: Range1d;\r\n public lowPoint: Point3d | undefined;\r\n public highPoint: Point3d | undefined;\r\n private constructor(plane: PlaneAltitudeEvaluator) {\r\n super();\r\n this.plane = plane;\r\n this.range = Range1d.createNull();\r\n this.resetRange();\r\n }\r\n\r\n public resetRange() {\r\n this.range.setNull();\r\n }\r\n\r\n public announcePoint(point: Point3d) {\r\n const h = this.plane.altitude(point);\r\n if (this.range.extendLow(h))\r\n this.lowPoint = point.clone(this.lowPoint);\r\n if (this.range.extendHigh(h))\r\n this.highPoint = point.clone(this.highPoint);\r\n }\r\n\r\n public announcePoints(points: GrowableXYZArray) {\r\n for (let i = 0; i < points.length; i++) {\r\n const h = points.evaluateUncheckedIndexPlaneAltitude(i, this.plane);\r\n if (this.range.extendLow(h))\r\n this.lowPoint = points.getPoint3dAtUncheckedPointIndex(i, this.lowPoint);\r\n if (this.range.extendHigh(h))\r\n this.highPoint = points.getPoint3dAtUncheckedPointIndex(i, this.highPoint);\r\n }\r\n }\r\n\r\n public static createCapture(plane: PlaneAltitudeEvaluator): PlaneAltitudeRangeContext {\r\n const context = new PlaneAltitudeRangeContext(plane);\r\n return context;\r\n }\r\n\r\n public override handleLineSegment3d(segment: LineSegment3d) {\r\n this.announcePoint(segment.point0Ref);\r\n this.announcePoint(segment.point1Ref);\r\n }\r\n\r\n public override handleLineString3d(lineString: LineString3d) {\r\n this.announcePoints(lineString.packedPoints);\r\n }\r\n\r\n private _strokeOptions?: StrokeOptions;\r\n\r\n private initStrokeOptions() {\r\n // TODO: compute the exact extrema; until then stroke aggressively\r\n if (undefined === this._strokeOptions) {\r\n this._strokeOptions = new StrokeOptions();\r\n this._strokeOptions.angleTol = Angle.createDegrees(1);\r\n }\r\n }\r\n\r\n public override handleBSplineCurve3d(bcurve: BSplineCurve3d) {\r\n // ugh. The point MUST be on the curve -- usual excess-range of poles is not ok.\r\n this.initStrokeOptions();\r\n const ls = LineString3d.create();\r\n bcurve.emitStrokes(ls, this._strokeOptions);\r\n this.handleLineString3d(ls);\r\n }\r\n\r\n public override handleBSplineCurve3dH(bcurve: BSplineCurve3dH) {\r\n // ugh. The point MUST be on the curve -- usual excess-range of poles is not ok.\r\n this.initStrokeOptions();\r\n const ls = LineString3d.create();\r\n bcurve.emitStrokes(ls, this._strokeOptions);\r\n this.handleLineString3d(ls);\r\n }\r\n\r\n private _sineCosinePolynomial?: SineCosinePolynomial;\r\n\r\n private _workPoint?: Point3d;\r\n\r\n public override handleArc3d(g: Arc3d) {\r\n this._sineCosinePolynomial = g.getPlaneAltitudeSineCosinePolynomial(this.plane, this._sineCosinePolynomial);\r\n let radians = this._sineCosinePolynomial.referenceMinMaxRadians();\r\n if (g.sweep.isRadiansInSweep(radians))\r\n this.announcePoint((this._workPoint = g.radiansToPoint(radians, this._workPoint)));\r\n radians += Math.PI;\r\n if (g.sweep.isRadiansInSweep(radians))\r\n this.announcePoint((this._workPoint = g.radiansToPoint(radians, this._workPoint)));\r\n this.announcePoint((this._workPoint = g.startPoint(this._workPoint)));\r\n this.announcePoint((this._workPoint = g.endPoint(this._workPoint)));\r\n }\r\n\r\n private static findExtremesInDirection(\r\n geometry: GeometryQuery | GrowableXYZArray | Point3d[], direction: Vector3d | Ray3d,\r\n ): PlaneAltitudeRangeContext | undefined {\r\n const origin = direction instanceof Ray3d ? direction.origin : Point3d.createZero();\r\n const vector = direction instanceof Ray3d ? direction.direction : direction;\r\n const plane = Plane3dByOriginAndUnitNormal.create(origin, vector); // vector is normalized, so altitudes are distances\r\n if (plane) {\r\n const context = new PlaneAltitudeRangeContext(plane);\r\n if (geometry instanceof GeometryQuery) {\r\n geometry.dispatchToGeometryHandler(context);\r\n } else if (geometry instanceof GrowableXYZArray) {\r\n context.announcePoints(geometry);\r\n } else {\r\n for (const pt of geometry)\r\n context.announcePoint(pt);\r\n }\r\n return context;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Compute altitudes for the geometry (via dispatch) over the plane defined by the given direction, and\r\n * return points at min and max altitude, packed into a `LineSegment3d`.\r\n * @param geometry geometry to project\r\n * @param direction vector or ray on which to project the instance. A `Vector3d` is treated as a `Ray3d` with\r\n * zero origin.\r\n * @param lowHigh optional receiver for output\r\n */\r\n public static findExtremePointsInDirection(\r\n geometry: GeometryQuery | GrowableXYZArray | Point3d[], direction: Vector3d | Ray3d, lowHigh?: LineSegment3d,\r\n ): LineSegment3d | undefined {\r\n const context = this.findExtremesInDirection(geometry, direction);\r\n if (context && context.highPoint && context.lowPoint)\r\n return LineSegment3d.create(context.lowPoint, context.highPoint, lowHigh);\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Compute altitudes for the geometry (via dispatch) over the plane defined by the given direction, and return\r\n * the min and max altitudes, packed into a Range1d.\r\n * @param geometry geometry to project\r\n * @param direction vector or ray on which to project the instance. A `Vector3d` is treated as a `Ray3d` with\r\n * zero origin.\r\n * @param lowHigh optional receiver for output\r\n */\r\n public static findExtremeAltitudesInDirection(\r\n geometry: GeometryQuery | GrowableXYZArray | Point3d[], direction: Vector3d | Ray3d, lowHigh?: Range1d,\r\n ): Range1d | undefined {\r\n const context = this.findExtremesInDirection(geometry, direction);\r\n if (context && !context.range.isNull)\r\n return Range1d.createFrom(context.range, lowHigh);\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Project geometry (via dispatch) onto the given ray, and return the extreme fractional parameters of projection.\r\n * @param geometry geometry to project\r\n * @param direction vector or ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with\r\n * zero origin.\r\n * @param lowHigh optional receiver for output\r\n */\r\n public static findExtremeFractionsAlongDirection(\r\n geometry: GeometryQuery | GrowableXYZArray | Point3d[], direction: Vector3d | Ray3d, lowHigh?: Range1d,\r\n ): Range1d | undefined {\r\n const range = this.findExtremeAltitudesInDirection(geometry, direction, lowHigh);\r\n if (undefined !== range) {\r\n const mag = (direction instanceof Vector3d) ? direction.magnitude() : direction.direction.magnitude();\r\n const scaleToFraction = Geometry.conditionalDivideCoordinate(1.0, mag);\r\n if (undefined !== scaleToFraction) {\r\n range.low *= scaleToFraction;\r\n range.high *= scaleToFraction;\r\n return range;\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"PlaneAltitudeRangeContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PlaneAltitudeRangeContext.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAQ/F,6CAAkE;AAClE,kDAA+C;AAC/C,sEAAkF;AAClF,wEAAqE;AACrE,gGAA6F;AAC7F,sEAAqE;AACrE,kDAAiD;AACjD,kDAA+C;AAG/C,oDAAiD;AACjD,oDAAiD;AACjD,kDAA+C;AAC/C,oDAAiD;AAEjD;;;GAGG;AACH,MAAa,yBAA0B,SAAQ,gDAA8B;IACpE,KAAK,CAAyB;IAC9B,KAAK,CAAU;IACf,QAAQ,CAAsB;IAC9B,SAAS,CAAsB;IACtC,YAAoB,KAA6B;QAC/C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAEM,aAAa,CAAC,KAAc;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAEM,cAAc,CAAC,MAAwB;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,MAAM,CAAC,mCAAmC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3E,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,KAA6B;QACvD,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEe,mBAAmB,CAAC,OAAsB;QACxD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAEe,kBAAkB,CAAC,UAAwB;QACzD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAEO,cAAc,CAAiB;IAE/B,iBAAiB;QACvB,kEAAkE;QAClE,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,GAAG,IAAI,6BAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,aAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEe,oBAAoB,CAAC,MAAsB;QACzD,kFAAkF;QAClF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAEe,qBAAqB,CAAC,MAAuB;QAC3D,kFAAkF;QAClF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAEO,qBAAqB,CAAwB;IAE7C,UAAU,CAAW;IAEb,WAAW,CAAC,CAAQ;QAClC,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,oCAAoC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5G,IAAI,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,CAAC;QAClE,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAEO,MAAM,CAAC,uBAAuB,CACpC,QAAsD,EAAE,SAA2B;QAEnF,MAAM,MAAM,GAAG,SAAS,YAAY,aAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAO,CAAC,UAAU,EAAE,CAAC;QACpF,MAAM,MAAM,GAAG,SAAS,YAAY,aAAK,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,MAAM,KAAK,GAAG,2DAA4B,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAE,mDAAmD;QACvH,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,QAAQ,YAAY,6BAAa,EAAE,CAAC;gBACtC,QAAQ,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,QAAQ,YAAY,mCAAgB,EAAE,CAAC;gBAChD,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,EAAE,IAAI,QAAQ;oBACvB,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;MAOE;IACK,MAAM,CAAC,4BAA4B,CACxC,QAAsD,EAAE,SAA2B,EAAE,OAAuB;QAE5G,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClE,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ;YAClD,OAAO,6BAAa,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;MAOE;IACK,MAAM,CAAC,+BAA+B,CAC3C,QAAsD,EAAE,SAA2B,EAAE,OAAiB;QAEtG,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClE,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;YAClC,OAAO,eAAO,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,kCAAkC,CAC9C,QAAsD,EAAE,SAA2B,EAAE,OAAiB;QAEtG,MAAM,KAAK,GAAG,IAAI,CAAC,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACjF,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,CAAC,SAAS,YAAY,0BAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YACtG,MAAM,eAAe,GAAG,mBAAQ,CAAC,2BAA2B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvE,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;gBAClC,KAAK,CAAC,GAAG,IAAI,eAAe,CAAC;gBAC7B,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAtKD,8DAsKC","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 Curve\n */\n\nimport { BSplineCurve3d } from \"../../bspline/BSplineCurve\";\nimport { BSplineCurve3dH } from \"../../bspline/BSplineCurve3dH\";\nimport { Geometry, PlaneAltitudeEvaluator } from \"../../Geometry\";\nimport { Angle } from \"../../geometry3d/Angle\";\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\nimport { GrowableXYZArray } from \"../../geometry3d/GrowableXYZArray\";\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Range1d } from \"../../geometry3d/Range\";\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\nimport { SineCosinePolynomial } from \"../../numerics/Polynomials\";\nimport { Arc3d } from \"../Arc3d\";\nimport { GeometryQuery } from \"../GeometryQuery\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { StrokeOptions } from \"../StrokeOptions\";\n\n/**\n * Accumulator context for searching for extrema of geometry along a plane.\n * @internal\n */\nexport class PlaneAltitudeRangeContext extends RecurseToCurvesGeometryHandler {\n public plane: PlaneAltitudeEvaluator;\n public range: Range1d;\n public lowPoint: Point3d | undefined;\n public highPoint: Point3d | undefined;\n private constructor(plane: PlaneAltitudeEvaluator) {\n super();\n this.plane = plane;\n this.range = Range1d.createNull();\n this.resetRange();\n }\n\n public resetRange() {\n this.range.setNull();\n }\n\n public announcePoint(point: Point3d) {\n const h = this.plane.altitude(point);\n if (this.range.extendLow(h))\n this.lowPoint = point.clone(this.lowPoint);\n if (this.range.extendHigh(h))\n this.highPoint = point.clone(this.highPoint);\n }\n\n public announcePoints(points: GrowableXYZArray) {\n for (let i = 0; i < points.length; i++) {\n const h = points.evaluateUncheckedIndexPlaneAltitude(i, this.plane);\n if (this.range.extendLow(h))\n this.lowPoint = points.getPoint3dAtUncheckedPointIndex(i, this.lowPoint);\n if (this.range.extendHigh(h))\n this.highPoint = points.getPoint3dAtUncheckedPointIndex(i, this.highPoint);\n }\n }\n\n public static createCapture(plane: PlaneAltitudeEvaluator): PlaneAltitudeRangeContext {\n const context = new PlaneAltitudeRangeContext(plane);\n return context;\n }\n\n public override handleLineSegment3d(segment: LineSegment3d) {\n this.announcePoint(segment.point0Ref);\n this.announcePoint(segment.point1Ref);\n }\n\n public override handleLineString3d(lineString: LineString3d) {\n this.announcePoints(lineString.packedPoints);\n }\n\n private _strokeOptions?: StrokeOptions;\n\n private initStrokeOptions() {\n // TODO: compute the exact extrema; until then stroke aggressively\n if (undefined === this._strokeOptions) {\n this._strokeOptions = new StrokeOptions();\n this._strokeOptions.angleTol = Angle.createDegrees(1);\n }\n }\n\n public override handleBSplineCurve3d(bcurve: BSplineCurve3d) {\n // ugh. The point MUST be on the curve -- usual excess-range of poles is not ok.\n this.initStrokeOptions();\n const ls = LineString3d.create();\n bcurve.emitStrokes(ls, this._strokeOptions);\n this.handleLineString3d(ls);\n }\n\n public override handleBSplineCurve3dH(bcurve: BSplineCurve3dH) {\n // ugh. The point MUST be on the curve -- usual excess-range of poles is not ok.\n this.initStrokeOptions();\n const ls = LineString3d.create();\n bcurve.emitStrokes(ls, this._strokeOptions);\n this.handleLineString3d(ls);\n }\n\n private _sineCosinePolynomial?: SineCosinePolynomial;\n\n private _workPoint?: Point3d;\n\n public override handleArc3d(g: Arc3d) {\n this._sineCosinePolynomial = g.getPlaneAltitudeSineCosinePolynomial(this.plane, this._sineCosinePolynomial);\n let radians = this._sineCosinePolynomial.referenceMinMaxRadians();\n if (g.sweep.isRadiansInSweep(radians))\n this.announcePoint((this._workPoint = g.radiansToPoint(radians, this._workPoint)));\n radians += Math.PI;\n if (g.sweep.isRadiansInSweep(radians))\n this.announcePoint((this._workPoint = g.radiansToPoint(radians, this._workPoint)));\n this.announcePoint((this._workPoint = g.startPoint(this._workPoint)));\n this.announcePoint((this._workPoint = g.endPoint(this._workPoint)));\n }\n\n private static findExtremesInDirection(\n geometry: GeometryQuery | GrowableXYZArray | Point3d[], direction: Vector3d | Ray3d,\n ): PlaneAltitudeRangeContext | undefined {\n const origin = direction instanceof Ray3d ? direction.origin : Point3d.createZero();\n const vector = direction instanceof Ray3d ? direction.direction : direction;\n const plane = Plane3dByOriginAndUnitNormal.create(origin, vector); // vector is normalized, so altitudes are distances\n if (plane) {\n const context = new PlaneAltitudeRangeContext(plane);\n if (geometry instanceof GeometryQuery) {\n geometry.dispatchToGeometryHandler(context);\n } else if (geometry instanceof GrowableXYZArray) {\n context.announcePoints(geometry);\n } else {\n for (const pt of geometry)\n context.announcePoint(pt);\n }\n return context;\n }\n return undefined;\n }\n /**\n * Compute altitudes for the geometry (via dispatch) over the plane defined by the given direction, and\n * return points at min and max altitude, packed into a `LineSegment3d`.\n * @param geometry geometry to project\n * @param direction vector or ray on which to project the instance. A `Vector3d` is treated as a `Ray3d` with\n * zero origin.\n * @param lowHigh optional receiver for output\n */\n public static findExtremePointsInDirection(\n geometry: GeometryQuery | GrowableXYZArray | Point3d[], direction: Vector3d | Ray3d, lowHigh?: LineSegment3d,\n ): LineSegment3d | undefined {\n const context = this.findExtremesInDirection(geometry, direction);\n if (context && context.highPoint && context.lowPoint)\n return LineSegment3d.create(context.lowPoint, context.highPoint, lowHigh);\n return undefined;\n }\n\n /**\n * Compute altitudes for the geometry (via dispatch) over the plane defined by the given direction, and return\n * the min and max altitudes, packed into a Range1d.\n * @param geometry geometry to project\n * @param direction vector or ray on which to project the instance. A `Vector3d` is treated as a `Ray3d` with\n * zero origin.\n * @param lowHigh optional receiver for output\n */\n public static findExtremeAltitudesInDirection(\n geometry: GeometryQuery | GrowableXYZArray | Point3d[], direction: Vector3d | Ray3d, lowHigh?: Range1d,\n ): Range1d | undefined {\n const context = this.findExtremesInDirection(geometry, direction);\n if (context && !context.range.isNull)\n return Range1d.createFrom(context.range, lowHigh);\n return undefined;\n }\n\n /**\n * Project geometry (via dispatch) onto the given ray, and return the extreme fractional parameters of projection.\n * @param geometry geometry to project\n * @param direction vector or ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with\n * zero origin.\n * @param lowHigh optional receiver for output\n */\n public static findExtremeFractionsAlongDirection(\n geometry: GeometryQuery | GrowableXYZArray | Point3d[], direction: Vector3d | Ray3d, lowHigh?: Range1d,\n ): Range1d | undefined {\n const range = this.findExtremeAltitudesInDirection(geometry, direction, lowHigh);\n if (undefined !== range) {\n const mag = (direction instanceof Vector3d) ? direction.magnitude() : direction.direction.magnitude();\n const scaleToFraction = Geometry.conditionalDivideCoordinate(1.0, mag);\n if (undefined !== scaleToFraction) {\n range.low *= scaleToFraction;\n range.high *= scaleToFraction;\n return range;\n }\n }\n return undefined;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PointToCurveTangentHandler.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PointToCurveTangentHandler.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sEAAkF;AAClF,wDAAqD;AACrD,sEAAqE;AAKrE;;;;;;GAMG;AACH,MAAa,0BAA2B,SAAQ,gDAA8B;IACrE,UAAU,CAAU;IACpB,SAAS,CAAyB;IAClC,UAAU,CAAU;IAC3B,mGAAmG;IAC5F,WAAW,CAAuB;IACzC,YACE,UAAmB,EAAE,SAAiC,EAAE,aAAsB,KAAK,EAAE,UAAgC;QAErH,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAEe,WAAW,CAAC,CAAQ;QAClC,MAAM,aAAa,GAAG,0BAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5E,IAAI,kBAAwC,CAAC;QAC7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,uEAAuE;YACvE,wBAAwB;YACxB,uBAAuB;YACvB,gCAAgC;YAChC,MAAM,SAAS,GAAG,mBAAQ,CAAC,aAAa,CACtC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAC/E,CAAC;YACF,kBAAkB,GAAG,SAAS,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,uEAAuE;YACvE,wBAAwB;YACxB,uBAAuB;YACvB,4DAA4D;YAC5D,kBAAkB,GAAG,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,kBAAkB,KAAK,SAAS;YAClC,OAAO;QACT,2FAA2F;QAC3F,2DAA2D;QAC3D,8DAA8D;QAC9D,kDAAkD;QAClD,6EAA6E;QAC7E,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YACzE,IAAI,wBAAwB,IAAI,GAAG,EAAE,CAAC;gBACpC,kCAAkC;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAA;gBACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBACrE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;gBAC/C,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;oBACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;oBAClE,IAAI,IAAI,CAAC,UAAU,IAAI,QAAQ,IAAI,GAAG;wBACpC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA1DD,gEA0DC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { Matrix3d } from \"../../geometry3d/Matrix3d\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\n\r\ntype TangencyPointCollector = (spacePoint: Point3d, curve: CurvePrimitive, fraction: number) => any;\r\n/**\r\n * Accumulator context for searching for lines tangent to curved geometry.\r\n * LIMITED IMPLEMENTATION 3/2025\r\n * * Only Arc3d implements its handler\r\n * * Arc3d calculation works with the projection of the space point into the plane of the arc.\r\n * @internal\r\n */\r\nexport class PointToCurveTangentHandler extends RecurseToCurvesGeometryHandler {\r\n public spacePoint: Point3d;\r\n public collector: TangencyPointCollector;\r\n public extendArcs: boolean;\r\n // if available, do the tangency as viewed in the xy plane AFTER multiplying vectors by this matrix\r\n public worldToView: Matrix3d | undefined;\r\n public constructor(\r\n spacePoint: Point3d, collector: TangencyPointCollector, extendArcs: boolean = false, viewMatrix: Matrix3d | undefined,\r\n ) {\r\n super();\r\n this.spacePoint = spacePoint;\r\n this.collector = collector;\r\n this.extendArcs = extendArcs;\r\n this.worldToView = viewMatrix;\r\n }\r\n\r\n public override handleArc3d(g: Arc3d) {\r\n const centerToPoint = Vector3d.createStartEnd(g.centerRef, this.spacePoint);\r\n let localCenterToPoint: Vector3d | undefined;\r\n if (this.worldToView) {\r\n // Convert the vector spacePoint into the arc's default system in which\r\n // U vector is column 0\r\n // V vector is column 1\r\n // worldToView row 2 is column 2\r\n const arcToView = Matrix3d.createColumns(\r\n g.matrixRef.getColumn(0), g.matrixRef.getColumn(1), this.worldToView.getRow(2),\r\n );\r\n localCenterToPoint = arcToView.multiplyInverse(centerToPoint);\r\n } else {\r\n // Convert the vector spacePoint into the arc's default system in which\r\n // U vector is column 0\r\n // V vector is column 1\r\n // their cross product (or maybe a scale of it) is column 2.\r\n localCenterToPoint = g.matrixRef.multiplyInverse(centerToPoint);\r\n }\r\n if (localCenterToPoint === undefined)\r\n return;\r\n // localCenterToPoint is measured in the (de-skewed and descaled!) coordinate system of the\r\n // arc U and V axes. That is, the arc is now a unit circle.\r\n // Angle alpha is from the local x axis to localCenterToPoint.\r\n // Angle beta is from that to the tangency points.\r\n // The inverse transformation preserves parameter angle in the ellipse sweep.\r\n if (localCenterToPoint !== undefined) {\r\n const distanceSquaredXYToPoint = localCenterToPoint.magnitudeSquaredXY();\r\n if (distanceSquaredXYToPoint <= 1.0) {\r\n // the point is inside the ellipse\r\n } else {\r\n const distanceToTangency = Math.sqrt(distanceSquaredXYToPoint - 1.0)\r\n const alpha = Math.atan2(localCenterToPoint.y, localCenterToPoint.x);\r\n const beta = Math.atan2(distanceToTangency, 1);\r\n for (const theta of [alpha + beta, alpha - beta]) {\r\n const fraction = g.sweep.radiansToPositivePeriodicFraction(theta);\r\n if (this.extendArcs || fraction <= 1.0)\r\n this.collector(this.spacePoint, g, fraction);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"PointToCurveTangentHandler.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PointToCurveTangentHandler.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sEAAkF;AAClF,wDAAqD;AACrD,sEAAqE;AAKrE;;;;;;GAMG;AACH,MAAa,0BAA2B,SAAQ,gDAA8B;IACrE,UAAU,CAAU;IACpB,SAAS,CAAyB;IAClC,UAAU,CAAU;IAC3B,mGAAmG;IAC5F,WAAW,CAAuB;IACzC,YACE,UAAmB,EAAE,SAAiC,EAAE,aAAsB,KAAK,EAAE,UAAgC;QAErH,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAEe,WAAW,CAAC,CAAQ;QAClC,MAAM,aAAa,GAAG,0BAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5E,IAAI,kBAAwC,CAAC;QAC7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,uEAAuE;YACvE,wBAAwB;YACxB,uBAAuB;YACvB,gCAAgC;YAChC,MAAM,SAAS,GAAG,mBAAQ,CAAC,aAAa,CACtC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAC/E,CAAC;YACF,kBAAkB,GAAG,SAAS,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,uEAAuE;YACvE,wBAAwB;YACxB,uBAAuB;YACvB,4DAA4D;YAC5D,kBAAkB,GAAG,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,kBAAkB,KAAK,SAAS;YAClC,OAAO;QACT,2FAA2F;QAC3F,2DAA2D;QAC3D,8DAA8D;QAC9D,kDAAkD;QAClD,6EAA6E;QAC7E,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YACzE,IAAI,wBAAwB,IAAI,GAAG,EAAE,CAAC;gBACpC,kCAAkC;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAA;gBACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBACrE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;gBAC/C,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;oBACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;oBAClE,IAAI,IAAI,CAAC,UAAU,IAAI,QAAQ,IAAI,GAAG;wBACpC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA1DD,gEA0DC","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 Curve\n */\n\nimport { RecurseToCurvesGeometryHandler } from \"../../geometry3d/GeometryHandler\";\nimport { Matrix3d } from \"../../geometry3d/Matrix3d\";\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Arc3d } from \"../Arc3d\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\n\ntype TangencyPointCollector = (spacePoint: Point3d, curve: CurvePrimitive, fraction: number) => any;\n/**\n * Accumulator context for searching for lines tangent to curved geometry.\n * LIMITED IMPLEMENTATION 3/2025\n * * Only Arc3d implements its handler\n * * Arc3d calculation works with the projection of the space point into the plane of the arc.\n * @internal\n */\nexport class PointToCurveTangentHandler extends RecurseToCurvesGeometryHandler {\n public spacePoint: Point3d;\n public collector: TangencyPointCollector;\n public extendArcs: boolean;\n // if available, do the tangency as viewed in the xy plane AFTER multiplying vectors by this matrix\n public worldToView: Matrix3d | undefined;\n public constructor(\n spacePoint: Point3d, collector: TangencyPointCollector, extendArcs: boolean = false, viewMatrix: Matrix3d | undefined,\n ) {\n super();\n this.spacePoint = spacePoint;\n this.collector = collector;\n this.extendArcs = extendArcs;\n this.worldToView = viewMatrix;\n }\n\n public override handleArc3d(g: Arc3d) {\n const centerToPoint = Vector3d.createStartEnd(g.centerRef, this.spacePoint);\n let localCenterToPoint: Vector3d | undefined;\n if (this.worldToView) {\n // Convert the vector spacePoint into the arc's default system in which\n // U vector is column 0\n // V vector is column 1\n // worldToView row 2 is column 2\n const arcToView = Matrix3d.createColumns(\n g.matrixRef.getColumn(0), g.matrixRef.getColumn(1), this.worldToView.getRow(2),\n );\n localCenterToPoint = arcToView.multiplyInverse(centerToPoint);\n } else {\n // Convert the vector spacePoint into the arc's default system in which\n // U vector is column 0\n // V vector is column 1\n // their cross product (or maybe a scale of it) is column 2.\n localCenterToPoint = g.matrixRef.multiplyInverse(centerToPoint);\n }\n if (localCenterToPoint === undefined)\n return;\n // localCenterToPoint is measured in the (de-skewed and descaled!) coordinate system of the\n // arc U and V axes. That is, the arc is now a unit circle.\n // Angle alpha is from the local x axis to localCenterToPoint.\n // Angle beta is from that to the tangency points.\n // The inverse transformation preserves parameter angle in the ellipse sweep.\n if (localCenterToPoint !== undefined) {\n const distanceSquaredXYToPoint = localCenterToPoint.magnitudeSquaredXY();\n if (distanceSquaredXYToPoint <= 1.0) {\n // the point is inside the ellipse\n } else {\n const distanceToTangency = Math.sqrt(distanceSquaredXYToPoint - 1.0)\n const alpha = Math.atan2(localCenterToPoint.y, localCenterToPoint.x);\n const beta = Math.atan2(distanceToTangency, 1);\n for (const theta of [alpha + beta, alpha - beta]) {\n const fraction = g.sweep.radiansToPositivePeriodicFraction(theta);\n if (this.extendArcs || fraction <= 1.0)\n this.collector(this.spacePoint, g, fraction);\n }\n }\n }\n }\n}\n"]}