解题报告
题意:
判断直线的位置关系(平行,重合,相交)
思路:
两直线可以用叉积来判断位置关系。
AB直线和CD直线
平行的话端点C和端点D会在直线AB的同一侧。
重合的话在直线AB上。
剩下就是相交。
求两直线交点可以用面积比和边长比来求。
看下面的图就知道了,推导就比较容易了
#include <iostream>
#include <cstring>
#include <cstdio>
#define eps 1e-6
#define zero(x) (((x)>0?(x):-(x))>eps)
using namespace std;
struct Point
{
double x,y;
};
struct L
{
Point l,r;
};
double xmulti(Point a,Point b,Point p)
{
return (b.x-a.x)*(p.y-a.y)-(p.x-a.x)*(b.y-a.y);
}
int main()
{
int n,i,j;
scanf("%d",&n);
cout<<"INTERSECTING LINES OUTPUT"<<endl;
L l1,l2;
Point p;
for(i=0; i<n; i++)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&l1.l.x,&l1.l.y,&l1.r.x,&l1.r.y,&l2.l.x,&l2.l.y,&l2.r.x,&l2.r.y);
double a,b,c,d;
a=xmulti(l1.l,l1.r,l2.l);//c
b=xmulti(l1.l,l1.r,l2.r);//d
c=xmulti(l2.l,l2.r,l1.l);
d=xmulti(l2.l,l2.r,l1.r);
if(a==0&&b==0)
cout<<"LINE"<<endl;
else if(a*b>0&&c*d>0)
{
cout<<"NONE"<<endl;
}
else
{
p.x=(b*l2.l.x-a*l2.r.x)/(b-a);
p.y=(b*l2.l.y-a*l2.r.y)/(b-a);
printf("POINT %.2lf %.2lf\n",p.x,p.y);
}
}
cout<<"END OF OUTPUT"<<endl;
}
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 10764 | Accepted: 4803 |
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
Source
POJ1269_Intersecting Lines(几何/叉积判断直线位置关系),布布扣,bubuko.com
POJ1269_Intersecting Lines(几何/叉积判断直线位置关系)
原文:http://blog.csdn.net/juncoder/article/details/38544545