How to generate a crust ?
Input: a set P of points in the plane
Output: a set S of segments with endpoints in P
// examples/Tutorial_SCG99/crust.C
// -------------------------------
#include "tutorial.h"
#include <CGAL/IO/leda_window.h>
#include <CGAL/IO/Ostream_iterator.h>
#include <vector>
struct Tmp_point : public Point {
static bool init;
bool delaunay;
Tmp_point() : delaunay( init) {}
Tmp_point( const Point& p) : Point(p), delaunay( init) {}
};
bool Tmp_point::init = true;
struct Traits : public EucliTraits {
typedef Tmp_point Point;
};
typedef CGAL::Triangulation_vertex_base_2<Traits> Vb;
typedef CGAL::Triangulation_face_base_2<Traits> Fb;
typedef CGAL::Triangulation_default_data_structure_2<Traits,Vb,Fb> Tds;
typedef CGAL::Delaunay_triangulation_2<Traits,Tds> Delaunay;
template <class InputIterator, class OutputIterator>
void crust( InputIterator first, InputIterator last, OutputIterator out) {
//generate DT of point set
Delaunay dt;
Tmp_point::init = true;
dt.insert( first, last);
//get voronoi vertices from the DT
vector<Point> voronoi_vertices;
voronoi_vertices.reserve( dt.number_of_faces());
Delaunay::Face_iterator f = dt.faces_begin();
while ( f != dt.faces_end()) {
voronoi_vertices.push_back( dt.dual( f));
++f;
}
//add the VD vertices into the DT
Tmp_point::init = false;
dt.insert( voronoi_vertices.begin(), voronoi_vertices.end());
//find the edges with both endpoints in P
Delaunay::Edge_iterator e = dt.edges_begin();
while ( e != dt.edges_end()) {
Delaunay::Face_handle face = (*e).first;
int index = (*e).second;
if ( face->vertex( dt.cw( index))->point().delaunay &&
face->vertex( dt.ccw( index))->point().delaunay)
*out++ = dt.segment(e);
++e;
}
}
int main () {
Delaunay_triangulation dt;
leda_window* window = CGAL::create_and_display_demo_window();
vector<Point> points;
while (true) {
Point p;
*window >> p;
if ( ! (*window))
break;
points.push_back( p);
window->clear();
*window << CGAL::BLACK;
std::copy( points.begin(), points.end(),
CGAL::Ostream_iterator<Point, leda_window>(*window));
*window << CGAL::GREEN;
crust( points.begin(), points.end(),
CGAL::Ostream_iterator<Segment, leda_window>(*window));
}
delete window;
return 0;
}