- Make the examples working

- Comment old code
- Try caching
This commit is contained in:
Nico Kruithof 2006-08-07 13:47:15 +00:00
parent d1aedbf6bb
commit 9832ce9d9b
6 changed files with 172 additions and 101 deletions

View File

@ -11,7 +11,7 @@
#include "skin_surface_writer.h" #include "skin_surface_writer.h"
typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Regular_triangulation_euclidean_traits_3<K> Traits; typedef CGAL::Mixed_complex_traits_3<K> Traits;
typedef CGAL::Skin_surface_3<Traits> Skin_surface_3; typedef CGAL::Skin_surface_3<Traits> Skin_surface_3;
typedef Skin_surface_3::RT RT; typedef Skin_surface_3::RT RT;
typedef Skin_surface_3::Weighted_point Weighted_point; typedef Skin_surface_3::Weighted_point Weighted_point;
@ -29,20 +29,17 @@ int main(int argc, char *argv[]) {
extract_balls_from_pdb(argv[1], K(), std::back_inserter(l)); extract_balls_from_pdb(argv[1], K(), std::back_inserter(l));
// Construct skin surface: // Construct skin surface:
Skin_surface_3 skin_surface(l.begin(), l.end(), shrinkfactor, true, Skin_surface_3 skin_surface(l.begin(), l.end(), shrinkfactor);
Traits(), true);
// Extract mesh from the skin surface: // Extract mesh from the skin surface:
Polyhedron p; Polyhedron p;
CGAL::mesh_skin_surface_3(skin_surface, p); CGAL::mesh_skin_surface_3(skin_surface, p);
// CGAL::subdivide_skin_surface_mesh_3(p, skin_surface, 1); // Subdivide skin surface
// std::cout << "Subdivided Skin_surface_3" << std::endl; // CGAL::subdivide_skin_surface_mesh_3(p, skin_surface, 1);
std::ofstream out("mesh.off"); std::ofstream out("mesh.off");
write_polyhedron_with_normals(p, skin_surface, out); write_polyhedron_with_normals(p, skin_surface, out);
// write without normals:
//out << p;
return 0; return 0;
} }

View File

@ -7,10 +7,6 @@
#include <CGAL/mesh_skin_surface_3.h> #include <CGAL/mesh_skin_surface_3.h>
#include <list> #include <list>
// NGHK: remove later
#include <fstream>
#include "skin_surface_writer.h"
typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Mixed_complex_traits_3<K> Traits; typedef CGAL::Mixed_complex_traits_3<K> Traits;
typedef CGAL::Skin_surface_3<Traits> Skin_surface_3; typedef CGAL::Skin_surface_3<Traits> Skin_surface_3;
@ -32,9 +28,5 @@ int main(int argc, char *argv[]) {
Polyhedron p; Polyhedron p;
CGAL::mesh_skin_surface_3(skin_surface, p); CGAL::mesh_skin_surface_3(skin_surface, p);
// NGHK: remove later
std::ofstream out("mesh.off");
write_polyhedron_with_normals(p, skin_surface, out);
return 0; return 0;
} }

View File

@ -6,7 +6,7 @@
#include <list> #include <list>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Regular_triangulation_euclidean_traits_3<K> Traits; typedef CGAL::Mixed_complex_traits_3<K> Traits;
typedef CGAL::Union_of_balls_3<Traits> Union_of_balls_3; typedef CGAL::Union_of_balls_3<Traits> Union_of_balls_3;
typedef Union_of_balls_3::RT RT; typedef Union_of_balls_3::RT RT;
typedef Union_of_balls_3::Weighted_point Weighted_point; typedef Union_of_balls_3::Weighted_point Weighted_point;

View File

