convex_hull/convex_hull.c
2024-12-13 15:20:28 +08:00

42 lines
1.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}