poj 1269 Intersecting Lines (求两直线交点)

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/83539945

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/83539945