studio_geo_c.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. // 该变量类型的定义为: studio_line_c temp_line = studio_line_c_init();
  41. // 并且 需要调用 studio_line_c_destroy(&temp_line); 释放内存
  42. typedef struct
  43. {
  44. studio_point_c* data; // 点数据指针
  45. unsigned int size; // 当前元素个数
  46. unsigned int capacity; // 当前分配的内存容量
  47. } studio_line_c;
  48. // 初始化线段 (默认容量为4)
  49. /// 初始化线
  50. /// @return 返回初始化的点类型
  51. studio_line_c studio_line_c_init();
  52. /// 销毁线段 (释放内存)
  53. /// @param line
  54. void studio_line_c_destroy(studio_line_c* line);
  55. /// 尾部添加点
  56. /// @param line 线段指针
  57. /// @param point 点
  58. void studio_line_c_add_point(studio_line_c* line, studio_point_c point);
  59. /// 从线段中删除指定索引的点
  60. /// \param line 线段指针
  61. /// \param index 要删除的点的索引 (索引从0开始)
  62. /// \return true 表示删除成功,false 表示索引无效
  63. bool studio_line_c_remove_point(studio_line_c* line, unsigned int index);
  64. /// 获取当前元素数量
  65. /// @param line 线段
  66. /// @return 当前元素数量
  67. unsigned int studio_line_c_size(const studio_line_c* line);
  68. // 获取指定位置的点的引用 (注意索引越界问题)
  69. /// 获取指定位置的点的引用,如果下标越界 则返回 (0,0)
  70. /// @param line 线段
  71. /// @param index 索引 (索引从0开始)
  72. /// @return 点
  73. studio_point_c studio_line_c_get_point(const studio_line_c* line, unsigned int index);
  74. /// 修改指定索引位置的值
  75. /// @param line 线段
  76. /// @param index 索引 (索引从0开始)
  77. /// @param point 点
  78. /// @return true 表示修改成功,false 表示索引无效
  79. bool studio_line_c_set_point(studio_line_c* line, unsigned int index, studio_point_c point);
  80. /****************************************/
  81. /// 矩形框
  82. /****************************************/
  83. typedef struct
  84. {
  85. studio_point_c left_top;
  86. studio_point_c right_bottom;
  87. } studio_rect_c;
  88. studio_rect_c studio_rect_init(double l, double t, double r, double b);
  89. /// 矩形框校正
  90. /// \param rect
  91. void studio_rect_correct(studio_rect_c* rect);
  92. /// 矩形框是否相交
  93. /// \param r1
  94. /// \param r2
  95. /// \return
  96. bool studio_rect_intersect(const studio_rect_c* r1, const studio_rect_c* r2);
  97. /****************************************/
  98. /// 圆
  99. /****************************************/
  100. typedef struct
  101. {
  102. studio_point_c center;
  103. double radius;
  104. } studio_circle_c;
  105. /// 初始化圆
  106. /// \param center 圆心
  107. /// \param radius 半径
  108. /// \return
  109. studio_circle_c studio_circle_init(studio_point_c center, double radius);
  110. /// 计算圆的面积
  111. /// \param circle
  112. /// \return
  113. double studio_circle_area(const studio_circle_c* circle);
  114. /****************************************/
  115. /// 三角形
  116. /****************************************/
  117. typedef struct
  118. {
  119. studio_point_c a;
  120. studio_point_c b;
  121. studio_point_c c;
  122. } studio_triangle_c;
  123. /// 初始化三角形
  124. /// \param a
  125. /// \param b
  126. /// \param c
  127. /// \return
  128. studio_triangle_c studio_triangle_init(studio_point_c a, studio_point_c b, studio_point_c c);
  129. /// 计算三角形的面积
  130. /// \param triangle
  131. /// \return
  132. double studio_triangle_oriented_area(const studio_triangle_c* triangle);
  133. /// 计算三角形的面积
  134. /// \param triangle
  135. /// \return
  136. double studio_triangle_area(const studio_triangle_c* triangle);
  137. /****************************************/
  138. /// 椭圆
  139. /****************************************/
  140. typedef struct
  141. {
  142. studio_point_c center;
  143. double rx;
  144. double ry;
  145. } studio_ellipse_c;
  146. studio_ellipse_c studio_ellipse_init(studio_point_c center, double rx, double ry);
  147. /// 计算椭圆的面积
  148. /// \param ellipse
  149. /// \return
  150. double studio_ellipse_area(const studio_ellipse_c* ellipse);
  151. /// 计算椭圆的周长
  152. /// \param ellipse
  153. /// \param Ramanujan
  154. /// \return
  155. double studio_ellipse_circumference(const studio_ellipse_c* ellipse, int Ramanujan);
  156. #endif // STUDIO_GEO_C_H