POJ 1269 intersecting Lines
蒻苣:弱弱很弱,路过的巨巨还不吝赐教!^.^...QAQ
题意:给定两条线段,判断是共线还是平行还是相交,相交还要输出相交的点
题解:转化成直线方程,然后直接判断就行。注意精度误差
代码:
1 #include<iostream> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 #include<cstdio> 6 using namespace std; 7 const double EP = 1E-9; 8 struct POINT{ 9 double x,y; 10 POINT ( double a = 0, double b = 0 ){ x = a; y = b ;} 11 }; 12 13 struct LINE{ 14 double a,b,c; 15 LINE( double d1 = 1,double d2 = -1,double d3 = 0 ){ a = d1;b = d2; c = d3; } 16 }; 17 18 LINE makeline( POINT p1, POINT p2 ) 19 { 20 LINE tl; 21 int sign = 1; 22 tl.a = p2.y - p1.y; 23 if(tl.a<0) 24 { 25 sign = -1; 26 tl.a = sign*tl.a; 27 } 28 tl.b = sign*( p1.x - p2.x ); 29 tl.c = sign*( p1.y*p2.x - p1.x*p2.y ); 30 return tl; 31 } 32 33 bool lineintersect( LINE l1, LINE l2, POINT &p ) 34 { 35 double d = l1.a*l2.b - l2.a*l1.b; 36 if(abs(d)<EP) 37 return false; 38 p.x = ( l2.c*l1.b-l1.c*l2.b )/d; 39 p.y = ( l2.a*l1.c-l1.a*l2.c )/d; 40 return true; 41 } 42 43 int main() 44 { 45 int n; 46 cin>>n; 47 puts("INTERSECTING LINES OUTPUT"); 48 POINT a,b,c,d; 49 for(int i = 0;i < n;i++) 50 { 51 POINT p; 52 cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y; 53 LINE l1 = makeline(a,b); 54 LINE l2 = makeline(c,d); 55 // cout<<l1.a<<" "<<l1.b<<" "<<l1.c<<endl; 56 // cout<<l2.a<<" "<<l2.b<<" "<<l2.c<<endl; 57 if( abs(l1.a*l2.b - l1.b*l2.a) < EP && abs(l1.a*l2.c - l1.c*l2.a) < EP && abs(l1.b*l2.c - l1.c*l2.b) < EP ) 58 puts("LINE"); 59 else if(lineintersect(l1,l2,p)) 60 { 61 //cout<<p.x<<" "<<p.y<<endl; 62 printf("POINT %.2f %.2f\n",p.x,p.y); 63 } 64 else 65 puts("NONE"); 66 } 67 puts("END OF OUTPUT"); 68 }
浙公网安备 33010602011771号