几何题。
题目大意:给你4个点,问你其确定的两条直线间的位置关系:平行,相交或是重合,如果相交,求出交点坐标。
因为数据只有上述三种情况,故我们可以先确定这两天直线是否平行或重合,如果不是,直接求出他们交点的坐标即可
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct node
{
double x,y;
}point;
typedef struct line
{
point start,end;
}segment;
double multi(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
bool is_px(point p1,point p2,point p3,point p4)
{
if((p1.x-p2.x)*(p3.y-p4.y)==(p3.x-p4.x)*(p1.y-p2.y))
return true;
return false;
}
point intersection(segment u,segment v)
{
point p;
p.x=(multi(v.end,u.end,u.start)*v.start.x-multi(v.start,u.end,u.start)*v.end.x)/(multi(v.end,u.end,u.start)-multi(v.start,u.end,u.start));
p.y=(multi(v.end,u.end,u.start)*v.start.y-multi(v.start,u.end,u.start)*v.end.y)/(multi(v.end,u.end,u.start)-multi(v.start,u.end,u.start));
return p;
}
int main()
{
segment u,v;
int t;
int x1,x2,x3,x4;
int y1,y2,y3,y4;
scanf("%d",&t);
printf("INTERSECTING LINES OUTPUT\n");
while(t--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
scanf("%d%d%d%d",&x3,&y3,&x4,&y4);
u.start.x=x1;u.start.y=y1;
u.end.x=x2;u.end.y=y2;
v.start.x=x3;v.start.y=y3;
v.end.x=x4;v.end.y=y4;
if(multi(u.start,u.end,v.start)==0&&multi(u.start,u.end,v.end)==0)
puts("LINE");
else if(is_px(u.start,u.end,v.start,v.end)) puts("NONE");
else
{
point p=intersection(u,v);
printf("POINT %.2lf %.2lf\n",p.x,p.y);
}
}
printf("END OF OUTPUT\n");
return 0;
}