您的位置:首页 > 其它

POJ 1269 判断直线和直线关系

2015-05-13 23:35 357 查看
题意:给两个直线,判断是相交还是重合还是平行,相交给出交点

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  直线和直线