题意:给出两条直线上的两点求两直线的交点。
思路:
一般方程法:
直线的一般方程为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-18;
struct point{
double x,y;
point(){}
point(int _x,int _y){
x=_x;y=_y;
}
point operator + (point &p){
return point(x+p.x,y+p.y);
}
point operator - (point &p){
return point(x-p.x,y-p.y);
}
point operator * (double k){
return point(x*k,y*k);
}
point operator / (double k){
return point(x/k,y/k);
}
};
double cross(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
int main()
{
int t;
scanf("%d",&t);
printf("INTERSECTING LINES OUTPUT\n");
while(t--){
point p1,p2,p3,p4;
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(p3-p2,p3-p1))<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);
}
}
printf("END OF OUTPUT\n");
return 0;
}