计算几何之凸包
目录
计算几何之凸包
凸包的大概意思是,在点集A
中,选取子集a
,将a
中的点进行连线形成多边形(假若a
中的点共线,则将多边形视为高度为0的长方形),则A
中的点要么在多边形内部、要么在多边形上。
#define MAXN 100
struct Point {
int x;
int y;
};
Point points[MAXN + 1];
int stack[MAXN + 1];
bool visited[MAXN + 1];
int length;
// 向量叉积
// a是次顶的点,b是栈顶的点,c是待检查的点
int mul(Point a, Point b, Point c) { return (b.x - a.x) * (c.y - b.y) - (c.x - b.x) * (b.y - a.y); }
void andrew() {
sort(points, cmp);
int top1 = 0;
stack[top1++] = 0;
for (int i = 1; i < length; i++) {
while (top1 > 1 && mul(points[stack[top1 - 2]], points[stack[top1 - 1]], points[i]) < 0){
top1--;
visited[stack[top1]] = false;
}
visited[i] = true;
stack[top1++] = i;
}
int downSize = top1;
for (int i = length - 2; i >= 0; i--) {
if(visited[i])continue;
while (top1 > downSize && mul(points[stack[top1 - 2]], points[stack[top1 - 1]], points[i]) < 0){
top1--;
visited[stack[top1]] = false;
}
visited[i] = true;
stack[top1++] = i;
}
// 由于第一个点会被存放两次,因此我们要防止第一个点被重复放入
for(int i = 0; i < top1 - 1; i++){
ans.push_back(points[stack[i]]);
}
}
int cmp(Point a, Point b) {
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
本文由「黄阿信」创作,创作不易,请多支持。
如果您觉得本文写得不错,那就点一下「赞赏」请我喝杯咖啡~
商业转载请联系作者获得授权,非商业转载请附上原文出处及本链接。
关注公众号,获取最新动态!
历史评论
开始评论