@ -41,59 +41,59 @@
CGAL_BEGIN_NAMESPACE CGAL_BEGIN_NAMESPACE
template < class GT, // template < class GT,
class SkinSurface_3, // class SkinSurface_3,
class Cb = Triangulation_cell_base_3<GT> > // class Cb = Triangulation_cell_base_3<GT> >
class Triangulated_mixed_complex_cell_3 : public Cb // class Triangulated_mixed_complex_cell_3 : public Cb
{ // {
public: // public:
typedef typename Cb::Triangulation_data_structure Triangulation_data_structure; // typedef typename Cb::Triangulation_data_structure Triangulation_data_structure;
typedef typename Triangulation_data_structure::Vertex_handle Vertex_handle; // typedef typename Triangulation_data_structure::Vertex_handle Vertex_handle;
typedef typename Triangulation_data_structure::Cell_handle Cell_handle; // typedef typename Triangulation_data_structure::Cell_handle Cell_handle;
typedef typename SkinSurface_3::Quadratic_surface Quadratic_surface; // typedef typename SkinSurface_3::Quadratic_surface Quadratic_surface;
typedef typename SkinSurface_3::Simplex Simplex; // typedef typename SkinSurface_3::Simplex Simplex;
template < class TDS2 > // template < class TDS2 >
struct Rebind_TDS { // struct Rebind_TDS {
typedef typename Cb::template Rebind_TDS<TDS2>::Other Cb2; // typedef typename Cb::template Rebind_TDS<TDS2>::Other Cb2;
typedef Triangulated_mixed_complex_cell_3<GT, SkinSurface_3, Cb2> // typedef Triangulated_mixed_complex_cell_3<GT, SkinSurface_3, Cb2>
Other; // Other;
}; // };
Triangulated_mixed_complex_cell_3() : Cb() { // Triangulated_mixed_complex_cell_3() : Cb() {
} // }
Triangulated_mixed_complex_cell_3(Vertex_handle v0, Vertex_handle v1, // Triangulated_mixed_complex_cell_3(Vertex_handle v0, Vertex_handle v1,
Vertex_handle v2, Vertex_handle v3) // Vertex_handle v2, Vertex_handle v3)
: Cb(v0, v1, v2, v3) { // : Cb(v0, v1, v2, v3) {
} // }
Quadratic_surface *surf; // Quadratic_surface *surf;
Simplex simp; // Simplex simp;
}; // };
template < class GT, // template < class GT,
class Vb = Triangulation_vertex_base_3<GT> > // class Vb = Triangulation_vertex_base_3<GT> >
class Triangulated_mixed_complex_vertex_3 : public Vb // class Triangulated_mixed_complex_vertex_3 : public Vb
{ // {
public: // public:
typedef typename Vb::Point Point; // typedef typename Vb::Point Point;
typedef typename Vb::Cell_handle Cell_handle; // typedef typename Vb::Cell_handle Cell_handle;
template < class TDS2 > // template < class TDS2 >
struct Rebind_TDS { // struct Rebind_TDS {
typedef typename Vb::template Rebind_TDS<TDS2>::Other Vb2; // typedef typename Vb::template Rebind_TDS<TDS2>::Other Vb2;
typedef Triangulated_mixed_complex_vertex_3<GT, Vb2> Other; // typedef Triangulated_mixed_complex_vertex_3<GT, Vb2> Other;
}; // };
Triangulated_mixed_complex_vertex_3() {} // Triangulated_mixed_complex_vertex_3() {}
Triangulated_mixed_complex_vertex_3(const Point&p) : Vb(p) {} // Triangulated_mixed_complex_vertex_3(const Point&p) : Vb(p) {}
Triangulated_mixed_complex_vertex_3(const Point&p, Cell_handle c) : Vb(p, c) {} // Triangulated_mixed_complex_vertex_3(const Point&p, Cell_handle c) : Vb(p, c) {}
Sign sign() const { // Sign sign() const {
return Vb::cell()->surf->sign(Vb::point()); // return Vb::cell()->surf->sign(Vb::point());
} // }
}; // };
template <class SkinSurfaceTraits_3> template <class SkinSurfaceTraits_3>
class Skin_surface_3 { class Skin_surface_3 {
@ -110,6 +110,9 @@ private:
typedef Regular_triangulation_3<Gt> Regular; typedef Regular_triangulation_3<Gt> Regular;
typedef Exact_predicates_inexact_constructions_kernel Filtered_kernel;
typedef Skin_surface_quadratic_surface_3<Filtered_kernel>
Filtered_quadratic_surface;
public: public:
typedef typename Regular::Vertex_handle Vertex_handle; typedef typename Regular::Vertex_handle Vertex_handle;
typedef typename Regular::Edge Edge; typedef typename Regular::Edge Edge;
@ -118,16 +121,21 @@ public:
typedef typename Regular::Cell_handle Cell_handle; typedef typename Regular::Cell_handle Cell_handle;
typedef Triangulation_simplex_3<Regular> Simplex; typedef Triangulation_simplex_3<Regular> Simplex;
// defining the triangulated mixed complex: typedef typename Regular::Finite_vertices_iterator Finite_vertices_iterator;
typedef Exact_predicates_exact_constructions_kernel TMC_traits; typedef typename Regular::Finite_edges_iterator Finite_edges_iterator;
typedef Skin_surface_quadratic_surface_3<TMC_traits> Quadratic_surface; typedef typename Regular::Finite_facets_iterator Finite_facets_iterator;
typedef typename Regular::Finite_cells_iterator Finite_cells_iterator;
typedef Triangulation_3< // // defining the triangulated mixed complex:
TMC_traits, // typedef Exact_predicates_exact_constructions_kernel TMC_traits;
Triangulation_data_structure_3 // typedef Skin_surface_quadratic_surface_3<TMC_traits> Quadratic_surface;
< Triangulated_mixed_complex_vertex_3<TMC_traits>,
Triangulated_mixed_complex_cell_3<TMC_traits,Self> > // typedef Triangulation_3<
> Triangulated_mixed_complex; // TMC_traits,
// Triangulation_data_structure_3
// < Triangulated_mixed_complex_vertex_3<TMC_traits>,
// Triangulated_mixed_complex_cell_3<TMC_traits,Self> >
// > Triangulated_mixed_complex;
typedef Combinatorial_mixed_complex_triangulator_3<Regular> CMCT; typedef Combinatorial_mixed_complex_triangulator_3<Regular> CMCT;
typedef typename CMCT::Vertex_handle CMCT_Vertex_handle; typedef typename CMCT::Vertex_handle CMCT_Vertex_handle;
typedef typename CMCT::Vertex_iterator CMCT_Vertex_iterator; typedef typename CMCT::Vertex_iterator CMCT_Vertex_iterator;
@ -135,17 +143,17 @@ public:
typedef typename CMCT::Cell_iterator CMCT_Cell_iterator; typedef typename CMCT::Cell_iterator CMCT_Cell_iterator;
typedef typename Triangulated_mixed_complex::Vertex_handle TMC_Vertex_handle; // typedef typename Triangulated_mixed_complex::Vertex_handle TMC_Vertex_handle;
typedef typename Triangulated_mixed_complex::Cell_handle TMC_Cell_handle; // typedef typename Triangulated_mixed_complex::Cell_handle TMC_Cell_handle;
typedef typename Triangulated_mixed_complex::Vertex_iterator TMC_Vertex_iterator; // typedef typename Triangulated_mixed_complex::Vertex_iterator TMC_Vertex_iterator;
typedef typename Triangulated_mixed_complex::Cell_iterator TMC_Cell_iterator; // typedef typename Triangulated_mixed_complex::Cell_iterator TMC_Cell_iterator;
// NGHK: added for the (Delaunay) surface mesher, document // NGHK: added for the (Delaunay) surface mesher, document
typedef Exact_predicates_inexact_constructions_kernel Mesher_Gt; typedef Exact_predicates_inexact_constructions_kernel Mesher_Gt;
typedef Skin_surface_mesher_oracle_3<Mesher_Gt,Self> Surface_mesher_traits_3; typedef Skin_surface_mesher_oracle_3<Mesher_Gt,Self> Surface_mesher_traits_3;
private: private:
typedef typename TMC_traits::Point_3 TMC_Point; //typedef typename TMC_traits::Point_3 TMC_Point;
public: public:
template < class WP_iterator > template < class WP_iterator >
@ -186,6 +194,38 @@ public:
// } // }
mc_triangulator = new CMCT(regular, verbose); mc_triangulator = new CMCT(regular, verbose);
// {
// Simplex s;
// for (Finite_vertices_iterator vit = regular.finite_vertices_begin();
// vit == regular.finite_vertices_end(); vit++) {
// s= vit;
// filtered_quadr_surfaces[s] =
// construct_surface(s,
// Exact_predicates_inexact_constructions_kernel());
// }
// for (Finite_edges_iterator eit = regular.finite_edges_begin();
// eit == regular.finite_edges_end(); eit++) {
// s= eit;
// filtered_quadr_surfaces[s] =
// construct_surface(s,
// Exact_predicates_inexact_constructions_kernel());
// }
// for (Finite_facets_iterator fit = regular.finite_facets_begin();
// fit == regular.finite_facets_end(); fit++) {
// s= fit;
// filtered_quadr_surfaces[s] =
// construct_surface(s,
// Exact_predicates_inexact_constructions_kernel());
// }
// for (Finite_cells_iterator cit = regular.finite_cells_begin();
// cit == regular.finite_cells_end(); cit++) {
// s= cit;
// filtered_quadr_surfaces[s] =
// construct_surface(s,
// Exact_predicates_inexact_constructions_kernel());
// }
// }
} }
// const Triangulated_mixed_complex &triangulated_mixed_complex() const { // const Triangulated_mixed_complex &triangulated_mixed_complex() const {
// return _tmc; // return _tmc;
@ -313,7 +353,22 @@ public:
} }
template< class Point > template< class Point >
Sign sign(const Simplex &sim, const Point &p) const { Sign sign(const Simplex &sim, const Point &p) const {
return construct_surface(sim, typename Point::R()).sign(p); try
{
CGAL_PROFILER(std::string("NGHK: calls to : ") + std::string(CGAL_PRETTY_FUNCTION));
Protect_FPU_rounding<true> P;
Sign result = construct_surface
(sim,
Exact_predicates_inexact_constructions_kernel()).sign(p);
if (! is_indeterminate(result))
return result;
}
catch (Interval_nt_advanced::unsafe_comparison) {}
CGAL_PROFILER(std::string("NGHK: failures of : ") + std::string(CGAL_PRETTY_FUNCTION));
Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST);
return construct_surface
(sim,
Exact_predicates_exact_constructions_kernel()).sign(p);
} }
template< class Point > template< class Point >
typename Point::R::RT typename Point::R::RT
@ -371,28 +426,22 @@ public:
// Use value to make the computation robust (endpoints near the surface) // Use value to make the computation robust (endpoints near the surface)
if (value(s1, p1) > value(s2, p2)) std::swap(p1, p2); if (value(s1, p1) > value(s2, p2)) std::swap(p1, p2);
Simplex sp = s1; Simplex sp = s1;
while (sq_dist > 1e-18) {
while ((s1 != s2) && (sq_dist > 1e-18)) {
p = midpoint(p1, p2); p = midpoint(p1, p2);
sp = locate_mixed(converter(p), sp); sp = locate_mixed(converter(p), sp);
if (sign(sp, p) == NEGATIVE) { p1 = p; }
if (sign(sp, p) == NEGATIVE) { p1 = p; s1 = sp; }
else { p2 = p; s2 = sp; }
sq_dist *= .25;
}
while (sq_dist > 1e-18) {
p = midpoint(p1, p2);
if (sign(s1, p) == NEGATIVE) { p1 = p; }
else { p2 = p; } else { p2 = p; }
sq_dist *= .25; sq_dist *= .25;
} }
// while ((s1 != s2) && (sq_dist > 1e-18)) {
// p = midpoint(p1, p2);
// sp = locate_mixed(converter(p), sp);
// if (sign(sp, p) == NEGATIVE) { p1 = p; s1 = sp; }
// else { p2 = p; s2 = sp; }
// sq_dist *= .25;
// }
// while (sq_dist > 1e-18) {
// p = midpoint(p1, p2);
// if (sign(s1, p) == NEGATIVE) { p1 = p; }
// else { p2 = p; }
// sq_dist *= .25;
// }
p = midpoint(p1, p2); p = midpoint(p1, p2);
} }
@ -472,10 +521,6 @@ public:
CGAL_assertion(false); CGAL_assertion(false);
} }
std::cerr << "SKEL 2 1" << std::endl
<< " " << p1 << std::endl
<< " " << p2 << std::endl
<< " 2 0 1" << std::endl;
// Find the intersection: // Find the intersection:
intersect(p1, p2, sim, sim, p); intersect(p1, p2, sim, sim, p);
} }
@ -573,7 +618,7 @@ public:
private: private:
// Used to optimize the point location in TMC: // Used to optimize the point location in TMC:
mutable TMC_Cell_handle last_ch; // mutable TMC_Cell_handle last_ch;
void construct_bounding_box(Regular &regular); void construct_bounding_box(Regular &regular);
@ -586,6 +631,7 @@ private:
// We want to construct this object later (the pointer): // We want to construct this object later (the pointer):
CMCT *mc_triangulator; CMCT *mc_triangulator;
// std::map<Simplex, Filtered_quadratic_surface> filtered_quadr_surfaces;
}; };
template <class SkinSurfaceTraits_3> template <class SkinSurfaceTraits_3>

