poj 1269 Intersecting Lines (求兩直線交點)
阿新 • • 發佈:2018-11-05
題目連結: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; }