刚开始做这道题貌似很纠结的样子,在纠结了更纠结的题目之后回来看这道题就是小case了
不过竟然把题目当成是判断线段相交了。于是WA…………………………………………
自己弱弱的写了一个判断平行的代码,其他直接用模板……
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define infinity 1e20
#define EP 1e-10
const int MAXV = 300 ;
const double PI = 2.0*asin(1.0); //高精度求PI
const double eps = 1e-6;
struct Lpoint
{
double x,y;
}; //点
struct Llineseg
{
Lpoint a,b;
}; //线段
struct Ldir
{
double dx,dy;
}; //方向向量
struct Lline
{
Lpoint p;
Ldir dir;
}; //直线
struct Lrad
{
Lpoint Sp;
Ldir dir;
}; //射线
struct Lround
{
Lpoint co;
double r;
};//圆
double p2pdis(Lpoint p1,Lpoint p2)
{
return (sqrt((p1.x-p2.x) * (p1.x-p2.x) +
(p1.y-p2.y) * (p1.y-p2.y)));
}
double xmulti(Lpoint p1,Lpoint p2,Lpoint p0)
{
return((p1.x-p0.x) * (p2.y-p0.y) -
(p2.x-p0.x) * (p1.y-p0.y));
}
double mx(double t1,double t2)
{
if(t1>t2) return t1;
return t2;
}
double mn(double t1,double t2)
{
if(t1<t2) return t1;
return t2;
}
int lsinterls(Llineseg u,Llineseg v)
{
return( (mx(u.a.x,u.b.x)>=mn(v.a.x,v.b.x))&&
(mx(v.a.x,v.b.x)>=mn(u.a.x,u.b.x))&&
(mx(u.a.y,u.b.y)>=mn(v.a.y,v.b.y))&&
(mx(v.a.y,v.b.y)>=mn(u.a.y,u.b.y))&&
(xmulti(v.a,u.b,u.a)*xmulti(u.b,v.b,u.a)>=0)&&
(xmulti(u.a,v.b,v.a)*xmulti(v.b,u.b,v.a)>=0));
}
int ponls(Llineseg l,Lpoint p)
{
return( (xmulti(l.b,p,l.a)==0) &&
( ((p.x-l.a.x)*(p.x-l.b.x)<0 ) ||
((p.y-l.a.y)*(p.y-l.b.y)<0 )) );
}
int Euqal_Point(Lpoint p1,Lpoint p2)
{
return((fabs(p1.x-p2.x)<EP)&&(fabs(p1.y-p2.y)<EP));
}
int lsinterls_A(Llineseg u,Llineseg v)
{
return((lsinterls(u,v)) && (!Euqal_Point(u.a,v.a))&&
(!Euqal_Point(u.a,v.b)) &&
(!Euqal_Point(u.b,v.a))&&
(!Euqal_Point(u.b,v.b)));
}
Lpoint intersection(Llineseg u,Llineseg v){
Lpoint ret=u.a;
double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))
/((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
ret.x+=(u.b.x-u.a.x)*t;
ret.y+=(u.b.y-u.a.y)*t;
return ret;
}
int linecorss(Lpoint p1,Lpoint p2,Lpoint p3,Lpoint p4,Lpoint *p)
{
double k;
if ((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y)==0) return 0;
if ((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x)==0&&
(p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x)==0) return 0;
k=((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y));
//k1=((p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y));
(*p).x=p1.x+k*(p2.x-p1.x);
(*p).y=p1.y+k*(p2.y-p1.y);
return 1;
}
bool online(Llineseg p , Llineseg q)
{
if(!xmulti(q.a,q.b,p.a) && !xmulti(q.a,q.b,p.b)) return true;
else return false;
}
bool Judge_parallel(Llineseg p, Llineseg q)
{
if(fabs(p.a.x - p.b.x) < eps && fabs(q.a.x - q.b.x) < eps && online(p,q)) return true;
if(fabs(p.a.x - p.b.x) > eps && fabs(q.a.x - q.b.x) > eps)
{
if(fabs((p.b.y - p.a.y)/(p.b.x-p.a.x) - (q.b.y-q.a.y)/(q.b.x-q.a.x)) < eps && online(p,q))
return true;
else
return false;
}
return false;
}
int main()
{
// freopen("1269.txt","r",stdin);
int n;
while(~scanf("%d",&n))
{
printf("INTERSECTING LINES OUTPUT\n");
for(int i=1; i<=n; i++)
{
Llineseg a,b;
Lpoint tem;
scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&a.a.x,&a.a.y,&a.b.x,&a.b.y,&b.a.x,&b.a.y,&b.b.x,&b.b.y);
if(Judge_parallel(a,b))
printf("LINE\n");
else if(linecorss(a.a,a.b,b.a,b.b,&tem))
{
printf("POINT %.2lf %.2lf\n",tem.x,tem.y);
}
else
printf("NONE\n");
}
printf("END OF OUTPUT\n");
}
}