Browse Source

自定义线增加删除点功能

wangyingjie 4 weeks ago
parent
commit
5affbdf2b7
2 changed files with 88 additions and 42 deletions
  1. 44 22
      line_vacuate/studio_geo_c.c
  2. 44 20
      line_vacuate/studio_geo_c.h

+ 44 - 22
line_vacuate/studio_geo_c.c

@@ -18,7 +18,7 @@ studio_point_c studio_point_init(double xx, double yy)
     return point;
 }
 
-bool studio_point_equal(const studio_point_c *p1, const studio_point_c *p2)
+bool studio_point_equal(const studio_point_c* p1, const studio_point_c* p2)
 {
     bool is_equal = fabs(p1->x - p2->x) <= AO_EPSILON && fabs(p1->y - p2->y) <= AO_EPSILON;
     return is_equal;
@@ -26,18 +26,16 @@ bool studio_point_equal(const studio_point_c *p1, const studio_point_c *p2)
 
 ////////////// 线 //////////////
 
-// 初始化线段 (默认容量为4)
 studio_line_c studio_line_c_init()
 {
     studio_line_c line;
     line.size = 0;
     line.capacity = 4;
-    line.data = (studio_point_c *) malloc(line.capacity * sizeof(studio_point_c));
+    line.data = (studio_point_c*)malloc(line.capacity * sizeof(studio_point_c));
     return line; // 注意: 返回结构体副本 (需配合 C99 或更高标准)
 }
 
-// 销毁线段 (释放内存)
-void studio_line_c_destroy(studio_line_c *line)
+void studio_line_c_destroy(studio_line_c* line)
 {
     if (line->data)
     {
@@ -48,14 +46,13 @@ void studio_line_c_destroy(studio_line_c *line)
     }
 }
 
-// 添加点 (自动扩容)
-void studio_line_c_add_point(studio_line_c *line, studio_point_c point)
+void studio_line_c_add_point(studio_line_c* line, studio_point_c point)
 {
     // 容量不足时扩容 (策略: 增加固定容量 10)
     if (line->size >= line->capacity)
     {
         line->capacity += 10;
-        studio_point_c *new_data = (studio_point_c *) realloc(line->data, line->capacity * sizeof(studio_point_c));
+        studio_point_c* new_data = (studio_point_c*)realloc(line->data, line->capacity * sizeof(studio_point_c));
         if (!new_data)
         {
             // 此处可添加错误处理 (例如: 终止程序或返回错误码)
@@ -68,14 +65,39 @@ void studio_line_c_add_point(studio_line_c *line, studio_point_c point)
     line->data[line->size++] = point;
 }
 
-// 获取当前元素数量
-unsigned int studio_line_c_size(const studio_line_c *line)
+bool studio_line_c_remove_point(studio_line_c* line, unsigned int index)
+{
+    if (index >= line->size)
+    {
+        return false; // 索引无效
+    }
+    // 将后续点前移
+    for (unsigned int i = index; i < line->size - 1; i++)
+    {
+        line->data[i] = line->data[i + 1];
+    }
+    line->size--;
+    // 缩小容量以节省内存
+    if (line->capacity > 10 && line->size < line->capacity / 2)
+    {
+        unsigned int new_capacity = line->capacity / 2;
+        studio_point_c* new_data = (studio_point_c*)realloc(line->data, new_capacity * sizeof(studio_point_c));
+        if (new_data)
+        {
+            line->data = new_data;
+            line->capacity = new_capacity;
+        }
+    }
+    return true;
+}
+
+unsigned int studio_line_c_size(const studio_line_c* line)
 {
     return line->size;
 }
 
 
-studio_point_c studio_line_c_get_point(const studio_line_c *line, unsigned int index)
+studio_point_c studio_line_c_get_point(const studio_line_c* line, unsigned int index)
 {
     studio_point_c tmp;
     if (index < line->size)
@@ -86,7 +108,7 @@ studio_point_c studio_line_c_get_point(const studio_line_c *line, unsigned int i
     return tmp; // 越界返回0,0点
 }
 
-bool studio_line_c_set_point(studio_line_c *line, unsigned int index, studio_point_c point)
+bool studio_line_c_set_point(studio_line_c* line, unsigned int index, studio_point_c point)
 {
     bool status = false;
     if (index > line->size)
@@ -107,7 +129,7 @@ studio_rect_c studio_rect_init(double l, double t, double r, double b)
     return rect;
 }
 
-void studio_rect_correct(studio_rect_c *rect)
+void studio_rect_correct(studio_rect_c* rect)
 {
     if (rect->left_top.x > rect->right_bottom.x)
     {
@@ -123,10 +145,10 @@ void studio_rect_correct(studio_rect_c *rect)
     }
 }
 
-bool studio_rect_intersect(const studio_rect_c *r1, const studio_rect_c *r2)
+bool studio_rect_intersect(const studio_rect_c* r1, const studio_rect_c* r2)
 {
     return !(r1->right_bottom.x < r2->left_top.x || r1->left_top.x > r2->right_bottom.x || r1->right_bottom.y > r2->
-             left_top.y || r1->left_top.y < r2->right_bottom.y);
+                                                                                                                left_top.y || r1->left_top.y < r2->right_bottom.y);
 }
 
 ////////////// 圆 //////////////
@@ -137,7 +159,7 @@ studio_circle_c studio_circle_init(studio_point_c center, double radius)
     return circle;
 }
 
-double studio_circle_area(const studio_circle_c *circle)
+double studio_circle_area(const studio_circle_c* circle)
 {
     return AO_M_PI * circle->radius * circle->radius;
 }
@@ -150,13 +172,13 @@ studio_triangle_c studio_triangle_init(studio_point_c a, studio_point_c b, studi
     return triangle;
 }
 
-double studio_triangle_oriented_area(const studio_triangle_c *triangle)
+double studio_triangle_oriented_area(const studio_triangle_c* triangle)
 {
     return (triangle->a.x * (triangle->b.y - triangle->c.y) + triangle->b.x * (triangle->c.y - triangle->a.y) + triangle
-            ->c.x * (triangle->a.y - triangle->b.y)) / 2.0;
+                                                                                                                ->c.x * (triangle->a.y - triangle->b.y)) / 2.0;
 }
 
-double studio_triangle_area(const studio_triangle_c *triangle)
+double studio_triangle_area(const studio_triangle_c* triangle)
 {
     return fabs(studio_triangle_oriented_area(triangle));
 }
@@ -169,12 +191,12 @@ studio_ellipse_c studio_ellipse_init(studio_point_c center, double rx, double ry
     return ellipse;
 }
 
-double studio_ellipse_area(const studio_ellipse_c *ellipse)
+double studio_ellipse_area(const studio_ellipse_c* ellipse)
 {
     return AO_M_PI * ellipse->rx * ellipse->ry;
 }
 
-double studio_ellipse_circumference(const studio_ellipse_c *ellipse, int Ramanujan)
+double studio_ellipse_circumference(const studio_ellipse_c* ellipse, int Ramanujan)
 {
     if (Ramanujan == 1)
     {
@@ -182,4 +204,4 @@ double studio_ellipse_circumference(const studio_ellipse_c *ellipse, int Ramanuj
                               (3 * ellipse->rx + ellipse->ry) * (ellipse->rx + 3 * ellipse->ry)));
     }
     return 2 * AO_M_PI * sqrt((ellipse->rx * ellipse->rx + ellipse->ry * ellipse->ry) / 2);
-}
+}

