UVA378题解报告
注:
本题解使用的全部是一次函数知识。
前置知识
直接看这个吧:一道很水的紫题。
解法
先特判直线两点横坐标相等的情况,此时无法计算出斜率的值。
然后,计算出两直线的解析式,直接联立求解即可。
然后就做完了。具体细节见代码:
#include<cstdio>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
printf("INTERSECTING LINES OUTPUT\n");
while(n--)
{
double x1,y1,x2,y2,x3,y3,x4,y4,k1,k2,b1,b2,judge=1e-13;//double可精确到小数点后15位
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
if(x1==x2&&x3!=x4)
{
k2=(y3-y4)/(x3-x4),b2=y3-k2*x3;
double x=x1,y=k2*x+b2;
printf("POINT %.2lf %.2lf\n",x,y);
}
else if(x1!=x2&&x3==x4)
{
k1=(y1-y2)/(x1-x2),b1=y1-k1*x1;
double x=x3,y=k1*x+b1;
printf("POINT %.2lf %.2lf\n",x,y);
}
else if(x1==x2&&x3==x4)
{
if(x1==x3) printf("LINE\n");
else printf("NONE\n");
}//先进行三次特判
else
{
k1=(y1-y2)/(x1-x2),b1=y1-k1*x1;
k2=(y3-y4)/(x3-x4),b2=y3-k2*x3;
if(b1-b2<=judge&&b1-b2>=-judge&&k1-k2<=judge&&k1-k2>=-judge) printf("LINE\n");
else if(k1-k2<=judge&&k1-k2>=-judge) printf("NONE\n");
else{
double x=(b1-b2)/(k2-k1),y=(b2*k1-b1*k2)/(k1-k2);//联立求解,推导过程较为简单,这里就不证了
printf("POINT %.2lf %.2lf\n",x,y);
}
}
}
printf("END OF OUTPUT\n");
return 0;
}