studio_geo_c.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. const studio_point_c *studio_line_c_get_point(const studio_line_c *line, unsigned int index);
  58. /****************************************/
  59. /// 矩形框
  60. /****************************************/
  61. typedef struct
  62. {
  63. studio_point_c left_top;
  64. studio_point_c right_bottom;
  65. } studio_rect_c;
  66. studio_rect_c studio_rect_init(double l, double t, double r, double b);
  67. /// 矩形框校正
  68. /// \param rect
  69. void studio_rect_correct(studio_rect_c *rect);
  70. /// 矩形框是否相交
  71. /// \param r1
  72. /// \param r2
  73. /// \return
  74. bool studio_rect_intersect(const studio_rect_c *r1, const studio_rect_c *r2);
  75. /****************************************/
  76. /// 圆
  77. /****************************************/
  78. typedef struct
  79. {
  80. studio_point_c center;
  81. double radius;
  82. } studio_circle_c;
  83. /// 初始化圆
  84. /// \param center 圆心
  85. /// \param radius 半径
  86. /// \return
  87. studio_circle_c studio_circle_init(studio_point_c center, double radius);
  88. /// 计算圆的面积
  89. /// \param circle
  90. /// \return
  91. double studio_circle_area(const studio_circle_c *circle);
  92. /****************************************/
  93. /// 三角形
  94. /****************************************/
  95. typedef struct
  96. {
  97. studio_point_c a;
  98. studio_point_c b;
  99. studio_point_c c;
  100. } studio_triangle_c;
  101. /// 初始化三角形
  102. /// \param a
  103. /// \param b
  104. /// \param c
  105. /// \return
  106. studio_triangle_c studio_triangle_init(studio_point_c a, studio_point_c b, studio_point_c c);
  107. /// 计算三角形的面积
  108. /// \param triangle
  109. /// \return
  110. double studio_triangle_oriented_area(const studio_triangle_c *triangle);
  111. /// 计算三角形的面积
  112. /// \param triangle
  113. /// \return
  114. double studio_triangle_area(const studio_triangle_c *triangle);
  115. /****************************************/
  116. /// 椭圆
  117. /****************************************/
  118. typedef struct
  119. {
  120. studio_point_c center;
  121. double rx;
  122. double ry;
  123. } studio_ellipse_c;
  124. studio_ellipse_c studio_ellipse_init(studio_point_c center, double rx, double ry);
  125. /// 计算椭圆的面积
  126. /// \param ellipse
  127. /// \return
  128. double studio_ellipse_area(const studio_ellipse_c *ellipse);
  129. /// 计算椭圆的周长
  130. /// \param ellipse
  131. /// \param Ramanujan
  132. /// \return
  133. double studio_ellipse_circumference(const studio_ellipse_c *ellipse, int Ramanujan);
  134. #endif // STUDIO_GEO_C_H