Intersecting Lines POJ - 1269
程序员文章站
2022-04-02 17:02:08
...
Intersecting Lines POJ - 1269
题意:给出两条直线上的两点求两直线的交点。
思路:
一般方程法:
直线的一般方程为F(x) = ax + by + c = 0。既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = y0 – y1, b = x1 – x0, c = x0y1 – x1y0。
因此我们可以将两条直线分别表示为
F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0
那么两条直线的交点应该满足
a0*x + b0*y +c0 = a1*x + b1*y + c1
由此可推出
x = (b0*c1 – b1*c0)/D
y = (a1*c0 – a0*c1)/D
D = a0*b1 – a1*b0, (D为0时,表示两直线平行或者重合)
判断重合用叉积表示。
//求两直线的交点
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double e=1e-8;
struct point
{
double x,y;
};
struct v{
point start;
point end;
v(){}
v(point _start,point _end){
start=_start;end=_end;
}
};
double cross(v v1,v v2)//判断
{
double result=0;
v1.end.x=v1.end.x-v1.start.x;
v1.end.y=v1.end.y-v1.start.y;
v1.start.x=v1.start.y=0;
v2.end.x=v2.end.x-v2.start.x;
v2.end.y=v2.end.y-v2.start.y;
v2.start.x=v2.start.y=0;
result=v1.end.x*v2.end.y-v2.end.x*v1.end.y;
return result;
}
int main()
{
int T;point p1,p2,p3,p4;
scanf("%d",&T);
printf("INTERSECTING LINES OUTPUT\n");
while(T--)
{
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);
double a0,b0,c0,a1,b1,c1;
a0=p1.y-p2.y,b0=p2.x-p1.x,c0=p1.x*p2.y-p2.x*p1.y;
a1=p3.y-p4.y,b1=p4.x-p3.x,c1=p3.x*p4.y-p4.x*p3.y;
double D=a0*b1-a1*b0;
if(fabs(D)<e)
{
if(fabs(cross(v(p1,p3),v(p1,p2)))<e) printf("LINE\n");
else printf("NONE\n");
}
else
{
double x=(b0*c1-b1*c0)/D;
double y=(a1*c0-a0*c1)/D;
printf("POINT %.2f %.2f\n",x,y);//输出%.2lf与%.2f的区别?输出不用lf
}
printf("END OF OUTPUT\n");
return 0;
}