叉积判断点是否在三角形内(包括边上)
程序员文章站
2022-04-01 15:51:28
...
叉积判断点是否在三角形内(包括边上)
模板代码如下:
struct P{
int x,y;
};
int cross(P &a,P &b,P &c){ //返回ab,ac的叉积.
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); //x1y2-x2y1 数据过大时要开long long
}
bool jg_left(P &a,P &b,P &c){ //判断点c 是否在直线ab左边.
return cross(a,b,c)>0;
}
bool is_line(P &a,P &b,P &c){ //判断点c 是否在线段ab上
return !cross(a,b,c)&&c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x);
}
bool fun(P &a,P &b,P &c,P &d){ //若点在三角形内,要么全在线段左边,要么全在线段右边.
bool j1=jg_left(a,b,d),j2=jg_left(b,c,d),j3=jg_left(c,a,d);
if(cross(a,b,c)){
if(is_line(a,b,d)||is_line(b,c,d)||is_line(c,a,d)) return true; //判断是否在三角形线段上
if(j1==j2&&j1==j3) return true;
}
return false;
}
推荐阅读