| 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