题意:n次询问,每次8个点,2条直线,判断直线相交,平行,还是属于一条。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct Point{
double x,y;
}point[1005];
struct Line{
Point a,b;
}line[1005];
double cross(Point p0,Point p1,Point p2)
{
return (p0.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p0.y-p1.y);
}
int intersect(Point p0,Point p1,Point p2,Point p3)
{
double d1=cross(p0,p2,p3);
double d2=cross(p1,p2,p3);
double d3=cross(p2,p0,p1);
double d4=cross(p3,p0,p1);
if( d1==0&&d2==0&&d3==0&&d4==0 ) // 一开始写成d1*d2==0&&d3*d4==0,忽略了当2条直线想交于一个端点的情况
return 1;
else if( d1*d2<=0||d3*d4<=0 ) // 一开始把||写成了&&,忽略了这是直线相交不是线段相交
//直线是可以延长的,所以只要满足一点就可成立
return 2;
return 0;
}
/// 相交直线的交点;
Point intersection(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()
{
int n;
while( scanf("%d",&n)!=EOF )
{
printf("INTERSECTING LINES OUTPUT\n");
for(int i=1;i<=n;i++)
{
Point p0,p1,p2,p3;
scanf("%lf%lf%lf%lf",&p0.x,&p0.y,&p1.x,&p1.y);
scanf("%lf%lf%lf%lf",&p2.x,&p2.y,&p3.x,&p3.y);
int k=intersect(p0,p1,p2,p3);
if( k==1 )
{
printf("LINE\n");
}
else if( k==0 )
{
printf("NONE\n");
}
else
{
Point ret=intersection(p0,p1,p2,p3);
printf("POINT %.2lf %.2lf\n",ret.x,ret.y);
}
}
printf("END OF OUTPUT\n");
}
return 0;
}