POJ 1269 判断直线和直线关系

来源:互联网 发布:淘宝退货时间规定 编辑:程序博客网 时间:2024/05/10 19:24

题意:给两个直线,判断是相交还是重合还是平行,相交给出交点

注意:用一般式判断的时候需要三个比值相等而不是两个

fabs(la.a*lb.b - la.b*lb.a) < 1e-5&&fabs(la.a*lb.c - la.c*lb.a) < 1e-5&&fabs(la.b*lb.c - lb.b*la.c) < 1e-5


代码:

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<cmath>using namespace std;const double INF = 1e200;const double EP = 1e-10;const int maxn = 5100;const double PI = acos(-1);struct POINT{    double x;    double y;    POINT(double a = 0,double b = 0){x = a;y = b;}};///点 定义struct SEGMENT{///line segment    POINT s;    POINT e;    SEGMENT(POINT a,POINT b){s = a;e = b;}    SEGMENT(){}};///线段 定义struct LINE{///ax + by + c = 0&&a >= 0    double a;    double b;    double c;    LINE(double da,double db,double dc){a = da;b = db;c = dc;}};int multiply(POINT sp,POINT ep,POINT op){    return ((sp.x - op.x)*(ep.y - op.y) - (ep.x - op.x)*(sp.y - op.y));}///向量op->sp X op->ep的叉乘,小于0:ep在op->sp顺时针方向//大于0:0:ep在op->sp逆时针方向//等于0:三点共线bool lineintersect(LINE l1,LINE l2,POINT &p){///求两直线交点,有交点返回true和交点,没有返回false(重合也是返回false)    double d = l1.a*l2.b-l2.a*l1.b;    if(fabs(d) < EP)return false;    p.x = (l2.c*l1.b-l1.c*l2.b)/d;    p.y = (l2.a*l1.c-l1.a*l2.c)/d;    return true;}int main(){    int T;    cin>>T;    printf("INTERSECTING LINES OUTPUT\n");    while(T --){        POINT a,b,c,d;        cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;        LINE la(b.y-a.y,a.x-b.x,b.x*a.y-a.x*b.y);        LINE lb(d.y-c.y,c.x-d.x,d.x*c.y-c.x*d.y);        POINT ans;        bool flag = lineintersect(la,lb,ans);        if(flag == 0){            if(fabs(la.a*lb.b - la.b*lb.a) < 1e-5&&fabs(la.a*lb.c - la.c*lb.a) < 1e-5&&fabs(la.b*lb.c - lb.b*la.c) < 1e-5)printf("LINE\n");            else printf("NONE\n");        }        else{            printf("POINT %.2f %.2f\n",ans.x,ans.y);        }    }    printf("END OF OUTPUT\n");    return 0;}

0 0
原创粉丝点击