计算几何的又一个基础题,直接用黑书的模版即可。问题是要求出对于给定的两条的直线中的两点,得出两条直线的关系:平行、共线和相交,相交时求出交点。
以下是代码:
- #include<cstdio>
#include<iostream>
using namespace std; - struct point
{
double x,y;
}p1,p2,p3,p4,p0;
double a1,b1,c1,a2,b2,c2; - void solve()
{
p0.x=(c1*b2-c2*b1)/(a2*b1-a1*b2);
p0.y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
} - double crossmul(point p1,point p2,point p3) //叉乘
{
return (p3.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p3.y-p1.y);
} - double pointmul(point p1,point p2,point p3,point p4) //点乘
{
return (p1.x-p2.x)*(p3.y-p4.y)-(p1.y-p2.y)*(p3.x-p4.x);
} - int main()
{
int T;
scanf("%d",&T);
printf("INTERSECTING LINES OUTPUT/n");
while(T--)
{
int i;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y,&p4.x,&p4.y);
if(crossmul(p3,p4,p1)==0 && crossmul(p3,p4,p2)==0) - printf("LINE/n"); //判断两条直线是否共线
else
{
if(pointmul(p1,p2,p3,p4)==0) //判断两条直线是否平行
printf("NONE/n");
else
{
a1=p1.y-p2.y; b1=p2.x-p1.x; c1=p1.x*p2.y-p2.x*p1.y;
a2=p3.y-p4.y; b2=p4.x-p3.x; c2=p3.x*p4.y-p4.x*p3.y;
solve();
printf("POINT %.2lf %.2lf/n",p0.x,p0.y); //求出两条直线的交点
}
}
}
printf("END OF OUTPUT/n");
return 0;
}