segment_arr_from_mouse.c

来自「CGAL is a collaborative effort of severa」· C语言 代码 · 共 214 行

C
214
字号
// demo/Arrangement_2/Segment_arr_from_mouse.C////constructs a segment arrangement from CGAL window.// We use the leda traits (therefore we are using leda functions).#include "short_names.h"#include <CGAL/basic.h>#ifndef CGAL_USE_LEDA#include <iostream>int main(){  std::cout << "Sorry, this demo needs LEDA for visualisation.";  std::cout << std::endl;  return 0;}#else#include <CGAL/Pm_segment_traits_leda_kernel_2.h>#include <CGAL/Arr_leda_segment_traits_2.h>#include <CGAL/Arr_2_bases.h>#include <CGAL/Arr_2_default_dcel.h>#include <CGAL/Arrangement_2.h>#include <CGAL/leda_rational.h>#include <LEDA/rat_window.h>#include <CGAL/Draw_preferences.h>#include <vector>#if defined(LEDA_NAMESPACE)using namespace leda;#endiftypedef leda_rational                                   NT;typedef CGAL::Pm_segment_traits_leda_kernel_2           Kernel;typedef CGAL::Arr_leda_segment_traits_2<Kernel>         Traits;typedef Traits::Point_2                                 Point;typedef Traits::Curve_2                                 Curve;typedef Traits::X_monotone_curve_2                      X_curve;typedef CGAL::Arr_base_node<Curve, X_curve>             Base_node;typedef CGAL::Arr_2_default_dcel<Traits>                Dcel;typedef CGAL::Arrangement_2<Dcel,Traits,Base_node>      Arr_2;//I had to add these in global namespace for the program to compile/*CGAL::Window_stream& operator<<(CGAL::Window_stream& os, const Point& p){  //return os << leda_point(p.xcoordD(),p.ycoordD());  return os << p.to_point();}*/CGAL::Window_stream& operator<<(CGAL::Window_stream & os, const X_curve & c){  return os << c.to_segment();}// global variables are used so that the redraw function for the LEDA window// can be defined to draw information found in these variables.static Arr_2 arr;static CGAL::Window_stream W(400, 400, "CGAL - Segment Arrangement Demo");CGAL_BEGIN_NAMESPACEWindow_stream & operator<<(Window_stream& os, Arr_2 &A){  My_Arr_drawer<Arr_2, Arr_2::Ccb_halfedge_circulator,     Arr_2::Holes_iterator> drawer(os);    draw_pm(arr, drawer, os);  return os;}CGAL_END_NAMESPACE// redraw function for the LEDA window. // used automatically when window reappears.void redraw(CGAL::Window_stream * wp) { wp->start_buffering();  wp->clear();  // draw arragnement  *wp << arr;  wp->flush_buffer();  wp->stop_buffering();}int main(){  double x0=-400,x1=400,y0=-400;  W.init(x0,x1,y0);  W.set_redraw(redraw);  W.set_mode(CGAL_LEDA_SCOPE::src_mode);  W.set_node_width(3);  W.button("finish",10);  W.open_status_window();  W.display();  //read input from window  std::cout << "Left button to start and end the segment.\n";  std::cout << "Clicking close to a vertex assumes the location" 	    << "is at the vertex"	    << std::endl;  std::vector<Point> cv1;  Point pnt;  bool begin=true;  W.set_status_string( "Left mouse button - segment input. "		       "Finish button -query mode" );  for (;;) {    double x, y;    int b = W.get_mouse(x,y);    if (b==10) break;    pnt = Point(x,y);      if (b == MOUSE_BUTTON(1))      {                for(Arr_2::Vertex_iterator vi = arr.vertices_begin();            vi != arr.vertices_end(); ++vi) {          //we are using the leda sqr_dist func          if ( pnt.sqr_dist(vi->point()) < ((x1-x0)/50)*((x1-x0)/50) )            pnt=vi->point();        }                cv1.push_back(pnt);        W << CGAL::BLACK;        W << pnt;        W << CGAL::GREEN;                if (!begin) {          if ( cv1[0] == cv1[1] ){            //Error. Segment has a zero length.             W.set_status_string("Error. Segment has a zero length.");            redraw( &W );          }          else{             arr.insert(X_curve(cv1[0],cv1[1]));            W.set_status_string("Left mouse button - segment input. "				"Finish button -query mode");            W << arr;	  }          cv1.clear();        }        begin=!begin;      }  }    W << arr;     // Point Location Queries  W.set_status_string("Enter a query point with left mouse button. "		      "Finish button - exit." );  W << CGAL::RED;  Point p;  Arr_2::Halfedge_handle e;    // if map is empty  if (arr.halfedges_begin() == arr.halfedges_end())     {      std::cout << std::endl;      std::cout << "No edges were inserted. Planar map is empty. Exiting.";      std::cout << std::endl;    }  else {    // map is not empty        CGAL:: My_Arr_drawer<Arr_2, Arr_2::Ccb_halfedge_circulator,       Arr_2::Holes_iterator>  drawer(W);    for (; ;) {      double x,y;      int b=W.read_mouse(x,y);      if (b==10) break;      else	p=Point(x,y);      W << arr;          Arr_2::Locate_type lt;      e = arr.locate(p,lt);            //color the face on the screen      Arr_2::Face_handle f=e->face();      drawer.draw_face(f);            /*if (f->does_outer_ccb_exist()) {	Arr_2::Ccb_halfedge_circulator cc=f->outer_ccb();	do {	W << cc->curve();	} while (++cc != f->outer_ccb());		}      	Arr_2::Holes_iterator hit=f->holes_begin(),eit=f->holes_end();	for (;hit!=eit; ++hit) {	Arr_2::Ccb_halfedge_circulator cc=*hit; 	do {	W << cc->curve();	} while (++cc != *hit);      	} */         }  } // else of 'if map is empty'  return 0;  }#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?