View File

@ -24,7 +24,9 @@ CGAL_BEGIN_NAMESPACE
template < class Triangulation_3 > template < class Triangulation_3 >
class Triangulation_simplex_3 { class Triangulation_simplex_3 {
public:
typedef Triangulation_3 T; typedef Triangulation_3 T;
typedef Triangulation_simplex_3<T> Self;
typedef typename T::Vertex_handle Vertex_handle; typedef typename T::Vertex_handle Vertex_handle;
typedef typename T::Edge Edge; typedef typename T::Edge Edge;
typedef typename T::Facet Facet; typedef typename T::Facet Facet;
@ -36,7 +38,11 @@ class Triangulation_simplex_3 {
typedef typename T::Edge_iterator Edge_iterator; typedef typename T::Edge_iterator Edge_iterator;
typedef typename T::Facet_iterator Facet_iterator; typedef typename T::Facet_iterator Facet_iterator;
public: typedef typename T::Finite_vertices_iterator Finite_vertices_iterator;
typedef typename T::Finite_edges_iterator Finite_edges_iterator;
typedef typename T::Finite_facets_iterator Finite_facets_iterator;
typedef typename T::Finite_cells_iterator Finite_cells_iterator;
Triangulation_simplex_3() : ref(-1), ch() { } Triangulation_simplex_3() : ref(-1), ch() { }
Triangulation_simplex_3(Vertex_handle v) { Triangulation_simplex_3(Vertex_handle v) {
@ -79,6 +85,36 @@ public:
CGAL_assertion (ch != Cell_handle()); CGAL_assertion (ch != Cell_handle());
} }
Self &operator=(const Vertex_handle &vh) {
ch = vh->cell();
ref = (ch->index(vh) << 2); /* dim == 0 */
CGAL_assertion (ch != Cell_handle());
return (*this);
}
Self &operator=(const Finite_vertices_iterator &vh) {
ch = vh->cell();
ref = (ch->index(vh) << 2); /* dim == 0 */
CGAL_assertion (ch != Cell_handle());
return (*this);
}
Self &operator=(const Finite_edges_iterator &eit) {
ch = (*eit).first;
ref = ((((*eit).third<< 2) + (*eit).second) << 2) + 1; /* dim */
CGAL_assertion (ch != Cell_handle());
return (*this);
}
Self &operator=(const Finite_facets_iterator &fit) {
ch = (*fit).first;
ref = ((*fit).second << 2) + 2; /* dim */
CGAL_assertion (ch != Cell_handle());
return (*this);
}
Self &operator=(const Finite_cells_iterator &cit) {
ch = cit;
ref = 3; /* dim */
CGAL_assertion (ch != Cell_handle());
return (*this);
}
operator Vertex_handle () const operator Vertex_handle () const
{ {

View File

@ -33,8 +33,8 @@ template <class SkinSurface_3, class Polyhedron>
void mesh_skin_surface_3(SkinSurface_3 const &skin_surface, void mesh_skin_surface_3(SkinSurface_3 const &skin_surface,
Polyhedron &p) Polyhedron &p)
{ {
typedef typename SkinSurface_3::Triangulated_mixed_complex // typedef typename SkinSurface_3::Triangulated_mixed_complex
Triangulated_mixed_complex; // Triangulated_mixed_complex;
typedef Marching_tetrahedra_traits_skin_surface_3< typedef Marching_tetrahedra_traits_skin_surface_3<
SkinSurface_3, SkinSurface_3,
typename SkinSurface_3::CMCT_Vertex_iterator, typename SkinSurface_3::CMCT_Vertex_iterator,