直线与直线相交
【题目描述】:
给出两条直线(每条直线给出其上两个点),要求判断出这两条直线的关系:平行,同线或相交。如果相交还要求出交点坐标。
【输入描述】:
第一行一个数T,表示T组数据;
每组数据输入一行,8个数,分别表示ax,ay,bx,by,cx,cy,dx,dy,四个点的横纵坐标,其中前两个点表示一条直线,后两个点表示另一条直线。
【输出描述】:
对于每组数据输出一行;
如果平行输出“NONE”;如果共线输出“LINE”;如果相交输出交点的横纵坐标(精确到小数点后两位)。
【样例输入】:
5
0 0 4 4 0 4 4 0
5 0 7 6 1 0 2 3
5 0 7 6 3 -6 4 -3
2 0 2 27 1 5 18 5
0 3 4 0 1 2 2 5
【样例输出】:
2.00 2.00
NONE
LINE
2.00 5.00
1.07 2.20
【时间限制、数据范围及描述】:
时间:1s 空间:64M
T<=10,000
-10000<=所有点坐标<=10000
这题是一道相对来说比较简单的计算几何题目,有很多种方法,这里只介绍一种。直线与直线的位置关系只有三种:相交、平行、共线。我们第一个想到的就是计算直线的解析式来判断直线的位置关系。解析式分两步,斜率k和b。斜率的计算只需用斜率公式计算,而b的计算就把某个点的坐标和斜率带入即可。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
void work(){
int x1,x2,y1,y2,x3,x4,y3,y4;
double k1,k2,b1,b2,x,y;
scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
if(x1==x2){
if(x3==x4){
if(x1==x3){
printf("LINE\n");
}
else{
printf("NONE\n");
}
}
else{
k2=(double)((y4-y3)/((x4-x3)*1.0));
b2=(double)(y3-k2*x3);
x=(double)(x1);
y=(double)(k2*x+b2);
printf("%.2lf %.2lf\n",x,y);
}
return;
}
if(x3==x4){
k1=(double)((y2-y1)/((x2-x1)*1.0));
b1=(double)(y1-k1*x1);
x=(double)(x3);
y=(double)(k1*x+b1);
printf("%.2lf %.2lf\n",x,y);
return;
}
if(y1==y2){
if(y3==y4){
if(y3==y1){
printf("LINE\n");
}
else{
printf("NONE\n");
}
return;
}
}
k1=(double)((y2-y1)/((x2-x1)*1.0));
k2=(double)((y4-y3)/((x4-x3)*1.0));
b1=(double)(y1-k1*x1);
b2=(double)(y3-k2*x3);
if((y2-y1)*(x4-x3)==(x2-x1)*(y4-y3)){
if(((x2*y1-x1*y2)*(x4-x3))==((x4*y3-x3*y4)*(x2-x1))){
printf("LINE\n");
}
else{
printf("NONE\n");
}
}
else{
x=(double)((b2-b1)/(k1-k2));
y=k1*x+b1;
printf("%.2lf %.2lf\n",x,y);
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
work();
}
return 0;
}