德莱联盟
-
描述
-
欢迎来到德莱联盟。。。。
德莱文。。。
德莱文在逃跑,卡兹克在追。。。。
我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和 终点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线。
-
输入
-
几组数据,一个整数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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
double x1,x2,y1,y2,x3,x4,y3,y4,k1,k2;
double w1,w2,w3,w4;
int flag=0;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
if((x2-x1)==0) //如果斜率不存在
{
if((x3>=x2&&x4<=x2)||(x4>=x2&&x3<=x2))
flag+=1;
}
else //如果存在
{
k1=(double)(y2-y1)/(x2-x1);
w3=k1*(x3-x2)+y2;
w4=k1*(x4-x2)+y2;
if((y3>=w3&&y4<=w4)||(y3<=w3&&y4>=w4)) //看图模拟
flag+=1;
}
if((x4-x3)==0) //继续判断斜率是否存在
{
if((x2>=x3&&x1<=x3)||(x1>=x3&&x2<=x3))
flag+=1;
}
else
{
k2=(double)(y4-y3)/(x4-x3);
w1=k2*(x1-x3)+y3;
w2=k2*(x2-x3)+y3;
if((y2>=w2&&y1<=w1)||(y2<=w2&&y1>=w1))
flag+=1;
}
if(flag==2)
printf("Interseetion\n");
else
printf("Not Interseetion\n");
}
return 0;
}
-
-
(数学美 之 判断线段相交的最简方法,https://segmentfault.com/a/1190000004457595)里面有两线段相交的方法,该作者解释的比较详细,值得学习!
-
几组数据,一个整数T表示T组数据