@itwin/core-geometry 5.7.2 → 5.8.0-dev.10

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 (242) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/lib/cjs/Geometry.d.ts +24 -14
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +34 -14
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurve.d.ts +1 -1
  7. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  8. package/lib/cjs/bspline/BSplineCurve.js +1 -1
  9. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  10. package/lib/cjs/clipping/ClipPrimitive.d.ts +2 -1
  11. package/lib/cjs/clipping/ClipPrimitive.d.ts.map +1 -1
  12. package/lib/cjs/clipping/ClipPrimitive.js +2 -1
  13. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  14. package/lib/cjs/core-geometry.d.ts +1 -0
  15. package/lib/cjs/core-geometry.d.ts.map +1 -1
  16. package/lib/cjs/core-geometry.js +1 -0
  17. package/lib/cjs/core-geometry.js.map +1 -1
  18. package/lib/cjs/curve/Arc3d.d.ts +19 -3
  19. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  20. package/lib/cjs/curve/Arc3d.js +50 -23
  21. package/lib/cjs/curve/Arc3d.js.map +1 -1
  22. package/lib/cjs/curve/ConstrainedCurve2d.d.ts +149 -0
  23. package/lib/cjs/curve/ConstrainedCurve2d.d.ts.map +1 -0
  24. package/lib/cjs/curve/ConstrainedCurve2d.js +317 -0
  25. package/lib/cjs/curve/ConstrainedCurve2d.js.map +1 -0
  26. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +18 -5
  27. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  28. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +34 -14
  29. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  30. package/lib/cjs/curve/CurveCollection.d.ts +12 -11
  31. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  32. package/lib/cjs/curve/CurveCollection.js +36 -36
  33. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  34. package/lib/cjs/curve/CurveExtendMode.d.ts +5 -5
  35. package/lib/cjs/curve/CurveExtendMode.d.ts.map +1 -1
  36. package/lib/cjs/curve/CurveExtendMode.js +4 -1
  37. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  38. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  39. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  40. package/lib/cjs/curve/CurvePrimitive.d.ts +14 -2
  41. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  42. package/lib/cjs/curve/CurvePrimitive.js +19 -3
  43. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  44. package/lib/cjs/curve/LineSegment3d.d.ts +2 -2
  45. package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
  46. package/lib/cjs/curve/LineSegment3d.js +2 -2
  47. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  48. package/lib/cjs/curve/LineString3d.d.ts +1 -1
  49. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  50. package/lib/cjs/curve/LineString3d.js +1 -1
  51. package/lib/cjs/curve/LineString3d.js.map +1 -1
  52. package/lib/cjs/curve/Path.d.ts +4 -15
  53. package/lib/cjs/curve/Path.d.ts.map +1 -1
  54. package/lib/cjs/curve/Path.js +1 -35
  55. package/lib/cjs/curve/Path.js.map +1 -1
  56. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +2 -1
  57. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  58. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +18 -13
  59. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  60. package/lib/cjs/curve/internalContexts/PointToCurveTangentHandler.d.ts +26 -0
  61. package/lib/cjs/curve/internalContexts/PointToCurveTangentHandler.d.ts.map +1 -0
  62. package/lib/cjs/curve/internalContexts/PointToCurveTangentHandler.js +78 -0
  63. package/lib/cjs/curve/internalContexts/PointToCurveTangentHandler.js.map +1 -0
  64. package/lib/cjs/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.d.ts +152 -0
  65. package/lib/cjs/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.d.ts.map +1 -0
  66. package/lib/cjs/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.js +843 -0
  67. package/lib/cjs/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.js.map +1 -0
  68. package/lib/cjs/curve/internalContexts/geometry2d/ConstraintSet.d.ts +97 -0
  69. package/lib/cjs/curve/internalContexts/geometry2d/ConstraintSet.d.ts.map +1 -0
  70. package/lib/cjs/curve/internalContexts/geometry2d/ConstraintSet.js +300 -0
  71. package/lib/cjs/curve/internalContexts/geometry2d/ConstraintSet.js.map +1 -0
  72. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2d.d.ts +105 -0
  73. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2d.d.ts.map +1 -0
  74. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2d.js +141 -0
  75. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2d.js.map +1 -0
  76. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.d.ts +27 -0
  77. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.d.ts.map +1 -0
  78. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.js +152 -0
  79. package/lib/cjs/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.js.map +1 -0
  80. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedCircle2d.d.ts +81 -0
  81. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedCircle2d.d.ts.map +1 -0
  82. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedCircle2d.js +170 -0
  83. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedCircle2d.js.map +1 -0
  84. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedEllipse2d.d.ts +96 -0
  85. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedEllipse2d.d.ts.map +1 -0
  86. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedEllipse2d.js +187 -0
  87. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedEllipse2d.js.map +1 -0
  88. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedHyperbola2d.d.ts +91 -0
  89. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedHyperbola2d.d.ts.map +1 -0
  90. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedHyperbola2d.js +197 -0
  91. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedHyperbola2d.js.map +1 -0
  92. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedLine2d.d.ts +129 -0
  93. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedLine2d.d.ts.map +1 -0
  94. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedLine2d.js +208 -0
  95. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedLine2d.js.map +1 -0
  96. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedParabola2d.d.ts +87 -0
  97. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedParabola2d.d.ts.map +1 -0
  98. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedParabola2d.js +193 -0
  99. package/lib/cjs/curve/internalContexts/geometry2d/UnboundedParabola2d.js.map +1 -0
  100. package/lib/cjs/geometry3d/Ellipsoid.d.ts +2 -1
  101. package/lib/cjs/geometry3d/Ellipsoid.d.ts.map +1 -1
  102. package/lib/cjs/geometry3d/Ellipsoid.js +2 -1
  103. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  104. package/lib/cjs/geometry3d/Point2dVector2d.d.ts +7 -0
  105. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  106. package/lib/cjs/geometry3d/Point2dVector2d.js +9 -0
  107. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  108. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  109. package/lib/cjs/geometry3d/Ray3d.d.ts +5 -0
  110. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  111. package/lib/cjs/geometry3d/Ray3d.js +7 -0
  112. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  113. package/lib/cjs/numerics/Newton.d.ts.map +1 -1
  114. package/lib/cjs/numerics/Newton.js +2 -1
  115. package/lib/cjs/numerics/Newton.js.map +1 -1
  116. package/lib/cjs/numerics/Polynomials.d.ts.map +1 -1
  117. package/lib/cjs/numerics/Polynomials.js +8 -6
  118. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  119. package/lib/cjs/topology/HalfEdgeGraphSpineContext.d.ts.map +1 -1
  120. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js +3 -1
  121. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  122. package/lib/esm/Geometry.d.ts +24 -14
  123. package/lib/esm/Geometry.d.ts.map +1 -1
  124. package/lib/esm/Geometry.js +34 -14
  125. package/lib/esm/Geometry.js.map +1 -1
  126. package/lib/esm/bspline/BSplineCurve.d.ts +1 -1
  127. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  128. package/lib/esm/bspline/BSplineCurve.js +1 -1
  129. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  130. package/lib/esm/clipping/ClipPrimitive.d.ts +2 -1
  131. package/lib/esm/clipping/ClipPrimitive.d.ts.map +1 -1
  132. package/lib/esm/clipping/ClipPrimitive.js +2 -1
  133. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  134. package/lib/esm/core-geometry.d.ts +1 -0
  135. package/lib/esm/core-geometry.d.ts.map +1 -1
  136. package/lib/esm/core-geometry.js +1 -0
  137. package/lib/esm/core-geometry.js.map +1 -1
  138. package/lib/esm/curve/Arc3d.d.ts +19 -3
  139. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  140. package/lib/esm/curve/Arc3d.js +50 -23
  141. package/lib/esm/curve/Arc3d.js.map +1 -1
  142. package/lib/esm/curve/ConstrainedCurve2d.d.ts +149 -0
  143. package/lib/esm/curve/ConstrainedCurve2d.d.ts.map +1 -0
  144. package/lib/esm/curve/ConstrainedCurve2d.js +313 -0
  145. package/lib/esm/curve/ConstrainedCurve2d.js.map +1 -0
  146. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +18 -5
  147. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  148. package/lib/esm/curve/CurveChainWithDistanceIndex.js +34 -14
  149. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  150. package/lib/esm/curve/CurveCollection.d.ts +12 -11
  151. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  152. package/lib/esm/curve/CurveCollection.js +36 -36
  153. package/lib/esm/curve/CurveCollection.js.map +1 -1
  154. package/lib/esm/curve/CurveExtendMode.d.ts +5 -5
  155. package/lib/esm/curve/CurveExtendMode.d.ts.map +1 -1
  156. package/lib/esm/curve/CurveExtendMode.js +4 -1
  157. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  158. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  159. package/lib/esm/curve/CurveFactory.js.map +1 -1
  160. package/lib/esm/curve/CurvePrimitive.d.ts +14 -2
  161. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  162. package/lib/esm/curve/CurvePrimitive.js +19 -3
  163. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  164. package/lib/esm/curve/LineSegment3d.d.ts +2 -2
  165. package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
  166. package/lib/esm/curve/LineSegment3d.js +2 -2
  167. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  168. package/lib/esm/curve/LineString3d.d.ts +1 -1
  169. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  170. package/lib/esm/curve/LineString3d.js +1 -1
  171. package/lib/esm/curve/LineString3d.js.map +1 -1
  172. package/lib/esm/curve/Path.d.ts +4 -15
  173. package/lib/esm/curve/Path.d.ts.map +1 -1
  174. package/lib/esm/curve/Path.js +1 -35
  175. package/lib/esm/curve/Path.js.map +1 -1
  176. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +2 -1
  177. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
  178. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +19 -14
  179. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  180. package/lib/esm/curve/internalContexts/PointToCurveTangentHandler.d.ts +26 -0
  181. package/lib/esm/curve/internalContexts/PointToCurveTangentHandler.d.ts.map +1 -0
  182. package/lib/esm/curve/internalContexts/PointToCurveTangentHandler.js +74 -0
  183. package/lib/esm/curve/internalContexts/PointToCurveTangentHandler.js.map +1 -0
  184. package/lib/esm/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.d.ts +152 -0
  185. package/lib/esm/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.d.ts.map +1 -0
  186. package/lib/esm/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.js +839 -0
  187. package/lib/esm/curve/internalContexts/geometry2d/ConstrainedImplicitCurve2d.js.map +1 -0
  188. package/lib/esm/curve/internalContexts/geometry2d/ConstraintSet.d.ts +97 -0
  189. package/lib/esm/curve/internalContexts/geometry2d/ConstraintSet.d.ts.map +1 -0
  190. package/lib/esm/curve/internalContexts/geometry2d/ConstraintSet.js +295 -0
  191. package/lib/esm/curve/internalContexts/geometry2d/ConstraintSet.js.map +1 -0
  192. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2d.d.ts +105 -0
  193. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2d.d.ts.map +1 -0
  194. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2d.js +135 -0
  195. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2d.js.map +1 -0
  196. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.d.ts +27 -0
  197. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.d.ts.map +1 -0
  198. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.js +148 -0
  199. package/lib/esm/curve/internalContexts/geometry2d/ImplicitCurve2dConverter.js.map +1 -0
  200. package/lib/esm/curve/internalContexts/geometry2d/UnboundedCircle2d.d.ts +81 -0
  201. package/lib/esm/curve/internalContexts/geometry2d/UnboundedCircle2d.d.ts.map +1 -0
  202. package/lib/esm/curve/internalContexts/geometry2d/UnboundedCircle2d.js +166 -0
  203. package/lib/esm/curve/internalContexts/geometry2d/UnboundedCircle2d.js.map +1 -0
  204. package/lib/esm/curve/internalContexts/geometry2d/UnboundedEllipse2d.d.ts +96 -0
  205. package/lib/esm/curve/internalContexts/geometry2d/UnboundedEllipse2d.d.ts.map +1 -0
  206. package/lib/esm/curve/internalContexts/geometry2d/UnboundedEllipse2d.js +183 -0
  207. package/lib/esm/curve/internalContexts/geometry2d/UnboundedEllipse2d.js.map +1 -0
  208. package/lib/esm/curve/internalContexts/geometry2d/UnboundedHyperbola2d.d.ts +91 -0
  209. package/lib/esm/curve/internalContexts/geometry2d/UnboundedHyperbola2d.d.ts.map +1 -0
  210. package/lib/esm/curve/internalContexts/geometry2d/UnboundedHyperbola2d.js +193 -0
  211. package/lib/esm/curve/internalContexts/geometry2d/UnboundedHyperbola2d.js.map +1 -0
  212. package/lib/esm/curve/internalContexts/geometry2d/UnboundedLine2d.d.ts +129 -0
  213. package/lib/esm/curve/internalContexts/geometry2d/UnboundedLine2d.d.ts.map +1 -0
  214. package/lib/esm/curve/internalContexts/geometry2d/UnboundedLine2d.js +204 -0
  215. package/lib/esm/curve/internalContexts/geometry2d/UnboundedLine2d.js.map +1 -0
  216. package/lib/esm/curve/internalContexts/geometry2d/UnboundedParabola2d.d.ts +87 -0
  217. package/lib/esm/curve/internalContexts/geometry2d/UnboundedParabola2d.d.ts.map +1 -0
  218. package/lib/esm/curve/internalContexts/geometry2d/UnboundedParabola2d.js +189 -0
  219. package/lib/esm/curve/internalContexts/geometry2d/UnboundedParabola2d.js.map +1 -0
  220. package/lib/esm/geometry3d/Ellipsoid.d.ts +2 -1
  221. package/lib/esm/geometry3d/Ellipsoid.d.ts.map +1 -1
  222. package/lib/esm/geometry3d/Ellipsoid.js +2 -1
  223. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  224. package/lib/esm/geometry3d/Point2dVector2d.d.ts +7 -0
  225. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  226. package/lib/esm/geometry3d/Point2dVector2d.js +9 -0
  227. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  228. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  229. package/lib/esm/geometry3d/Ray3d.d.ts +5 -0
  230. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  231. package/lib/esm/geometry3d/Ray3d.js +7 -0
  232. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  233. package/lib/esm/numerics/Newton.d.ts.map +1 -1
  234. package/lib/esm/numerics/Newton.js +2 -1
  235. package/lib/esm/numerics/Newton.js.map +1 -1
  236. package/lib/esm/numerics/Polynomials.d.ts.map +1 -1
  237. package/lib/esm/numerics/Polynomials.js +8 -6
  238. package/lib/esm/numerics/Polynomials.js.map +1 -1
  239. package/lib/esm/topology/HalfEdgeGraphSpineContext.d.ts.map +1 -1
  240. package/lib/esm/topology/HalfEdgeGraphSpineContext.js +3 -1
  241. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  242. package/package.json +3 -3
