Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 12284 | Accepted: 5495 |
Description
Input
Output
Sample Input
5 0 0 4 4 0 4 4 0 5 0 7 6 1 0 2 3 5 0 7 6 3 -6 4 -3 2 0 2 27 1 5 18 5 0 3 4 0 1 2 2 5
Sample Output
INTERSECTING LINES OUTPUT POINT 2.00 2.00 NONE LINE POINT 2.00 5.00 POINT 1.07 2.20 END OF OUTPUT
题意:有N组数据,每组数据分别给出两条直线的两个点,问这两条直线是否相交,不相交的话,如果共线则输出LINE,平行则输出NONE,相交的话,输出交点坐标
题解:三点共线的条件是:p1,p2,p3:(p2-p1)X(p3-p1)=0,没有交点就判断是否平行
#include<cstring> #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #define eps 1e-8 using namespace std; struct point { double x,y; } p[8]; ///叉积 double ok(point a,point b,point c) { return (c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y); } //共线判断 bool Line(point a,point b,point c) { return ok(a,b,c)==0; } ///交点判断 bool None() { return (p[1].y-p[2].y)*(p[3].x-p[4].x)==(p[1].x-p[2].x)*(p[3].y-p[4].y); } //求交点 point inter(point u1,point u2,point v1,point v2) { point ret=u1; double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x)) /((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x)); ret.x+=(u2.x-u1.x)*t; ret.y+=(u2.y-u1.y)*t; return ret; } int main() { //freopen("in.txt","r",stdin); int n; while(cin>>n) { printf("INTERSECTING LINES OUTPUT\n"); while(n--) { for(int i=1; i<=4; i++) scanf("%lf%lff",&p[i].x,&p[i].y); if(Line(p[1],p[3],p[4])&&Line(p[2],p[3],p[4])) { printf("LINE\n"); continue; } if(None()) { printf("NONE\n"); continue; } point ans=inter(p[1],p[2],p[3],p[4]); printf("POINT %.2f %.2f\n",ans.x,ans.y); } printf("END OF OUTPUT\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
poj 1269 Intersecting Lines(计算几何)
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/47299793