您的位置:首页 > 其它

nyoj1016德莱联盟【判断两线段是否相交】

2015-08-28 10:28 211 查看


德莱联盟

时间限制:1000 ms  |  内存限制:65535 KB
难度:1

描述
欢迎来到德莱联盟。。。。
德莱文。。。
德莱文在逃跑,卡兹克在追。。。。
我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和中点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线。

输入几组数据,一个整数T表示T组数据

每组数据 8个实数,分别表示德莱文的起点和终点坐标,以及卡兹克的起点和终点坐标输出如果可能 输出 Interseetion,否则输出 Not Interseetion样例输入
2
-19.74 7.14 22.23 -27.45 -38.79 -5.08 47.51 34.01
-8.61 9.91 -32.47 6.47 -3.81 -16.1 7.82 -6.37

样例输出
Interseetion
Not Interseetion


#include<cstdio>
#include<cstdlib>
#include<cstring>
#define eps 1e-10
using namespace std;
struct point{
double x,y;
};
struct Node{
point a,b;
}A[2];
double MIN(double a,double b){
return a<b?a:b;
}
double MAX(double a,double b){
return a>b?a:b;
}
bool judge(int a,int b){
if(MIN(A[a].a.x,A[a].b.x)>MAX(A[b].a.x,A[b].b.x)||MIN(A[a].a.y,A[a].b.y)>MAX(A[b].a.y,A[b].b.y)||MIN(A[b].a.x,A[b].b.x)>MAX(A[a].a.x,A[a].b.x)||MIN(A[b].a.y,A[b].b.y)>MAX(A[a].a.y,A[a].b.y))
return false;
double h,i,j,k;
h=(A[a].b.x-A[a].a.x)*(A[b].a.y-A[a].a.y)-(A[a].b.y-A[a].a.y)*(A[b].a.x-A[a].a.x);
i=(A[a].b.x-A[a].a.x)*(A[b].b.y-A[a].a.y)-(A[a].b.y-A[a].a.y)*(A[b].b.x-A[a].a.x);
j=(A[b].b.x-A[b].a.x)*(A[a].a.y-A[b].a.y)-(A[b].b.y-A[b].a.y)*(A[a].a.x-A[b].a.x);
k=(A[b].b.x-A[b].a.x)*(A[a].b.y-A[b].a.y)-(A[b].b.y-A[b].a.y)*(A[a].b.x-A[b].a.x);
return h*i<=eps&&j*k<=eps;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--){
scanf("%lf%lf%lf%lf",&A[0].a.x,&A[0].a.y,&A[0].b.x,&A[0].b.y);
scanf("%lf%lf%lf%lf",&A[1].a.x,&A[1].a.y,&A[1].b.x,&A[1].b.y);
//A[1].b.x=A[1].b.x*2-A[1].a.x;
//A[1].b.y=A[1].b.y*2-A[1].a.y;
if(judge(0,1))
printf("Interseetion\n");
else{
printf("Not Interseetion\n");
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息