@@ -767,48 +767,61 @@ export class Arc3d extends CurvePrimitive {
767
767
  /**
768
768
  * Return details of the closest point on the arc, optionally extending to full ellipse.
769
769
  * @param spacePoint search for point closest to this point.
770
- * @param extend if true, consider projections to the complete ellipse. If false, consider only endpoints and
771
- * projections within the arc sweep.
770
+ * @param extend if true, consider projections to the complete ellipse. If false (default), consider only endpoints
771
+ * and projections within the arc sweep. Note that for an open arc, extending one end is the same as extending both ends.
772
772
  * @param result optional preallocated result.
773
773
  */
774
- closestPoint(spacePoint, extend, result) {
774
+ closestPoint(spacePoint, extend = false, result) {
775
775
  result = CurveLocationDetail.create(this, result);
776
- const allRadians = this.allPerpendicularAngles(spacePoint, true, true);
777
- let extend0 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0);
778
- let extend1 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1);
779
- // distinct extends for cyclic space are awkward ....
780
- if (this._sweep.isFullCircle) {
781
- extend0 = CurveExtendMode.None;
782
- extend1 = CurveExtendMode.None;
783
- }
784
- if (extend0 !== CurveExtendMode.None && extend1 !== CurveExtendMode.None) {
785
- allRadians.push(this._sweep.startRadians);
786
- allRadians.push(this._sweep.endRadians);
776
+ const allRadians = this.allPerpendicularAngles(spacePoint, true, false);
777
+ // test endpoints if and only if arc is open and unextended
778
+ if (!this._sweep.isFullCircle) {
779
+ const extend0 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0);
780
+ const extend1 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1);
781
+ if (extend0 === CurveExtendMode.None && extend1 === CurveExtendMode.None) {
782
+ allRadians.push(this._sweep.startRadians);
783
+ allRadians.push(this._sweep.endRadians);
784
+ }
787
785
  }
