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

MultiPlatform

  1. #include <LEDA/plane_alg.h>
  2. #include <LEDA/d_array.h>
  3. #include <LEDA/window.h>
  4. static  int segments_to_points(list<segment>& in, 
  5.                                list<point>& out, 
  6.                                d_array<point,segment>& D, double dist)
  7.   int count = 0;
  8.   segment s;
  9.   random_source ran(0,10000);
  10.   forall(s,in)
  11.   { int n = int(s.length()/dist);
  12.     count = count + n +1;
  13.     double dx = (s.xcoord2() - s.xcoord1())/n;
  14.     double dy = (s.ycoord2() - s.ycoord1())/n;
  15.     double x  = s.xcoord1();
  16.     double y  = s.ycoord1();
  17.     out.append(s.start());
  18.     D[s.start()] = s;
  19.     for(int i = 0; i<n; i++)
  20.     {  x += dx + ran()/1000000.0;
  21.        y += dy + ran()/1000000.0;
  22.        point p(x,y);
  23.        D[p] = s;
  24.        out.append(p);
  25.      }
  26. /*
  27.     out.append(s.end());
  28.     count++;
  29. */
  30.    }
  31.   out.permute();
  32.  return count;
  33. }
  34. static  int polygons_to_points(list<polygon>& in, 
  35.                               list<point>& out, 
  36.                               d_array<point,segment>& D, int pixdist)
  37. { polygon p;
  38.   int count = 0;
  39.   forall(p,in)
  40.   { list<segment> sl = p.segments();
  41.     count += segments_to_points(sl,out,D,pixdist);
  42.    }
  43.   return count;
  44.  }
  45. /*
  46. static  int circles_to_points(list<circle>& in, 
  47.                               list<point>& out, 
  48.                               d_array<point,circle>& D, double dist)
  49.   int count = 0;
  50.   circle s;
  51.   forall(s,in)
  52.   { point c = s.center();
  53.     double r = s.radius();
  54.     int n = int(6.283 * r/dist);
  55.     count = count + n +1;
  56.     double alpha = 0;
  57.     double d = 6.283/n;
  58.     for(int i = 0; i<n; i++)
  59.     {  point p = c.translate(alpha,r + 0.0001 * rrandom());
  60.        alpha += d;
  61.        D[p] = s;
  62.        out.append(p);
  63.      }
  64.    }
  65.   out.permute();
  66.  return count;
  67. }
  68. */
  69. void VORONOI_SEG(list<segment>& sites, double R,GRAPH<point,point>& G, 
  70.                                                              int pixdist = 10)
  71.   list<point> pl;
  72.   d_array<point,segment> D;
  73.   segments_to_points(sites,pl,D,pixdist);
  74.   VORONOI(pl,R,G);
  75.   // eliminate edges intersecting segments
  76.   list<edge> el;
  77.   edge e;
  78.   point p;
  79.   forall_edges(e,G)  
  80.   { segment s = D[G[e]];
  81.     if (s.intersection(segment(G[source(e)],G[target(e)]),p)) el.append(e);
  82.    }
  83.   forall(e,el) G.del_edge(e);
  84.  }
  85. main()
  86. {
  87.  window W;
  88.  W.init(0,1000,0);
  89.   segment s;
  90.   circle  c;
  91.   polygon p;
  92.   double R = 1000;
  93.   list<point>   pl;
  94.   list<segment> sl;
  95.   list<circle>  cl;
  96.   list<polygon> Pl;
  97.   while ( W >> s ) 
  98.   { W << s;
  99.     sl.append(s);
  100.    }
  101. /*
  102.   while ( W >> c ) 
  103.   { W << c;
  104.     cl.append(c);
  105.    }
  106.   while ( W >> p ) 
  107.   { W << p;
  108.     Pl.append(p);
  109.    }
  110. */
  111.   int n = 10;
  112.   cout << "Computing Voronoi diagramn";
  113.   newline;
  114.   GRAPH<point,point> G;
  115.     d_array<point,segment> D;
  116.     d_array<point,circle> D2;
  117.   
  118.     int count = segments_to_points(sl,pl,D,n/W.scale());
  119.             //+ circles_to_points(cl,pl,D2,n)
  120.             //+ polygons_to_points(Pl,pl,D,n);
  121.     cout << count << " points generated.n";
  122.     newline;
  123.     pl.append(point(-5000,-5000));
  124.     pl.append(point(-5000,5000));
  125.     pl.append(point(5000,5000));
  126.     pl.append(point(5000,-5000));
  127.   
  128.     VORONOI(pl,R,G);
  129.     edge e;
  130. /*
  131.     forall_edges(e,G) W.draw_segment(G[source(e)], G[target(e)]);
  132.     W.read_mouse();
  133. */
  134.     // eliminate edges intersecting segments
  135.     list<edge> el;
  136.     edge_array<edge> rev(G);
  137.     compute_correspondence(G,rev);
  138.     edge_array<int> deleted(G,false);
  139.   
  140.     forall_edges(e,G)  
  141.      if (!deleted[e])
  142.      { segment s = D[G[e]];
  143.        segment t = segment(G[source(e)], G[target(e)]);
  144.        point p;
  145.        if (s.intersection(t,p)) deleted[e] = deleted[rev[e]] = true;
  146.       }
  147.     W.set_line_width(2);
  148.     forall_edges(e,G) 
  149.         if (!deleted[e]) W.draw_segment(G[source(e)], G[target(e)],blue);
  150.     W.read_mouse();
  151.     return 0;
  152. }