+ 44 - 20
line_vacuate/studio_geo_c.h

@@ -39,7 +39,7 @@ studio_point_c studio_point_init(double xx, double yy);
 /// \param p1
 /// \param p2
 /// \return true 表示 相等
-bool studio_point_equal(const studio_point_c *p1, const studio_point_c *p2);
+bool studio_point_equal(const studio_point_c* p1, const studio_point_c* p2);
 
 /****************************************/
 /// 线
@@ -49,27 +49,51 @@ bool studio_point_equal(const studio_point_c *p1, const studio_point_c *p2);
 // 并且 需要调用 studio_line_c_destroy(&temp_line); 释放内存
 typedef struct
 {
-    studio_point_c *data; // 点数据指针
-    unsigned int size; // 当前元素个数
+    studio_point_c* data;  // 点数据指针
+    unsigned int size;     // 当前元素个数
     unsigned int capacity; // 当前分配的内存容量
 } studio_line_c;
 
 // 初始化线段 (默认容量为4)
+
+/// 初始化线
+/// @return 返回初始化的点类型
 studio_line_c studio_line_c_init();
 
-// 销毁线段 (释放内存)
-void studio_line_c_destroy(studio_line_c *line);
+/// 销毁线段 (释放内存)
+/// @param line
+void studio_line_c_destroy(studio_line_c* line);
+
+/// 尾部添加点
+/// @param line 线段指针
+/// @param point 点
+void studio_line_c_add_point(studio_line_c* line, studio_point_c point);
 
