circle.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { distance, piMod } from './util';
  2. import { BBox, Point } from './types';
  3. export default {
  4. /**
  5. * 计算包围盒
  6. * @param {number} x 圆心 x
  7. * @param {number} y 圆心 y
  8. * @param {number} r 半径
  9. * @return {object} 包围盒
  10. */
  11. box(x: number, y: number, r: number): BBox {
  12. return {
  13. x: x - r,
  14. y: y - r,
  15. width: 2 * r,
  16. height: 2 * r,
  17. };
  18. },
  19. /**
  20. * 计算周长
  21. * @param {number} x 圆心 x
  22. * @param {number} y 圆心 y
  23. * @param {number} r 半径
  24. * @return {number} 周长
  25. */
  26. length(x: number, y: number, r: number) {
  27. return Math.PI * 2 * r;
  28. },
  29. /**
  30. * 根据比例获取点
  31. * @param {number} x 圆心 x
  32. * @param {number} y 圆心 y
  33. * @param {number} r 半径
  34. * @param {number} t 指定比例,x轴方向为 0
  35. * @return {object} 点
  36. */
  37. pointAt(x: number, y: number, r: number, t: number): Point {
  38. const angle = Math.PI * 2 * t;
  39. return {
  40. x: x + r * Math.cos(angle),
  41. y: y + r * Math.sin(angle),
  42. };
  43. },
  44. /**
  45. * 点到圆的距离
  46. * @param {number} x 圆心 x
  47. * @param {number} y 圆心 y
  48. * @param {number} r 半径
  49. * @param {number} x0 指定的点 x
  50. * @param {number} y0 指定的点 y
  51. * @return {number} 距离
  52. */
  53. pointDistance(x: number, y: number, r: number, x0: number, y0: number) {
  54. return Math.abs(distance(x, y, x0, y0) - r);
  55. },
  56. /**
  57. * 根据比例计算切线角度
  58. * @param {number} x 圆心 x
  59. * @param {number} y 圆心 y
  60. * @param {number} r 半径
  61. * @param {number} t 指定比例 0 - 1 之间,x轴方向为 0。在 0-1 范围之外是循环还是返回 null,还需要调整
  62. * @return {number} 角度,在 0 - 2PI 之间
  63. */
  64. tangentAngle(x: number, y: number, r: number, t) {
  65. const angle = Math.PI * 2 * t;
  66. return piMod(angle + Math.PI / 2);
  67. },
  68. };