POJ 1269 判断直线和直线关系

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值