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-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;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/81983777