studio_geo_c.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. studio_line_c studio_line_c_init();
  50. // 销毁线段 (释放内存)
  51. void studio_line_c_destroy(studio_line_c *line);
  52. // 添加点 (自动扩容)
  53. void studio_line_c_add_point(studio_line_c *line, studio_point_c point);
  54. // 获取当前元素数量
  55. unsigned int studio_line_c_size(const studio_line_c *line);
  56. // 获取指定位置的点的引用 (注意索引越界问题)
  57. studio_point_c studio_line_c_get_point(const studio_line_c *line, unsigned int index);
  58. // 修改指定索引位置的值
  59. bool studio_line_c_set_point(studio_line_c *line, unsigned int index, studio_point_c point);
  60. /****************************************/
  61. /// 矩形框
  62. /****************************************/
  63. typedef struct
  64. {
  65. studio_point_c left_top;
  66. studio_point_c right_bottom;
  67. } studio_rect_c;
  68. studio_rect_c studio_rect_init(double l, double t, double r, double b);
  69. /// 矩形框校正
  70. /// \param rect
  71. void studio_rect_correct(studio_rect_c *rect);
  72. /// 矩形框是否相交
  73. /// \param r1
  74. /// \param r2
  75. /// \return
  76. bool studio_rect_intersect(const studio_rect_c *r1, const studio_rect_c *r2);
  77. /****************************************/
  78. /// 圆
  79. /****************************************/
  80. typedef struct
  81. {
  82. studio_point_c center;
  83. double radius;
  84. } studio_circle_c;
  85. /// 初始化圆
  86. /// \param center 圆心
  87. /// \param radius 半径
  88. /// \return
  89. studio_circle_c studio_circle_init(studio_point_c center, double radius);
  90. /// 计算圆的面积
  91. /// \param circle
  92. /// \return
  93. double studio_circle_area(const studio_circle_c *circle);
  94. /****************************************/
  95. /// 三角形
  96. /****************************************/
  97. typedef struct
  98. {
  99. studio_point_c a;
  100. studio_point_c b;
  101. studio_point_c c;
  102. } studio_triangle_c;
  103. /// 初始化三角形
  104. /// \param a
  105. /// \param b
  106. /// \param c
  107. /// \return
  108. studio_triangle_c studio_triangle_init(studio_point_c a, studio_point_c b, studio_point_c c);
  109. /// 计算三角形的面积
  110. /// \param triangle
  111. /// \return
  112. double studio_triangle_oriented_area(const studio_triangle_c *triangle);
  113. /// 计算三角形的面积
  114. /// \param triangle
  115. /// \return
  116. double studio_triangle_area(const studio_triangle_c *triangle);
  117. /****************************************/
  118. /// 椭圆
  119. /****************************************/
  120. typedef struct
  121. {
  122. studio_point_c center;
  123. double rx;
  124. double ry;
  125. } studio_ellipse_c;
  126. studio_ellipse_c studio_ellipse_init(studio_point_c center, double rx, double ry);
  127. /// 计算椭圆的面积
  128. /// \param ellipse
  129. /// \return
  130. double studio_ellipse_area(const studio_ellipse_c *ellipse);
  131. /// 计算椭圆的周长
  132. /// \param ellipse
  133. /// \param Ramanujan
  134. /// \return
  135. double studio_ellipse_circumference(const studio_ellipse_c *ellipse, int Ramanujan);
  136. #endif // STUDIO_GEO_C_H