欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

叉积判断点是否在三角形内(包括边上)

程序员文章站 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; 
}