#ifdef CGAL_USE_LEDA
#include <CGAL/basic.h>
#include <CGAL/LEDA_basic.h>
#include <CGAL/Homogeneous_d.h>
#include <CGAL/leda_integer.h>
#include <CGAL/Delaunay_d.h>
#include <CGAL/IO/Delaunay_d_window_stream.h>
#include <LEDA/d3_window.h>
#include <iostream>
typedef leda_integer RT;
typedef CGAL::Homogeneous_d<RT> Kernel;
typedef CGAL::Delaunay_d<Kernel> Delaunay_d;
typedef Delaunay_d::Point_d Point_d;
typedef Delaunay_d::Simplex_handle Simplex_handle;
typedef Delaunay_d::Vertex_handle Vertex_handle;
static int wsize = 500;
static leda_rat_vector transform(const Point_d& p,int i)
{ return leda_rat_vector(p.homogeneous(0),
p.homogeneous(1),
p.homogeneous(2)/i,
p.homogeneous(p.dimension())); }
enum { ChangeWin = 30, Nearest, Furthest, Exit };
static Delaunay_d* pT;
static leda_window* pW;
static Delaunay_d::Delaunay_voronoi_kind kind = Delaunay_d::NEAREST;
static void redraw_diagram()
{ CGAL::d2_show(*pT,*pW,kind); }
int main()
{
CGAL::set_pretty_mode ( std::cerr );
SETDTHREAD(191);
leda_string startmess = "input points with left mouse button and ";
startmess += "exit program with right mouse button!";
leda_window W1(wsize,wsize,"Delaunay Diagram (projected)"),
W2(wsize,wsize,"Convex Hull (lifted)");
pW = &W1;
W1.set_redraw(redraw_diagram);
int but = 0;
int scale = 30;
W1.init(-50,50,-50);
W1.set_show_coordinates(true);
W1.set_grid_mode(5);
leda_list<leda_string> L;
W1.button("Nearest Site Delaunay",Nearest);
W1.button("Furthest Site Delaunay",Furthest);
W1.button("Change to 3D Window",ChangeWin);
W1.button("Exit",Exit);
W1.int_item("z-axis scale",scale,1,100,
"determines the extend of the z-axis");
W2.init(-50,50,-50);
W1.display(leda_window::min,leda_window::min);
W2.display(wsize+20,0);
W1.message(startmess);
double a,b; // coordinates of a point in the window
but = W1.read_mouse(a,b);
W1.del_messages();
Delaunay_d T(2);
pT = &T;
// we are working in space
// see dd_delaunay_traits.h for the adaptations
std::ofstream To("delddemo.log");
CGAL_LEDA_SCOPE::GRAPH< Point_d, int > G;
leda_node_array<leda_rat_vector> pos(G);
leda_d3_window W3(W2,G,pos);
leda_node v;
while (but != MOUSE_BUTTON(3)) {
// while mouse click is not the right button
// read the window coordinates into a and b
W1.clear();
RT ia(a), ib(b);
To << a << "," << b << std::endl; To.flush();
Point_d x(ia,ib);
switch (but) {
case Nearest:
kind = Delaunay_d::NEAREST;
break;
case Furthest:
kind = Delaunay_d::FURTHEST;
break;
case ChangeWin:
case MOUSE_BUTTON(2):
forall_nodes(v,G) pos[v] = transform(G[v],scale);
W3.init(pos);
CGAL::d2_show(T,W1,kind);
while (but != MOUSE_BUTTON(3))
but = W3.move();
break;
case Exit:
but = MOUSE_BUTTON(3);
continue;
break;
default:
T.insert(x);
T.is_valid();
CGAL::d3_surface_map(T,G);
pos.init(G);
forall_nodes(v,G) pos[v] = transform(G[v],scale);
W3.init(pos);
W3.draw();
break;
}
CGAL::d2_show(T,W1,kind);
but = W1.read_mouse(a,b);
}
return 0;
}
#else
#include <iostream>
int main()
{
std::cout << "this program requires LEDA" << std::endl;
return 0;
}
#endif // CGAL_USE_LEDA
syntax highlighted by Code2HTML, v. 0.9.1