1. 程式人生 > >poj 1269 Intersecting Lines (求兩直線交點)

poj 1269 Intersecting Lines (求兩直線交點)

題目連結:poj 1269

題意:給出n個詢問,每次給兩條邊,有三種不同的結果可以輸出,1,平行不共線,2,平行且共線,3,相交併求出交點

題解:模板題,注意一點的是,判斷兩直線平行時用叉積去判斷,不要簡單的直接用斜率公式去判斷,可能會出現誤差

程式碼如下:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;

struct point{
    double x,y;
    point(){}
    point(double _x,double _y){
        x=_x;y=_y;
    }
};

struct line{
    point s,e;
    line(){}
    line(point _s,point _e){
        s=_s;e=_e;
    }
}segment[20];

point operator + (point a,point b) {return point(a.x+b.x,a.y+b.y);}
point operator - (point a,point b) {return point(a.x-b.x,a.y-b.y);}
point operator * (point a,double p) { return point(a.x*p,a.y*p);}
point operator / (point a,double p){ return point(a.x/p,a.y/p);}

bool operator < (const point &a,const point &b){
    return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
const double esp=1e-8;
int dcmp(double x){
    if(fabs(x)<esp) return 0;
    else return x<0?-1:1;
}
bool operator ==(const point &a,const point &b){
    return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}

double Cross(point A,point B){
    return A.x*B.y-A.y*B.x;
}

point Getlinenode(point P,point v,point Q,point w){ ///求兩直線的交點
    point u=P-Q;
    double t=Cross(w,u)/Cross(v,w);
    return P+v*t;
}

bool Onsegment(point P,point a1,point a2){ ///判斷點在直線上
    return dcmp(Cross(P-a1,P-a2))==0;
}

int main()
{
    int n;
    while(~scanf("%d",&n)){
    printf("INTERSECTING LINES OUTPUT\n");
    double x1,y1,x2,y2,x3,y3,x4,y4;
    while(n--){
        scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
        segment[1]=line(point(x1,y1),point(x2,y2));
        scanf("%lf%lf%lf%lf",&x3,&y3,&x4,&y4);
        segment[2]=line(point(x3,y3),point(x4,y4));

       /// if(dcmp((y2-y1)/(x2-x1)-(y4-y3)/(x4-x3))==0) ///判斷兩直線斜率是否相等
        if(dcmp(Cross(segment[1].e-segment[1].s,segment[2].e-segment[2].s))==0)
        {///叉積判斷,不要用上面的,直接斜率公式,不然可能會出現精度誤差
            if(Onsegment(segment[1].s,segment[2].s,segment[2].e)){ ///判斷是否共線
                printf("LINE\n");
            }
            else printf("NONE\n");
        }
        else{
            point a=Getlinenode(segment[1].s,segment[1].e-segment[1].s,segment[2].s,segment[2].e-segment[2].s);

            printf("POINT %.2f %.2f\n",a.x,a.y);
        }

    }
    printf("END OF OUTPUT\n");

    }
    return 0;
}