@itwin/core-geometry 5.8.0-dev.15 → 5.8.0-dev.16

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 (471) hide show
  1. package/lib/cjs/Constant.js.map +1 -1
  2. package/lib/cjs/Geometry.js.map +1 -1
  3. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  4. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  5. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  7. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  8. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  9. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  10. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  11. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  12. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  13. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  14. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  15. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  16. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  17. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  18. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  19. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  20. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  21. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  22. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  23. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  24. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  25. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  26. package/lib/cjs/core-geometry.js.map +1 -1
  27. package/lib/cjs/curve/Arc3d.js.map +1 -1
  28. package/lib/cjs/curve/ConstrainedCurve2d.js.map +1 -1
  29. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  30. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  31. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  32. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  33. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  34. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  35. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  36. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  37. package/lib/cjs/curve/CurveOps.js.map +1 -1
  38. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  39. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  40. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  41. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  42. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  43. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  44. package/lib/cjs/curve/LineString3d.js.map +1 -1
  45. package/lib/cjs/curve/Loop.js.map +1 -1
  46. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  47. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  48. package/lib/cjs/curve/Path.js.map +1 -1
  49. package/lib/cjs/curve/PointString3d.js.map +1 -1
  50. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  51. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  52. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  53. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  54. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  55. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  56. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  57. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  58. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  59. package/lib/cjs/curve/RegionOps.js.map +1 -1
  60. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  61. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  62. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  63. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  64. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  65. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  66. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  67. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  68. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  69. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  70. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  71. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  72. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  73. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  74. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  75. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  76. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  77. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  78. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  79. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  80. package/lib/cjs/curve/internalContexts/PointToCurveTangentHandler.js.map +1 -1
  81. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  82. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  83. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  84. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  85. package/lib/cjs/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.js.map +1 -1
  86. package/lib/cjs/curve/internalContexts/geometry2d/ConstraintSet.js.map +1 -1
  87. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2d.js.map +1 -1
  88. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.js.map +1 -1
  89. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedCircle2d.js.map +1 -1
  90. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedEllipse2d.js.map +1 -1
  91. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedHyperbola2d.js.map +1 -1
  92. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedLine2d.js.map +1 -1
  93. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedParabola2d.js.map +1 -1
  94. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  95. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  96. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  97. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  98. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  99. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  100. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  101. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  102. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  103. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  104. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  105. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  106. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  107. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  108. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  109. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  110. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  111. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  112. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  113. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  114. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  115. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  116. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  117. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  118. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  119. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  120. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  121. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  122. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  123. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  124. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  125. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  126. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  127. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  128. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  129. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  130. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  131. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  132. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  133. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  134. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  135. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  136. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  137. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  138. package/lib/cjs/geometry3d/Range.js.map +1 -1
  139. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  140. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  141. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  142. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  143. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  144. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  145. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  146. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  147. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  148. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  149. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  150. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  151. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  152. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  153. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  154. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  155. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  156. package/lib/cjs/numerics/Complex.js.map +1 -1
  157. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  158. package/lib/cjs/numerics/Newton.js.map +1 -1
  159. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  160. package/lib/cjs/numerics/PolarData.js.map +1 -1
  161. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  162. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  163. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  164. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  165. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  166. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  167. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  168. package/lib/cjs/polyface/AuxData.js.map +1 -1
  169. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  170. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  171. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  172. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  173. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  174. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  175. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  176. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  177. package/lib/cjs/polyface/Polyface.js.map +1 -1
  178. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  179. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  180. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  181. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  182. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  183. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  184. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  185. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  186. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  187. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  188. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  189. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  190. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  191. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  192. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  193. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  194. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  195. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  196. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  197. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  198. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  199. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  200. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  201. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  202. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  203. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  204. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  205. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  206. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  207. package/lib/cjs/solid/Box.js.map +1 -1
  208. package/lib/cjs/solid/Cone.js.map +1 -1
  209. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  210. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  211. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  212. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  213. package/lib/cjs/solid/Sphere.js.map +1 -1
  214. package/lib/cjs/solid/SweepContour.js.map +1 -1
  215. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  216. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  217. package/lib/cjs/topology/Graph.js.map +1 -1
  218. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  219. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  220. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  221. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  222. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  223. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  224. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  225. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  226. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  227. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  228. package/lib/cjs/topology/MaskManager.js.map +1 -1
  229. package/lib/cjs/topology/Merging.js.map +1 -1
  230. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  231. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  232. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  233. package/lib/cjs/topology/Triangulation.js.map +1 -1
  234. package/lib/cjs/topology/Voronoi.js.map +1 -1
  235. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  236. package/lib/esm/Constant.js.map +1 -1
  237. package/lib/esm/Geometry.js.map +1 -1
  238. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  239. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  240. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  241. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  242. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  243. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  244. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  245. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  246. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  247. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  248. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  249. package/lib/esm/bspline/KnotVector.js.map +1 -1
  250. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  251. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  252. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  253. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  254. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  255. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  256. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  257. package/lib/esm/clipping/ClipVector.js.map +1 -1
  258. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  259. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  260. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  261. package/lib/esm/core-geometry.js.map +1 -1
  262. package/lib/esm/curve/Arc3d.js.map +1 -1
  263. package/lib/esm/curve/ConstrainedCurve2d.js.map +1 -1
  264. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  265. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  266. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  267. package/lib/esm/curve/CurveCollection.js.map +1 -1
  268. package/lib/esm/curve/CurveCurve.js.map +1 -1
  269. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  270. package/lib/esm/curve/CurveFactory.js.map +1 -1
  271. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  272. package/lib/esm/curve/CurveOps.js.map +1 -1
  273. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  274. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  275. package/lib/esm/curve/CurveTypes.js.map +1 -1
  276. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  277. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  278. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  279. package/lib/esm/curve/LineString3d.js.map +1 -1
  280. package/lib/esm/curve/Loop.js.map +1 -1
  281. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  282. package/lib/esm/curve/ParityRegion.js.map +1 -1
  283. package/lib/esm/curve/Path.js.map +1 -1
  284. package/lib/esm/curve/PointString3d.js.map +1 -1
  285. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  286. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  287. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  288. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  289. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  290. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  291. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  292. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  293. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  294. package/lib/esm/curve/RegionOps.js.map +1 -1
  295. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  296. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  297. package/lib/esm/curve/UnionRegion.js.map +1 -1
  298. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  299. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  300. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  301. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  302. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  303. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  304. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  305. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  306. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  307. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  308. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  309. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  310. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  311. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  312. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  313. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  314. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  315. package/lib/esm/curve/internalContexts/PointToCurveTangentHandler.js.map +1 -1
  316. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  317. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  318. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  319. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  320. package/lib/esm/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.js.map +1 -1
  321. package/lib/esm/curve/internalContexts/geometry2d/ConstraintSet.js.map +1 -1
  322. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2d.js.map +1 -1
  323. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.js.map +1 -1
  324. package/lib/esm/curve/internalContexts/geometry2d/UnboundedCircle2d.js.map +1 -1
  325. package/lib/esm/curve/internalContexts/geometry2d/UnboundedEllipse2d.js.map +1 -1
  326. package/lib/esm/curve/internalContexts/geometry2d/UnboundedHyperbola2d.js.map +1 -1
  327. package/lib/esm/curve/internalContexts/geometry2d/UnboundedLine2d.js.map +1 -1
  328. package/lib/esm/curve/internalContexts/geometry2d/UnboundedParabola2d.js.map +1 -1
  329. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  330. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  331. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  332. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  333. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  334. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  335. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  336. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  337. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  338. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  339. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  340. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  341. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  342. package/lib/esm/geometry3d/Angle.js.map +1 -1
  343. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  344. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  345. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  346. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  347. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  348. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  349. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  350. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  351. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  352. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  353. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  354. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  355. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  356. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  357. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  358. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  359. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  360. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  361. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  362. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  363. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  364. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  365. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  366. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  367. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  368. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  369. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  370. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  371. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  372. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  373. package/lib/esm/geometry3d/Range.js.map +1 -1
  374. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  375. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  376. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  377. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  378. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  379. package/lib/esm/geometry3d/Transform.js.map +1 -1
  380. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  381. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  382. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  383. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  384. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  385. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  386. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  387. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  388. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  389. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  390. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  391. package/lib/esm/numerics/Complex.js.map +1 -1
  392. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  393. package/lib/esm/numerics/Newton.js.map +1 -1
  394. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  395. package/lib/esm/numerics/PolarData.js.map +1 -1
  396. package/lib/esm/numerics/Polynomials.js.map +1 -1
  397. package/lib/esm/numerics/Quadrature.js.map +1 -1
  398. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  399. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  400. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  401. package/lib/esm/numerics/UnionFind.js.map +1 -1
  402. package/lib/esm/numerics/UsageSums.js.map +1 -1
  403. package/lib/esm/polyface/AuxData.js.map +1 -1
  404. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  405. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  406. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  407. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  408. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  409. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  410. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  411. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  412. package/lib/esm/polyface/Polyface.js.map +1 -1
  413. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  414. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  415. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  416. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  417. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  418. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  419. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  420. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  421. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  422. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  423. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  424. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  425. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  426. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  427. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  428. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  429. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  430. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  431. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  432. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  433. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  434. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  435. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  436. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  437. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  438. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  439. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  440. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  441. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  442. package/lib/esm/solid/Box.js.map +1 -1
  443. package/lib/esm/solid/Cone.js.map +1 -1
  444. package/lib/esm/solid/LinearSweep.js.map +1 -1
  445. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  446. package/lib/esm/solid/RuledSweep.js.map +1 -1
  447. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  448. package/lib/esm/solid/Sphere.js.map +1 -1
  449. package/lib/esm/solid/SweepContour.js.map +1 -1
  450. package/lib/esm/solid/TorusPipe.js.map +1 -1
  451. package/lib/esm/topology/ChainMerge.js.map +1 -1
  452. package/lib/esm/topology/Graph.js.map +1 -1
  453. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  454. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  455. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  456. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  457. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  458. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  459. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  460. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  461. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  462. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  463. package/lib/esm/topology/MaskManager.js.map +1 -1
  464. package/lib/esm/topology/Merging.js.map +1 -1
  465. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  466. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  467. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  468. package/lib/esm/topology/Triangulation.js.map +1 -1
  469. package/lib/esm/topology/Voronoi.js.map +1 -1
  470. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  471. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"ConstrainedImplicitCurve2d.js","sourceRoot":"","sources":["../../../../../src/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;EAEE;AAEF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAmB,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,kCAAkC,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IACrC;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAC7B,KAAsC,EACtC,KAAsC,EACtC,KAAsC;QAEtC;;;;;;;;kGAQ0F;QAC1F,mDAAmD;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YACtE,OAAO,SAAS,CAAC;QACnB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CACrC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EACvC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EACvC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CACxC,CAAC;gBACF,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrC,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,kCAAkC,CAAC,cAAc,CAC9D,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CACpD,CAAC;oBACF,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,MAAM,CAAC,CAAC;oBACtF,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5E,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5E,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,kBAAkB,CAC9B,IAAqC,EAAE,MAA0C;QAEjF,yCAAyC;QACzC,4FAA4F;QAC5F,gEAAgE;QAChE,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,SAAS,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YAClF,OAAO,SAAS,CAAC;QACnB,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,EAAE,CAAA;QAC3C,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,+BAA+B,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAClF,MAAM,UAAU,GAAG,IAAI,sBAAsB,CAAkC,KAAK,CAAC,CAAC;YACtF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ;YACxE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ;YAC1E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,eAAe,CAC3B,OAA2C,EAAE,OAA2C;QAExF,2FAA2F;QAC3F,iHAAiH;QACjH,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,kBAAkB,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;QACtD,IAAI,kBAAkB,KAAK,SAAS;YAClC,OAAO,SAAS,CAAC;QACnB,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;gBACjE,MAAM,KAAK,GAAG,+BAA+B,CAAC,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBACpF,MAAM,UAAU,GAAG,IAAI,sBAAsB,CAAkC,KAAK,CAAC,CAAC;gBACtF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAC3E,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAC3E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,eAAe,CAC3B,IAAqC,EAAE,MAA0C;QAEjF,8GAA8G;QAC9G,uGAAuG;QACvG,2DAA2D;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,SAAS,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YAClF,OAAO,SAAS,CAAC;QACnB,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,EAAE,CAAA;QAC3C,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAA;YAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,+BAA+B,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAClF,MAAM,UAAU,GAAG,IAAI,sBAAsB,CAAkC,KAAK,CAAC,CAAC;YACtF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACzE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,kBAAkB,CAC9B,OAA2C,EAAE,OAA2C;QAExF,2FAA2F;QAC3F,gGAAgG;QAChG,kHAAkH;QAClH,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,sBAAsB,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;QAC1D,MAAM,kBAAkB,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;QACtD,IAAI,kBAAkB,KAAK,SAAS;YAClC,OAAO,SAAS,CAAC;QACnB,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,aAAa,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;QACtF,IAAI,IAAI,GAAG,GAAG;YACZ,OAAO,SAAS,CAAC;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;gBACzD,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;gBACtG,MAAM,aAAa,GAAG,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAM,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;gBACxG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnE,MAAM,KAAK,GAAG,+BAA+B,CAAC,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBACpF,MAAM,UAAU,GAAG,IAAI,sBAAsB,CAAkC,KAAK,CAAC,CAAC;gBACtF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAC3E,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAC3E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,cAAc,CAC1B,OAA2C,EAAE,OAA2C;QAExF,sFAAsF;QACtF,8BAA8B;QAC9B,uFAAuF;QACvF,sGAAsG;QACtG,8EAA8E;QAC9E,qFAAqF;QACrF,kCAAkC;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;YACnE,OAAO,SAAS,CAAC;QACnB,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;YACnE,OAAO,SAAS,CAAC;QACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAC/B,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;gBACpC,MAAM,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC;gBAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;oBAC5C,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;wBAC3B,IAAI,MAAM,EAAE,MAAM,CAAC;wBACnB,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;4BACd,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;4BACzF,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;wBAC3F,CAAC;6BAAM,CAAC;4BACN,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;4BACxF,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;wBAC5F,CAAC;wBACD,MAAM,KAAK,GAAG,+BAA+B,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBAC/E,IAAI,KAAK,KAAK,SAAS;4BACrB,OAAO,SAAS,CAAC;wBACnB,MAAM,UAAU,GAAG,IAAI,sBAAsB,CAAkC,KAAK,CAAC,CAAC;wBACtF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;wBAC3E,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;wBAC3E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;MAME;IACK,MAAM,CAAC,iBAAiB,CAC7B,KAAsC,EACtC,KAAsC,EACtC,MAA0C;QAE1C;;;;;;;;;;;;;;;;;;kGAkB0F;QAC1F,kEAAkE;QAClE,MAAM,MAAM,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAC9C,OAAO,SAAS,CAAC;QACnB,4DAA4D;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,yDAAyD;QAC5F,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;eACxC,CAAC,WAAW,CAAC,cAAc,CAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAChC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAChC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;YAC3B,+BAA+B;YAC/B,qBAAqB;YACrB,wEAAwE;YACxE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACjE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YACpD,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAC9C,sFAAsF;YACtF,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,GAAG,GAAG,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;YAClF,MAAM,YAAY,GAAG,EAAE,CAAC;YACxB,2BAA2B;YAC3B,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBACtC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,yEAAyE;gBACzE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBACtC,kFAAkF;gBAClF,gEAAgE;gBAChE,qEAAqE;gBACrE,2CAA2C;gBAC3C,IAAI,MAAM,CAAC;gBACX,IAAI,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,4CAA4C;oBACrF,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;qBACtE,IAAI,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,4CAA4C;oBAC1F,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACnF,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;oBACzF,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC3G,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,sBAAsB,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;gBACzG,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;wBAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;wBAClF,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBACnF,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;wBACzF,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;wBAC3G,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,WAAW,CAAC,cAAc,CAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAChC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;gBACzD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBAChD,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC9D,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBAClD,MAAM,KAAK,GAAG,sBAAsB,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;oBACzE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;4BACtB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;4BACnE,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;4BAClF,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;gCAC5C,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;gCACzF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gCACrF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gCACrF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gCACtF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BACtB,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAC7B,OAA2C,EAC3C,OAA2C,EAC3C,IAAqC;QAErC;;;;;;;;;;;;;;;;;;;;;;kGAsB0F;QAC1F,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/C,IAAI,cAAc,KAAK,SAAS;YAC9B,OAAO,SAAS,CAAC;QACnB,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,mBAAmB,GAAG;YAC1B,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;YACnD,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;SACpD,CAAC;QACF,MAAM,iBAAiB,GAAG,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACvB,iBAAiB,CAAC,IAAI,CACpB,QAAQ,CAAC,MAAM,CACb,mBAAmB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,EAChD,mBAAmB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAClD,CAAC,CAAC;QACP,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAChE,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YACjC,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;YAC1B,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;gBACjC,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;gBAC1B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC3D,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjD,CAAC;gBACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC7D,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACV,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG,sBAAsB,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;wBACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,2BAA2B,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC3F,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;4BACpB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;4BACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;4BAC3E,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;4BAClF,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;gCAC5C,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;gCACzF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gCACxE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gCACxE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gCACrE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BACtB,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;;;;OASG;IACK,MAAM,CAAC,wBAAwB,CACrC,OAA2C,EAC3C,OAA2C,EAC3C,OAA2C,EAC3C,EAAU,EACV,EAAU,EACV,EAAU,EACV,MAAoE;QAEpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC9B,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;YACnC,EAAE,GAAG,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACpC,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,CAAC,uDAAuD;QACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QACxC;;;;;;;;;;;;;;;;;UAiBE;QACF,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC;QACxB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACzC,IAAI,WAAW,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;YAC3B,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;gBACpB,EAAE,GAAG,GAAG,CAAC;YACX,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;gBACd,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACvD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxD,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;oBACnC,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;oBACrF,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;wBAC5C,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;wBACzF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;wBACxE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;wBACxE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;wBACxE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;OAGG;IACK,MAAM,CAAC,0BAA0B,CACvC,OAA6C;QAE7C,oCAAoC;QACpC,kBAAkB;QAClB,kBAAkB;QAClB,kBAAkB;QAClB,uDAAuD;QACvD,mCAAmC;QACnC,mCAAmC;QACnC,mCAAmC;QACnC,6CAA6C;QAC7C,6CAA6C;QAC7C,0DAA0D;QAC1D,oDAAoD;QACpD,4DAA4D;QAC5D,mDAAmD;QACnD,+CAA+C;QAC/C,6EAA6E;QAC7E,4BAA4B;QAC5B,2DAA2D;QAC3D,mEAAmE;QACnE,0EAA0E;QAC1E,MAAM,MAAM,GAAiE,EAAE,CAAC;QAChF,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,cAAc,GAAG,MAAM,CAAC;QAC9B,MAAM,kBAAkB,GAAG,QAAQ,CAAC,yBAAyB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAChF,4EAA4E;QAC5E,0CAA0C;QAC1C,IAAI,kBAAkB,KAAK,SAAS;eAC/B,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;eACzD,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACnC,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvD,IAAI,CAAC,wBAAwB,CAC3B,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAClC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAC5B,MAAM,CACP,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAChD,CAAC;QACD,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAC5C,QAAQ,CAAC,CAAC,GAAG,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,EACtE,CAAC,QAAQ,CAAC,CAAC,GAAG,kBAAkB,EAAE,QAAQ,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,EACtE,GAAG,EAAE,GAAG,EAAE,GAAG,CACd,CAAC;QACF,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAC7B,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAC9G,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAC9G,GAAG,CACJ,CAAC;gBACF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC7D,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBACvD,MAAM,EAAE,GAAG,QAAQ,CAAC,gBAAgB,EAAE,GAAG,GAAG,CAAC;gBAC7C,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;gBACpD,MAAM,EAAE,GAAG,QAAQ,CAAC,gBAAgB,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC7D,MAAM,KAAK,GAAG,sBAAsB,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;2BACjB,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1E,KAAK,CAAC,GAAG,EAAE,CAAC;oBACd,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;wBAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;wBACpF,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;wBAC7F,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;4BAC5C,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;4BACzF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACnF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACnF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BACnF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAC7B,OAA2C,EAC3C,OAA2C,EAC3C,OAA2C;QAE3C,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,QAAQ,CAAC,MAAa,EAAE,MAAa;QACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACpC,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,SAAS,CAAC;QACnB,OAAO,+BAA+B,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,iBAAiB,CAC7B,KAAsC,EACtC,KAAsC,EACtC,MAAc;QAEd,2DAA2D;QAC3D,qFAAqF;QACrF,gCAAgC;QAChC,IAAI,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;YACtG,OAAO,SAAS,CAAC;QACnB,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,mDAAmD,CAAC,OAAO,CAAC,CAAC;gBAC/E,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACpB,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAClF,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;wBAC5C,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;wBACzF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;wBACrF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;wBACrF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,iBAAiB,CAC7B,OAA2C,EAAE,KAAsC,EAAE,MAAc;QAEnG,yEAAyE;QACzE,qEAAqE;QACrE,2EAA2E;QAC3E,4DAA4D;QAC5D,IAAI,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,MAAM,QAAQ,GAAG;YACf,kCAAkC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7F,kCAAkC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;SAC9F,CAAC;QACF,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;YAClD,OAAO,SAAS,CAAC;QACnB,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAClF,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;wBAC5C,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;wBACzF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;wBACvF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;wBACrF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,iBAAiB,CAC7B,OAA2C,EAAE,OAA2C,EAAE,MAAc;QAExG,yEAAyE;QACzE,yEAAyE;QACzE,oEAAoE;QACpE,4DAA4D;QAC5D,IAAI,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,MAAM,QAAQ,GAAG;YACf,kCAAkC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7F,kCAAkC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;SAC9F,CAAC;QACF,MAAM,QAAQ,GAAG;YACf,kCAAkC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7F,kCAAkC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;SAC9F,CAAC;QACF,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAChD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,MAAM,SAAS,GAAG,kCAAkC,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAClF,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;wBAC5C,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAqC,SAAS,CAAC,CAAC;wBACzF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;wBACvF,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;wBACvF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC;IACD;;;;;;;;;OASG;IACI,MAAM,CAAC,uBAAuB,CACnC,OAA2C,EAAE,OAA2C;QAExF,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC1C,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC1E,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,SAAS,CAAC;QACnB,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;QACnB,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;YACvB,OAAO,oBAAoB,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACnF,CAAC;aAAM,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;YAC9B,OAAO,kBAAkB,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,qBAAqB,CACjC,IAAqC,EAAE,MAA0C;QAEjF,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,SAAS,KAAK,SAAS;YACzB,OAAO,SAAS,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,SAAS,CAAC;QACnB,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;QACzB,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1D,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACjB,CAAC;YACJ,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACpE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBACnD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC1F,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AACD;;;;;GAKG;AACH,SAAS,YAAY,CAAC,QAAgB,EAAE,KAAc;IACpD,IAAI,KAAK,KAAK,SAAS;QACrB,KAAK,GAAG,QAAQ,CAAC;IACnB,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,QAAQ,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,uFAAuF;AACvF,SAAS,mBAAmB,CAC1B,OAAqE,EAAE,MAA0C;IAEjH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC;YACpC,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","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 CartesianGeometry\r\n*/\r\n\r\nimport { Geometry } from \"../../../Geometry\";\r\nimport { Matrix3d } from \"../../../geometry3d/Matrix3d\";\r\nimport { Point2d, Vector2d } from \"../../../geometry3d/Point2dVector2d\";\r\nimport { Vector3d } from \"../../../geometry3d/Point3dVector3d\";\r\nimport { XAndY } from \"../../../geometry3d/XYZProps\";\r\nimport { Degree2PowerPolynomial } from \"../../../numerics/Polynomials\";\r\nimport { SmallSystem } from \"../../../numerics/SmallSystem\";\r\nimport { ImplicitCurve2d, ImplicitGeometryMarkup, Point2dImplicitCurve2d } from \"./ImplicitCurve2d\";\r\nimport { UnboundedCircle2dByCenterAndRadius } from \"./UnboundedCircle2d\";\r\nimport { UnboundedEllipse2d } from \"./UnboundedEllipse2d\";\r\nimport { UnboundedHyperbola2d } from \"./UnboundedHyperbola2d\";\r\nimport { UnboundedLine2dByPointAndNormal } from \"./UnboundedLine2d\";\r\nimport { UnboundedParabola2d } from \"./UnboundedParabola2d\";\r\n\r\n/**\r\n * Static methods for special case circle and line tangent constructions.\r\n * @internal\r\n */\r\nexport class ConstrainedImplicitCurve2d {\r\n /**\r\n * Return all (i.e., up to 4) circles that are tangent to 3 given lines.\r\n * @param lineA first line\r\n * @param lineB second line\r\n * @param lineC third line\r\n */\r\n public static circlesTangentLLL(\r\n lineA: UnboundedLine2dByPointAndNormal,\r\n lineB: UnboundedLine2dByPointAndNormal,\r\n lineC: UnboundedLine2dByPointAndNormal,\r\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n /*--------------------------------------------------------------------------------------\r\n (X-A).normalA = a*r\r\n (X-B).normalB = b*r\r\n (X-C).normalC = c*r\r\n Typical expansion is\r\n x*mx + y*my - a*r = A.normalA\r\n Where a,b,c are combinations of {+1,-1}\r\n Need to consider 4 combinations of signs: (+++) (++-) (+-+) (+--) The other 4 generate negated r as solution.\r\n ----------------------------------------------------------------------------------------*/\r\n // make lines with normal vectors and nearby origin\r\n const origin = lineA.point;\r\n const lineA1 = lineA.cloneNormalizedFromOrigin(origin);\r\n const lineB1 = lineB.cloneNormalizedFromOrigin(origin);\r\n const lineC1 = lineC.cloneNormalizedFromOrigin(origin);\r\n if (lineA1 === undefined || lineB1 === undefined || lineC1 === undefined)\r\n return undefined;\r\n const result = [];\r\n const a = lineA1.normal.dotProduct(lineA1.point);\r\n const b = lineB1.normal.dotProduct(lineB1.point);\r\n const c = lineC1.normal.dotProduct(lineC1.point);\r\n const signA = 1;\r\n for (const signB of [-1, 1]) {\r\n for (const signC of [-1, 1]) {\r\n const matrix = Matrix3d.createRowValues(\r\n lineA1.normal.x, lineA1.normal.y, signA,\r\n lineB1.normal.x, lineB1.normal.y, signB,\r\n lineC1.normal.x, lineC1.normal.y, signC,\r\n );\r\n const rhs = Vector3d.create(a, b, c);\r\n const xyr = matrix.multiplyInverse(rhs);\r\n if (xyr !== undefined) {\r\n const circle = UnboundedCircle2dByCenterAndRadius.createXYRadius(\r\n origin.x + xyr.x, origin.y + xyr.y, Math.abs(xyr.z),\r\n );\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(circle);\r\n markup.appendClosePoint(circle.center, lineA, circle.center, circle.radius);\r\n markup.appendClosePoint(circle.center, lineB, circle.center, circle.radius);\r\n markup.appendClosePoint(circle.center, lineC, circle.center, circle.radius);\r\n result.push(markup);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return all (i.e., up to 2) unbounded lines perpendicular to a line and tangent to a circle.\r\n * @param line the line\r\n * @param circle the circle\r\n */\r\n public static linesPerpLTangentC(\r\n line: UnboundedLine2dByPointAndNormal, circle: UnboundedCircle2dByCenterAndRadius,\r\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\r\n // Project the circle center to the line.\r\n // The endpoints of the perpendicular line are the circle center and that line point shifted\r\n // by positive and negative radius in the direction of the line.\r\n const lineTangent = line.unitVectorAlongLine();\r\n const unitNormal = line.unitNormal();\r\n const linePoint = line.closestPoint(circle.center);\r\n if (linePoint === undefined || lineTangent === undefined || unitNormal === undefined)\r\n return undefined;\r\n const unitPerp = unitNormal.rotate90CCWXY()\r\n const result = [];\r\n for (const r of signedValues(circle.radius)) {\r\n const pointA = linePoint.plusScaled(lineTangent, r);\r\n const pointB = circle.center.plusScaled(lineTangent, r);\r\n const lineC = UnboundedLine2dByPointAndNormal.createPointNormal(pointA, unitPerp);\r\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineC);\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, line)); // CLONE\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circle)); // CLONE\r\n result.push(taggedLine);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return all (i.e., 4) variants of the line perpendicular to 2 circles (line between centers, with ends at crossing\r\n * points on respective circles).\r\n * @param circleA first circle\r\n * @param circleB second circle\r\n */\r\n public static linesPerpCPerpC(\r\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius,\r\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\r\n // There infinite line containing the circle centers is the only line perp to both circles.\r\n // The endpoints for the 4 line segments are the centers shifted by the respective radii along the infinite line.\r\n const centerToCenter = Vector2d.createStartEnd(circleA.center, circleB.center);\r\n const unitCenterToCenter = centerToCenter.normalize();\r\n if (unitCenterToCenter === undefined)\r\n return undefined;\r\n const unitNormal = unitCenterToCenter.rotate90CCWXY();\r\n const result = [];\r\n for (const rA of signedValues(circleA.radius)) {\r\n for (const rB of signedValues(circleB.radius)) {\r\n const pointA = circleA.center.plusScaled(unitCenterToCenter, rA);\r\n const pointB = circleB.center.plusScaled(unitCenterToCenter, rB);\r\n const lineC = UnboundedLine2dByPointAndNormal.createPointNormal(pointA, unitNormal);\r\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineC);\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, circleA)); // CLONE\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circleB)); // CLONE\r\n result.push(taggedLine);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return all (i.e., up to 2) unbounded lines perpendicular to a line and a circle.\r\n * @param line the line\r\n * @param circle the circle\r\n */\r\n public static linesPerpLPerpC(\r\n line: UnboundedLine2dByPointAndNormal, circle: UnboundedCircle2dByCenterAndRadius,\r\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\r\n // The infinite line through the circle center and in the direction of the line normal is the containing line.\r\n // Make segments from its intersection with the line to the near and far intersections with the circle.\r\n // (these are the centers shifted by radius along the line)\r\n const lineTangent = line.unitVectorAlongLine();\r\n const unitNormal = line.unitNormal();\r\n const linePoint = line.closestPoint(circle.center);\r\n if (linePoint === undefined || lineTangent === undefined || unitNormal === undefined)\r\n return undefined;\r\n const unitPerp = unitNormal.rotate90CCWXY()\r\n const result = [];\r\n for (const r of signedValues(circle.radius)) {\r\n const pointA = linePoint.clone()\r\n const pointB = circle.center.plusScaled(unitNormal, r);\r\n const lineC = UnboundedLine2dByPointAndNormal.createPointNormal(pointA, unitPerp);\r\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineC);\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, line)); // CLONE!\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circle)); // CLONE!\r\n result.push(taggedLine);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return all (i.e., up to 4) unbounded lines perpendicular to a circle and tangent to a circle.\r\n * Note that multiple colinear lines are returned tagged with diametrically opposing points of circleA.\r\n * @param circleA first circle (for perpendicular constraint)\r\n * @param circleB second circle (for tangent constraint)\r\n */\r\n public static linesPerpCTangentC(\r\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius\r\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\r\n // The solution lines are through the perp circle center and tangent to the tangent circle.\r\n // Hence this is the two infinite lines \"through first circle center, tangent to second circle\",\r\n // Bounded line segments go from the tangent circle points to the near and far intersections with the perp circle.\r\n const centerToCenter = Vector2d.createStartEnd(circleA.center, circleB.center);\r\n const centerToCenterDistance = centerToCenter.magnitude();\r\n const unitCenterToCenter = centerToCenter.normalize();\r\n if (unitCenterToCenter === undefined)\r\n return undefined;\r\n const centerToCenterNormal = unitCenterToCenter.rotate90CCWXY();\r\n const sine = Geometry.safeDivideFraction(circleB.radius, centerToCenterDistance, 0.0);\r\n if (sine > 1.0)\r\n return undefined;\r\n const absoluteCosine = Math.sqrt(1.0 - sine * sine);\r\n const result = [];\r\n for (const rA of signedValues(circleA.radius)) {\r\n for (const rB of signedValues(circleB.radius)) {\r\n const cosine = rB > 0 ? absoluteCosine : -absoluteCosine;\r\n const lineNormal = Vector2d.createAdd2Scaled(unitCenterToCenter, -sine, centerToCenterNormal, cosine);\r\n const lineDirection = Vector2d.createAdd2Scaled(unitCenterToCenter, cosine, centerToCenterNormal, sine);\r\n const pointA = circleA.center.plusScaled(lineDirection, rA);\r\n const pointB = circleB.center.plusScaled(lineNormal, Math.abs(rB));\r\n const lineC = UnboundedLine2dByPointAndNormal.createPointNormal(pointA, lineNormal);\r\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineC);\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, circleA)); // CLONE\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circleB)); // CLONE\r\n result.push(taggedLine);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return all (i.e., up to 4) unbounded lines tangent to 2 circles.\r\n * * There are 4 lines if there is neither intersection nor containment between the circles\r\n * * There are 2 lines if the circles intersect\r\n * * THere are no lines if the one circle is entirely inside the other.\r\n * @param circleA first circle\r\n * @param circleB second circle\r\n */\r\n public static linesTangentCC(\r\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius\r\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\r\n // draw a line tangent to both circles. This may have both circles on the same side,\r\n // or one circle on each side.\r\n // draw radii from both centers to the tangencies. (These are parallel to each other)\r\n // the (sum or difference of the radii) and the (distance between centers) are side and hypotenuse of\r\n // // a right triangle, with the tangent-to-tangent segment as the other side.\r\n // The lengths give sine and cosine of angles in the triangle, and those give vectors\r\n // from center to tangency points.\r\n const distanceAB = circleA.center.distance(circleB.center);\r\n if (distanceAB + Math.abs(circleB.radius) <= Math.abs(circleA.radius))\r\n return undefined;\r\n if (distanceAB + Math.abs(circleA.radius) <= Math.abs(circleB.radius))\r\n return undefined;\r\n const unitAB = Vector2d.createStartEnd(circleA.center, circleB.center);\r\n if (!unitAB.normalize(unitAB))\r\n return undefined;\r\n const result = [];\r\n if (unitAB !== undefined) {\r\n const radiusA = circleA.radius;\r\n const radiusB = circleB.radius;\r\n for (const signQ of [-1, 1]) {\r\n const q = radiusB + signQ * radiusA;\r\n const sine = q / distanceAB;\r\n if (Math.abs(sine) < 1.0) {\r\n const cosine = Math.sqrt(1.0 - sine * sine);\r\n for (const sign of [-1, 1]) {\r\n let pointA, pointB;\r\n if (signQ < 0) {\r\n pointA = circleA.center.addForwardLeft(radiusA * -sine, radiusA * sign * cosine, unitAB);\r\n pointB = circleB.center.addForwardLeft(radiusB * -sine, radiusB * sign * cosine, unitAB);\r\n } else {\r\n pointA = circleA.center.addForwardLeft(radiusA * sine, radiusA * sign * cosine, unitAB);\r\n pointB = circleB.center.addForwardLeft(-radiusB * sine, -radiusB * sign * cosine, unitAB);\r\n }\r\n const lineA = UnboundedLine2dByPointAndNormal.createPointPoint(pointA, pointB);\r\n if (lineA === undefined)\r\n return undefined;\r\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineA);\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, circleA)); // CLONE\r\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circleB)); // CLONE\r\n result.push(taggedLine);\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return all (i.e., up to 8) circles tangent to two lines and a circle.\r\n * * There are 8 circles if the circle contains the intersection of the lines.\r\n * * There are 2 circles if the circle is completely contained in one quadrant bounded by the two lines.\r\n * * There are 2 circles if the circle intersects one ray outward from the intersection.\r\n * * There are 4 circles if the circle intersects two of the outward rays.\r\n */\r\n public static circlesTangentLLC(\r\n lineA: UnboundedLine2dByPointAndNormal,\r\n lineB: UnboundedLine2dByPointAndNormal,\r\n circle: UnboundedCircle2dByCenterAndRadius,\r\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n /*--------------------------------------------------------------------------------------\r\n Put origin at circle center.\r\n A,B are line points.\r\n M,N are line normals.\r\n (X).(X) = (a +- r)^2 = 0\r\n (X-A).M = +-r\r\n (X-B).N = +-r\r\n Need to consider 4 combinations of signs: (+++) (++-) (-++) (-+-) The other 4 are negations.\r\n Write the linear part as\r\n [M N]^ * X = [M.A N.B]^ + r Ei\r\n where Ei is one of E0=[1 1]^ or E1=[1 -1]^\r\n Multiply by inverse of matrix X = F + r G\r\n The quadratic part is\r\n (F + rG).(F + rG) = (a +- r)^2\r\n (F + rG).(F + rG) = a^2 +- 2ar + r^2\r\n F.F + 2r G.F + r^2 G.G = a^2 +- 2ar + r^2\r\n r^2 (1-G.G) + 2(+-a - G.F)r + a^2-F.F = 0.\r\n Solve with positive, negative branch. Each generates 2 solutions to go back through Ei.\r\n ----------------------------------------------------------------------------------------*/\r\n // lines with unit vector and point coordinates from circle center\r\n const lineA1 = lineA.cloneNormalizedFromOrigin(circle.center);\r\n const lineB1 = lineB.cloneNormalizedFromOrigin(circle.center);\r\n if (lineA1 === undefined || lineB1 === undefined)\r\n return undefined;\r\n // perpendicular distance from each line to center of circle\r\n const dotMA = lineA1.normal.dotProduct(lineA1.point);\r\n const dotMB = lineB1.normal.dotProduct(lineB1.point);\r\n\r\n const a = circle.radius;\r\n const vectorF = Vector2d.create(); // vector from circle center to intersection of the lines\r\n if (lineA1.normal.isParallelTo(lineB1.normal)\r\n || !SmallSystem.linearSystem2d(\r\n lineA1.normal.x, lineA1.normal.y,\r\n lineB1.normal.x, lineB1.normal.y,\r\n dotMA, dotMB, vectorF)) {\r\n // SPECIAL CASE: PARALLEL LINES\r\n // Lines are parallel\r\n // Make a midline. Half of line separation is the tangent circle radius.\r\n const midLinePoint = lineA1.point.interpolate(0.5, lineB1.point);\r\n const lineDirection = lineA1.normal.rotate90CCWXY();\r\n const a1 = lineA1.functionValue(midLinePoint);\r\n // vector from centerC to midline point midline point is vectorCP + s * lineDirectionA\r\n const coffSine2 = lineDirection.dotProduct(lineDirection);\r\n const coffSine = 2.0 * lineDirection.dotProduct(midLinePoint);\r\n const coffConstant = Geometry.hypotenuseSquaredXY(midLinePoint.x, midLinePoint.y);\r\n const targetRadius = [];\r\n // special case zero radius\r\n if (!Geometry.isSmallMetricDistance(circle.radius)) {\r\n targetRadius.push(circle.radius + a1);\r\n targetRadius.push(circle.radius - a1);\r\n } else {\r\n // circle is just a point -- the quadratic solver only has to happen once\r\n targetRadius.push(circle.radius + a1);\r\n // But if the center is ON one of the lines, construct by projecting to the other.\r\n // REMARK: In C++ code this pointOnLine test was done with messy\r\n // tolerance relative to the various line points' distance to origin.\r\n // Here we trust metric distance condition.\r\n let center;\r\n if (Geometry.isSmallMetricDistance(dotMA)) // tangency is on lineA; move towards line B\r\n center = circle.center.plusScaled(lineA1.normal, dotMB > 0.0 ? -a1 : a1);\r\n else if (Geometry.isSmallMetricDistance(dotMB)) // tangency is on lineB; move towards line A\r\n center = circle.center.plusScaled(lineB1.normal, dotMA > 0.0 ? a1 : -a1);\r\n if (center !== undefined) {\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(center, a1);\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.closePointsOfGeometry(newCircle.center, newCircle.center, newCircle.radius, [lineA, lineB, circle]);\r\n return [markup];\r\n }\r\n }\r\n const resultA = [];\r\n for (const radius of targetRadius) {\r\n const roots = Degree2PowerPolynomial.solveQuadratic(coffSine2, coffSine, coffConstant - radius * radius);\r\n if (roots) {\r\n for (const alpha of roots) {\r\n const center = circle.center.plus2Scaled(midLinePoint, 1.0, lineDirection, alpha);\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(center, a1);\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.closePointsOfGeometry(newCircle.center, newCircle.center, newCircle.radius, [lineA, lineB, circle]);\r\n resultA.push(markup);\r\n }\r\n }\r\n }\r\n return resultA;\r\n }\r\n const result = [];\r\n for (const sign1 of [-1, 1]) {\r\n const vectorG = Vector2d.create();\r\n if (SmallSystem.linearSystem2d(\r\n lineA1.normal.x, lineA1.normal.y,\r\n lineB1.normal.x, lineB1.normal.y, 1.0, sign1, vectorG)) {\r\n for (const sign2 of [-1, 1]) {\r\n const coffA = 1.0 - vectorG.dotProduct(vectorG);\r\n const coffB = 2.0 * (sign2 * a - vectorG.dotProduct(vectorF));\r\n const coffC = a * a - vectorF.dotProduct(vectorF);\r\n const roots = Degree2PowerPolynomial.solveQuadratic(coffA, coffB, coffC);\r\n if (roots !== undefined) {\r\n for (const r of roots) {\r\n const center = circle.center.plus2Scaled(vectorF, 1.0, vectorG, r);\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(center, r);\r\n if (!isThisCirclePresent(result, newCircle)) {\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.appendClosePoint(newCircle.center, lineA, newCircle.center, newCircle.radius);\r\n markup.appendClosePoint(newCircle.center, lineB, newCircle.center, newCircle.radius);\r\n markup.appendClosePoint(newCircle.center, circle, newCircle.center, newCircle.radius);\r\n result.push(markup);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return all (i.e., up to 4) circles tangent to 2 circles and a line.\r\n * @param circleA first circle\r\n * @param circleB second circle\r\n * @param line the line\r\n */\r\n public static circlesTangentCCL(\r\n circleA: UnboundedCircle2dByCenterAndRadius,\r\n circleB: UnboundedCircle2dByCenterAndRadius,\r\n line: UnboundedLine2dByPointAndNormal,\r\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n /*--------------------------------------------------------------------------------------\r\n (x-xA)^2 + (y-y0)^2 - (r + r0)^2 = 0\r\n (x-xB)^2 + (y-y1)^2 - (r + r1)^2 = 0\r\n y = r NOTE: Cannot arbitrarily change sign of r as is done in 3-circle case.\r\n -------------------------------------------\r\n x^2 -2 xA x + xA^2 -2 y0 y + y0^2 - 2 r0 y - r0^2 = 0\r\n x^2 -2 xB x + xB^2 -2 y1 y + y1^2 - 2 r1 y - r1^2 = 0\r\n -------------------------------------------\r\n x^2 -2 xA x + -2 (y0 + r0) y + a0= 0 a0 = xA^2 + y0^2 - r0^2\r\n x^2 -2 xB x + -2 (y1 + r1) y + a1= 0 a1 = xB^2 + y1^2 - r1^2\r\n -------------------------------------------\r\n (A0) x^2 + b0 x + c0 y + a0= 0 b0 = -2x0 c0 = -2 (y0 + r0)\r\n (A1) x^2 + b1 x + c1 y + a1= 0 b1 = -2x1 c1 = -2 (y1 + r1)\r\n -------------------------------------------\r\n c1 x^2 c1 c0 y + c1 a0= 0\r\n c0 x^2 + c0 b1 x + c0 c1 y + c0 a1= 0\r\n ---------------------------------------\r\n Subtract first from second.\r\n (c0 - c1) x^2 + (c0 b1 - c1 b0) x + (c0 a1 - c1 a0) = 0.\r\n Solve for two x values. Substitute in with largest c0, c1.\r\n ---------------------------------------\r\n Repeat with signed combinations of the circle radii.\r\n ----------------------------------------------------------------------------------------*/\r\n const lineUnitNormal = line.normal.normalize();\r\n if (lineUnitNormal === undefined)\r\n return undefined;\r\n const lineUnitAlong = lineUnitNormal.rotate90CCWXY();\r\n const circleGlobalOffsets = [\r\n Vector2d.createStartEnd(line.point, circleA.center),\r\n Vector2d.createStartEnd(line.point, circleB.center),\r\n ];\r\n const circleLocalOffset = [];\r\n for (const i of [0, 1]) {\r\n circleLocalOffset.push(\r\n Vector2d.create(\r\n circleGlobalOffsets[i].dotProduct(lineUnitAlong),\r\n circleGlobalOffsets[i].dotProduct(lineUnitNormal),\r\n ));\r\n }\r\n const coffA = [0, 0];\r\n const coffB = [0, 0];\r\n const coffC = [0, 0];\r\n const circleRadius = [0, 0];\r\n const result = [];\r\n const radiiFromA = signedValues(circleA.radius, circleA.radius);\r\n const radiiFromB = signedValues(circleB.radius, circleB.radius);\r\n for (const radiusA of radiiFromA) {\r\n circleRadius[0] = radiusA;\r\n for (const radiusB of radiiFromB) {\r\n circleRadius[1] = radiusB;\r\n for (const i of [0, 1]) {\r\n const r = circleRadius[i];\r\n coffA[i] = circleLocalOffset[i].magnitudeSquared() - r * r;\r\n coffB[i] = -2.0 * circleLocalOffset[i].x;\r\n coffC[i] = -2.0 * (circleLocalOffset[i].y + r);\r\n }\r\n const k = Math.abs(circleRadius[0]) > Math.abs(circleRadius[1])\r\n ? 0 : 1;\r\n const qa = coffC[0] - coffC[1];\r\n const qb = coffC[0] * coffB[1] - coffC[1] * coffB[0];\r\n const qc = coffC[0] * coffA[1] - coffC[1] * coffA[0];\r\n const xRoot = Degree2PowerPolynomial.solveQuadratic(qa, qb, qc);\r\n if (xRoot !== undefined) {\r\n for (const x of xRoot) {\r\n const y = Geometry.conditionalDivideCoordinate(x * x + coffB[k] * x + coffA[k], -coffC[k]);\r\n if (y !== undefined) {\r\n const r = Math.abs(y);\r\n const center = line.point.plus2Scaled(lineUnitAlong, x, lineUnitNormal, y);\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(center, r);\r\n if (!isThisCirclePresent(result, newCircle)) {\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.appendClosePoint(newCircle.center, circleA, newCircle.center, r);\r\n markup.appendClosePoint(newCircle.center, circleB, newCircle.center, r);\r\n markup.appendClosePoint(newCircle.center, line, newCircle.center, r);\r\n result.push(markup);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Special case CCC tangent construction when inputs are colinear.\r\n * @param circleA first input circle\r\n * @param circleB second input circle\r\n * @param circleC third input circle\r\n * @param rA signed radius for circleA\r\n * @param rB signed radius for circleB\r\n * @param rC signed radius for circleC\r\n * @param result pre-initialized array to which tangent circle markup will be added.\r\n */\r\n private static solveColinearCCCTangents(\r\n circleA: UnboundedCircle2dByCenterAndRadius,\r\n circleB: UnboundedCircle2dByCenterAndRadius,\r\n circleC: UnboundedCircle2dByCenterAndRadius,\r\n rA: number,\r\n rB: number,\r\n rC: number,\r\n result: ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[],\r\n ): void {\r\n const vectorAB = Vector2d.createStartEnd(circleA.center, circleB.center);\r\n const vectorAC = Vector2d.createStartEnd(circleA.center, circleC.center);\r\n const xB = vectorAB.magnitude();\r\n let xC = vectorAC.magnitude();\r\n if (vectorAB.dotProduct(vectorAC) < 0)\r\n xC = -xC;\r\n const unitAB = vectorAB.normalize();\r\n if (unitAB === undefined)\r\n return; // there are circle-in-circle cases with common centers\r\n const unitPerp = unitAB.rotate90CCWXY();\r\n /*\r\n Measuring from center A in rotated system:\r\n x^2 + y^2 = (r+rA)^2\r\n (x-xB)^2 + y^2 = (r+rB)^2\r\n (x-xC)^2 + y^2 = (r+rC)^2\r\n -------------------------\r\n x^2 + y^2 = (r+rA)^2\r\n -2xB x + xB^2 = (r+rB)^2 - (r+rA)^2\r\n -2xC x + xC^2 = (r+rC)^2 - (r+rA)^2\r\n -------------------------\r\n x^2 + y^2 = (r+rA)^2\r\n -2xB x = 2 (rB-rA) r + rB^2 - rA^2 - xB^2\r\n -2x2 x = 2 (rC-rA) r + rC^2 - rA^2 - xC^2\r\n -------------------------\r\n Solve\r\n -2xB x - 2 (rB-rA) r = rB^2 - rA^2 - xB^2\r\n -2xC x - 2 (rC-rA) r = rC^2 - rA^2 - xC^2\r\n */\r\n const ax = -2.0 * xB;\r\n const ar = -2.0 * (rB - rA);\r\n const a = rB * rB - rA * rA - xB * xB;\r\n const bx = -2.0 * xC;\r\n const br = -2.0 * (rC - rA);\r\n const b = rC * rC - rA * rA - xC * xC;\r\n const sRelTol = 1.0e-14;\r\n const origin = Point2d.create(circleA.center.x, circleA.center.y);\r\n const solutionVector = Vector2d.create();\r\n if (SmallSystem.linearSystem2d(ax, ar, bx, br, a, b, solutionVector)) {\r\n const x = solutionVector.x;\r\n const r = solutionVector.y;\r\n let dd = (r + rA) * (r + rA) - x * x;\r\n const tol = sRelTol * x * x;\r\n if (Math.abs(dd) < tol)\r\n dd = 0.0;\r\n if (dd >= 0.0) {\r\n const y = Math.sqrt(dd);\r\n const xy0 = origin.plus2Scaled(unitAB, x, unitPerp, y);\r\n const xy1 = origin.plus2Scaled(unitAB, x, unitPerp, -y);\r\n for (const newCenter of [xy0, xy1]) {\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(newCenter, r);\r\n if (!isThisCirclePresent(result, newCircle)) {\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.appendClosePoint(newCircle.center, circleA, newCircle.center, r);\r\n markup.appendClosePoint(newCircle.center, circleB, newCircle.center, r);\r\n markup.appendClosePoint(newCircle.center, circleC, newCircle.center, r);\r\n result.push(markup);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Return all (i.e., up to 8) circles tangent to 3 circles.\r\n * @param circles the three input circles\r\n */\r\n private static circlesTangentCCCThisOrder(\r\n circles: UnboundedCircle2dByCenterAndRadius[],\r\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n // Call the circle centers and radii\r\n // (ax, ay, ar)\r\n // (bx, by, br)\r\n // (cx, cy, cr)\r\n // For a tangent circle with center (x,y) and radius r,\r\n // (x-ax)^2 + (y-ay)^2 = (r+ar)^2\r\n // (x-bx)^2 + (y-by)^2 = (r+br)^2\r\n // (x-cx)^2 + (y-cy)^2 = (r+cr)^2\r\n // This has squares of all the unknowns x,y,r\r\n // BUT !!! all coefficients of squares are 1.\r\n // Subtract the first from the second and third equations.\r\n // All the squares go away in the shifted equations.\r\n // What's left is 2 linear equations with x,y,r as unknowns.\r\n // Move the r and constant parts to the right side.\r\n // Solve for x and y as a linear function of r.\r\n // Substitute those linear forms back into the x and y of the first equation.\r\n // A quadratic in r is left!\r\n // Solve it for r, and then the linear forms give x and y.\r\n // Do the whole process with every combination of signed br and cr.\r\n // (No need to treat negated ar because negating all of them is redundant)\r\n const result: ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] = [];\r\n const vector01 = Vector2d.createStartEnd(circles[0].center, circles[1].center);\r\n const vector02 = Vector2d.createStartEnd(circles[0].center, circles[2].center);\r\n const dot12 = vector01.dotProduct(vector02);\r\n const determinant = vector01.crossProduct(vector02);\r\n const determinantTol = 1.0e-8;\r\n const oneOverDeterminant = Geometry.conditionalDivideFraction(1.0, determinant);\r\n // messy tolerance test ported. Why not just a parallel test on the vectors?\r\n // maybe having 1/determinant is worth it?\r\n if (oneOverDeterminant === undefined\r\n || Math.abs(determinant) <= determinantTol * Math.abs(dot12)\r\n || oneOverDeterminant === undefined) {\r\n const signedR0 = circles[0].radius;\r\n for (const signedR1 of signedValues(circles[1].radius)) {\r\n for (const signedR2 of signedValues(circles[2].radius)) {\r\n this.solveColinearCCCTangents(\r\n circles[0], circles[1], circles[2],\r\n signedR0, signedR1, signedR2,\r\n result,\r\n );\r\n }\r\n }\r\n return result.length > 0 ? result : undefined;\r\n }\r\n const r0 = circles[0].radius;\r\n const inverseMatrix = Matrix3d.createRowValues(\r\n vector02.y * oneOverDeterminant, -vector01.y * oneOverDeterminant, 0.0,\r\n -vector02.x * oneOverDeterminant, vector01.x * oneOverDeterminant, 0.0,\r\n 0.0, 0.0, 1.0,\r\n );\r\n for (const r1 of signedValues(circles[1].radius)) {\r\n for (const r2 of signedValues(circles[2].radius)) {\r\n const vectorA = Vector3d.create(\r\n -0.5 * (Geometry.square(r1) - Geometry.square(vector01.x) - Geometry.square(vector01.y) - Geometry.square(r0)),\r\n -0.5 * (Geometry.square(r2) - Geometry.square(vector02.x) - Geometry.square(vector02.y) - Geometry.square(r0)),\r\n 0.0,\r\n );\r\n const vectorB = Vector3d.create(-(r1 - r0), -(r2 - r0), 0.0);\r\n const vectorA1 = inverseMatrix.multiplyVector(vectorA);\r\n const vectorB1 = inverseMatrix.multiplyVector(vectorB);\r\n const qa = vectorB1.magnitudeSquared() - 1.0;\r\n const qb = 2 * (vectorA1.dotProduct(vectorB1) - r0);\r\n const qc = vectorA1.magnitudeSquared() - Geometry.square(r0);\r\n const roots = Degree2PowerPolynomial.solveQuadratic(qa, qb, qc);\r\n if (roots !== undefined) {\r\n if (roots.length === 2\r\n && Geometry.isSmallMetricDistance(Math.abs(roots[0]) - Math.abs(roots[1])))\r\n roots.pop();\r\n for (const newRadius of roots) {\r\n const newCenter = circles[0].center.plus2Scaled(vectorA1, 1.0, vectorB1, newRadius);\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(newCenter, newRadius);\r\n if (!isThisCirclePresent(result, newCircle)) {\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.appendClosePoint(newCircle.center, circles[0], newCircle.center, newRadius);\r\n markup.appendClosePoint(newCircle.center, circles[1], newCircle.center, newRadius);\r\n markup.appendClosePoint(newCircle.center, circles[2], newCircle.center, newRadius);\r\n result.push(markup);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return all (i.e., up to 8) circles tangent to 3 circles.\r\n * @param circleA first circle\r\n * @param circleB second circle\r\n * @param circleC third circle\r\n */\r\n public static circlesTangentCCC(\r\n circleA: UnboundedCircle2dByCenterAndRadius,\r\n circleB: UnboundedCircle2dByCenterAndRadius,\r\n circleC: UnboundedCircle2dByCenterAndRadius,\r\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n const circlesInOrder = [circleA, circleB, circleC];\r\n return this.circlesTangentCCCThisOrder(circlesInOrder);\r\n }\r\n /**\r\n * Return an unbounded line with the midpoint between pointA and pointB as its reference point\r\n * and the unit vector from pointA towards pointB as its normal.\r\n * @param pointA first point\r\n * @param pointB second point\r\n * @returns unbounded line, or undefined if pointA and pointB are coincident.\r\n */\r\n public static bisector(pointA: XAndY, pointB: XAndY): UnboundedLine2dByPointAndNormal | undefined {\r\n const vectorAB = Vector2d.createStartEnd(pointA, pointB);\r\n const midPoint = Point2d.createInterpolated(pointA, 0.5, pointB);\r\n const unitAB = vectorAB.normalize();\r\n if (unitAB === undefined)\r\n return undefined;\r\n return UnboundedLine2dByPointAndNormal.createPointNormal(midPoint, unitAB);\r\n }\r\n /**\r\n * Compute circles of specified radius tangent to each of the lines\r\n * * There are normally 4 circles\r\n * * The undefined case occurs when the lines are parallel.\r\n * @param lineA first line\r\n * @param lineB second line\r\n * @param radius radius of tangent circles\r\n * @returns array of circles with annotated tangencies. returns undefined if lines are parallel.\r\n */\r\n public static circlesTangentLLR(\r\n lineA: UnboundedLine2dByPointAndNormal,\r\n lineB: UnboundedLine2dByPointAndNormal,\r\n radius: number,\r\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n // Construct lines offset by (positive and negative) radii.\r\n // For each of the 4 combinations of offset lines, the intersection of offsets is the\r\n // center of the tangent circle.\r\n if (Geometry.isSmallMetricDistance(radius))\r\n return undefined;\r\n const offsetA0 = lineA.cloneShifted(radius);\r\n const offsetA1 = lineA.cloneShifted(-radius);\r\n const offsetB0 = lineB.cloneShifted(radius);\r\n const offsetB1 = lineB.cloneShifted(-radius);\r\n if (offsetA0 === undefined || offsetA1 === undefined || offsetB0 === undefined || offsetB1 === undefined)\r\n return undefined;\r\n const offsetsA = [offsetA0, offsetA1];\r\n const offsetsB = [offsetB0, offsetB1];\r\n const result = [];\r\n for (const offsetA of offsetsA) {\r\n for (const offsetB of offsetsB) {\r\n const p = offsetA.intersectUnboundedLine2dByPointAndNormalWithOffsets(offsetB);\r\n if (p !== undefined) {\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(p, radius);\r\n if (!isThisCirclePresent(result, newCircle)) {\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.appendClosePoint(newCircle.center, lineA, newCircle.center, newCircle.radius);\r\n markup.appendClosePoint(newCircle.center, lineB, newCircle.center, newCircle.radius);\r\n result.push(markup);\r\n }\r\n }\r\n }\r\n }\r\n return result.length > 0 ? result : undefined;\r\n }\r\n /**\r\n * Compute circles of specified radius tangent to both a line and an arc\r\n * * There can be 0 to 8 circles\r\n * * The undefined case occurs when the smallest distance from circle to line exceeds radius.\r\n * @param circleA the circle\r\n * @param lineB the line\r\n * @param radius radius of tangent circles\r\n * @returns array of circles with annotated tangencies\r\n */\r\n public static circlesTangentCLR(\r\n circleA: UnboundedCircle2dByCenterAndRadius, lineB: UnboundedLine2dByPointAndNormal, radius: number,\r\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n // From circleA, construct circles offset by positive and negative radii.\r\n // From lineB, construct lines offset by positive and negative radii.\r\n // Each combination of [offsetCircle, offsetLine] can have 2 intersections.\r\n // Each such intersection is the center of a tangent circle.\r\n if (Geometry.isSmallMetricDistance(radius))\r\n return undefined;\r\n const offsetsA = [\r\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleA.center, circleA.radius + radius),\r\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleA.center, circleA.radius - radius),\r\n ];\r\n const offsetB0 = lineB.cloneShifted(radius);\r\n const offsetB1 = lineB.cloneShifted(-radius);\r\n if (offsetB0 === undefined || offsetB1 === undefined)\r\n return undefined;\r\n const offsetsB = [offsetB0, offsetB1];\r\n const result = [];\r\n for (const offsetA of offsetsA) {\r\n for (const offsetB of offsetsB) {\r\n const points = offsetA.intersectLine(offsetB);\r\n for (const p of points) {\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(p, radius);\r\n if (!isThisCirclePresent(result, newCircle)) {\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.appendClosePoint(newCircle.center, circleA, newCircle.center, newCircle.radius);\r\n markup.appendClosePoint(newCircle.center, lineB, newCircle.center, newCircle.radius);\r\n result.push(markup);\r\n }\r\n }\r\n }\r\n }\r\n return result.length > 0 ? result : undefined;\r\n }\r\n /**\r\n * Compute circles of specified radius tangent to both circles\r\n * * There can be 0 to 8 circles\r\n * * The undefined case is when the smallest distance between the circles exceeds the requested radius.\r\n * @param circleA the first circle\r\n * @param circleB the second circle\r\n * @param radius radius of tangent circles\r\n * @returns array of circles with annotated tangencies\r\n */\r\n public static circlesTangentCCR(\r\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius, radius: number,\r\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n // From circleA, construct circles offset by positive and negative radii.\r\n // From circleB, construct circles offset by positive and negative radii.\r\n // Each combination of [offsetA, offsetsB] can have 2 intersections.\r\n // Each such intersection is the center of a tangent circle.\r\n if (Geometry.isSmallMetricDistance(radius))\r\n return undefined;\r\n const offsetsA = [\r\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleA.center, circleA.radius + radius),\r\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleA.center, circleA.radius - radius),\r\n ];\r\n const offsetsB = [\r\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleB.center, circleB.radius + radius),\r\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleB.center, circleB.radius - radius),\r\n ];\r\n const result = [];\r\n for (const offsetA of offsetsA) {\r\n for (const offsetB of offsetsB) {\r\n const points = offsetA.intersectCircle(offsetB);\r\n for (const p of points) {\r\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(p, radius);\r\n if (!isThisCirclePresent(result, newCircle)) {\r\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\r\n markup.appendClosePoint(newCircle.center, circleA, newCircle.center, newCircle.radius);\r\n markup.appendClosePoint(newCircle.center, circleB, newCircle.center, newCircle.radius);\r\n result.push(markup);\r\n }\r\n }\r\n }\r\n }\r\n return result.length > 0 ? result : undefined;\r\n }\r\n /**\r\n * Construct basis vectors for hyperbola or ellipse whose points are equidistant from tangencies with\r\n * circleA and circleB.\r\n * * If the curve is a hyperbola, the equation is\r\n * X = center + vectorU * sec(theta) + vectorV * tan(theta)\r\n * * If the curve is an ellipse, the equation is\r\n * X = center + vectorU * cos(theta) + vectorV * sin(theta)\r\n * @param circleA first circle\r\n * @param circleB second circle\r\n */\r\n public static medialCurveCircleCircle(\r\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius,\r\n ): ImplicitCurve2d | undefined {\r\n const d = circleA.center.distance(circleB.center);\r\n const origin = circleA.center.interpolate(0.5, circleB.center);\r\n const h = circleA.radius + circleB.radius;\r\n const discriminant = d * d - h * h;\r\n const hy = Math.sqrt(Math.abs(discriminant));\r\n const xAxis = Vector2d.createStartEnd(origin, circleB.center).normalize();\r\n if (xAxis === undefined)\r\n return undefined;\r\n const yAxis = xAxis.rotate90CCWXY();\r\n const ax = 0.5 * h;\r\n const ay = 0.5 * hy;\r\n const vectorU = xAxis.scale(ax);\r\n const vectorV = yAxis.scale(ay);\r\n if (discriminant > 0.0) {\r\n return UnboundedHyperbola2d.createCenterAndAxisVectors(origin, vectorU, vectorV);\r\n } else if (discriminant < 0.0) {\r\n return UnboundedEllipse2d.createCenterAndAxisVectors(origin, vectorU, vectorV);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct parabolas whose points are equidistant from tangencies with\r\n * circleA and circleB.\r\n * * Note that if th e circle has non-zero radius there are two parabolas based on\r\n * tangencies on near or far side of the circle.\r\n * @param line the line\r\n * @param circle the circle\r\n */\r\n public static medialCurveLineCircle(\r\n line: UnboundedLine2dByPointAndNormal, circle: UnboundedCircle2dByCenterAndRadius,\r\n ): ImplicitCurve2d[] | undefined {\r\n const linePoint = line.closestPoint(circle.center);\r\n if (linePoint === undefined)\r\n return undefined;\r\n const lineA = line.cloneNormalizedWithOrigin(linePoint);\r\n if (lineA === undefined)\r\n return undefined;\r\n const b = linePoint.distance(circle.center);\r\n const side = lineA.functionValue(circle.center) > 0 ? 1 : -1;\r\n const signedB = b * side;\r\n const signedRadii = [];\r\n if (Geometry.isSameCoordinate(circle.radius, -circle.radius))\r\n signedRadii.push(0);\r\n else {\r\n signedRadii.push(circle.radius);\r\n signedRadii.push(-circle.radius);\r\n }\r\n const result = [];\r\n for (const r of signedRadii) {\r\n const vertexDistance = (signedB - r) * 0.5;\r\n const vertex = lineA.point.plusScaled(lineA.normal, vertexDistance);\r\n const c = 2 * (signedB + r);\r\n const oneOverC = Geometry.conditionalDivideCoordinate(1, c);\r\n if (oneOverC !== undefined) {\r\n const vectorV = lineA.normal.clone().scale(oneOverC);\r\n const vectorU = lineA.normal.unitPerpendicularXY();\r\n const parabola = UnboundedParabola2d.createCenterAndAxisVectors(vertex, vectorU, vectorV);\r\n result.push(parabola);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n/**\r\n * If distance is near zero metric, return an array containing only value.\r\n * If not near zero, return an array with both value and its negative (in that order).\r\n * @param distance the distance\r\n * @param value the value\r\n */\r\nfunction signedValues(distance: number, value?: number): number[] {\r\n if (value === undefined)\r\n value = distance;\r\n const values = [value];\r\n if (!Geometry.isSmallMetricDistance(distance))\r\n values.push(-value);\r\n return values;\r\n}\r\n/** Search an array of circles to see if a particular new circle is already present. */\r\nfunction isThisCirclePresent(\r\n circles: ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[], circle: UnboundedCircle2dByCenterAndRadius,\r\n): boolean {\r\n for (const c of circles) {\r\n if (circle.isSameCircle(c.curve, true))\r\n return true;\r\n }\r\n return false;\r\n}\r\n"]}