788
- // hm... logically there must at least two angles there ... but if it happens return the start point ...
789
786
  const workRay = Ray3d.createZero();
790
- if (allRadians.length === 0) {
791
- result.setFR(0.0, this.radiansToPointAndDerivative(this._sweep.startRadians, workRay));
792
- result.a = spacePoint.distance(result.point);
787
+ if (allRadians.length === 0) { // shouldn't happen; there should always be at least 2 angles
788
+ result.setFR(0.0, this.radiansToPointAndDerivative(this._sweep.startRadians, workRay), spacePoint.distance(result.point));
793
789
  }
794
790
  else {
795
791
  let dMin = Number.MAX_VALUE;
796
792
  let d = 0;
797
793
  for (const radians of allRadians) {
798
- const fraction = CurveExtendOptions.resolveRadiansToSweepFraction(extend, radians, this.sweep);
799
- if (fraction !== undefined) {
800
- this.fractionToPointAndDerivative(fraction, workRay);
794
+ const validatedFraction = CurveExtendOptions.resolveRadiansToValidSweepFraction(extend, radians, this.sweep);
795
+ if (validatedFraction.isValid) {
796
+ this.fractionToPointAndDerivative(validatedFraction.fraction, workRay);
801
797
  d = spacePoint.distance(workRay.origin);
802
798
  if (d < dMin) {
803
799
  dMin = d;
804
- result.setFR(fraction, workRay);
805
- result.a = d;
800
+ result.setFR(validatedFraction.fraction, workRay, d);
806
801
  }
807
802
  }
808
803
  }
809
804
  }
810
805
  return result;
811
806
  }
807
+ /**
808
+ * Search for a point on the Arc3d that is closest to the spacePoint as viewed in the xy-plane (ignoring z).
809
+ * * If the space point is exactly on the curve, this is the reverse of fractionToPoint.
810
+ * * Since CurvePrimitive should always have start and end available as candidate points, this method should always
811
+ * succeed.
812
+ * @param spacePoint point in space.
813
+ * @param extend if true, consider projections to the complete ellipse. If false (default), consider only endpoints
814
+ * and projections within the arc sweep. Note that for an open arc, extending one end is the same as extending both ends.
815
+ * @param result (optional) pre-allocated detail to populate and return.
816
+ * @returns details of the closest point.
817
+ */
818
+ closestPointXY(spacePoint, extend = false, result) {
819
+ // prevent `ClosestPointStroker.claimResult` from clamping an exterior fraction when arc is half-extended
820
+ const extend0 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0);
821
+ const extend1 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1);
822
+ extend = extend0 !== CurveExtendMode.None || extend1 !== CurveExtendMode.None;
823
+ return super.closestPointXY(spacePoint, extend, result); // TODO: implement exact solution instead of deferring to superclass
824
+ }
812
825
  /** Override of [[CurvePrimitive.emitTangents]] for Arc3d. */
