arc.ts 690 B

1234567891011121314151617181920
  1. import { cartesian2Polar } from "./angle";
  2. import type { GlobalPoint, LocalPoint, SymmetricArc } from "./types";
  3. import { PRECISION } from "./utils";
  4. /**
  5. * Determines if a cartesian point lies on a symmetric arc, i.e. an arc which
  6. * is part of a circle contour centered on 0, 0.
  7. */
  8. export const isPointOnSymmetricArc = <P extends GlobalPoint | LocalPoint>(
  9. { radius: arcRadius, startAngle, endAngle }: SymmetricArc,
  10. point: P,
  11. ): boolean => {
  12. const [radius, angle] = cartesian2Polar(point);
  13. return startAngle < endAngle
  14. ? Math.abs(radius - arcRadius) < PRECISION &&
  15. startAngle <= angle &&
  16. endAngle >= angle
  17. : startAngle <= angle || endAngle >= angle;
  18. };