1
+ {"version":3,"file":"ConstrainedImplicitCurve2d.js","sourceRoot":"","sources":["../../../../../src/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module CartesianGeometry\n*/\n\nimport { Geometry } from \"../../../Geometry\";\nimport { Matrix3d } from \"../../../geometry3d/Matrix3d\";\nimport { Point2d, Vector2d } from \"../../../geometry3d/Point2dVector2d\";\nimport { Vector3d } from \"../../../geometry3d/Point3dVector3d\";\nimport { XAndY } from \"../../../geometry3d/XYZProps\";\nimport { Degree2PowerPolynomial } from \"../../../numerics/Polynomials\";\nimport { SmallSystem } from \"../../../numerics/SmallSystem\";\nimport { ImplicitCurve2d, ImplicitGeometryMarkup, Point2dImplicitCurve2d } from \"./ImplicitCurve2d\";\nimport { UnboundedCircle2dByCenterAndRadius } from \"./UnboundedCircle2d\";\nimport { UnboundedEllipse2d } from \"./UnboundedEllipse2d\";\nimport { UnboundedHyperbola2d } from \"./UnboundedHyperbola2d\";\nimport { UnboundedLine2dByPointAndNormal } from \"./UnboundedLine2d\";\nimport { UnboundedParabola2d } from \"./UnboundedParabola2d\";\n\n/**\n * Static methods for special case circle and line tangent constructions.\n * @internal\n */\nexport class ConstrainedImplicitCurve2d {\n /**\n * Return all (i.e., up to 4) circles that are tangent to 3 given lines.\n * @param lineA first line\n * @param lineB second line\n * @param lineC third line\n */\n public static circlesTangentLLL(\n lineA: UnboundedLine2dByPointAndNormal,\n lineB: UnboundedLine2dByPointAndNormal,\n lineC: UnboundedLine2dByPointAndNormal,\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n /*--------------------------------------------------------------------------------------\n (X-A).normalA = a*r\n (X-B).normalB = b*r\n (X-C).normalC = c*r\n Typical expansion is\n x*mx + y*my - a*r = A.normalA\n Where a,b,c are combinations of {+1,-1}\n Need to consider 4 combinations of signs: (+++) (++-) (+-+) (+--) The other 4 generate negated r as solution.\n ----------------------------------------------------------------------------------------*/\n // make lines with normal vectors and nearby origin\n const origin = lineA.point;\n const lineA1 = lineA.cloneNormalizedFromOrigin(origin);\n const lineB1 = lineB.cloneNormalizedFromOrigin(origin);\n const lineC1 = lineC.cloneNormalizedFromOrigin(origin);\n if (lineA1 === undefined || lineB1 === undefined || lineC1 === undefined)\n return undefined;\n const result = [];\n const a = lineA1.normal.dotProduct(lineA1.point);\n const b = lineB1.normal.dotProduct(lineB1.point);\n const c = lineC1.normal.dotProduct(lineC1.point);\n const signA = 1;\n for (const signB of [-1, 1]) {\n for (const signC of [-1, 1]) {\n const matrix = Matrix3d.createRowValues(\n lineA1.normal.x, lineA1.normal.y, signA,\n lineB1.normal.x, lineB1.normal.y, signB,\n lineC1.normal.x, lineC1.normal.y, signC,\n );\n const rhs = Vector3d.create(a, b, c);\n const xyr = matrix.multiplyInverse(rhs);\n if (xyr !== undefined) {\n const circle = UnboundedCircle2dByCenterAndRadius.createXYRadius(\n origin.x + xyr.x, origin.y + xyr.y, Math.abs(xyr.z),\n );\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(circle);\n markup.appendClosePoint(circle.center, lineA, circle.center, circle.radius);\n markup.appendClosePoint(circle.center, lineB, circle.center, circle.radius);\n markup.appendClosePoint(circle.center, lineC, circle.center, circle.radius);\n result.push(markup);\n }\n }\n }\n return result;\n }\n /**\n * Return all (i.e., up to 2) unbounded lines perpendicular to a line and tangent to a circle.\n * @param line the line\n * @param circle the circle\n */\n public static linesPerpLTangentC(\n line: UnboundedLine2dByPointAndNormal, circle: UnboundedCircle2dByCenterAndRadius,\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\n // Project the circle center to the line.\n // The endpoints of the perpendicular line are the circle center and that line point shifted\n // by positive and negative radius in the direction of the line.\n const lineTangent = line.unitVectorAlongLine();\n const unitNormal = line.unitNormal();\n const linePoint = line.closestPoint(circle.center);\n if (linePoint === undefined || lineTangent === undefined || unitNormal === undefined)\n return undefined;\n const unitPerp = unitNormal.rotate90CCWXY()\n const result = [];\n for (const r of signedValues(circle.radius)) {\n const pointA = linePoint.plusScaled(lineTangent, r);\n const pointB = circle.center.plusScaled(lineTangent, r);\n const lineC = UnboundedLine2dByPointAndNormal.createPointNormal(pointA, unitPerp);\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineC);\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, line)); // CLONE\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circle)); // CLONE\n result.push(taggedLine);\n }\n return result;\n }\n /**\n * Return all (i.e., 4) variants of the line perpendicular to 2 circles (line between centers, with ends at crossing\n * points on respective circles).\n * @param circleA first circle\n * @param circleB second circle\n */\n public static linesPerpCPerpC(\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius,\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\n // There infinite line containing the circle centers is the only line perp to both circles.\n // The endpoints for the 4 line segments are the centers shifted by the respective radii along the infinite line.\n const centerToCenter = Vector2d.createStartEnd(circleA.center, circleB.center);\n const unitCenterToCenter = centerToCenter.normalize();\n if (unitCenterToCenter === undefined)\n return undefined;\n const unitNormal = unitCenterToCenter.rotate90CCWXY();\n const result = [];\n for (const rA of signedValues(circleA.radius)) {\n for (const rB of signedValues(circleB.radius)) {\n const pointA = circleA.center.plusScaled(unitCenterToCenter, rA);\n const pointB = circleB.center.plusScaled(unitCenterToCenter, rB);\n const lineC = UnboundedLine2dByPointAndNormal.createPointNormal(pointA, unitNormal);\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineC);\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, circleA)); // CLONE\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circleB)); // CLONE\n result.push(taggedLine);\n }\n }\n return result;\n }\n /**\n * Return all (i.e., up to 2) unbounded lines perpendicular to a line and a circle.\n * @param line the line\n * @param circle the circle\n */\n public static linesPerpLPerpC(\n line: UnboundedLine2dByPointAndNormal, circle: UnboundedCircle2dByCenterAndRadius,\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\n // The infinite line through the circle center and in the direction of the line normal is the containing line.\n // Make segments from its intersection with the line to the near and far intersections with the circle.\n // (these are the centers shifted by radius along the line)\n const lineTangent = line.unitVectorAlongLine();\n const unitNormal = line.unitNormal();\n const linePoint = line.closestPoint(circle.center);\n if (linePoint === undefined || lineTangent === undefined || unitNormal === undefined)\n return undefined;\n const unitPerp = unitNormal.rotate90CCWXY()\n const result = [];\n for (const r of signedValues(circle.radius)) {\n const pointA = linePoint.clone()\n const pointB = circle.center.plusScaled(unitNormal, r);\n const lineC = UnboundedLine2dByPointAndNormal.createPointNormal(pointA, unitPerp);\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineC);\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, line)); // CLONE!\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circle)); // CLONE!\n result.push(taggedLine);\n }\n return result;\n }\n /**\n * Return all (i.e., up to 4) unbounded lines perpendicular to a circle and tangent to a circle.\n * Note that multiple colinear lines are returned tagged with diametrically opposing points of circleA.\n * @param circleA first circle (for perpendicular constraint)\n * @param circleB second circle (for tangent constraint)\n */\n public static linesPerpCTangentC(\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\n // The solution lines are through the perp circle center and tangent to the tangent circle.\n // Hence this is the two infinite lines \"through first circle center, tangent to second circle\",\n // Bounded line segments go from the tangent circle points to the near and far intersections with the perp circle.\n const centerToCenter = Vector2d.createStartEnd(circleA.center, circleB.center);\n const centerToCenterDistance = centerToCenter.magnitude();\n const unitCenterToCenter = centerToCenter.normalize();\n if (unitCenterToCenter === undefined)\n return undefined;\n const centerToCenterNormal = unitCenterToCenter.rotate90CCWXY();\n const sine = Geometry.safeDivideFraction(circleB.radius, centerToCenterDistance, 0.0);\n if (sine > 1.0)\n return undefined;\n const absoluteCosine = Math.sqrt(1.0 - sine * sine);\n const result = [];\n for (const rA of signedValues(circleA.radius)) {\n for (const rB of signedValues(circleB.radius)) {\n const cosine = rB > 0 ? absoluteCosine : -absoluteCosine;\n const lineNormal = Vector2d.createAdd2Scaled(unitCenterToCenter, -sine, centerToCenterNormal, cosine);\n const lineDirection = Vector2d.createAdd2Scaled(unitCenterToCenter, cosine, centerToCenterNormal, sine);\n const pointA = circleA.center.plusScaled(lineDirection, rA);\n const pointB = circleB.center.plusScaled(lineNormal, Math.abs(rB));\n const lineC = UnboundedLine2dByPointAndNormal.createPointNormal(pointA, lineNormal);\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineC);\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, circleA)); // CLONE\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circleB)); // CLONE\n result.push(taggedLine);\n }\n }\n return result;\n }\n /**\n * Return all (i.e., up to 4) unbounded lines tangent to 2 circles.\n * * There are 4 lines if there is neither intersection nor containment between the circles\n * * There are 2 lines if the circles intersect\n * * THere are no lines if the one circle is entirely inside the other.\n * @param circleA first circle\n * @param circleB second circle\n */\n public static linesTangentCC(\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius\n ): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\n // draw a line tangent to both circles. This may have both circles on the same side,\n // or one circle on each side.\n // draw radii from both centers to the tangencies. (These are parallel to each other)\n // the (sum or difference of the radii) and the (distance between centers) are side and hypotenuse of\n // // a right triangle, with the tangent-to-tangent segment as the other side.\n // The lengths give sine and cosine of angles in the triangle, and those give vectors\n // from center to tangency points.\n const distanceAB = circleA.center.distance(circleB.center);\n if (distanceAB + Math.abs(circleB.radius) <= Math.abs(circleA.radius))\n return undefined;\n if (distanceAB + Math.abs(circleA.radius) <= Math.abs(circleB.radius))\n return undefined;\n const unitAB = Vector2d.createStartEnd(circleA.center, circleB.center);\n if (!unitAB.normalize(unitAB))\n return undefined;\n const result = [];\n if (unitAB !== undefined) {\n const radiusA = circleA.radius;\n const radiusB = circleB.radius;\n for (const signQ of [-1, 1]) {\n const q = radiusB + signQ * radiusA;\n const sine = q / distanceAB;\n if (Math.abs(sine) < 1.0) {\n const cosine = Math.sqrt(1.0 - sine * sine);\n for (const sign of [-1, 1]) {\n let pointA, pointB;\n if (signQ < 0) {\n pointA = circleA.center.addForwardLeft(radiusA * -sine, radiusA * sign * cosine, unitAB);\n pointB = circleB.center.addForwardLeft(radiusB * -sine, radiusB * sign * cosine, unitAB);\n } else {\n pointA = circleA.center.addForwardLeft(radiusA * sine, radiusA * sign * cosine, unitAB);\n pointB = circleB.center.addForwardLeft(-radiusB * sine, -radiusB * sign * cosine, unitAB);\n }\n const lineA = UnboundedLine2dByPointAndNormal.createPointPoint(pointA, pointB);\n if (lineA === undefined)\n return undefined;\n const taggedLine = new ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>(lineA);\n taggedLine.data.push(new Point2dImplicitCurve2d(pointA, circleA)); // CLONE\n taggedLine.data.push(new Point2dImplicitCurve2d(pointB, circleB)); // CLONE\n result.push(taggedLine);\n }\n }\n }\n }\n return result;\n }\n /**\n * Return all (i.e., up to 8) circles tangent to two lines and a circle.\n * * There are 8 circles if the circle contains the intersection of the lines.\n * * There are 2 circles if the circle is completely contained in one quadrant bounded by the two lines.\n * * There are 2 circles if the circle intersects one ray outward from the intersection.\n * * There are 4 circles if the circle intersects two of the outward rays.\n */\n public static circlesTangentLLC(\n lineA: UnboundedLine2dByPointAndNormal,\n lineB: UnboundedLine2dByPointAndNormal,\n circle: UnboundedCircle2dByCenterAndRadius,\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n /*--------------------------------------------------------------------------------------\n Put origin at circle center.\n A,B are line points.\n M,N are line normals.\n (X).(X) = (a +- r)^2 = 0\n (X-A).M = +-r\n (X-B).N = +-r\n Need to consider 4 combinations of signs: (+++) (++-) (-++) (-+-) The other 4 are negations.\n Write the linear part as\n [M N]^ * X = [M.A N.B]^ + r Ei\n where Ei is one of E0=[1 1]^ or E1=[1 -1]^\n Multiply by inverse of matrix X = F + r G\n The quadratic part is\n (F + rG).(F + rG) = (a +- r)^2\n (F + rG).(F + rG) = a^2 +- 2ar + r^2\n F.F + 2r G.F + r^2 G.G = a^2 +- 2ar + r^2\n r^2 (1-G.G) + 2(+-a - G.F)r + a^2-F.F = 0.\n Solve with positive, negative branch. Each generates 2 solutions to go back through Ei.\n ----------------------------------------------------------------------------------------*/\n // lines with unit vector and point coordinates from circle center\n const lineA1 = lineA.cloneNormalizedFromOrigin(circle.center);\n const lineB1 = lineB.cloneNormalizedFromOrigin(circle.center);\n if (lineA1 === undefined || lineB1 === undefined)\n return undefined;\n // perpendicular distance from each line to center of circle\n const dotMA = lineA1.normal.dotProduct(lineA1.point);\n const dotMB = lineB1.normal.dotProduct(lineB1.point);\n\n const a = circle.radius;\n const vectorF = Vector2d.create(); // vector from circle center to intersection of the lines\n if (lineA1.normal.isParallelTo(lineB1.normal)\n || !SmallSystem.linearSystem2d(\n lineA1.normal.x, lineA1.normal.y,\n lineB1.normal.x, lineB1.normal.y,\n dotMA, dotMB, vectorF)) {\n // SPECIAL CASE: PARALLEL LINES\n // Lines are parallel\n // Make a midline. Half of line separation is the tangent circle radius.\n const midLinePoint = lineA1.point.interpolate(0.5, lineB1.point);\n const lineDirection = lineA1.normal.rotate90CCWXY();\n const a1 = lineA1.functionValue(midLinePoint);\n // vector from centerC to midline point midline point is vectorCP + s * lineDirectionA\n const coffSine2 = lineDirection.dotProduct(lineDirection);\n const coffSine = 2.0 * lineDirection.dotProduct(midLinePoint);\n const coffConstant = Geometry.hypotenuseSquaredXY(midLinePoint.x, midLinePoint.y);\n const targetRadius = [];\n // special case zero radius\n if (!Geometry.isSmallMetricDistance(circle.radius)) {\n targetRadius.push(circle.radius + a1);\n targetRadius.push(circle.radius - a1);\n } else {\n // circle is just a point -- the quadratic solver only has to happen once\n targetRadius.push(circle.radius + a1);\n // But if the center is ON one of the lines, construct by projecting to the other.\n // REMARK: In C++ code this pointOnLine test was done with messy\n // tolerance relative to the various line points' distance to origin.\n // Here we trust metric distance condition.\n let center;\n if (Geometry.isSmallMetricDistance(dotMA)) // tangency is on lineA; move towards line B\n center = circle.center.plusScaled(lineA1.normal, dotMB > 0.0 ? -a1 : a1);\n else if (Geometry.isSmallMetricDistance(dotMB)) // tangency is on lineB; move towards line A\n center = circle.center.plusScaled(lineB1.normal, dotMA > 0.0 ? a1 : -a1);\n if (center !== undefined) {\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(center, a1);\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.closePointsOfGeometry(newCircle.center, newCircle.center, newCircle.radius, [lineA, lineB, circle]);\n return [markup];\n }\n }\n const resultA = [];\n for (const radius of targetRadius) {\n const roots = Degree2PowerPolynomial.solveQuadratic(coffSine2, coffSine, coffConstant - radius * radius);\n if (roots) {\n for (const alpha of roots) {\n const center = circle.center.plus2Scaled(midLinePoint, 1.0, lineDirection, alpha);\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(center, a1);\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.closePointsOfGeometry(newCircle.center, newCircle.center, newCircle.radius, [lineA, lineB, circle]);\n resultA.push(markup);\n }\n }\n }\n return resultA;\n }\n const result = [];\n for (const sign1 of [-1, 1]) {\n const vectorG = Vector2d.create();\n if (SmallSystem.linearSystem2d(\n lineA1.normal.x, lineA1.normal.y,\n lineB1.normal.x, lineB1.normal.y, 1.0, sign1, vectorG)) {\n for (const sign2 of [-1, 1]) {\n const coffA = 1.0 - vectorG.dotProduct(vectorG);\n const coffB = 2.0 * (sign2 * a - vectorG.dotProduct(vectorF));\n const coffC = a * a - vectorF.dotProduct(vectorF);\n const roots = Degree2PowerPolynomial.solveQuadratic(coffA, coffB, coffC);\n if (roots !== undefined) {\n for (const r of roots) {\n const center = circle.center.plus2Scaled(vectorF, 1.0, vectorG, r);\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(center, r);\n if (!isThisCirclePresent(result, newCircle)) {\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.appendClosePoint(newCircle.center, lineA, newCircle.center, newCircle.radius);\n markup.appendClosePoint(newCircle.center, lineB, newCircle.center, newCircle.radius);\n markup.appendClosePoint(newCircle.center, circle, newCircle.center, newCircle.radius);\n result.push(markup);\n }\n }\n }\n }\n }\n }\n return result;\n }\n /**\n * Return all (i.e., up to 4) circles tangent to 2 circles and a line.\n * @param circleA first circle\n * @param circleB second circle\n * @param line the line\n */\n public static circlesTangentCCL(\n circleA: UnboundedCircle2dByCenterAndRadius,\n circleB: UnboundedCircle2dByCenterAndRadius,\n line: UnboundedLine2dByPointAndNormal,\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n /*--------------------------------------------------------------------------------------\n (x-xA)^2 + (y-y0)^2 - (r + r0)^2 = 0\n (x-xB)^2 + (y-y1)^2 - (r + r1)^2 = 0\n y = r NOTE: Cannot arbitrarily change sign of r as is done in 3-circle case.\n -------------------------------------------\n x^2 -2 xA x + xA^2 -2 y0 y + y0^2 - 2 r0 y - r0^2 = 0\n x^2 -2 xB x + xB^2 -2 y1 y + y1^2 - 2 r1 y - r1^2 = 0\n -------------------------------------------\n x^2 -2 xA x + -2 (y0 + r0) y + a0= 0 a0 = xA^2 + y0^2 - r0^2\n x^2 -2 xB x + -2 (y1 + r1) y + a1= 0 a1 = xB^2 + y1^2 - r1^2\n -------------------------------------------\n (A0) x^2 + b0 x + c0 y + a0= 0 b0 = -2x0 c0 = -2 (y0 + r0)\n (A1) x^2 + b1 x + c1 y + a1= 0 b1 = -2x1 c1 = -2 (y1 + r1)\n -------------------------------------------\n c1 x^2 c1 c0 y + c1 a0= 0\n c0 x^2 + c0 b1 x + c0 c1 y + c0 a1= 0\n ---------------------------------------\n Subtract first from second.\n (c0 - c1) x^2 + (c0 b1 - c1 b0) x + (c0 a1 - c1 a0) = 0.\n Solve for two x values. Substitute in with largest c0, c1.\n ---------------------------------------\n Repeat with signed combinations of the circle radii.\n ----------------------------------------------------------------------------------------*/\n const lineUnitNormal = line.normal.normalize();\n if (lineUnitNormal === undefined)\n return undefined;\n const lineUnitAlong = lineUnitNormal.rotate90CCWXY();\n const circleGlobalOffsets = [\n Vector2d.createStartEnd(line.point, circleA.center),\n Vector2d.createStartEnd(line.point, circleB.center),\n ];\n const circleLocalOffset = [];\n for (const i of [0, 1]) {\n circleLocalOffset.push(\n Vector2d.create(\n circleGlobalOffsets[i].dotProduct(lineUnitAlong),\n circleGlobalOffsets[i].dotProduct(lineUnitNormal),\n ));\n }\n const coffA = [0, 0];\n const coffB = [0, 0];\n const coffC = [0, 0];\n const circleRadius = [0, 0];\n const result = [];\n const radiiFromA = signedValues(circleA.radius, circleA.radius);\n const radiiFromB = signedValues(circleB.radius, circleB.radius);\n for (const radiusA of radiiFromA) {\n circleRadius[0] = radiusA;\n for (const radiusB of radiiFromB) {\n circleRadius[1] = radiusB;\n for (const i of [0, 1]) {\n const r = circleRadius[i];\n coffA[i] = circleLocalOffset[i].magnitudeSquared() - r * r;\n coffB[i] = -2.0 * circleLocalOffset[i].x;\n coffC[i] = -2.0 * (circleLocalOffset[i].y + r);\n }\n const k = Math.abs(circleRadius[0]) > Math.abs(circleRadius[1])\n ? 0 : 1;\n const qa = coffC[0] - coffC[1];\n const qb = coffC[0] * coffB[1] - coffC[1] * coffB[0];\n const qc = coffC[0] * coffA[1] - coffC[1] * coffA[0];\n const xRoot = Degree2PowerPolynomial.solveQuadratic(qa, qb, qc);\n if (xRoot !== undefined) {\n for (const x of xRoot) {\n const y = Geometry.conditionalDivideCoordinate(x * x + coffB[k] * x + coffA[k], -coffC[k]);\n if (y !== undefined) {\n const r = Math.abs(y);\n const center = line.point.plus2Scaled(lineUnitAlong, x, lineUnitNormal, y);\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(center, r);\n if (!isThisCirclePresent(result, newCircle)) {\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.appendClosePoint(newCircle.center, circleA, newCircle.center, r);\n markup.appendClosePoint(newCircle.center, circleB, newCircle.center, r);\n markup.appendClosePoint(newCircle.center, line, newCircle.center, r);\n result.push(markup);\n }\n }\n }\n }\n }\n }\n return result;\n }\n /**\n * Special case CCC tangent construction when inputs are colinear.\n * @param circleA first input circle\n * @param circleB second input circle\n * @param circleC third input circle\n * @param rA signed radius for circleA\n * @param rB signed radius for circleB\n * @param rC signed radius for circleC\n * @param result pre-initialized array to which tangent circle markup will be added.\n */\n private static solveColinearCCCTangents(\n circleA: UnboundedCircle2dByCenterAndRadius,\n circleB: UnboundedCircle2dByCenterAndRadius,\n circleC: UnboundedCircle2dByCenterAndRadius,\n rA: number,\n rB: number,\n rC: number,\n result: ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[],\n ): void {\n const vectorAB = Vector2d.createStartEnd(circleA.center, circleB.center);\n const vectorAC = Vector2d.createStartEnd(circleA.center, circleC.center);\n const xB = vectorAB.magnitude();\n let xC = vectorAC.magnitude();\n if (vectorAB.dotProduct(vectorAC) < 0)\n xC = -xC;\n const unitAB = vectorAB.normalize();\n if (unitAB === undefined)\n return; // there are circle-in-circle cases with common centers\n const unitPerp = unitAB.rotate90CCWXY();\n /*\n Measuring from center A in rotated system:\n x^2 + y^2 = (r+rA)^2\n (x-xB)^2 + y^2 = (r+rB)^2\n (x-xC)^2 + y^2 = (r+rC)^2\n -------------------------\n x^2 + y^2 = (r+rA)^2\n -2xB x + xB^2 = (r+rB)^2 - (r+rA)^2\n -2xC x + xC^2 = (r+rC)^2 - (r+rA)^2\n -------------------------\n x^2 + y^2 = (r+rA)^2\n -2xB x = 2 (rB-rA) r + rB^2 - rA^2 - xB^2\n -2x2 x = 2 (rC-rA) r + rC^2 - rA^2 - xC^2\n -------------------------\n Solve\n -2xB x - 2 (rB-rA) r = rB^2 - rA^2 - xB^2\n -2xC x - 2 (rC-rA) r = rC^2 - rA^2 - xC^2\n */\n const ax = -2.0 * xB;\n const ar = -2.0 * (rB - rA);\n const a = rB * rB - rA * rA - xB * xB;\n const bx = -2.0 * xC;\n const br = -2.0 * (rC - rA);\n const b = rC * rC - rA * rA - xC * xC;\n const sRelTol = 1.0e-14;\n const origin = Point2d.create(circleA.center.x, circleA.center.y);\n const solutionVector = Vector2d.create();\n if (SmallSystem.linearSystem2d(ax, ar, bx, br, a, b, solutionVector)) {\n const x = solutionVector.x;\n const r = solutionVector.y;\n let dd = (r + rA) * (r + rA) - x * x;\n const tol = sRelTol * x * x;\n if (Math.abs(dd) < tol)\n dd = 0.0;\n if (dd >= 0.0) {\n const y = Math.sqrt(dd);\n const xy0 = origin.plus2Scaled(unitAB, x, unitPerp, y);\n const xy1 = origin.plus2Scaled(unitAB, x, unitPerp, -y);\n for (const newCenter of [xy0, xy1]) {\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(newCenter, r);\n if (!isThisCirclePresent(result, newCircle)) {\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.appendClosePoint(newCircle.center, circleA, newCircle.center, r);\n markup.appendClosePoint(newCircle.center, circleB, newCircle.center, r);\n markup.appendClosePoint(newCircle.center, circleC, newCircle.center, r);\n result.push(markup);\n }\n }\n }\n }\n }\n /**\n * Return all (i.e., up to 8) circles tangent to 3 circles.\n * @param circles the three input circles\n */\n private static circlesTangentCCCThisOrder(\n circles: UnboundedCircle2dByCenterAndRadius[],\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n // Call the circle centers and radii\n // (ax, ay, ar)\n // (bx, by, br)\n // (cx, cy, cr)\n // For a tangent circle with center (x,y) and radius r,\n // (x-ax)^2 + (y-ay)^2 = (r+ar)^2\n // (x-bx)^2 + (y-by)^2 = (r+br)^2\n // (x-cx)^2 + (y-cy)^2 = (r+cr)^2\n // This has squares of all the unknowns x,y,r\n // BUT !!! all coefficients of squares are 1.\n // Subtract the first from the second and third equations.\n // All the squares go away in the shifted equations.\n // What's left is 2 linear equations with x,y,r as unknowns.\n // Move the r and constant parts to the right side.\n // Solve for x and y as a linear function of r.\n // Substitute those linear forms back into the x and y of the first equation.\n // A quadratic in r is left!\n // Solve it for r, and then the linear forms give x and y.\n // Do the whole process with every combination of signed br and cr.\n // (No need to treat negated ar because negating all of them is redundant)\n const result: ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] = [];\n const vector01 = Vector2d.createStartEnd(circles[0].center, circles[1].center);\n const vector02 = Vector2d.createStartEnd(circles[0].center, circles[2].center);\n const dot12 = vector01.dotProduct(vector02);\n const determinant = vector01.crossProduct(vector02);\n const determinantTol = 1.0e-8;\n const oneOverDeterminant = Geometry.conditionalDivideFraction(1.0, determinant);\n // messy tolerance test ported. Why not just a parallel test on the vectors?\n // maybe having 1/determinant is worth it?\n if (oneOverDeterminant === undefined\n || Math.abs(determinant) <= determinantTol * Math.abs(dot12)\n || oneOverDeterminant === undefined) {\n const signedR0 = circles[0].radius;\n for (const signedR1 of signedValues(circles[1].radius)) {\n for (const signedR2 of signedValues(circles[2].radius)) {\n this.solveColinearCCCTangents(\n circles[0], circles[1], circles[2],\n signedR0, signedR1, signedR2,\n result,\n );\n }\n }\n return result.length > 0 ? result : undefined;\n }\n const r0 = circles[0].radius;\n const inverseMatrix = Matrix3d.createRowValues(\n vector02.y * oneOverDeterminant, -vector01.y * oneOverDeterminant, 0.0,\n -vector02.x * oneOverDeterminant, vector01.x * oneOverDeterminant, 0.0,\n 0.0, 0.0, 1.0,\n );\n for (const r1 of signedValues(circles[1].radius)) {\n for (const r2 of signedValues(circles[2].radius)) {\n const vectorA = Vector3d.create(\n -0.5 * (Geometry.square(r1) - Geometry.square(vector01.x) - Geometry.square(vector01.y) - Geometry.square(r0)),\n -0.5 * (Geometry.square(r2) - Geometry.square(vector02.x) - Geometry.square(vector02.y) - Geometry.square(r0)),\n 0.0,\n );\n const vectorB = Vector3d.create(-(r1 - r0), -(r2 - r0), 0.0);\n const vectorA1 = inverseMatrix.multiplyVector(vectorA);\n const vectorB1 = inverseMatrix.multiplyVector(vectorB);\n const qa = vectorB1.magnitudeSquared() - 1.0;\n const qb = 2 * (vectorA1.dotProduct(vectorB1) - r0);\n const qc = vectorA1.magnitudeSquared() - Geometry.square(r0);\n const roots = Degree2PowerPolynomial.solveQuadratic(qa, qb, qc);\n if (roots !== undefined) {\n if (roots.length === 2\n && Geometry.isSmallMetricDistance(Math.abs(roots[0]) - Math.abs(roots[1])))\n roots.pop();\n for (const newRadius of roots) {\n const newCenter = circles[0].center.plus2Scaled(vectorA1, 1.0, vectorB1, newRadius);\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(newCenter, newRadius);\n if (!isThisCirclePresent(result, newCircle)) {\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.appendClosePoint(newCircle.center, circles[0], newCircle.center, newRadius);\n markup.appendClosePoint(newCircle.center, circles[1], newCircle.center, newRadius);\n markup.appendClosePoint(newCircle.center, circles[2], newCircle.center, newRadius);\n result.push(markup);\n }\n }\n }\n }\n }\n return result;\n }\n /**\n * Return all (i.e., up to 8) circles tangent to 3 circles.\n * @param circleA first circle\n * @param circleB second circle\n * @param circleC third circle\n */\n public static circlesTangentCCC(\n circleA: UnboundedCircle2dByCenterAndRadius,\n circleB: UnboundedCircle2dByCenterAndRadius,\n circleC: UnboundedCircle2dByCenterAndRadius,\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n const circlesInOrder = [circleA, circleB, circleC];\n return this.circlesTangentCCCThisOrder(circlesInOrder);\n }\n /**\n * Return an unbounded line with the midpoint between pointA and pointB as its reference point\n * and the unit vector from pointA towards pointB as its normal.\n * @param pointA first point\n * @param pointB second point\n * @returns unbounded line, or undefined if pointA and pointB are coincident.\n */\n public static bisector(pointA: XAndY, pointB: XAndY): UnboundedLine2dByPointAndNormal | undefined {\n const vectorAB = Vector2d.createStartEnd(pointA, pointB);\n const midPoint = Point2d.createInterpolated(pointA, 0.5, pointB);\n const unitAB = vectorAB.normalize();\n if (unitAB === undefined)\n return undefined;\n return UnboundedLine2dByPointAndNormal.createPointNormal(midPoint, unitAB);\n }\n /**\n * Compute circles of specified radius tangent to each of the lines\n * * There are normally 4 circles\n * * The undefined case occurs when the lines are parallel.\n * @param lineA first line\n * @param lineB second line\n * @param radius radius of tangent circles\n * @returns array of circles with annotated tangencies. returns undefined if lines are parallel.\n */\n public static circlesTangentLLR(\n lineA: UnboundedLine2dByPointAndNormal,\n lineB: UnboundedLine2dByPointAndNormal,\n radius: number,\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n // Construct lines offset by (positive and negative) radii.\n // For each of the 4 combinations of offset lines, the intersection of offsets is the\n // center of the tangent circle.\n if (Geometry.isSmallMetricDistance(radius))\n return undefined;\n const offsetA0 = lineA.cloneShifted(radius);\n const offsetA1 = lineA.cloneShifted(-radius);\n const offsetB0 = lineB.cloneShifted(radius);\n const offsetB1 = lineB.cloneShifted(-radius);\n if (offsetA0 === undefined || offsetA1 === undefined || offsetB0 === undefined || offsetB1 === undefined)\n return undefined;\n const offsetsA = [offsetA0, offsetA1];\n const offsetsB = [offsetB0, offsetB1];\n const result = [];\n for (const offsetA of offsetsA) {\n for (const offsetB of offsetsB) {\n const p = offsetA.intersectUnboundedLine2dByPointAndNormalWithOffsets(offsetB);\n if (p !== undefined) {\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(p, radius);\n if (!isThisCirclePresent(result, newCircle)) {\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.appendClosePoint(newCircle.center, lineA, newCircle.center, newCircle.radius);\n markup.appendClosePoint(newCircle.center, lineB, newCircle.center, newCircle.radius);\n result.push(markup);\n }\n }\n }\n }\n return result.length > 0 ? result : undefined;\n }\n /**\n * Compute circles of specified radius tangent to both a line and an arc\n * * There can be 0 to 8 circles\n * * The undefined case occurs when the smallest distance from circle to line exceeds radius.\n * @param circleA the circle\n * @param lineB the line\n * @param radius radius of tangent circles\n * @returns array of circles with annotated tangencies\n */\n public static circlesTangentCLR(\n circleA: UnboundedCircle2dByCenterAndRadius, lineB: UnboundedLine2dByPointAndNormal, radius: number,\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n // From circleA, construct circles offset by positive and negative radii.\n // From lineB, construct lines offset by positive and negative radii.\n // Each combination of [offsetCircle, offsetLine] can have 2 intersections.\n // Each such intersection is the center of a tangent circle.\n if (Geometry.isSmallMetricDistance(radius))\n return undefined;\n const offsetsA = [\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleA.center, circleA.radius + radius),\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleA.center, circleA.radius - radius),\n ];\n const offsetB0 = lineB.cloneShifted(radius);\n const offsetB1 = lineB.cloneShifted(-radius);\n if (offsetB0 === undefined || offsetB1 === undefined)\n return undefined;\n const offsetsB = [offsetB0, offsetB1];\n const result = [];\n for (const offsetA of offsetsA) {\n for (const offsetB of offsetsB) {\n const points = offsetA.intersectLine(offsetB);\n for (const p of points) {\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(p, radius);\n if (!isThisCirclePresent(result, newCircle)) {\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.appendClosePoint(newCircle.center, circleA, newCircle.center, newCircle.radius);\n markup.appendClosePoint(newCircle.center, lineB, newCircle.center, newCircle.radius);\n result.push(markup);\n }\n }\n }\n }\n return result.length > 0 ? result : undefined;\n }\n /**\n * Compute circles of specified radius tangent to both circles\n * * There can be 0 to 8 circles\n * * The undefined case is when the smallest distance between the circles exceeds the requested radius.\n * @param circleA the first circle\n * @param circleB the second circle\n * @param radius radius of tangent circles\n * @returns array of circles with annotated tangencies\n */\n public static circlesTangentCCR(\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius, radius: number,\n ): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n // From circleA, construct circles offset by positive and negative radii.\n // From circleB, construct circles offset by positive and negative radii.\n // Each combination of [offsetA, offsetsB] can have 2 intersections.\n // Each such intersection is the center of a tangent circle.\n if (Geometry.isSmallMetricDistance(radius))\n return undefined;\n const offsetsA = [\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleA.center, circleA.radius + radius),\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleA.center, circleA.radius - radius),\n ];\n const offsetsB = [\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleB.center, circleB.radius + radius),\n UnboundedCircle2dByCenterAndRadius.createPointRadius(circleB.center, circleB.radius - radius),\n ];\n const result = [];\n for (const offsetA of offsetsA) {\n for (const offsetB of offsetsB) {\n const points = offsetA.intersectCircle(offsetB);\n for (const p of points) {\n const newCircle = UnboundedCircle2dByCenterAndRadius.createPointRadius(p, radius);\n if (!isThisCirclePresent(result, newCircle)) {\n const markup = new ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>(newCircle);\n markup.appendClosePoint(newCircle.center, circleA, newCircle.center, newCircle.radius);\n markup.appendClosePoint(newCircle.center, circleB, newCircle.center, newCircle.radius);\n result.push(markup);\n }\n }\n }\n }\n return result.length > 0 ? result : undefined;\n }\n /**\n * Construct basis vectors for hyperbola or ellipse whose points are equidistant from tangencies with\n * circleA and circleB.\n * * If the curve is a hyperbola, the equation is\n * X = center + vectorU * sec(theta) + vectorV * tan(theta)\n * * If the curve is an ellipse, the equation is\n * X = center + vectorU * cos(theta) + vectorV * sin(theta)\n * @param circleA first circle\n * @param circleB second circle\n */\n public static medialCurveCircleCircle(\n circleA: UnboundedCircle2dByCenterAndRadius, circleB: UnboundedCircle2dByCenterAndRadius,\n ): ImplicitCurve2d | undefined {\n const d = circleA.center.distance(circleB.center);\n const origin = circleA.center.interpolate(0.5, circleB.center);\n const h = circleA.radius + circleB.radius;\n const discriminant = d * d - h * h;\n const hy = Math.sqrt(Math.abs(discriminant));\n const xAxis = Vector2d.createStartEnd(origin, circleB.center).normalize();\n if (xAxis === undefined)\n return undefined;\n const yAxis = xAxis.rotate90CCWXY();\n const ax = 0.5 * h;\n const ay = 0.5 * hy;\n const vectorU = xAxis.scale(ax);\n const vectorV = yAxis.scale(ay);\n if (discriminant > 0.0) {\n return UnboundedHyperbola2d.createCenterAndAxisVectors(origin, vectorU, vectorV);\n } else if (discriminant < 0.0) {\n return UnboundedEllipse2d.createCenterAndAxisVectors(origin, vectorU, vectorV);\n }\n return undefined;\n }\n /**\n * Construct parabolas whose points are equidistant from tangencies with\n * circleA and circleB.\n * * Note that if th e circle has non-zero radius there are two parabolas based on\n * tangencies on near or far side of the circle.\n * @param line the line\n * @param circle the circle\n */\n public static medialCurveLineCircle(\n line: UnboundedLine2dByPointAndNormal, circle: UnboundedCircle2dByCenterAndRadius,\n ): ImplicitCurve2d[] | undefined {\n const linePoint = line.closestPoint(circle.center);\n if (linePoint === undefined)\n return undefined;\n const lineA = line.cloneNormalizedWithOrigin(linePoint);\n if (lineA === undefined)\n return undefined;\n const b = linePoint.distance(circle.center);\n const side = lineA.functionValue(circle.center) > 0 ? 1 : -1;\n const signedB = b * side;\n const signedRadii = [];\n if (Geometry.isSameCoordinate(circle.radius, -circle.radius))\n signedRadii.push(0);\n else {\n signedRadii.push(circle.radius);\n signedRadii.push(-circle.radius);\n }\n const result = [];\n for (const r of signedRadii) {\n const vertexDistance = (signedB - r) * 0.5;\n const vertex = lineA.point.plusScaled(lineA.normal, vertexDistance);\n const c = 2 * (signedB + r);\n const oneOverC = Geometry.conditionalDivideCoordinate(1, c);\n if (oneOverC !== undefined) {\n const vectorV = lineA.normal.clone().scale(oneOverC);\n const vectorU = lineA.normal.unitPerpendicularXY();\n const parabola = UnboundedParabola2d.createCenterAndAxisVectors(vertex, vectorU, vectorV);\n result.push(parabola);\n }\n }\n return result;\n }\n}\n/**\n * If distance is near zero metric, return an array containing only value.\n * If not near zero, return an array with both value and its negative (in that order).\n * @param distance the distance\n * @param value the value\n */\nfunction signedValues(distance: number, value?: number): number[] {\n if (value === undefined)\n value = distance;\n const values = [value];\n if (!Geometry.isSmallMetricDistance(distance))\n values.push(-value);\n return values;\n}\n/** Search an array of circles to see if a particular new circle is already present. */\nfunction isThisCirclePresent(\n circles: ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[], circle: UnboundedCircle2dByCenterAndRadius,\n): boolean {\n for (const c of circles) {\n if (circle.isSameCircle(c.curve, true))\n return true;\n }\n return false;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ConstraintSet.js","sourceRoot":"","sources":["../../../../../src/curve/internalContexts/geometry2d/ConstraintSet.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\nimport { Geometry } from \"../../../Geometry\";\r\nimport { Point2d } from \"../../../geometry3d/Point2dVector2d\";\r\nimport { ConstrainedImplicitCurve2d } from \"./ConstrainedImplicitCurve2d\";\r\nimport { ImplicitCurve2d, ImplicitGeometryMarkup } from \"./ImplicitCurve2d\";\r\nimport { UnboundedCircle2dByCenterAndRadius } from \"./UnboundedCircle2d\";\r\nimport { UnboundedLine2dByPointAndNormal } from \"./UnboundedLine2d\";\r\n\r\n/**\r\n * Itemization of constraints for line and circle construction.\r\n * Not all combinations are solvable!\r\n * @internal\r\n */\r\n\r\nexport enum ConstraintType {\r\n throughPoint,\r\n radius,\r\n perpendicularTo,\r\n tangentTo,\r\n curveLength\r\n}\r\n\r\n/**\r\n * Represents a single construction constraint used by `ConstraintSet`.\r\n * @internal\r\n */\r\nexport class ConstraintConstruction {\r\n public constraintType: ConstraintType;\r\n public curve?: ImplicitCurve2d;\r\n public point?: Point2d;\r\n public radius?: number;\r\n private constructor(constraintType: ConstraintType) {\r\n this.constraintType = constraintType;\r\n }\r\n /** Create a constraint requiring the constructed geometry to pass through a point. */\r\n public static createThroughPoint(point: Point2d): ConstraintConstruction {\r\n const c = new ConstraintConstruction(ConstraintType.throughPoint);\r\n c.point = point.clone();\r\n return c;\r\n }\r\n /** Create a tangency constraint to a curve. */\r\n public static createTangentTo(curve: ImplicitCurve2d): ConstraintConstruction {\r\n const c = new ConstraintConstruction(ConstraintType.tangentTo);\r\n c.curve = curve.clone();\r\n return c;\r\n }\r\n /** Create a perpendicularity constraint to a curve. */\r\n public static createPerpendicularTo(curve: ImplicitCurve2d): ConstraintConstruction {\r\n const c = new ConstraintConstruction(ConstraintType.perpendicularTo);\r\n c.curve = curve.clone();\r\n return c;\r\n }\r\n /** Create a fixed-radius constraint. */\r\n public static createRadius(radius: number): ConstraintConstruction {\r\n const c = new ConstraintConstruction(ConstraintType.radius);\r\n c.radius = radius;\r\n return c;\r\n }\r\n /**\r\n * Return a clone of this constraint.\r\n * * point or curve referenced by this constraint are cloned.\r\n */\r\n public clone(): ConstraintConstruction {\r\n const c = new ConstraintConstruction(this.constraintType);\r\n if (this.curve !== undefined)\r\n c.curve = this.curve.clone();\r\n if (this.point !== undefined)\r\n c.point = this.point.clone();\r\n if (this.radius !== undefined)\r\n c.radius = this.radius;\r\n return c;\r\n }\r\n}\r\n\r\n/**\r\n * Collection of construction constraints for line and circle construction.\r\n * @internal\r\n */\r\nexport class ConstraintSet {\r\n private _constraints: ConstraintConstruction[];\r\n private constructor() {\r\n this._constraints = [];\r\n }\r\n /** Create an empty constraint set. */\r\n public static create(): ConstraintSet {\r\n return new ConstraintSet();\r\n }\r\n /** Clone this constraint set. */\r\n public clone(): ConstraintSet {\r\n const theClone = ConstraintSet.create();\r\n for (const c of this._constraints) {\r\n theClone._constraints.push(c.clone());\r\n }\r\n return theClone;\r\n }\r\n /**\r\n * Add a new constraint to the array.\r\n * @param constraint the constraint to add.\r\n * @returns true if the constraint was accepted.\r\n */\r\n public addConstraint(constraint: ConstraintConstruction): boolean {\r\n this._constraints.push(constraint);\r\n return true;\r\n }\r\n /** Count constraints of a specific type. */\r\n public countConstraintType(t: ConstraintType): number {\r\n let n = 0;\r\n for (const c of this._constraints) {\r\n if (c.constraintType === t)\r\n n++;\r\n }\r\n return n;\r\n }\r\n /** Replace zero-radius circle tangency constraints with through-point constraints. */\r\n public convertZeroRadiusCirclesToThroughPoint(): void {\r\n for (let i = 0; i < this._constraints.length; i++) {\r\n const c = this._constraints[i];\r\n if (c.constraintType === ConstraintType.tangentTo\r\n && c.curve !== undefined\r\n && c.curve instanceof UnboundedCircle2dByCenterAndRadius\r\n && Geometry.isSmallMetricDistance(c.curve.radius)) {\r\n const c1 = ConstraintConstruction.createThroughPoint(c.curve.center);\r\n this._constraints[i] = c1;\r\n }\r\n }\r\n }\r\n /** Replace through-point constraints with tangency to zero-radius circles. */\r\n public convertThroughPointToZeroRadiusCircles(): void {\r\n for (let i = 0; i < this._constraints.length; i++) {\r\n const c = this._constraints[i];\r\n if (c.constraintType === ConstraintType.throughPoint && c.point !== undefined) {\r\n const c1 = ConstraintConstruction.createTangentTo(\r\n UnboundedCircle2dByCenterAndRadius.createPointRadius(c.point, 0.0)\r\n );\r\n this._constraints[i] = c1;\r\n }\r\n }\r\n }\r\n /** Normalize all lines for the `tangentTo` constraint. */\r\n public normalizeLines(): void {\r\n for (let i = 0; i < this._constraints.length; i++) {\r\n const c = this._constraints[i];\r\n if (c.constraintType === ConstraintType.tangentTo && c.curve instanceof UnboundedLine2dByPointAndNormal) {\r\n const newLine = c.curve.cloneNormalizedFromOrigin();\r\n if (newLine !== undefined) {\r\n const c1 = ConstraintConstruction.createTangentTo(newLine);\r\n this._constraints[i] = c1;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Return\r\n * * 1 if the constraint curve is UnboundedLine2dByPointAndNormal\r\n * * 2 if the constraint curve is UnboundedCircle2dByCenterAndRadius\r\n * * 0 otherwise\r\n * @param c the constraint.\r\n */\r\n private static tangentGeometryLineCircleType(c: ConstraintConstruction): number {\r\n if (c.curve instanceof UnboundedCircle2dByCenterAndRadius)\r\n return 2;\r\n if (c.curve instanceof UnboundedLine2dByPointAndNormal)\r\n return 1;\r\n return 0;\r\n }\r\n /**\r\n * Sort the given constraints with\r\n * * Primary sort is on constraint type\r\n * * For equal constraint type, apply ordering from tangentGeometryType function.\r\n */\r\n public static sortByConstraintTypeAndGeometryType(constraints: ConstraintConstruction[]) {\r\n constraints.sort(\r\n (a: ConstraintConstruction, b: ConstraintConstruction) => {\r\n if (a.constraintType === b.constraintType) {\r\n const ga = this.tangentGeometryLineCircleType(a);\r\n const gb = this.tangentGeometryLineCircleType(b);\r\n if (ga === gb)\r\n return 0;\r\n return ga < gb ? -1 : 1;\r\n }\r\n return (a.constraintType < b.constraintType) ? -1 : 1;\r\n }\r\n )\r\n }\r\n /**\r\n * Given an array of constraint requests (e.g. tangent to circle, tangent to line, etc),\r\n * construct all circles that satisfy the conditions.\r\n * * Circles are defined by 3 conditions, so there is null output for inputs with other than 3 constraints.\r\n * * Returns undefined if no solver is available for the requested constraints.\r\n * @returns Array of circles with markup about how or where the constraints are satisfied.\r\n */\r\n public constructConstrainedCircles(): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\r\n if (this._constraints.length !== 3)\r\n return undefined;\r\n const constraints = this.clone();\r\n constraints.convertThroughPointToZeroRadiusCircles();\r\n constraints.normalizeLines();\r\n ConstraintSet.sortByConstraintTypeAndGeometryType(constraints._constraints);\r\n // note that pass-through points are now tangentTo circles with zero radius\r\n const numTangent = constraints.countConstraintType(ConstraintType.tangentTo);\r\n const numRadius = constraints.countConstraintType(ConstraintType.radius);\r\n const c0 = constraints._constraints[0];\r\n const c1 = constraints._constraints[1];\r\n const c2 = constraints._constraints[2];\r\n if (numTangent === 3) {\r\n // radius comes first, then line(s), then circle(s); once a circle is encountered, the rest must be circles\r\n if (c0.curve instanceof UnboundedLine2dByPointAndNormal) {\r\n if (c1.curve instanceof UnboundedLine2dByPointAndNormal) {\r\n if (c2.curve instanceof UnboundedLine2dByPointAndNormal) {\r\n return ConstrainedImplicitCurve2d.circlesTangentLLL(c0.curve, c1.curve, c2.curve);\r\n } else if (c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.circlesTangentLLC(c0.curve, c1.curve, c2.curve);\r\n }\r\n } else if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n if (c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.circlesTangentCCL(c1.curve, c2.curve, c0.curve);\r\n }\r\n }\r\n } else if (c0.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius\r\n && c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.circlesTangentCCC(c0.curve, c1.curve, c2.curve);\r\n }\r\n }\r\n } else if (numRadius === 1 && numTangent === 2 && c0.radius !== undefined) {\r\n if (c1.curve instanceof UnboundedLine2dByPointAndNormal) {\r\n if (c2.curve instanceof UnboundedLine2dByPointAndNormal) {\r\n return ConstrainedImplicitCurve2d.circlesTangentLLR(c1.curve, c2.curve, c0.radius);\r\n } else if (c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.circlesTangentCLR(c2.curve, c1.curve, c0.radius);\r\n }\r\n } else if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n if (c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.circlesTangentCCR(c1.curve, c2.curve, c0.radius);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Given an array of constraint requests (e.g. tangent to circle, tangent to line, etc),\r\n * construct all lines that satisfy the conditions.\r\n * * Lines are defined by 2 conditions, so there is null output for inputs with other than 2 constraints.\r\n * * Returns undefined if no solver is available for the requested constraints.\r\n * @returns Array of lines with markup about how or where the constraints are satisfied.\r\n */\r\n public constructConstrainedLines(): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\r\n if (this._constraints.length !== 2)\r\n return undefined;\r\n const constraints = this.clone();\r\n constraints.convertThroughPointToZeroRadiusCircles();\r\n constraints.normalizeLines();\r\n ConstraintSet.sortByConstraintTypeAndGeometryType(constraints._constraints);\r\n // note that pass-through points are now tangentTo circles with zero radius\r\n const numTangent = constraints.countConstraintType(ConstraintType.tangentTo);\r\n const numPerp = constraints.countConstraintType(ConstraintType.perpendicularTo);\r\n const c0 = constraints._constraints[0];\r\n const c1 = constraints._constraints[1];\r\n if (numTangent === 2) {\r\n if (c0.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.linesTangentCC(c1.curve, c0.curve);\r\n }\r\n }\r\n } else if (numPerp === 2) {\r\n if (c0.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.linesPerpCPerpC(c0.curve, c1.curve);\r\n }\r\n } else if (c0.curve instanceof UnboundedLine2dByPointAndNormal) {\r\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.linesPerpLPerpC(c0.curve, c1.curve);\r\n }\r\n }\r\n } else if (numPerp === 1 && numTangent === 1) {\r\n // the tangent comes second and must be a circle\r\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n if (c0.curve instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return ConstrainedImplicitCurve2d.linesPerpCTangentC(c0.curve, c1.curve);\r\n } else if (c0.curve instanceof UnboundedLine2dByPointAndNormal) {\r\n return ConstrainedImplicitCurve2d.linesPerpLTangentC(c0.curve, c1.curve);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ConstraintSet.js","sourceRoot":"","sources":["../../../../../src/curve/internalContexts/geometry2d/ConstraintSet.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module CartesianGeometry\n */\nimport { Geometry } from \"../../../Geometry\";\nimport { Point2d } from \"../../../geometry3d/Point2dVector2d\";\nimport { ConstrainedImplicitCurve2d } from \"./ConstrainedImplicitCurve2d\";\nimport { ImplicitCurve2d, ImplicitGeometryMarkup } from \"./ImplicitCurve2d\";\nimport { UnboundedCircle2dByCenterAndRadius } from \"./UnboundedCircle2d\";\nimport { UnboundedLine2dByPointAndNormal } from \"./UnboundedLine2d\";\n\n/**\n * Itemization of constraints for line and circle construction.\n * Not all combinations are solvable!\n * @internal\n */\n\nexport enum ConstraintType {\n throughPoint,\n radius,\n perpendicularTo,\n tangentTo,\n curveLength\n}\n\n/**\n * Represents a single construction constraint used by `ConstraintSet`.\n * @internal\n */\nexport class ConstraintConstruction {\n public constraintType: ConstraintType;\n public curve?: ImplicitCurve2d;\n public point?: Point2d;\n public radius?: number;\n private constructor(constraintType: ConstraintType) {\n this.constraintType = constraintType;\n }\n /** Create a constraint requiring the constructed geometry to pass through a point. */\n public static createThroughPoint(point: Point2d): ConstraintConstruction {\n const c = new ConstraintConstruction(ConstraintType.throughPoint);\n c.point = point.clone();\n return c;\n }\n /** Create a tangency constraint to a curve. */\n public static createTangentTo(curve: ImplicitCurve2d): ConstraintConstruction {\n const c = new ConstraintConstruction(ConstraintType.tangentTo);\n c.curve = curve.clone();\n return c;\n }\n /** Create a perpendicularity constraint to a curve. */\n public static createPerpendicularTo(curve: ImplicitCurve2d): ConstraintConstruction {\n const c = new ConstraintConstruction(ConstraintType.perpendicularTo);\n c.curve = curve.clone();\n return c;\n }\n /** Create a fixed-radius constraint. */\n public static createRadius(radius: number): ConstraintConstruction {\n const c = new ConstraintConstruction(ConstraintType.radius);\n c.radius = radius;\n return c;\n }\n /**\n * Return a clone of this constraint.\n * * point or curve referenced by this constraint are cloned.\n */\n public clone(): ConstraintConstruction {\n const c = new ConstraintConstruction(this.constraintType);\n if (this.curve !== undefined)\n c.curve = this.curve.clone();\n if (this.point !== undefined)\n c.point = this.point.clone();\n if (this.radius !== undefined)\n c.radius = this.radius;\n return c;\n }\n}\n\n/**\n * Collection of construction constraints for line and circle construction.\n * @internal\n */\nexport class ConstraintSet {\n private _constraints: ConstraintConstruction[];\n private constructor() {\n this._constraints = [];\n }\n /** Create an empty constraint set. */\n public static create(): ConstraintSet {\n return new ConstraintSet();\n }\n /** Clone this constraint set. */\n public clone(): ConstraintSet {\n const theClone = ConstraintSet.create();\n for (const c of this._constraints) {\n theClone._constraints.push(c.clone());\n }\n return theClone;\n }\n /**\n * Add a new constraint to the array.\n * @param constraint the constraint to add.\n * @returns true if the constraint was accepted.\n */\n public addConstraint(constraint: ConstraintConstruction): boolean {\n this._constraints.push(constraint);\n return true;\n }\n /** Count constraints of a specific type. */\n public countConstraintType(t: ConstraintType): number {\n let n = 0;\n for (const c of this._constraints) {\n if (c.constraintType === t)\n n++;\n }\n return n;\n }\n /** Replace zero-radius circle tangency constraints with through-point constraints. */\n public convertZeroRadiusCirclesToThroughPoint(): void {\n for (let i = 0; i < this._constraints.length; i++) {\n const c = this._constraints[i];\n if (c.constraintType === ConstraintType.tangentTo\n && c.curve !== undefined\n && c.curve instanceof UnboundedCircle2dByCenterAndRadius\n && Geometry.isSmallMetricDistance(c.curve.radius)) {\n const c1 = ConstraintConstruction.createThroughPoint(c.curve.center);\n this._constraints[i] = c1;\n }\n }\n }\n /** Replace through-point constraints with tangency to zero-radius circles. */\n public convertThroughPointToZeroRadiusCircles(): void {\n for (let i = 0; i < this._constraints.length; i++) {\n const c = this._constraints[i];\n if (c.constraintType === ConstraintType.throughPoint && c.point !== undefined) {\n const c1 = ConstraintConstruction.createTangentTo(\n UnboundedCircle2dByCenterAndRadius.createPointRadius(c.point, 0.0)\n );\n this._constraints[i] = c1;\n }\n }\n }\n /** Normalize all lines for the `tangentTo` constraint. */\n public normalizeLines(): void {\n for (let i = 0; i < this._constraints.length; i++) {\n const c = this._constraints[i];\n if (c.constraintType === ConstraintType.tangentTo && c.curve instanceof UnboundedLine2dByPointAndNormal) {\n const newLine = c.curve.cloneNormalizedFromOrigin();\n if (newLine !== undefined) {\n const c1 = ConstraintConstruction.createTangentTo(newLine);\n this._constraints[i] = c1;\n }\n }\n }\n }\n /**\n * Return\n * * 1 if the constraint curve is UnboundedLine2dByPointAndNormal\n * * 2 if the constraint curve is UnboundedCircle2dByCenterAndRadius\n * * 0 otherwise\n * @param c the constraint.\n */\n private static tangentGeometryLineCircleType(c: ConstraintConstruction): number {\n if (c.curve instanceof UnboundedCircle2dByCenterAndRadius)\n return 2;\n if (c.curve instanceof UnboundedLine2dByPointAndNormal)\n return 1;\n return 0;\n }\n /**\n * Sort the given constraints with\n * * Primary sort is on constraint type\n * * For equal constraint type, apply ordering from tangentGeometryType function.\n */\n public static sortByConstraintTypeAndGeometryType(constraints: ConstraintConstruction[]) {\n constraints.sort(\n (a: ConstraintConstruction, b: ConstraintConstruction) => {\n if (a.constraintType === b.constraintType) {\n const ga = this.tangentGeometryLineCircleType(a);\n const gb = this.tangentGeometryLineCircleType(b);\n if (ga === gb)\n return 0;\n return ga < gb ? -1 : 1;\n }\n return (a.constraintType < b.constraintType) ? -1 : 1;\n }\n )\n }\n /**\n * Given an array of constraint requests (e.g. tangent to circle, tangent to line, etc),\n * construct all circles that satisfy the conditions.\n * * Circles are defined by 3 conditions, so there is null output for inputs with other than 3 constraints.\n * * Returns undefined if no solver is available for the requested constraints.\n * @returns Array of circles with markup about how or where the constraints are satisfied.\n */\n public constructConstrainedCircles(): ImplicitGeometryMarkup<UnboundedCircle2dByCenterAndRadius>[] | undefined {\n if (this._constraints.length !== 3)\n return undefined;\n const constraints = this.clone();\n constraints.convertThroughPointToZeroRadiusCircles();\n constraints.normalizeLines();\n ConstraintSet.sortByConstraintTypeAndGeometryType(constraints._constraints);\n // note that pass-through points are now tangentTo circles with zero radius\n const numTangent = constraints.countConstraintType(ConstraintType.tangentTo);\n const numRadius = constraints.countConstraintType(ConstraintType.radius);\n const c0 = constraints._constraints[0];\n const c1 = constraints._constraints[1];\n const c2 = constraints._constraints[2];\n if (numTangent === 3) {\n // radius comes first, then line(s), then circle(s); once a circle is encountered, the rest must be circles\n if (c0.curve instanceof UnboundedLine2dByPointAndNormal) {\n if (c1.curve instanceof UnboundedLine2dByPointAndNormal) {\n if (c2.curve instanceof UnboundedLine2dByPointAndNormal) {\n return ConstrainedImplicitCurve2d.circlesTangentLLL(c0.curve, c1.curve, c2.curve);\n } else if (c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.circlesTangentLLC(c0.curve, c1.curve, c2.curve);\n }\n } else if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n if (c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.circlesTangentCCL(c1.curve, c2.curve, c0.curve);\n }\n }\n } else if (c0.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius\n && c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.circlesTangentCCC(c0.curve, c1.curve, c2.curve);\n }\n }\n } else if (numRadius === 1 && numTangent === 2 && c0.radius !== undefined) {\n if (c1.curve instanceof UnboundedLine2dByPointAndNormal) {\n if (c2.curve instanceof UnboundedLine2dByPointAndNormal) {\n return ConstrainedImplicitCurve2d.circlesTangentLLR(c1.curve, c2.curve, c0.radius);\n } else if (c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.circlesTangentCLR(c2.curve, c1.curve, c0.radius);\n }\n } else if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n if (c2.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.circlesTangentCCR(c1.curve, c2.curve, c0.radius);\n }\n }\n }\n return undefined;\n }\n /**\n * Given an array of constraint requests (e.g. tangent to circle, tangent to line, etc),\n * construct all lines that satisfy the conditions.\n * * Lines are defined by 2 conditions, so there is null output for inputs with other than 2 constraints.\n * * Returns undefined if no solver is available for the requested constraints.\n * @returns Array of lines with markup about how or where the constraints are satisfied.\n */\n public constructConstrainedLines(): ImplicitGeometryMarkup<UnboundedLine2dByPointAndNormal>[] | undefined {\n if (this._constraints.length !== 2)\n return undefined;\n const constraints = this.clone();\n constraints.convertThroughPointToZeroRadiusCircles();\n constraints.normalizeLines();\n ConstraintSet.sortByConstraintTypeAndGeometryType(constraints._constraints);\n // note that pass-through points are now tangentTo circles with zero radius\n const numTangent = constraints.countConstraintType(ConstraintType.tangentTo);\n const numPerp = constraints.countConstraintType(ConstraintType.perpendicularTo);\n const c0 = constraints._constraints[0];\n const c1 = constraints._constraints[1];\n if (numTangent === 2) {\n if (c0.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.linesTangentCC(c1.curve, c0.curve);\n }\n }\n } else if (numPerp === 2) {\n if (c0.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.linesPerpCPerpC(c0.curve, c1.curve);\n }\n } else if (c0.curve instanceof UnboundedLine2dByPointAndNormal) {\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.linesPerpLPerpC(c0.curve, c1.curve);\n }\n }\n } else if (numPerp === 1 && numTangent === 1) {\n // the tangent comes second and must be a circle\n if (c1.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n if (c0.curve instanceof UnboundedCircle2dByCenterAndRadius) {\n return ConstrainedImplicitCurve2d.linesPerpCTangentC(c0.curve, c1.curve);\n } else if (c0.curve instanceof UnboundedLine2dByPointAndNormal) {\n return ConstrainedImplicitCurve2d.linesPerpLTangentC(c0.curve, c1.curve);\n }\n }\n }\n return undefined;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ImplicitCurve2d.js","sourceRoot":"","sources":["../../../../../src/curve/internalContexts/geometry2d/ImplicitCurve2d.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAW,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,OAAgB,eAAe;IAWnC,oEAAoE;IAC7D,MAAM,CAAC,qBAAqB,CAAC,EAAU,EAAE,EAAU,EAAE,OAAiB,EAAE,OAAiB;QAC9F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjC,gEAAgE;QAChE,IAAI,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC;YACxF,OAAO,MAAM,CAAC;QAChB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAUD;;;;OAIG;IACI,YAAY,CAAC,UAAmB;QACrC,IAAI,kBAAkB,GAAW,MAAM,CAAC,gBAAgB,CAAC;QACzD,IAAI,KAA0B,CAAC;QAC/B,8CAA8C;QAC9C,IAAI,CAAC,kBAAkB,CACrB,UAAU,EACV,CAAC,UAAmB,EAAE,QAA4B,EAAE,EAAE;YACpD,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAC/D,sFAAsF;YACtF,IAAI,eAAe,GAAG,kBAAkB,EAAE,CAAC;gBACzC,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC3B,kBAAkB,GAAG,eAAe,CAAC;YACvC,CAAC;QACH,CAAC,CACF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAKD;;;;OAIG;IACI,gBAAgB,CAAC,QAAgB;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;OAIG;IACI,wBAAwB,CAAC,QAAgB;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAsB;IAC1B,KAAK,CAAU;IACf,KAAK,CAAkB;IAC9B;;;;OAIG;IACH,YAAmB,KAAc,EAAE,KAAsB;QACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AACD;;;;;GAKG;AACH,MAAM,OAAO,sBAAsB;IAC1B,KAAK,CAAe;IACpB,IAAI,CAA2B;IACtC;;;OAGG;IACH,YAAmB,KAAmB;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,CAAC;IACD;;;;;;;;;OASG;IACI,gBAAgB,CACrB,UAAmB,EAAE,UAA2B,EAAE,cAAqB,EAAE,YAAoB;QAE7F,IAAI,IAAwB,CAAC;QAE7B,IAAI,YAAY,CAAC;QACjB,UAAU,CAAC,kBAAkB,CAC3B,UAAU,EACV,CAAC,UAAmB,EAAE,QAA4B,EAAE,EAAE;YACpD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YACjF,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;gBACnC,IAAI,GAAG,CAAC,CAAC;gBACT,YAAY,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;YACpC,CAAC;QACH,CAAC,CACF,CAAC;QACF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;OAMG;IACI,qBAAqB,CAC1B,UAAmB,EAAE,cAAuB,EAAE,UAAkB,EAAE,WAA8B;QAEhG,KAAK,MAAM,CAAC,IAAI,WAAW;YACzB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { Point2d, Vector2d } from \"../../../geometry3d/Point2dVector2d\";\r\nimport { XAndY } from \"../../../geometry3d/XYZProps\";\r\nimport { SmallSystem } from \"../../../numerics/SmallSystem\";\r\n\r\n/**\r\n * Abstract base class for curves with an implicit 2d function.\r\n * * Curves in the class are required to have an implicit function f(x,y)=0.\r\n * * They MAY (but are not required to) implement a parametric evaluator radiansToPoint2d.\r\n * @internal\r\n */\r\nexport abstract class ImplicitCurve2d {\r\n /**\r\n * Return the implicit function value at xy, i.e, f(x,y).\r\n * @param xy point for evaluation.\r\n */\r\n public abstract functionValue(xy: XAndY): number;\r\n /**\r\n * Return the implicit function gradient at xy.\r\n * @param xy point for evaluation.\r\n */\r\n public abstract gradient(xy: XAndY): Vector2d;\r\n /** Map a gradient vector (du,dv) from its local frame to global. */\r\n public static gradientLocalToGlobal(du: number, dv: number, vectorU: Vector2d, vectorV: Vector2d): Vector2d {\r\n const result = Vector2d.create();\r\n // use INVERSE of TRANSPOSE of [UV] matrix to map gradient terms\r\n if (SmallSystem.linearSystem2d(vectorU.x, vectorU.y, vectorV.x, vectorV.y, du, dv, result))\r\n return result;\r\n return Vector2d.create(0, 0);\r\n }\r\n /**\r\n * Find all perpendiculars from space point to the curve.\r\n * Pass each in turn to the handler.\r\n * @param spacePoint the space point.\r\n * @handler the handler to receive all the points on the curve and radians where perpendicular happens.\r\n */\r\n public abstract emitPerpendiculars(\r\n spacePoint: Point2d, handler: (curvePoint: Point2d, radians: number | undefined) => any,\r\n ): any;\r\n /**\r\n * Call emitPerpendiculars. Return the closest of the perpendiculars.\r\n * * Return undefined if no perpendiculars are received.\r\n * @param spacePoint the space point.\r\n */\r\n public closestPoint(spacePoint: Point2d): Point2d | undefined {\r\n let minDistanceSquared: number = Number.MAX_SAFE_INTEGER;\r\n let point: Point2d | undefined;\r\n // console.log ({space: spacePoint.toJSON()});\r\n this.emitPerpendiculars(\r\n spacePoint,\r\n (curvePoint: Point2d, _radians: number | undefined) => {\r\n const distanceSquared = curvePoint.distanceSquared(spacePoint);\r\n // console.log ({distanceSquared, xy: curvePoint.toJSON(), minD: minDistanceSquared});\r\n if (distanceSquared < minDistanceSquared) {\r\n point = curvePoint.clone();\r\n minDistanceSquared = distanceSquared;\r\n }\r\n }\r\n );\r\n return point;\r\n }\r\n /** Return true if the item has degenerate defining data. */\r\n public abstract isDegenerate(): boolean;\r\n /** Return a clone of the curve. */\r\n public abstract clone(): ImplicitCurve2d;\r\n /**\r\n * OPTIONAL method to return a Point2d at given radians value.\r\n * * The default implementation returns undefined.\r\n * * Concrete classes that can be expressed as a function of radians should implement this.\r\n */\r\n public radiansToPoint2d(_radians: number): Point2d | undefined {\r\n return undefined;\r\n }\r\n /**\r\n * OPTIONAL method to return the tangent at given radians value.\r\n * * The default implementation returns undefined.\r\n * * Concrete classes that can be expressed as a function of radians should implement this.\r\n */\r\n public radiansToTangentVector2d(_radians: number): Vector2d | undefined {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Carrier class containing:\r\n * * a point\r\n * * the curve to which the point is related.\r\n * @internal\r\n */\r\nexport class Point2dImplicitCurve2d {\r\n public point: Point2d;\r\n public curve: ImplicitCurve2d;\r\n /**\r\n * CAPTURE a point and curve.\r\n * @param point point member\r\n * @param curve curve member\r\n */\r\n public constructor(point: Point2d, curve: ImplicitCurve2d) {\r\n this.point = point;\r\n this.curve = curve;\r\n }\r\n}\r\n/**\r\n * Carrier class containing:\r\n * * a curve which is a subclass of ImplicitCurve2d\r\n * * an array of paired point and ImplicitCurve2d.\r\n * @internal\r\n */\r\nexport class ImplicitGeometryMarkup<GeometryType extends ImplicitCurve2d> {\r\n public curve: GeometryType;\r\n public data: Point2dImplicitCurve2d[];\r\n /**\r\n * Construct a new carrier. The data array is created empty.\r\n * @param curve curve to CAPTURE\r\n */\r\n public constructor(curve: GeometryType) {\r\n this.curve = curve;\r\n this.data = [];\r\n }\r\n /**\r\n * * Use the otherCurve's emitPerpendiculars method to examine all perpendiculars from spacePoint to the curve.\r\n * * For each such point, compute distance from bias point.\r\n * * Choose the one whose distance is closest to biasDistance.\r\n * * push the chosen point on the data array.\r\n * @param spacePoint point to project to otherCurve\r\n * @param otherCurve target curve for projection\r\n * @param referencePoint reference point for point selection\r\n * @param biasDistance preferred distance.\r\n */\r\n public appendClosePoint(\r\n spacePoint: Point2d, otherCurve: ImplicitCurve2d, referencePoint: XAndY, biasDistance: number,\r\n ): boolean {\r\n let dMin: undefined | number;\r\n \r\n let closestPoint;\r\n otherCurve.emitPerpendiculars(\r\n spacePoint,\r\n (curvePoint: Point2d, _radians: number | undefined) => {\r\n const d = Math.abs(curvePoint.distance(referencePoint) - Math.abs(biasDistance));\r\n if (dMin === undefined || d < dMin) {\r\n dMin = d;\r\n closestPoint = curvePoint.clone();\r\n }\r\n }\r\n );\r\n if (closestPoint !== undefined) {\r\n this.data.push(new Point2dImplicitCurve2d(closestPoint, otherCurve));\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * Find closest points of an array of curves.\r\n * @param spacePoint point to project to otherCurve\r\n * @param referencePoint reference point for point selection\r\n * @param biasDistance preferred distance.\r\n * @param otherCurves array of curves to check.\r\n */\r\n public closePointsOfGeometry(\r\n spacePoint: Point2d, referencePoint: Point2d, biasRadius: number, otherCurves: ImplicitCurve2d[],\r\n ): void {\r\n for (const c of otherCurves)\r\n this.appendClosePoint(spacePoint, c, referencePoint, biasRadius);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ImplicitCurve2d.js","sourceRoot":"","sources":["../../../../../src/curve/internalContexts/geometry2d/ImplicitCurve2d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { Point2d, Vector2d } from \"../../../geometry3d/Point2dVector2d\";\nimport { XAndY } from \"../../../geometry3d/XYZProps\";\nimport { SmallSystem } from \"../../../numerics/SmallSystem\";\n\n/**\n * Abstract base class for curves with an implicit 2d function.\n * * Curves in the class are required to have an implicit function f(x,y)=0.\n * * They MAY (but are not required to) implement a parametric evaluator radiansToPoint2d.\n * @internal\n */\nexport abstract class ImplicitCurve2d {\n /**\n * Return the implicit function value at xy, i.e, f(x,y).\n * @param xy point for evaluation.\n */\n public abstract functionValue(xy: XAndY): number;\n /**\n * Return the implicit function gradient at xy.\n * @param xy point for evaluation.\n */\n public abstract gradient(xy: XAndY): Vector2d;\n /** Map a gradient vector (du,dv) from its local frame to global. */\n public static gradientLocalToGlobal(du: number, dv: number, vectorU: Vector2d, vectorV: Vector2d): Vector2d {\n const result = Vector2d.create();\n // use INVERSE of TRANSPOSE of [UV] matrix to map gradient terms\n if (SmallSystem.linearSystem2d(vectorU.x, vectorU.y, vectorV.x, vectorV.y, du, dv, result))\n return result;\n return Vector2d.create(0, 0);\n }\n /**\n * Find all perpendiculars from space point to the curve.\n * Pass each in turn to the handler.\n * @param spacePoint the space point.\n * @handler the handler to receive all the points on the curve and radians where perpendicular happens.\n */\n public abstract emitPerpendiculars(\n spacePoint: Point2d, handler: (curvePoint: Point2d, radians: number | undefined) => any,\n ): any;\n /**\n * Call emitPerpendiculars. Return the closest of the perpendiculars.\n * * Return undefined if no perpendiculars are received.\n * @param spacePoint the space point.\n */\n public closestPoint(spacePoint: Point2d): Point2d | undefined {\n let minDistanceSquared: number = Number.MAX_SAFE_INTEGER;\n let point: Point2d | undefined;\n // console.log ({space: spacePoint.toJSON()});\n this.emitPerpendiculars(\n spacePoint,\n (curvePoint: Point2d, _radians: number | undefined) => {\n const distanceSquared = curvePoint.distanceSquared(spacePoint);\n // console.log ({distanceSquared, xy: curvePoint.toJSON(), minD: minDistanceSquared});\n if (distanceSquared < minDistanceSquared) {\n point = curvePoint.clone();\n minDistanceSquared = distanceSquared;\n }\n }\n );\n return point;\n }\n /** Return true if the item has degenerate defining data. */\n public abstract isDegenerate(): boolean;\n /** Return a clone of the curve. */\n public abstract clone(): ImplicitCurve2d;\n /**\n * OPTIONAL method to return a Point2d at given radians value.\n * * The default implementation returns undefined.\n * * Concrete classes that can be expressed as a function of radians should implement this.\n */\n public radiansToPoint2d(_radians: number): Point2d | undefined {\n return undefined;\n }\n /**\n * OPTIONAL method to return the tangent at given radians value.\n * * The default implementation returns undefined.\n * * Concrete classes that can be expressed as a function of radians should implement this.\n */\n public radiansToTangentVector2d(_radians: number): Vector2d | undefined {\n return undefined;\n }\n}\n\n/**\n * Carrier class containing:\n * * a point\n * * the curve to which the point is related.\n * @internal\n */\nexport class Point2dImplicitCurve2d {\n public point: Point2d;\n public curve: ImplicitCurve2d;\n /**\n * CAPTURE a point and curve.\n * @param point point member\n * @param curve curve member\n */\n public constructor(point: Point2d, curve: ImplicitCurve2d) {\n this.point = point;\n this.curve = curve;\n }\n}\n/**\n * Carrier class containing:\n * * a curve which is a subclass of ImplicitCurve2d\n * * an array of paired point and ImplicitCurve2d.\n * @internal\n */\nexport class ImplicitGeometryMarkup<GeometryType extends ImplicitCurve2d> {\n public curve: GeometryType;\n public data: Point2dImplicitCurve2d[];\n /**\n * Construct a new carrier. The data array is created empty.\n * @param curve curve to CAPTURE\n */\n public constructor(curve: GeometryType) {\n this.curve = curve;\n this.data = [];\n }\n /**\n * * Use the otherCurve's emitPerpendiculars method to examine all perpendiculars from spacePoint to the curve.\n * * For each such point, compute distance from bias point.\n * * Choose the one whose distance is closest to biasDistance.\n * * push the chosen point on the data array.\n * @param spacePoint point to project to otherCurve\n * @param otherCurve target curve for projection\n * @param referencePoint reference point for point selection\n * @param biasDistance preferred distance.\n */\n public appendClosePoint(\n spacePoint: Point2d, otherCurve: ImplicitCurve2d, referencePoint: XAndY, biasDistance: number,\n ): boolean {\n let dMin: undefined | number;\n \n let closestPoint;\n otherCurve.emitPerpendiculars(\n spacePoint,\n (curvePoint: Point2d, _radians: number | undefined) => {\n const d = Math.abs(curvePoint.distance(referencePoint) - Math.abs(biasDistance));\n if (dMin === undefined || d < dMin) {\n dMin = d;\n closestPoint = curvePoint.clone();\n }\n }\n );\n if (closestPoint !== undefined) {\n this.data.push(new Point2dImplicitCurve2d(closestPoint, otherCurve));\n return true;\n }\n return false;\n }\n /**\n * Find closest points of an array of curves.\n * @param spacePoint point to project to otherCurve\n * @param referencePoint reference point for point selection\n * @param biasDistance preferred distance.\n * @param otherCurves array of curves to check.\n */\n public closePointsOfGeometry(\n spacePoint: Point2d, referencePoint: Point2d, biasRadius: number, otherCurves: ImplicitCurve2d[],\n ): void {\n for (const c of otherCurves)\n this.appendClosePoint(spacePoint, c, referencePoint, biasRadius);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ImplicitCurve2dConverter.js","sourceRoot":"","sources":["../../../../../src/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { BezierCurve3dH } from \"../../../bspline/BezierCurve3dH\";\r\nimport { Vector2d } from \"../../../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../../../geometry3d/Point3dVector3d\";\r\nimport { Point4d } from \"../../../geometry4d/Point4d\";\r\nimport { Arc3d } from \"../../Arc3d\";\r\nimport { CurvePrimitive } from \"../../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../../LineSegment3d\";\r\nimport { ImplicitCurve2d } from \"./ImplicitCurve2d\";\r\nimport { UnboundedCircle2dByCenterAndRadius } from \"./UnboundedCircle2d\";\r\nimport { UnboundedEllipse2d } from \"./UnboundedEllipse2d\";\r\nimport { UnboundedHyperbola2d } from \"./UnboundedHyperbola2d\";\r\nimport { UnboundedLine2dByPointAndNormal } from \"./UnboundedLine2d\";\r\nimport { UnboundedParabola2d } from \"./UnboundedParabola2d\";\r\n\r\n/**\r\n * Class to convert between `CurvePrimitive` and `ImplicitCurve2d`.\r\n * @internal\r\n */\r\nexport class ImplicitCurve2dConverter {\r\n /**\r\n * Return an implicit curve for the XY parts of the given curve3d.\r\n * * z components of the input curve are completely ignored\r\n * * input Arc3d can convert to UnboundedEllipse2d or circle\r\n * * Returned curves are untrimmed, i.e. lines do not record endpoints and arcs have no angle range.\r\n * @param curve3d curve to convert. Must be a LineSegment3d or Arc3d. Other curve types return `undefined`.\r\n */\r\n public static createImplicitCurve2dFromCurvePrimitiveXY(curve3d: CurvePrimitive):\r\n ImplicitCurve2d | ImplicitCurve2d[] | undefined {\r\n if (curve3d instanceof LineSegment3d) {\r\n const pointA = curve3d.startPoint();\r\n const pointB = curve3d.endPoint();\r\n return UnboundedLine2dByPointAndNormal.createPointXYPointXY(pointA.x, pointA.y, pointB.x, pointB.y);\r\n } else if (curve3d instanceof Arc3d) {\r\n const center = curve3d.center;\r\n const columnX = curve3d.matrixRef.columnX()\r\n const columnY = curve3d.matrixRef.columnY()\r\n if (curve3d.isCircularXY || curve3d.isDegenerateCircle) {\r\n return UnboundedCircle2dByCenterAndRadius.createXYRadius(\r\n center.x, center.y, columnX.magnitudeXY(),\r\n );\r\n } else {\r\n return UnboundedEllipse2d.createCenterAndAxisVectors(\r\n center, Vector2d.createFrom(columnX), Vector2d.createFrom(columnY),\r\n );\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create a curve primitive from an implicit curve.\r\n * @param source the implicit curve(s) to convert.\r\n * @param sizeHint for unbounded curves, the size hint is used when creating a curve primitive. Larger values create a\r\n * longer curve primitive. Ignored for bounded curves. Default is 10.\r\n */\r\n public static createCurvePrimitiveFromImplicitCurve(\r\n source: ImplicitCurve2d | ImplicitCurve2d[], sizeHint: number = 10,\r\n ): CurvePrimitive | CurvePrimitive[] | undefined {\r\n if (Array.isArray(source)) {\r\n const result: CurvePrimitive[] = [];\r\n for (const s of source) {\r\n const c = this.createCurvePrimitiveFromImplicitCurve(s);\r\n if (c === undefined) {\r\n // ignore it\r\n } else if (c instanceof CurvePrimitive) {\r\n result.push(c);\r\n } else if (Array.isArray(c)) {\r\n for (const c1 of c)\r\n result.push(c1);\r\n }\r\n }\r\n return result;\r\n }\r\n // source is a single curve\r\n if (source instanceof UnboundedCircle2dByCenterAndRadius) {\r\n return Arc3d.createXY(Point3d.createFrom(source.center), source.radius);\r\n } else if (source instanceof UnboundedLine2dByPointAndNormal) {\r\n const vectorAlong = source.vectorAlongLine();\r\n return LineSegment3d.createXYXY(\r\n source.point.x - sizeHint * vectorAlong.x, source.point.y - sizeHint * vectorAlong.y,\r\n source.point.x + sizeHint * vectorAlong.x, source.point.y + sizeHint * vectorAlong.y,\r\n );\r\n } else if (source instanceof UnboundedHyperbola2d) {\r\n const result: CurvePrimitive[] = [];\r\n /* COMMENTED CODE FOR LINESTRING APPROXIMATION\r\n const degreeStep = 10.0;\r\n const degreeLimit = 80.0;\r\n for (const signX of [1, -1]) {\r\n const strokes = [];\r\n for (const theta = Angle.createDegrees(-degreeLimit);\r\n theta.degrees < degreeLimit + 1;\r\n theta.setDegrees(theta.degrees + degreeStep)) {\r\n const c = signX * theta.cos();\r\n const s = theta.sin();\r\n const xy = Point3d.createFrom(source.pointA.plus2Scaled(source.vectorU, 1.0 / c, source.vectorV, s / c));\r\n strokes.push(Point3d.createFrom(xy));\r\n }\r\n result.push(LineString3d.create(strokes));\r\n }\r\n */\r\n // The bezier branches open on plus and minus u axes, with asymptotes at 45 degree angles in local space\r\n // Construct a bezier for 180 degrees of unit circle from negative y to plus 1 with (c,s,w)\r\n // Reverse c and w so its normalized form is (sec, tan, 1)\r\n // Map those so bezier 0 maps to U-V asymptote, bezier 1 maps to U+v, and bezier 0.5 maps to A\r\n // but the secants have 0 weight and evaluate at infinity\r\n // so subdivide to safely within 0..1\r\n // Repeat with negated sign for U to get the other branch.\r\n for (const signU of [1, -1]) {\r\n const poles = [\r\n Point4d.create(signU * source.vectorU.x + source.vectorV.x, signU * source.vectorU.y + source.vectorV.y, 0, 0),\r\n Point4d.create(source.center.x, source.center.y, 0, 1),\r\n Point4d.create(signU * source.vectorU.x - source.vectorV.x, signU * source.vectorU.y - source.vectorV.y, 0, 0),\r\n ];\r\n const fullBezier = BezierCurve3dH.create(poles);\r\n if (fullBezier) {\r\n const branch = fullBezier?.clonePartialCurve(0.05, 0.95);\r\n result.push(branch);\r\n }\r\n }\r\n return result;\r\n } else if (source instanceof UnboundedEllipse2d) {\r\n return Arc3d.create(\r\n Point3d.createFrom(source.center),\r\n Vector3d.createFrom(source.vectorU),\r\n Vector3d.createFrom(source.vectorV),\r\n );\r\n } else if (source instanceof UnboundedParabola2d) {\r\n /*\r\n const halfParabolaPoles = [\r\n Point4d.create (2 * source.pointA.x, 2 *source.pointA.y, 0, 2),\r\n Point4d.create (source.vectorU.x, source.vectorU.y, 0, 0),\r\n Point4d.create (2 * source.vectorV.x, 2 * source.vectorV.y, 0, 0),\r\n ];\r\n */\r\n const point0 = source.center.plus2Scaled(source.vectorU, 1, source.vectorV, 1);\r\n const point1 = source.center.minus(source.vectorV);\r\n const point2 = source.center.plus2Scaled(source.vectorU, -1, source.vectorV, 1);\r\n const poles = [\r\n Point4d.create(point0.x, point0.y, 0, 1),\r\n Point4d.create(point1.x, point1.y, 0, 1),\r\n Point4d.create(point2.x, point2.y, 0, 1),\r\n ];\r\n\r\n const centerBezier = BezierCurve3dH.create(poles);\r\n if (centerBezier !== undefined)\r\n return centerBezier.clonePartialCurve(-2, 3);\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ImplicitCurve2dConverter.js","sourceRoot":"","sources":["../../../../../src/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { BezierCurve3dH } from \"../../../bspline/BezierCurve3dH\";\nimport { Vector2d } from \"../../../geometry3d/Point2dVector2d\";\nimport { Point3d, Vector3d } from \"../../../geometry3d/Point3dVector3d\";\nimport { Point4d } from \"../../../geometry4d/Point4d\";\nimport { Arc3d } from \"../../Arc3d\";\nimport { CurvePrimitive } from \"../../CurvePrimitive\";\nimport { LineSegment3d } from \"../../LineSegment3d\";\nimport { ImplicitCurve2d } from \"./ImplicitCurve2d\";\nimport { UnboundedCircle2dByCenterAndRadius } from \"./UnboundedCircle2d\";\nimport { UnboundedEllipse2d } from \"./UnboundedEllipse2d\";\nimport { UnboundedHyperbola2d } from \"./UnboundedHyperbola2d\";\nimport { UnboundedLine2dByPointAndNormal } from \"./UnboundedLine2d\";\nimport { UnboundedParabola2d } from \"./UnboundedParabola2d\";\n\n/**\n * Class to convert between `CurvePrimitive` and `ImplicitCurve2d`.\n * @internal\n */\nexport class ImplicitCurve2dConverter {\n /**\n * Return an implicit curve for the XY parts of the given curve3d.\n * * z components of the input curve are completely ignored\n * * input Arc3d can convert to UnboundedEllipse2d or circle\n * * Returned curves are untrimmed, i.e. lines do not record endpoints and arcs have no angle range.\n * @param curve3d curve to convert. Must be a LineSegment3d or Arc3d. Other curve types return `undefined`.\n */\n public static createImplicitCurve2dFromCurvePrimitiveXY(curve3d: CurvePrimitive):\n ImplicitCurve2d | ImplicitCurve2d[] | undefined {\n if (curve3d instanceof LineSegment3d) {\n const pointA = curve3d.startPoint();\n const pointB = curve3d.endPoint();\n return UnboundedLine2dByPointAndNormal.createPointXYPointXY(pointA.x, pointA.y, pointB.x, pointB.y);\n } else if (curve3d instanceof Arc3d) {\n const center = curve3d.center;\n const columnX = curve3d.matrixRef.columnX()\n const columnY = curve3d.matrixRef.columnY()\n if (curve3d.isCircularXY || curve3d.isDegenerateCircle) {\n return UnboundedCircle2dByCenterAndRadius.createXYRadius(\n center.x, center.y, columnX.magnitudeXY(),\n );\n } else {\n return UnboundedEllipse2d.createCenterAndAxisVectors(\n center, Vector2d.createFrom(columnX), Vector2d.createFrom(columnY),\n );\n }\n }\n return undefined;\n }\n /**\n * Create a curve primitive from an implicit curve.\n * @param source the implicit curve(s) to convert.\n * @param sizeHint for unbounded curves, the size hint is used when creating a curve primitive. Larger values create a\n * longer curve primitive. Ignored for bounded curves. Default is 10.\n */\n public static createCurvePrimitiveFromImplicitCurve(\n source: ImplicitCurve2d | ImplicitCurve2d[], sizeHint: number = 10,\n ): CurvePrimitive | CurvePrimitive[] | undefined {\n if (Array.isArray(source)) {\n const result: CurvePrimitive[] = [];\n for (const s of source) {\n const c = this.createCurvePrimitiveFromImplicitCurve(s);\n if (c === undefined) {\n // ignore it\n } else if (c instanceof CurvePrimitive) {\n result.push(c);\n } else if (Array.isArray(c)) {\n for (const c1 of c)\n result.push(c1);\n }\n }\n return result;\n }\n // source is a single curve\n if (source instanceof UnboundedCircle2dByCenterAndRadius) {\n return Arc3d.createXY(Point3d.createFrom(source.center), source.radius);\n } else if (source instanceof UnboundedLine2dByPointAndNormal) {\n const vectorAlong = source.vectorAlongLine();\n return LineSegment3d.createXYXY(\n source.point.x - sizeHint * vectorAlong.x, source.point.y - sizeHint * vectorAlong.y,\n source.point.x + sizeHint * vectorAlong.x, source.point.y + sizeHint * vectorAlong.y,\n );\n } else if (source instanceof UnboundedHyperbola2d) {\n const result: CurvePrimitive[] = [];\n /* COMMENTED CODE FOR LINESTRING APPROXIMATION\n const degreeStep = 10.0;\n const degreeLimit = 80.0;\n for (const signX of [1, -1]) {\n const strokes = [];\n for (const theta = Angle.createDegrees(-degreeLimit);\n theta.degrees < degreeLimit + 1;\n theta.setDegrees(theta.degrees + degreeStep)) {\n const c = signX * theta.cos();\n const s = theta.sin();\n const xy = Point3d.createFrom(source.pointA.plus2Scaled(source.vectorU, 1.0 / c, source.vectorV, s / c));\n strokes.push(Point3d.createFrom(xy));\n }\n result.push(LineString3d.create(strokes));\n }\n */\n // The bezier branches open on plus and minus u axes, with asymptotes at 45 degree angles in local space\n // Construct a bezier for 180 degrees of unit circle from negative y to plus 1 with (c,s,w)\n // Reverse c and w so its normalized form is (sec, tan, 1)\n // Map those so bezier 0 maps to U-V asymptote, bezier 1 maps to U+v, and bezier 0.5 maps to A\n // but the secants have 0 weight and evaluate at infinity\n // so subdivide to safely within 0..1\n // Repeat with negated sign for U to get the other branch.\n for (const signU of [1, -1]) {\n const poles = [\n Point4d.create(signU * source.vectorU.x + source.vectorV.x, signU * source.vectorU.y + source.vectorV.y, 0, 0),\n Point4d.create(source.center.x, source.center.y, 0, 1),\n Point4d.create(signU * source.vectorU.x - source.vectorV.x, signU * source.vectorU.y - source.vectorV.y, 0, 0),\n ];\n const fullBezier = BezierCurve3dH.create(poles);\n if (fullBezier) {\n const branch = fullBezier?.clonePartialCurve(0.05, 0.95);\n result.push(branch);\n }\n }\n return result;\n } else if (source instanceof UnboundedEllipse2d) {\n return Arc3d.create(\n Point3d.createFrom(source.center),\n Vector3d.createFrom(source.vectorU),\n Vector3d.createFrom(source.vectorV),\n );\n } else if (source instanceof UnboundedParabola2d) {\n /*\n const halfParabolaPoles = [\n Point4d.create (2 * source.pointA.x, 2 *source.pointA.y, 0, 2),\n Point4d.create (source.vectorU.x, source.vectorU.y, 0, 0),\n Point4d.create (2 * source.vectorV.x, 2 * source.vectorV.y, 0, 0),\n ];\n */\n const point0 = source.center.plus2Scaled(source.vectorU, 1, source.vectorV, 1);\n const point1 = source.center.minus(source.vectorV);\n const point2 = source.center.plus2Scaled(source.vectorU, -1, source.vectorV, 1);\n const poles = [\n Point4d.create(point0.x, point0.y, 0, 1),\n Point4d.create(point1.x, point1.y, 0, 1),\n Point4d.create(point2.x, point2.y, 0, 1),\n ];\n\n const centerBezier = BezierCurve3dH.create(poles);\n if (centerBezier !== undefined)\n return centerBezier.clonePartialCurve(-2, 3);\n }\n return undefined;\n }\n}\n"]}