HDU 1086 You can Solve a Geometry Problem too

计算几何基础问题,具体可以参考算法导论p577,确定两个线段是否相交

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 struct point{
 8     double x,y;
 9 };
10 
11 struct segment{
12     point p1,p2;
13 };
14 
15 double direction(point p1, point p2, point p3){
16     return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);
17 }
18 
19 bool on_segment(point p1, point p2, point p3){
20     if( min(p1.x,p2.x) <= p3.x && p3.x <= max(p1.x,p2.x) && min(p1.y,p2.y) <= p3.y && p3.y <= max(p1.y,p2.y) )
21         return true;
22     else return false;
23 }
24 
25 bool segment_intersect(point p1,point p2,point p3,point p4){
26     double d1 = direction(p3,p4,p1);
27     double d2 = direction(p3,p4,p2);
28     double d3 = direction(p1,p2,p3);
29     double d4 = direction(p1,p2,p4);
30     if( d1*d2 <0 && d3*d4 < 0) return true;
31     else if(d1 == 0 && on_segment(p3,p4,p1)) return true;
32     else if(d2 == 0 && on_segment(p3,p4,p2)) return true;
33     else if(d3 == 0 && on_segment(p1,p2,p3)) return true;
34     else if(d4 == 0 && on_segment(p1,p2,p4)) return true;
35     else return false;
36 }
37 
38 int main(){
39     int N;
40     while(cin >>N && N){
41         vector<segment> seg(N);
42         for(int i = 0; i < N; i ++ )
43             cin >> seg[i].p1.x>>seg[i].p1.y>>seg[i].p2.x>>seg[i].p2.y;
44         int cnt  = 0;
45         for(int i = 0 ; i < N; i ++ ){
46             for(int j = i+1; j < N; j ++ ){
47                 if(segment_intersect(seg[i].p1,seg[i].p2,seg[j].p1,seg[j].p2)) cnt++;
48             }
49         }
50         cout<< cnt<<endl;
51     }
52     return 0;
53 }

 

posted @ 2013-04-10 14:51  OpenSoucre  阅读(155)  评论(0编辑  收藏  举报