1.声明
此处的简单多边形,是只常见的凸多边形,比如三角形、长方形、五边形、6边形。不包括奇奇怪怪的多边形
2.方法:
常见的有
1.向量叉乘
2.面积法
对于叉乘法的步骤:
3.1.先判断有没有点在多边形的边上
代码如下:
看图,C的位置有如下可能,只有在边上,也就是AC+BC==AB
才满足在边上的情况
每个vector变量,就存两个坐标:横和纵
bool isOnside(vector<int>& A, vector<int>& B, vector<int>& C)
{
//先判断该点是否在边上,如果是AC+BC=AB
// 有一个满足,该点就在边上
int x1 = C[0] - A[0];
int y1 = C[1] - A[1];//AC
int x2 = B[0] - A[0];
int y2 = B[1] - A[1];//AB
int x3 = C[0] - B[0];
int y3 = C[1] - B[1];//BC
int a = sqrt(pow(x1, 2) + pow(y1, 2));
int b = sqrt(pow(x3, 2) + pow(y3, 2));
int c = sqrt(pow(x2, 2) + pow(y2, 2));
return a + b == c;
}
把目标点和所有的点都遍历一遍就可以知道该点是不是在边上
如果不在边上,再判断是不是在内部或者外部
3.2.通过叉乘的符号是否一致
如图
分别计算
AD x AB
BD x BC
CD x CA
的符号,在图中看来,叉乘的右手准则,因此符号都为负
可以用一个cnt记录为负的个数,
而对于这种情况而言呢,三个向量的叉积都为正,因此用另一个
flag记录为正的数目
如果(cnt==n-1 || flag==n-1)
其中n为所有点的个数
if(cnt==n-1 || flag==n-1)
cout<<"点在多边形内部"<<endl;
else
cout<<"在外部"<<endl;
int CP(vector<int>& A, vector<int>& B, vector<int>& C)
{
// AC叉乘AB ,cross_product
int x1 = C[0] - A[0];
int y1 = C[1] - A[1];
int x2 = B[0] - A[0];
int y2 = B[1] - A[1];
return x1 * y2 - x2 * y1;
}
4.完整代码
细节没搞出来,,,但是思路就是这样了
下次想起来再写吧