判断点否在凸包内部
例题
https://vjudge.net/problem/UVALive-7281
直接上例题,稍稍梳理一下,如下图

- 思考一下,最简单的办法,按照 A n d r e w Andrew Andrew求凸包的思路,从凸包的某个点沿着逆时针顺序行进,同时看这个点是不是在这条线段左侧,如果到某条线段发现点在这条线段右侧,那么说明这个点就在凸包外侧,判断点在线段的哪一侧使用叉积即可
- 这样的判断时间复杂度是 O ( n ) O(n) O(n)的,对于大规模询问显然不行
- 我们有更好的办法,我们在凸包上进行二分,看下面的图

- 这个点的位置只有四种情况(边界一样),在外侧的两种情况可以通过叉积来判断,这是非法情况,内侧的情况可能是合法情况,只需要判断一下这个点是不是在上面的线内部即可,使用叉积判断,比较简单就不细说了,做一下上面的那道题,整理一下模板
#include <bits/stdc++.h>
using namespace std;
#define db double
const db eps = 1e-10;
const int MAXN = 1e4 + 100;
int sgn(db x){
if(fabs(x) < eps) return 0;
return x < 0 ? -1 : 1;
}
struct Point{
db x, y;
Point(){
}
Point(db x, db y): x(x), y(y){
}
Point operator + (const Point &B)const{
return Point(x + B.x, y + B.y);
}
Point operator - (const Point &B)const{
return Point(x - B.x, y - B.y);
}
bool operator < (const Point &B)const{
return sgn(x - B.x) < 0 || (sgn(x - B.x) == 0 && sgn(y - B.y) < 0);
}
bool operator == (const Point &B)const{
return sgn(x - B.x) == 0 && sgn(y - B.y) == 0;
}
}s[MAXN], ch[MAXN];
typedef Point Vector;
db Cross(Vector A,

这篇博客介绍了如何判断一个点是否在凸包或凹多边形内部。对于凸包,使用Andrew算法求解凸包后,通过二分查找判断点的位置;对于凹多边形,利用射线与多边形边的交点个数为奇偶性来判断。文章提供了C++实现的代码示例。
最低0.47元/天 解锁文章
1634





