- Add new example program : example_find_conflicts.C

This commit is contained in:
Sylvain Pion 2003-05-30 09:20:20 +00:00
parent 107718ecfa
commit 7bbbf35d1b
2 changed files with 74 additions and 4 deletions

View File

@ -1,5 +1,5 @@
------- example_simple -------------------------------------------------
------- example_simple ---------------------------------------
This example shows the incremental construction of a 3D triangulation,
the location of a point, and how to manipulate elementary operations
@ -8,23 +8,32 @@ CGAL for the Triangulation_3 class.
--------------------------------------------------------------
------- example_color -------------------------------------------------
------- example_color ----------------------------------------
This example shows how the user can plug his own vertex base in a
triangulation.
--------------------------------------------------------------
------- example_hierarchy -------------------------------------------------
------- example_hierarchy ------------------------------------
This example shows the use of the hierarchy to speed up the
construction of a Delaunay triangulation.
--------------------------------------------------------------
------- example_tds -------------------------------------------------
------- example_tds ------------------------------------------
Shows how to construct a 3D triangulation data structure by
inserting vertices.
--------------------------------------------------------------
------- example_find_conflicts -------------------------------
Illustrates how the insertion process of points in a Delaunay
triangulation can be decomposed in order to give access to the
cells in conflict (those which would be destroyed by the insertion
of a point) prior to deciding to do the actual insertion or not.
--------------------------------------------------------------

View File

@ -0,0 +1,61 @@
// Triangulation_3/example_find_conflicts.C
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Filtered_kernel.h>
#include <CGAL/Delaunay_triangulation_3.h>
#include <CGAL/point_generators_3.h>
#include <vector>
#include <cassert>
struct K : CGAL::Filtered_kernel<CGAL::Simple_cartesian<double> > {};
typedef CGAL::Delaunay_triangulation_3<K> Delaunay;
typedef Delaunay::Point Point;
typedef Delaunay::Cell_handle Cell_handle;
typedef Delaunay::Facet Facet;
int main()
{
Delaunay T;
CGAL::Random_points_in_sphere_3<Point> rnd;
// First, make sure the triangulation is 3D.
T.insert(Point(0,0,0));
T.insert(Point(1,0,0));
T.insert(Point(0,1,0));
T.insert(Point(0,0,1));
assert(T.dimension() == 3);
// Inserts 100 random points if and only if their insertion
// in the Delaunay tetrahedralization would conflict with
// an even number of cells.
for (int i = 0; i != 100; ++i) {
Point p = *rnd++;
// Locate the point
Delaunay::Locate_type lt;
int li, lj;
Cell_handle c = T.locate(p, lt, li, lj);
if (lt == Delaunay::VERTEX)
continue; // Point already exists
// Get the cells that conflict with p in a vector V,
// and a facet on the boundary of this hole in f.
std::vector<Cell_handle> V;
Facet f;
T.find_conflicts(p, c,
CGAL::Oneset_iterator<Facet>(f), // Get one boundary facet
std::back_inserter(V), // Conflict cells in V
CGAL::Emptyset_iterator()); // Drop internal facets
if ((V.size() & 1) == 0) // Even number of conflict cells ?
T.insert_in_hole(p, V.begin(), V.end(), f.first, f.second);
}
std::cout << "Final triangulation has " << T.number_of_vertices()
<< " vertices." << std::endl;
return 0;
}