Your program will repeatedly read in four points that define two lines in the x-y plane and determine how and where the lines intersect. All numbers required by this problem will be reasonable, say between -1000 and 1000.
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
題意: 判斷兩條線是平行,共線,還是相交;
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-8;
struct point
{
double x,y;
};
struct vector
{
point start,end;
};
point p;
double multi(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int Across(vector v1,vector v2)
{
if(max(v1.start.x,v1.end.x)>=min(v2.start.x,v2.end.x)&&max(v2.start.x,v2.end.x)>=min(v1.start.x,v1.end.x)&&
max(v1.start.y,v1.end.y)>=min(v2.start.y,v2.end.y)&&multi(v2.start,v1.end,v1.start)*multi(v1.end,v2.end,v1.start)>=0
&&multi(v1.start,v2.end,v2.start)*multi(v2.end,v1.end,v2.start)>=0)
return 1;
return 0;
}
int intersection(vector u,vector v)
{
p.x=(multi(v.end,u.end,u.start)*v.start.x-multi(v.start,u.end,u.start)*v.end.x)/(multi(v.end,u.end,u.start)-multi(v.start,u.end,u.start));
p.y=(multi(v.end,u.end,u.start)*v.start.y-multi(v.start,u.end,u.start)*v.end.y)/(multi(v.end,u.end,u.start)-multi(v.start,u.end,u.start));
return 0;
}
vector a,b;
int main()
{
int n;
while(cin>>n)
{
printf("INTERSECTING LINES OUTPUT\n");
for(int i=0;i<n;i++)
{
cin>>a.start.x>>a.start.y>>a.end.x>>a.end.y>>b.start.x>>b.start.y>>b.end.x>>b.end.y;
if(fabs(multi(a.start,a.end,b.start))<eps&&fabs(multi(a.start,a.end,b.end))<eps)
printf("LINE\n");
else if((a.end.x-a.start.x)*(b.end.y-b.start.y)==(a.end.y-a.start.y)*(b.end.x-b.start.x))
printf("NONE\n");
else
{
intersection(a,b);
printf("POINT %.2f %.2f\n",p.x,p.y);
p.x=0.0,p.y=0.0;
}
}
printf("END OF OUTPUT\n");
}
return 0;
}