版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/83539945
题目链接:poj 1269
题意:给出n个询问,每次给两条边,有三种不同的结果可以输出,1,平行不共线,2,平行且共线,3,相交并求出交点
题解:模板题,注意一点的是,判断两直线平行时用叉积去判断,不要简单的直接用斜率公式去判断,可能会出现误差。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
struct point{
double x,y;
point(){}
point(double _x,double _y){
x=_x;y=_y;
}
};
struct line{
point s,e;
line(){}
line(point _s,point _e){
s=_s;e=_e;
}
}segment[20];
point operator + (point a,point b) {return point(a.x+b.x,a.y+b.y);}
point operator - (point a,point b) {return point(a.x-b.x,a.y-b.y);}
point operator * (point a,double p) { return point(a.x*p,a.y*p);}
point operator / (point a,double p){ return point(a.x/p,a.y/p);}
bool operator < (const point &a,const point &b){
return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
const double esp=1e-8;
int dcmp(double x){
if(fabs(x)<esp) return 0;
else return x<0?-1:1;
}
bool operator ==(const point &a,const point &b){
return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}
double Cross(point A,point B){
return A.x*B.y-A.y*B.x;
}
point Getlinenode(point P,point v,point Q,point w){ ///求两直线的交点
point u=P-Q;
double t=Cross(w,u)/Cross(v,w);
return P+v*t;
}
bool Onsegment(point P,point a1,point a2){ ///判断点在直线上
return dcmp(Cross(P-a1,P-a2))==0;
}
int main()
{
int n;
while(~scanf("%d",&n)){
printf("INTERSECTING LINES OUTPUT\n");
double x1,y1,x2,y2,x3,y3,x4,y4;
while(n--){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
segment[1]=line(point(x1,y1),point(x2,y2));
scanf("%lf%lf%lf%lf",&x3,&y3,&x4,&y4);
segment[2]=line(point(x3,y3),point(x4,y4));
/// if(dcmp((y2-y1)/(x2-x1)-(y4-y3)/(x4-x3))==0) ///判断两直线斜率是否相等
if(dcmp(Cross(segment[1].e-segment[1].s,segment[2].e-segment[2].s))==0)
{///叉积判断,不要用上面的,直接斜率公式,不然可能会出现精度误差
if(Onsegment(segment[1].s,segment[2].s,segment[2].e)){ ///判断是否共线
printf("LINE\n");
}
else printf("NONE\n");
}
else{
point a=Getlinenode(segment[1].s,segment[1].e-segment[1].s,segment[2].s,segment[2].e-segment[2].s);
printf("POINT %.2f %.2f\n",a.x,a.y);
}
}
printf("END OF OUTPUT\n");
}
return 0;
}