判断一个点是否在三角形及多边形的内部
代码思路:
如果一个点在一个多边形的内部则依次链接多变形的两点,形成的有向直线,则该点必将都在这些有向直线的一侧,要不然都在左侧,要不然都在右侧。所以就是判断是否在一侧通过isLeft这个函数判断。
而这个函数使用的方法就是计算这三个点围成的面积,利用行列式公式,如果在左侧为正数,则自然在右侧就是负数,因为左右相当于行列式做了一次行交换,而这刚好为行列式带来了一个负数。
#include <iostream>
#include<vector>
using namespace std;
typedef struct PointF
{
float x;
float y;
PointF(float x,float y) :x(x),y(y){}
PointF():x(0),y(0){}
}PointF;
bool isLeft(PointF a,PointF b,PointF c);
float triangleArea(PointF a,PointF b,PointF c);
//判断一个点是否在一个三角形内
bool isInTriangle(PointF triangle[],int size, PointF point){
if(size<3)return false;
bool a = isLeft(triangle[0],triangle[1],point);
bool b = isLeft(triangle[1],triangle[2],point);
bool c = isLeft(triangle[2],triangle[0],point);
if(a == b&&b==c&&c==a){
return true;
}
else {
return false;
}
}
//判断一个点是否在一个多边形内
bool isInMultiangle(PointF Multiangle[],int size, PointF point){
if(size<3)return 0;
bool flag =isLeft(Multiangle[0],Multiangle[1],point);
for(int i=0;i<size;i++){
bool result = isLeft(Multiangle[i%size],Multiangle[(i+1)%size],point);
if(result!=flag){
return false;
}
}
return 1;
}
bool isLeft(PointF a,PointF b,PointF c){
//judge c in left of ab, true:left,false:right
return triangleArea(a,b,c)>0;
}
float triangleArea(PointF a,PointF b,PointF c){
return (b.x*c.y-b.y*c.x)
-(a.x*c.y-a.y*c.x)
+(a.x*b.y-b.x*a.y);
}
int main()
{
PointF p[4] = {PointF(0,0),PointF(3,0),PointF(3,3),PointF(0,3)};
PointF test =PointF(4,2);
cout<<isInMultiangle(p,4,test)<<endl;
cout << "Hello World!" << endl;
return 0;
}
来源:CSDN
作者:邓文尧
链接:https://blog.csdn.net/AlonewaitingNew/article/details/104845975