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

MultiPlatform

  1. #include <LEDA/subdivision.h>
  2. #include <LEDA/plane_alg.h>
  3. #include <LEDA/window.h>
  4. void  show_face(subdivision<segment>& G, face f, window& W)
  5. { list<node> L = G.adj_nodes(f);
  6.   list<point> P;
  7.   node v;
  8.   forall(v,L) P.append(G[v]);
  9.   W.draw_filled_polygon(P,red);
  10. }
  11. main()
  12. {
  13.   window W;
  14.   W.init(0,1000,0);
  15.   W.message("            Arrangement of line segments                ");
  16.   W.message("                                                        ");
  17.   W.message("This program computes an arrangement of straight lines. ");
  18.   W.message("Use the left button to insert a sequence of lines and ");
  19.   W.message("terminate the input by clicking the right button. Now");
  20.   W.message("you can input query points with the left button. For ");
  21.   W.message("each point p the face of the arrangment containing p ");
  22.   W.message("is computed and displayed. Terminate the program by  "); 
  23.   W.message("pressing the right mouse key.                        ");
  24.   W.message("                                                     ");
  25.   W.message("Click any button to start.                           ");
  26.   W.read_mouse();
  27.   W.clear();
  28.   list<segment> seglist;
  29.   // build up a frame
  30.   double x0 = W.xmin();
  31.   double x1 = W.xmax();
  32.   double y0 = W.ymin();
  33.   double y1 = W.ymax();
  34.   segment b(x0,y0,x1,y0);
  35.   segment t(x0,y1,x1,y1);
  36.   segment l(x0,y0,x0,y1);
  37.   segment r(x1,y0,x1,y1);
  38.   seglist.append(b);
  39.   seglist.append(t);
  40.   seglist.append(l);
  41.   seglist.append(r);
  42.   line L;
  43.   while ( W >> L ) 
  44.   {  W << L;
  45.      if (L.vertical()) 
  46.         seglist.append(segment(L.x_proj(y0),y0,L.x_proj(y1),y1));
  47.      else 
  48.         seglist.append(segment(x0,L.y_proj(x0),x1,L.y_proj(x1)));
  49.    }
  50.   W.message("Computing subdivision");
  51.   newline;
  52.   GRAPH<point,segment> G;
  53.   SWEEP_SEGMENTS(seglist,G);
  54.   // insert reverse edges
  55.   edge e;
  56.   list<edge> E = G.all_edges();
  57.   forall(e,E) G.new_edge(target(e),source(e),G[e]);
  58.   // sort edges counter-clockwise
  59.   edge_array<double> angle(G);
  60.   forall_edges(e,G)
  61.   { segment s(G[source(e)],G[target(e)]);
  62.     angle[e] = s.angle();
  63.    }
  64.   G.sort_edges(angle);
  65.   subdivision<segment> S(G);
  66.   W.clear(); 
  67.   W.set_line_width(2);
  68.   forall_edges(e,G)
  69.   W.draw_segment(G[source(e)], G[target(e)],blue);
  70.   // Locate points
  71.   W.set_mode(xor_mode);
  72.   point p;
  73.   face  f=nil;
  74.   W.message("Give query points !");
  75.   while (W >> p)
  76.   { if (f) show_face(S,f,W);
  77.     f = S.locate_point(p);
  78.     show_face(S,f,W);
  79.    }
  80. /*
  81.   // show strips
  82.   segment s;
  83.   slist<segment> SL;
  84.   while (W >> p)
  85.   { forall(s,SL) W.draw_segment(s);
  86.     SL.clear();
  87.     SL = S.compute_strip(p);
  88.     W.set_line_width(1);
  89.     W.draw_vline(p.xcoord());
  90.     W.set_line_width(5);
  91.     forall(s,SL) W.draw_segment(s);
  92.    }
  93. */;
  94.   return 0;
  95. }