题意:
给出四个点,前两个点确定一条直线,后两个点确定一条直线。判断这两条直线的位置关系。
题解:
1.先判断斜率是否相等,如果斜率相等,那么两条直线重合或平行。若斜率不相同,则求交点。
2.注意斜率不存在即直线垂直于x轴的情况。
3.注意前两个点和后两个点会有重复点。
4.调试时查看变量fabs(0) = 8064 ,但其实运行时fabs(0) = 0。
5.一直WA是因为输出浮点数用了%.2lf,改为%.2f后就过了!!!!!!!!!!!!!!!
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std ;
#define eps 1e-8
double x1 , yy1 , x2 , y2 , x3 , y3 , x4 , y4 ;
bool para()
{
int para_num = 0 ; //判断有几个直线与x轴垂直
double slope_1 , slope_2 ;
if(x1 == x2)
para_num ++ ;
if(x3 == x4)
para_num ++ ;
if(para_num == 1) //只有一个与x轴垂直的直线 那么一定有交点
return 0 ;
if(para_num == 2) //两个直线都与x轴垂直 那么一定没有单独的交点
return 1 ;
slope_1 = (y2 - yy1) / (x2 - x1) ;
slope_2 = (y4 - y3) / (x4 - x3) ;
return fabs(slope_1 - slope_2) < eps ; //判断没有垂直x轴的两条直线是否斜率相等
}
bool same()
{
//先判断是不是两条垂直于x轴的平行直线
if(fabs(x2 - x1) < eps && fabs(x3 - x1) < eps && fabs(x4 - x1) < eps)
return 1 ;
if(fabs(x3 - x1) < eps && fabs(y3 - yy1) < eps ||
fabs(x4 - x1) < eps && fabs(y4 - x1) < eps ||
fabs(x3 - x2) < eps && fabs(y3 - y2) < eps ||
fabs(x4 - x2) < eps && fabs(y4 - y2) < eps)
return 1 ;
double slope_0 , slope_1 , slope_2 , slope_3 , slope_4 ;
slope_0 = (y2 - yy1) / (x2 - x1) ;
slope_1 = (y3 - yy1) / (x3 - x1) ;
slope_2 = (y4 - yy1) / (x4 - x1) ;
slope_3 = (y3 - y2) / (x3 - x2) ;
slope_4 = (y4 - y2) / (x4 - x2) ;
return fabs(slope_1 - slope_0) < eps &&
fabs(slope_2 - slope_0) < eps &&
fabs(slope_3 - slope_0) < eps &&
fabs(slope_4 - slope_0) < eps ;
}
void cal()
{
double x , y ;
double k1 , k2 ;
double b1 , b2 ;
if(fabs(x2 - x1) < eps)
{
k2 = (y4 - y3) / (x4 - x3) ;
b2 = y4 - k2 * x4 ;
x = x1 ;
y = k2 * x + b2 ;
printf("POINT %.2f %.2f\n" , x , y) ;
return ;
}
if(fabs(x4 - x3) < eps)
{
k1 = (y2 - yy1) / (x2 - x1) ;
b1 = y2 - k1 * x2 ;
x = x3 ;
y = k1 * x + b1 ;
printf("POINT %.2f %.2f\n" , x , y) ;
return ;
}
k1 = (y2 - yy1) / (x2 - x1) ;
b1 = y2 - k1 * x2 ;
k2 = (y4 - y3) / (x4 - x3) ;
b2 = y4 - k2 * x4 ;
x = (b1 - b2) / (k2 - k1) ;
y = k1 * x + b1 ;
printf("POINT %.2f %.2f\n" , x , y) ;
}
int main()
{
int t ;
scanf("%d" , &t) ;
printf("INTERSECTING LINES OUTPUT\n") ;
while(t --)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf" , &x1 , &yy1 , &x2 , &y2 , &x3 , &y3 , &x4 , &y4) ;
if(para()) //两个直线的斜率相等
{
if(same())
printf("LINE\n") ;
else
printf("NONE\n") ;
}
else
{
cal() ;
}
}
printf("END OF OUTPUT\n") ;
}