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

MultiPlatform

  1. #include <LEDA/segment_set.h>
  2. #include <LEDA/plane.h>
  3. #include <LEDA/window.h>
  4. #include <math.h>
  5. main()
  6.   segment s,x;
  7.   window W;
  8.   W.init(-1000,1000,-1000);
  9.   W.set_line_width(1);
  10.   panel P("SEGMENT SET");
  11.   
  12.   P.text_item("Use the left mouse button to insert a set of segments, ");
  13.   P.text_item("all with the same orientation. Terminate the input by  ");
  14.   P.text_item("clicking the right button. During input, the segments  ");
  15.   P.text_item("are rotated to be parallel to the first read segment.  ");
  16.   P.text_item("Now you can input orthogonal query segments, for each  ");
  17.   P.text_item("of which the set of intersected segments is computed   ");
  18.   P.text_item("and displayed. To leave the program, click the right   ");
  19.   P.text_item("mouse button.                                          ");
  20.   P.text_item("                                                       ");
  21.   P.button("continue");
  22.   P.open();
  23.   W >> s;
  24.   W << s;
  25.   double alpha = s.angle();
  26.   segment_set<double> S(alpha);
  27.   S.insert(s,s.xcoord1());
  28.   while (W >> s)
  29.   { point p = s.start();
  30.     point q = p.translate(alpha,s.length());
  31.     s = segment(p,q);
  32.     W << s;
  33.     S.insert(s,s.xcoord1());
  34. /*
  35.     W.set_line_style(dashed);
  36.     W<< s.rotate(point(0,0),-alpha);
  37.     W.set_line_style(solid);
  38. */
  39.    }
  40.   W.set_mode(xor_mode);
  41.   list<seg_item> L;
  42.   seg_item it;
  43.   point p;
  44.   s = segment(W.xmin(),W.ymin(),W.xmax(),W.ymin());
  45.   while (W >> p)
  46.   { double x,y;
  47.     // erase previously found segments
  48.     W.set_line_width(4);
  49.     forall(it,L) W << S.key(it);
  50.     W.set_line_width(1);
  51.     forall(it,L) W << S.key(it);
  52.     W << s;
  53.     W.read_mouse_seg(p.xcoord(),p.ycoord(),x,y);
  54.     point q(x,y);
  55.     q = p.translate(alpha+LEDA_PI,p.distance(q));
  56.    
  57.     s = segment(p,q);
  58.     W << s;
  59.     L = S.intersection(s);
  60.     forall(it,L) W << S.key(it);
  61.     W.set_line_width(4);
  62.     forall(it,L) W << S.key(it);
  63.     forall(it,L) 
  64.       cout << "key = " << S.key(it) << "  info = " << S.inf(it) << "n";
  65.     newline;
  66.   }
  67.   return 0;
  68. }