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

MultiPlatform

  1. #include <LEDA/plane_alg.h>
  2. #include <LEDA/subdivision.h>
  3. #include <LEDA/window.h>
  4. main()
  5. {
  6.   window W;
  7.   W.init(0,1000,0);
  8.   int node_width = 4;
  9.   int line_width = 1;
  10.   int input = 1;
  11.   int grid_width = 0;
  12.   int N = 100;
  13.   panel P("VORONOI");
  14.   P.text_item("This program computes the Voronoi diagram for a set  "); 
  15.   P.text_item("of point sites S in the plane. There are two ways of ");
  16.   P.text_item("defining set S. Mouse input: Use the left button to  ");
  17.   P.text_item("insert a sequence of points and terminate the input  ");
  18.   P.text_item("by clicking the right button. Random input: Give the ");
  19.   P.text_item("number of random points to be created by the program.");
  20.   P.text_item("The Voronoi diagram Vor(S) is computed and shown. Now");
  21.   P.text_item("you can define query points with the left button, for");
  22.   P.text_item("each of which a point location in Vor(S) is performed.");
  23.   P.text_item("Terminate the program by clicking the right button.  "); 
  24.   P.text_item("                                                     ");
  25.   P.choice_item("INPUT",input,"RANDOM","MOUSE");
  26.   P.int_item("GRID",grid_width,0,40,10);
  27.   P.int_item("SITES",N);
  28.   P.int_item("node width",node_width,1,10);
  29.   P.int_item("line width",line_width,1,5);
  30.   P.open(W);
  31.   W.set_node_width(node_width);
  32.   W.set_line_width(line_width);
  33.   double x, y;
  34.   point c;
  35.   double R = 1000;  // length of the "infinite rays"
  36.   list<point> sites;
  37.   W.clear();
  38.   if (input)
  39.   { W.init(0,1000,0,grid_width);
  40.     while ( W >> c ) 
  41.     { W << c;
  42.       sites.append(c);
  43.      }
  44.    }
  45.   else 
  46.    { while (N--)
  47.      { c = point(rand_int(100,900),rand_int(100,900));
  48.        W << c;
  49.        sites.append(c);
  50.      }
  51.    }
  52.   cout << "Computing Voronoi diagramn";
  53.   newline;
  54.   edge e;
  55.   GRAPH<point,point> G;
  56.   VORONOI(sites,R,G);
  57.   // Draw Graph
  58.   forall_edges(e,G) W.draw_segment(G[source(e)], G[target(e)]);
  59.   cout << "Computing subdivisionn";
  60.   newline;
  61.   
  62.   subdivision<point> S(G);
  63.   // locate points
  64.   W.message("Give query points!");
  65.   W.set_mode(xor_mode);
  66.   face f = nil;
  67.   while (W.read_mouse(x,y)!=3)
  68.   { if (f!=nil)                      // delete previously located site
  69.       W.draw_filled_node(S.inf(f));
  70.   
  71.     f = S.locate_point(point(x,y));
  72.   
  73.     W.draw_filled_node(S.inf(f));
  74.     cout << S.inf(f);
  75.     newline;
  76.    }
  77.   return 0;
  78. }