813
826
  emitTangents(spacePoint, announceTangent, options) {
814
827
  const centerToPoint = Vector3d.createStartEnd(this.centerRef, spacePoint);
@@ -876,6 +889,20 @@ export class Arc3d extends CurvePrimitive {
876
889
  const axy = this._matrix.columnXDotColumnY();
877
890
  return Angle.isPerpendicularDotSet(axx, ayy, axy) && Geometry.isSameCoordinateSquared(axx, ayy);
878
891
  }
892
+ /** Return true if the vector0 and vector90 xy parts are of equal length and perpendicular. */
893
+ get isCircularXY() {
894
+ const columnX = this._matrix.columnX();
895
+ const columnY = this._matrix.columnY();
896
+ const axx = columnX.magnitudeSquaredXY();
897
+ const ayy = columnY.magnitudeSquaredXY();
898
+ const axy = columnX.dotProductXY(columnY);
899
+ return Angle.isPerpendicularDotSet(axx, ayy, axy) && Geometry.isSameCoordinateSquared(axx, ayy);
900
+ }
901
+ /** Return true if the arc has zero radius (is a point). */
902
+ get isDegenerateCircle() {
903
+ return Geometry.isSmallMetricDistanceSquared(this._matrix.columnXMagnitudeSquared()) &&
904
+ Geometry.isSmallMetricDistanceSquared(this._matrix.columnYMagnitudeSquared());
905
+ }
879
906
  /** Return radius if the vector0 and vector90 are of equal length and perpendicular. Ignores z. */
880
907
  circularRadiusXY() {
881
908
  const ux = this._matrix.at(0, 0);