-// 添加点 (自动扩容)
-void studio_line_c_add_point(studio_line_c *line, studio_point_c point);
+/// 从线段中删除指定索引的点
+/// \param line 线段指针
+/// \param index 要删除的点的索引 (索引从0开始)
+/// \return true 表示删除成功,false 表示索引无效
+bool studio_line_c_remove_point(studio_line_c* line, unsigned int index);
 
-// 获取当前元素数量
-unsigned int studio_line_c_size(const studio_line_c *line);
+/// 获取当前元素数量
+/// @param line 线段
+/// @return 当前元素数量
+unsigned int studio_line_c_size(const studio_line_c* line);
 
 // 获取指定位置的点的引用 (注意索引越界问题)
-studio_point_c studio_line_c_get_point(const studio_line_c *line, unsigned int index);
-// 修改指定索引位置的值
-bool studio_line_c_set_point(studio_line_c *line, unsigned int index, studio_point_c point);
+
+/// 获取指定位置的点的引用,如果下标越界 则返回 (0,0)
+/// @param line 线段
+/// @param index 索引 (索引从0开始)
+/// @return 点
+studio_point_c studio_line_c_get_point(const studio_line_c* line, unsigned int index);
+
+/// 修改指定索引位置的值
+/// @param line 线段
+/// @param index 索引 (索引从0开始)
+/// @param point 点
+/// @return true 表示修改成功,false 表示索引无效
+bool studio_line_c_set_point(studio_line_c* line, unsigned int index, studio_point_c point);
 
 /****************************************/
 /// 矩形框
@@ -84,13 +108,13 @@ studio_rect_c studio_rect_init(double l, double t, double r, double b);
 
 /// 矩形框校正
 /// \param rect
-void studio_rect_correct(studio_rect_c *rect);
+void studio_rect_correct(studio_rect_c* rect);
 
 /// 矩形框是否相交
 /// \param r1
 /// \param r2
 /// \return
-bool studio_rect_intersect(const studio_rect_c *r1, const studio_rect_c *r2);
+bool studio_rect_intersect(const studio_rect_c* r1, const studio_rect_c* r2);
 
 /****************************************/
 /// 圆
@@ -110,7 +134,7 @@ studio_circle_c studio_circle_init(studio_point_c center, double radius);
 /// 计算圆的面积
 /// \param circle
 /// \return
-double studio_circle_area(const studio_circle_c *circle);
+double studio_circle_area(const studio_circle_c* circle);
 
 /****************************************/
 /// 三角形
@@ -132,12 +156,12 @@ studio_triangle_c studio_triangle_init(studio_point_c a, studio_point_c b, studi
 /// 计算三角形的面积
 /// \param triangle
 /// \return
-double studio_triangle_oriented_area(const studio_triangle_c *triangle);
+double studio_triangle_oriented_area(const studio_triangle_c* triangle);
 
 /// 计算三角形的面积
 /// \param triangle
 /// \return
-double studio_triangle_area(const studio_triangle_c *triangle);
+double studio_triangle_area(const studio_triangle_c* triangle);
 
 /****************************************/
 /// 椭圆
@@ -154,12 +178,12 @@ studio_ellipse_c studio_ellipse_init(studio_point_c center, double rx, double ry
 /// 计算椭圆的面积
 /// \param ellipse
 /// \return
-double studio_ellipse_area(const studio_ellipse_c *ellipse);
+double studio_ellipse_area(const studio_ellipse_c* ellipse);
 
 /// 计算椭圆的周长
 /// \param ellipse
 /// \param Ramanujan
 /// \return
-double studio_ellipse_circumference(const studio_ellipse_c *ellipse, int Ramanujan);
+double studio_ellipse_circumference(const studio_ellipse_c* ellipse, int Ramanujan);
 
-#endif  //  STUDIO_GEO_C_H
+#endif  //  STUDIO_GEO_C_H