convex_hull/convex_hull.c

42 lines
1.1 KiB
C
Raw Normal View History

2024-12-13 07:20:28 +00:00
#include <stdlib.h>
// 定义一个点结构体
typedef struct {
int x, y;
} Point;
// 计算两点的极角
int orientation(Point p, Point q, Point r) {
int val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
if (val == 0) return 0; // 共线
return (val > 0) ? 1 : 2; // 顺时针或逆时针
}
// 对点的极角排序
int compare(const void *vp1, const void *vp2) {
Point *p1 = (Point *)vp1;
Point *p2 = (Point *)vp2;
return (p1->y < p2->y) || (p1->y == p2->y && p1->x < p2->x);
}
// 凸包主函数
void convexHull(Point points[], int n, Point result[], int *result_size) {
// 如果点数小于 3无法构成凸包
if (n < 3) {
*result_size = 0;
return;
}
// 按 y 坐标排序,如果 y 坐标相同则按 x 坐标排序
qsort(points, n, sizeof(Point), compare);
// 构建凸包
int m = 0; // 凸包的点数
for (int i = 0; i < n; i++) {
while (m >= 2 && orientation(result[m-2], result[m-1], points[i]) != 2)
m--;
result[m++] = points[i];
}
*result_size = m;
}