triang.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. #include <LEDA/plane_alg.h>
  2. #include <LEDA/point.h>
  3. #include <LEDA/matrix.h>
  4. #include <LEDA/map.h>
  5. static int  flip_count = 0;
  6. static int visited_edges = 0;
  7. #define NEXT_FACE_EDGE(x)   G.cyclic_adj_pred(G[x])
  8. void DELAUNAY_FLIPPING(GRAPH<point,edge>& G)
  9. {
  10.   edge_map<bool> marked(G,false);
  11.   list<edge> L;
  12.   edge e;
  13.   forall_edges(e,G) 
  14.     if ( !marked[e] )
  15.     { L.append(e);
  16.       marked[e] = true;
  17.       marked[G[e]] = true;
  18.      }
  19.   while ( !L.empty() )
  20.   { visited_edges++;
  21.     edge e = L.pop();
  22.     edge r = G[e];
  23.     edge e_succ = G.cyclic_adj_succ(e);
  24.     edge e_pred = G.cyclic_adj_pred(e);
  25.     marked[e] = false;
  26.     marked[r] = false;
  27.     point a = G[source(e)];
  28.     point b = G[target(e_pred)];
  29.     point c = G[target(e)];
  30.     point d = G[target(e_succ)];
  31.     if ( right_turn(b,a,d) && right_turn(b,d,c) && incircle(a,b,c,d) )
  32.     { flip_count++;
  33.       G.del_edge(r);
  34.       for(edge x = e_pred; x != e; x = NEXT_FACE_EDGE(x))
  35.         if ( !marked[x] ) 
  36.         { L.push(x); 
  37.           marked[x] = marked[G[x]] = true; 
  38.          }
  39.       G.del_edge(e);
  40.       e = G.new_edge(G[e_pred],target(e_succ),nil,before);
  41.       r = G.new_edge(G[e_succ],target(e_pred),e);
  42.       G[e] = r;
  43.      }
  44.    }
  45.  }
  46. random_source& operator>>(random_source& R, point& p)
  47. { double x,y;
  48.   R >> x >>y;
  49.   p = point(x,y);
  50.   return R;
  51. }
  52. main()
  53. {
  54.    int N = read_int("N = ");
  55.    list<point> L;
  56.    random_source ran(0,1000);
  57.    ran.set_seed(12345*N);
  58.    for(int i=0; i<N; i++) 
  59.    { point p;
  60.      ran >> p;
  61.      L.append(p);
  62.     }
  63. GRAPH<point,edge> G;
  64. float T = used_time();
  65. G.clear();
  66. flip_count = 0;
  67. TRIANGULATE_POINTS(L,G);
  68. DELAUNAY_FLIPPING(G);
  69. cout << string("visited = %d flips = %d   time = %.2f",
  70.                 visited_edges, flip_count,used_time(T)) << endl;
  71. return 0;
  72. }