51NOD1264 线段相交(模板)

#include<iostream>
using namespace std;
struct Lpoint {double x,y;}; //点
struct Llineseg{ Lpoint a,b;}; //线段

double xmulti(Lpoint p1,Lpoint p2,Lpoint p0)//叉乘 
{
	return ((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}

double mx(double t1,double t2)
{
if(t1>t2) return t1;
return t2;
}
double mn(double t1,double t2)
{
if(t1<t2) return t1;
return t2;
}
int lsinterls(Llineseg u,Llineseg v)//判断是否相交 
{
return( (mx(u.a.x,u.b.x)>=mn(v.a.x,v.b.x))&&
(mx(v.a.x,v.b.x)>=mn(u.a.x,u.b.x))&&
(mx(u.a.y,u.b.y)>=mn(v.a.y,v.b.y))&&
(mx(v.a.y,v.b.y)>=mn(u.a.y,u.b.y))&&
(xmulti(v.a,u.b,u.a)*xmulti(u.b,v.b,u.a)>=0)&&
(xmulti(u.a,v.b,v.a)*xmulti(v.b,u.b,v.a)>=0));
}

int main()
{
	int T;
	//freopen("in.txt","r",stdin);
	scanf("%d",&T);
	while(T--)
	{
		Llineseg u,v;
		int cnt=0;
		cin>>u.a.x>>u.a.y>>u.b.x>>u.b.y>>v.a.x>>v.a.y>>v.b.x>>v.b.y;
		if(lsinterls(u,v))
		cnt++;
		if(cnt)
		cout<<"Yes"<<endl;
		else
		cout<<"No"<<endl;
	}
 } 

猜你喜欢

转载自blog.csdn.net/love20165104027/article/details/81434331
今日推荐