您的位置:首页 > 其它

[51nod]1264 线段相交

2016-07-02 12:46 288 查看
题目链接点这里

判断两线段相交

直接上模板

#include<cstring>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const double eps=1e-8;
const double pi=acos(-1.0);
int sgn(double x){
if(fabs(x)<eps) return 0;
if(x<0) return -1;
else return 1;
}
struct node
{
double x,y;
node(){}
node(int x_,int y_)
{
x=x_;
y=y_;
}
node operator -(const node &b)
{
return node(x-b.x,y-b.y);
}
double operator *(const node &b)
{
return x*b.x+y*b.y;
}
double operator ^(const node &b)
{
return x*b.y-b.x*y;
}
friend istream & operator >>(istream &in,node & a)
{
in>>a.x>>a.y;
return in;
}
} p[4];
typedef node vect;
struct line
{
node s,e;
line(){}
line(const node &s_,const node &e_)
{
s=s_;
e=e_;
}
friend bool inter(line l1,line l2)
{
return
max(l1.s.x,l1.e.x)>=min(l2.s.x,l2.e.x) &&
max(l2.s.x,l2.e.x)>=min(l1.s.x,l1.e.x) &&
max(l1.s.y,l1.e.y)>=min(l2.s.y,l2.e.y) &&
max(l2.s.y,l2.e.y)>=min(l1.s.y,l1.e.y) &&
sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e))<=0 &&
sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e))<=0;
}
};
typedef line segment;
int main()
{
segment l1,l2;
int sk;
scanf("%d",&sk);
while(sk--)
{

cin>>l1.s>>l1.e>>l2.s>>l2.e;
if(inter(l1,l2)) puts("Yes");
else puts("No");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod