studio_geo_c.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /**
  2. ******************************************************************************
  3. * @file : studio_geo_c.h
  4. * @author : wangyingjie
  5. * @brief : 几何矢量类型 C 语言版
  6. * 包括: 点、多点、线、环、面 、圆、 三角、 椭圆
  7. * @attention : None
  8. * @date : 2025/5/10
  9. ******************************************************************************
  10. */
  11. #ifndef STUDIO_GEO_C_H
  12. #define STUDIO_GEO_C_H
  13. #include <stdio.h>
  14. #include <math.h>
  15. #include <stdlib.h>
  16. #include <stdbool.h>
  17. #define AO_EPSILON 1e-6
  18. #define AO_M_PI 3.14159265358979323846
  19. /****************************************/
  20. /// 点
  21. /****************************************/
  22. typedef struct
  23. {
  24. double x;
  25. double y;
  26. } studio_point_c;
  27. /// 初始化点
  28. /// \param xx
  29. /// \param yy
  30. /// \return
  31. studio_point_c studio_point_init(double xx, double yy);
  32. /// 判断两个点是否相等
  33. /// \param p1
  34. /// \param p2
  35. /// \return true 表示 相等
  36. bool studio_point_equal(const studio_point_c *p1, const studio_point_c *p2);
  37. /****************************************/
  38. /// 线
  39. /****************************************/
  40. typedef struct
  41. {
  42. studio_point_c *data; // 点数据指针
  43. unsigned int size; // 当前元素个数
  44. unsigned int capacity; // 当前分配的内存容量
  45. } studio_line_c;
  46. // 初始化线段 (默认容量为4)
  47. studio_line_c studio_line_c_init();
  48. // 销毁线段 (释放内存)
  49. void studio_line_c_destroy(studio_line_c *line);
  50. // 添加点 (自动扩容)
  51. void studio_line_c_add_point(studio_line_c *line, studio_point_c point);
  52. // 获取当前元素数量
  53. unsigned int studio_line_c_size(const studio_line_c *line);
  54. // 获取指定位置的点的引用 (注意索引越界问题)
  55. const studio_point_c *studio_line_c_get_point(const studio_line_c *line, unsigned int index);
  56. /****************************************/
  57. /// 矩形框
  58. /****************************************/
  59. typedef struct
  60. {
  61. studio_point_c left_top;
  62. studio_point_c right_bottom;
  63. } studio_rect_c;
  64. studio_rect_c studio_rect_init(double l, double t, double r, double b);
  65. /// 矩形框校正
  66. /// \param rect
  67. void studio_rect_correct(studio_rect_c *rect);
  68. /// 矩形框是否相交
  69. /// \param r1
  70. /// \param r2
  71. /// \return
  72. bool studio_rect_intersect(const studio_rect_c *r1, const studio_rect_c *r2);
  73. /****************************************/
  74. /// 圆
  75. /****************************************/
  76. typedef struct
  77. {
  78. studio_point_c center;
  79. double radius;
  80. } studio_circle_c;
  81. /// 初始化圆
  82. /// \param center 圆心
  83. /// \param radius 半径
  84. /// \return
  85. studio_circle_c studio_circle_init(studio_point_c center, double radius);
  86. /// 计算圆的面积
  87. /// \param circle
  88. /// \return
  89. double studio_circle_area(const studio_circle_c *circle);
  90. /****************************************/
  91. /// 三角形
  92. /****************************************/
  93. typedef struct
  94. {
  95. studio_point_c a;
  96. studio_point_c b;
  97. studio_point_c c;
  98. } studio_triangle_c;
  99. /// 初始化三角形
  100. /// \param a
  101. /// \param b
  102. /// \param c
  103. /// \return
  104. studio_triangle_c studio_triangle_init(studio_point_c a, studio_point_c b, studio_point_c c);
  105. /// 计算三角形的面积
  106. /// \param triangle
  107. /// \return
  108. double studio_triangle_oriented_area(const studio_triangle_c *triangle);
  109. /// 计算三角形的面积
  110. /// \param triangle
  111. /// \return
  112. double studio_triangle_area(const studio_triangle_c *triangle);
  113. /****************************************/
  114. /// 椭圆
  115. /****************************************/
  116. typedef struct
  117. {
  118. studio_point_c center;
  119. double rx;
  120. double ry;
  121. } studio_ellipse_c;
  122. studio_ellipse_c studio_ellipse_init(studio_point_c center, double rx, double ry);
  123. /// 计算椭圆的面积
  124. /// \param ellipse
  125. /// \return
  126. double studio_ellipse_area(const studio_ellipse_c *ellipse);
  127. /// 计算椭圆的周长
  128. /// \param ellipse
  129. /// \param Ramanujan
  130. /// \return
  131. double studio_ellipse_circumference(const studio_ellipse_c *ellipse, int Ramanujan);
  132. #endif // STUDIO_GEO_C_H