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

MultiPlatform

  1. #include <LEDA/point_set.h>
  2. #include <LEDA/plane.h>
  3. #include <LEDA/window.h>
  4. window* Wp;
  5. void draw_vor_seg(double x1, double y1, double x2, double y2,double,double)
  6. { Wp->draw_segment(x1,y1,x2,y2,blue); }
  7. void draw_triang_seg(double x1, double y1, double x2, double y2)
  8. { Wp->draw_segment(x1,y1,x2,y2,red); 
  9.  }
  10. void infi_pt(double x1, double y1, double x2, double y2, double *x, double* y)
  11. { vector v(x2,y2);
  12.   v = v.norm();
  13.   *x = x1 + 1000 * v[0];
  14.   *y = y1 + 1000 * v[1];
  15.  }
  16. void draw_polygon(window& W, point_set<string>& S, list<ps_item>& P)
  17. { list_item it;
  18.   forall_items(it,P)
  19.   { point p =  S.key(P[it]);
  20.     point q =  S.key(P[P.cyclic_succ(it)]);
  21.     W.draw_segment(p,q);
  22.    }
  23.  }
  24. main()
  25. {
  26.   window W;
  27.   Wp = &W;
  28.   int node_width = 4;
  29.   int line_width = 1;
  30.   int grid_width = 0;
  31.   W.set_mode(xor_mode);
  32.   panel P("POINT SET");
  33.   P.text_item("Use the left mouse button to insert points. If a shift ");
  34.   P.text_item("key is pressed simultaneously the nearest neighbor of  ");
  35.   P.text_item("the current mouse position is computed and displayed.  ");
  36.   P.text_item("An iso-oriented query rectangle can by defined using   ");
  37.   P.text_item("the middle button twice. An orthogonal range query is  ");
  38.   P.text_item("performed and all points lying inside the rectangle    ");
  39.   P.text_item("are deleted. Click the right button to quit.           ");
  40.   P.int_item("line width",line_width,1,5);
  41.   P.int_item("node width",node_width,1,10);
  42.   P.int_item("GRID",grid_width,0,8,1);
  43.   P.open();
  44.   W.clear();
  45.   W.set_node_width(node_width);
  46.   W.set_line_width(line_width);
  47.   W.set_grid_mode(grid_width);
  48.   point_set<string> S;
  49.   double        x,y,x1,y1;
  50.   int           button=0;
  51.   bool          voro = false;
  52.   ps_item       nearest_it=nil;
  53.   point         p; 
  54.   list<ps_item> Pol;
  55.   while (button !=3 )
  56.   {  
  57.      button =  W.read_mouse(x,y);
  58.      if (nearest_it) W.draw_edge_arrow(p,S.key(nearest_it));
  59.      if (!Pol.empty()) draw_polygon(W,S,Pol); 
  60.      if (voro)  S.trace_voronoi_edges(draw_vor_seg,infi_pt);
  61.      Pol.clear();
  62.      nearest_it = nil;
  63.      voro = false;
  64.      p = point(x,y);
  65.      switch(button) {
  66.      case 1: { string s("point (%f,%f)",p.xcoord(),p.ycoord());
  67.                S.insert(p,s);
  68.                W.draw_filled_node(p);
  69.                break;
  70.               }
  71.      case 2: { W.read_mouse_rect(x,y,x1,y1);
  72.                list<ps_item> L = S.range_search(x,x1,y,y1);
  73.                ps_item it;
  74.                forall(it,L) 
  75.                { cout << "delete " << S.inf(it) << "n";
  76.                  W.draw_filled_node(S.key(it));
  77.                  S.del_item(it);
  78.                 }
  79.                cout.flush();
  80.                break;
  81.               }
  82.      case -1:  { nearest_it = S.nearest_neighbor(p);
  83.                  if (nearest_it!=nil) 
  84.                   { W.draw_edge_arrow(p,S.key(nearest_it));
  85.                     cout << "Nearest " << S.inf(nearest_it) << "n";
  86.                    }
  87.                  else cout << "Empty point set.n";
  88.                  cout.flush();
  89.                  break;
  90.                 }
  91.      case -2:  { S.trace_voronoi_edges(draw_vor_seg,infi_pt);
  92.                  voro = true;
  93.                  break;
  94.                 }
  95.      case -3:  { Pol = S.convex_hull();
  96.                  draw_polygon(W,S,Pol);
  97.                  break;
  98.                 }
  99.      } //switch
  100. } //for
  101. return 0;
  102. }