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

MultiPlatform

  1. #include <LEDA/subdivision.h>
  2. #include <LEDA/segment.h>
  3. #include <LEDA/plane_alg.h>
  4. #include <LEDA/window.h>
  5. void   show_face(subdivision<segment>& G, face f, window& W)
  6. { list<node> L = G.adj_nodes(f);
  7.   list<point> P;
  8.   node v;
  9.   forall(v,L) P.append(G[v]);
  10.   W.draw_filled_polygon(P,orange);
  11. }
  12. main()
  13. {
  14.   window W;
  15.   W.init(0,1000,0);
  16.   W.set_node_width(3);
  17.   W.set_line_width(2);
  18.   panel P("Arrangement of line segments");
  19.   P.text_item("This program computes the subdivision defined by the "); 
  20.   P.text_item("arrangement of a list of straight line segments. Use ");
  21.   P.text_item("the left button to insert a sequence of segments and ");
  22.   P.text_item("terminate the input by clicking the right button. Now");
  23.   P.text_item("you can input query points with the left button. For ");
  24.   P.text_item("each point p the face of the arrangment containing p ");
  25.   P.text_item("is computed and displayed. Terminate the program by  "); 
  26.   P.text_item("pressing the right mouse key.                        ");
  27.   P.text_item("                                                     ");
  28.   P.button("continue");
  29.   P.open();
  30.   list<segment> seglist;
  31.   segment s;
  32.   while ( W >> s ) 
  33.   { W << s;
  34.     seglist.append(s);
  35.    }
  36.   GRAPH<point,segment> G;
  37.   cout << "Computing subdivision.n";
  38.   SWEEP_SEGMENTS(seglist,G);
  39.   W.clear(); 
  40.   // Draw Subdivision
  41.   edge e;
  42.   forall_edges(e,G)
  43.   W.draw_segment(G[source(e)], G[target(e)]);
  44.   cout << "Constructing search structuren";
  45.   // insert reverse edges
  46.   list<edge> L = G.all_edges();
  47.   forall(e,L) G.new_edge(target(e),source(e),G[e]);
  48.   // sort edges counter-clockwise
  49.   edge_array<double> angle(G);
  50.   forall_edges(e,G)
  51.   { segment s(G[source(e)],G[target(e)]);
  52.     angle[e] = s.angle();
  53.    }
  54.   G.sort_edges(angle);
  55.   // Create Subdivision
  56.   subdivision<segment> S(G);
  57.   W.message("Give query points!");
  58.   // Locate points
  59.   W.set_mode(xor_mode);
  60.   point p;
  61.   face  f=nil;
  62.   while (W >> p)
  63.   { if (f) show_face(S,f,W);
  64.     f = S.locate_point(p);
  65.     show_face(S,f,W);
  66.    }
  67.   return 0;
  68. }