非常基础的判断直线关系题,用最直观的方式:写出直线的一般式,然后根据高中的解析几何判断两条直线是否相交,相同和平行。
#include<stdio.h>
double eps=1e-6;
double abs(double a)
{
if(a<0)
return -a;
return a;
}
struct Point{
double x,y;
};
struct line{
double a,b,c;
};
line makeLine(Point s,Point end) //通过直线上两点构造直线的一般式
{
line l;
l.a=end.y-s.y;
l.b=s.x-end.x;
l.c=end.x*s.y-s.x*end.y;
return l;
}
int main()
{
int n;
Point s1,e1,s2,e2,ans;
scanf("%d",&n);
printf("INTERSECTING LINES OUTPUT\n");
while(n--)
{
scanf("%lf %lf %lf %lf",&s1.x,&s1.y,&e1.x,&e1.y);
scanf("%lf %lf %lf %lf",&s2.x,&s2.y,&e2.x,&e2.y);
line l1,l2;
l1=makeLine(s1,e1); //分别构造两条直线
l2=makeLine(s2,e2);
if(abs(l1.a*l2.b-l1.b*l2.a)<eps) //两条直线不想交的情况
{
if(abs(l1.a*l2.c-l1.c*l2.a)>eps || (abs(l1.a)<eps && abs(l2.a)<eps && abs(l1.c-l2.c)>eps)) //判断两条线段不相同
printf("NONE\n");
else
printf("LINE\n");
}
else
{
ans.x=(l1.b*l2.c-l2.b*l1.c)/(l2.b*l1.a-l1.b*l2.a);//根据直线方程求解x,y,因为前面的情况已经排除,所以必然有解
ans.y=-(l1.a*l2.c-l2.a*l1.c)/(l2.b*l1.a-l1.b*l2.a);
printf("POINT %.2f %.2f\n",ans.x,ans.y);
}
}
printf("END OF OUTPUT\n");
return 0;
}