diff --git a/Ridges_3/examples/Ridges_3/GSL.h b/Ridges_3/examples/Ridges_3/GSL.h deleted file mode 100644 index f2d6f6f8a3d..00000000000 --- a/Ridges_3/examples/Ridges_3/GSL.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef _GSL_H_ -#define _GSL_H_ - -#include -#include - -////////////////////////class gsl_Vector///////////////////// -class gsl_Vector{ -protected: - gsl_vector* m_vector; -public: - //contructor - // initializes all the elements of the vector to zero - gsl_Vector(size_t n) { m_vector = gsl_vector_calloc(n); } - //access - double const operator[](size_t i) const { return gsl_vector_get(m_vector, - i); } - //use as left value v[i]=10 - double& operator[](size_t i) { return *gsl_vector_ptr(m_vector, i);} - const gsl_vector* vector() const { return m_vector; } - gsl_vector* vector() { return m_vector; } -}; - -////////////////////////class gsl_Matrix///////////////////// -class gsl_Matrix{ -protected: - gsl_matrix* m_matrix; -public: - //contructor - // initializes all the elements of the matrix to zero. - gsl_Matrix(size_t n1, size_t n2) { m_matrix = gsl_matrix_calloc (n1, n2); } - - //class Row, to define the usual double operator [][] for matrices - class Row{ - gsl_matrix* matrix; - size_t row; - public: - Row(gsl_matrix* _matrix, size_t _row) : - matrix(_matrix), row(_row) {} - double const operator[](size_t column) const - { return gsl_matrix_get(this->matrix, row, column);} - double& operator[](size_t column) - { return *gsl_matrix_ptr(this->matrix, row, column);} - };//END class Row - - Row operator[](size_t _row) { return Row(m_matrix, _row);} - - //access - const gsl_matrix* matrix() const { return m_matrix; } - gsl_matrix* matrix() { return m_matrix; } -}; - -////////////////////////class GSL///////////////////// -class GSL{ -public: - typedef double FT; - typedef gsl_Vector Vector; - typedef gsl_Matrix Matrix; - // solve for eigenvalues and eigenvectors. - // eigen values are sorted in descending order, - // eigen vectors are sorted in accordance. - static - void eigen_symm_algo(Matrix& S, Vector& eval, Matrix& evec); - //solve MX=B using SVD and give the condition number of M - //M replaced by U after gsl_linalg_SV_decomp() - //The diagonal and lower triangular part of M are destroyed during the - //computation, but the strict upper triangular part is not referenced. - static - void solve_ls_svd_algo(Matrix& M, Vector& X, const Vector& B, - double &cond_nb); -}; - -void GSL::eigen_symm_algo(Matrix& S, Vector& eval, Matrix& evec) -{ - const size_t common_size = S.matrix()->size1; - assert( S.matrix()->size2 == common_size - && eval.vector()->size == common_size - && evec.matrix()->size1 == common_size - && evec.matrix()->size2 == common_size - ); - gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc (common_size); - gsl_eigen_symmv (S.matrix(), eval.vector(), evec.matrix(), w); - gsl_eigen_symmv_free (w); - gsl_eigen_symmv_sort (eval.vector(), evec.matrix(), - GSL_EIGEN_SORT_VAL_DESC); -} - -void GSL::solve_ls_svd_algo(Matrix& M, Vector& X, const Vector& B, - double &cond_nb) -{ - const size_t nb_lines = M.matrix()->size1; - assert( B.vector()->size == nb_lines ); - const size_t nb_columns = M.matrix()->size2; - assert( X.vector()->size == nb_columns ); - - gsl_matrix * V = gsl_matrix_alloc(nb_columns,nb_columns); - gsl_vector * S = gsl_vector_alloc(nb_columns); - gsl_vector * work = gsl_vector_alloc(nb_columns); - - gsl_linalg_SV_decomp (M.matrix(), V, S, work); - gsl_linalg_SV_solve (M.matrix(), V, S, B.vector(), X.vector()); - - cond_nb = gsl_vector_get(S,0)/gsl_vector_get(S,nb_columns-1); - gsl_matrix_free(V); - gsl_vector_free(S); - gsl_vector_free(work); -} - -#endif diff --git a/Ridges_3/examples/Ridges_3/PolyhedralSurf.C b/Ridges_3/examples/Ridges_3/PolyhedralSurf.C new file mode 100644 index 00000000000..0d281c5a0a9 --- /dev/null +++ b/Ridges_3/examples/Ridges_3/PolyhedralSurf.C @@ -0,0 +1,64 @@ +#include "PolyhedralSurf.h" + +// Vector_3 PolyhedralSurf::getHalfedge_vector(Halfedge * h) +// { +// Vector_3 v = h->opposite()->vertex()->point() - h->vertex()->point(); +// return v; +// } + +// double PolyhedralSurf:: +// compute_mean_edges_length_around_vertex(Vertex* v) +// { +// Halfedge_around_vertex_circulator +// hedgeb = v->vertex_begin(), hedgee = hedgeb; +// int count_he = 0; +// double sum = 0.; +// CGAL_For_all(hedgeb, hedgee) +// { +// sum += hedgeb->getLength(); +// count_he++; +// } +// return sum/count_he; +// } + +// void PolyhedralSurf::compute_edges_length() +// { +// std::for_each(this->halfedges_begin(), this->halfedges_end(), +// Edge_length()); +// } + + +void PolyhedralSurf::compute_facets_normals() +{ + std::for_each(this->facets_begin(), this->facets_end(), + Facet_unit_normal()); +} + +Vector_3 PolyhedralSurf::computeFacetsAverageUnitNormal(Vertex * v) +{ + Halfedge *h; + Facet *f; + Vector_3 sum(0., 0., 0.), n; + + Halfedge_around_vertex_circulator + hedgeb = v->vertex_begin(), hedgee = hedgeb; + + do + { + h = &(*hedgeb); + if (h->is_border_edge()) + { + hedgeb++; + continue; + } + + f = &(*h->facet()); + n = f->getUnitNormal(); + sum = (sum + n); + hedgeb++; + } + while (hedgeb != hedgee); + sum = sum / std::sqrt(sum * sum); + return sum; +} + diff --git a/Ridges_3/examples/Ridges_3/PolyhedralSurf.cpp b/Ridges_3/examples/Ridges_3/PolyhedralSurf.cpp index e2dc34f67a9..0d281c5a0a9 100644 --- a/Ridges_3/examples/Ridges_3/PolyhedralSurf.cpp +++ b/Ridges_3/examples/Ridges_3/PolyhedralSurf.cpp @@ -1,10 +1,32 @@ #include "PolyhedralSurf.h" -Vector_3 PolyhedralSurf::getHalfedge_vector(Halfedge * h) -{ - Vector_3 v = h->opposite()->vertex()->point() - h->vertex()->point(); - return v; -} +// Vector_3 PolyhedralSurf::getHalfedge_vector(Halfedge * h) +// { +// Vector_3 v = h->opposite()->vertex()->point() - h->vertex()->point(); +// return v; +// } + +// double PolyhedralSurf:: +// compute_mean_edges_length_around_vertex(Vertex* v) +// { +// Halfedge_around_vertex_circulator +// hedgeb = v->vertex_begin(), hedgee = hedgeb; +// int count_he = 0; +// double sum = 0.; +// CGAL_For_all(hedgeb, hedgee) +// { +// sum += hedgeb->getLength(); +// count_he++; +// } +// return sum/count_he; +// } + +// void PolyhedralSurf::compute_edges_length() +// { +// std::for_each(this->halfedges_begin(), this->halfedges_end(), +// Edge_length()); +// } + void PolyhedralSurf::compute_facets_normals() { @@ -12,27 +34,6 @@ void PolyhedralSurf::compute_facets_normals() Facet_unit_normal()); } -void PolyhedralSurf::compute_edges_length() -{ - std::for_each(this->halfedges_begin(), this->halfedges_end(), - Edge_length()); -} - -double PolyhedralSurf:: -compute_mean_edges_length_around_vertex(Vertex* v) -{ - Halfedge_around_vertex_circulator - hedgeb = v->vertex_begin(), hedgee = hedgeb; - int count_he = 0; - double sum = 0.; - CGAL_For_all(hedgeb, hedgee) - { - sum += hedgeb->getLength(); - count_he++; - } - return sum/count_he; -} - Vector_3 PolyhedralSurf::computeFacetsAverageUnitNormal(Vertex * v) { Halfedge *h; @@ -60,3 +61,4 @@ Vector_3 PolyhedralSurf::computeFacetsAverageUnitNormal(Vertex * v) sum = sum / std::sqrt(sum * sum); return sum; } + diff --git a/Ridges_3/examples/Ridges_3/PolyhedralSurf.h b/Ridges_3/examples/Ridges_3/PolyhedralSurf.h index 77a2097c7c0..06ce873a0ff 100644 --- a/Ridges_3/examples/Ridges_3/PolyhedralSurf.h +++ b/Ridges_3/examples/Ridges_3/PolyhedralSurf.h @@ -1,78 +1,26 @@ #ifndef _POLYHEDRALSURF_H_ #define _POLYHEDRALSURF_H_ +#include +#include +#include +#include +#include + #include #include #include -#include -#include -#include - -#include -#include - #include "PolyhedralSurf_operations.h" //---------------------------------------------------------------- // A redefined items class for the Polyhedron_3 with -// a refined vertex class that contains monge data and ring_tag -// a refined facet with a normal vector + tag is_visited -// a refined halfedge with length -template < class Refs, class Tag, class Pt, class FGeomTraits > -class My_vertex:public CGAL::HalfedgeDS_vertex_base < Refs, Tag, Pt > -{ - protected: - //to be def in Vertex_wrapper too from the Traits - typedef typename FGeomTraits::FT FT; - typedef typename FGeomTraits::Point_3 Point_3; - typedef typename FGeomTraits::Vector_3 Vector_3; - - protected: - //monge data - Vector_3 m_d1; //max ppal dir - Vector_3 m_d2; //min ppal dir; monge normal is then n_m=d1^d2, should be so that n_m.n_mesh>0 - FT m_k1, m_k2; //max/min ppal curv - FT m_b0, m_b3; //blue/red extremalities - FT m_P1, m_P2; //if fourth order quantities - - //this is for collecting i-th ring neighbours - int ring_index; - - public: - //monge data - const Vector_3 d1() const { return m_d1; } - Vector_3& d1() { return m_d1; } - const Vector_3 d2() const { return d2; } - Vector_3& d2() { return m_d2; } - const FT k1() const { return m_k1; } - FT& k1() { return m_k1; } - const FT k2() const { return m_k2; } - FT& k2() { return m_k2; } - const FT b0() const { return m_b0; } - FT& b0() { return m_b0; } - const FT b3() const { return m_b3; } - FT& b3() { return m_b3; } - const FT P1() const { return m_P1; } - FT& P1() { return m_P1; }//= 3*b1^2+(k1-k2)(c0-3k1^3) - const FT P2() const { return m_P2; } - FT& P2() { return m_P2; }//= 3*b2^2+(k2-k1)(c4-3k2^3) - - //this is for collecting i-th ring neighbours - void setRingIndex(int i) { ring_index = i; } - int getRingIndex() { return ring_index; } - void resetRingIndex() { ring_index = -1; } - - My_vertex(const Point_3 & pt): - CGAL::HalfedgeDS_vertex_base < Refs, Tag, Point_3 > (pt), - ring_index(-1) {} - My_vertex() {} -}; +// a refined facet with a normal vector +//--------------------------------------------------------------- //---------------------------------------------------------------- // Facet with normal and possibly more types. types are recovered //from the FGeomTraits template arg -// tag for ridge computations //---------------------------------------------------------------- template < class Refs, class Tag, class FGeomTraits > class My_facet:public CGAL::HalfedgeDS_face_base < Refs, Tag > @@ -82,61 +30,16 @@ public: protected: Vector_3 normal; - // int ring_index; - bool m_is_visited; public: - My_facet() {}//: ring_index(-1) {} + My_facet() {} Vector_3 & getUnitNormal() { return normal; } void setNormal(Vector_3 n) { normal = n; } - -/* //this is for collecting i-th ring neighbours */ -/* void setRingIndex(int i) { ring_index = i; } */ -/* int getRingIndex() { return ring_index; } */ -/* void resetRingIndex() { ring_index = -1; } */ - - //this is for following ridge lines - void set_visited(bool b) { m_is_visited = b; } - const bool is_visited() const { return m_is_visited;} - void reset_is_visited() { m_is_visited = false; } -}; - -//---------------------------------------------------------------- -// Halfedge with length -//---------------------------------------------------------------- -template < class Refs, class Tprev, class Tvertex, class Tface > -class My_halfedge:public CGAL::HalfedgeDS_halfedge_base < Refs, Tprev, Tvertex, Tface > -{ -protected: - // int ring_index; - double len; -public: - My_halfedge() {}//: ring_index(-1) {} - /* void setRingIndex(int i) { ring_index = i; } */ -/* int getRingIndex() {return ring_index; } */ -/* void resetRingIndex() {ring_index = -1; } */ - - void setLength(double l) { len = l; } - double getLength() { return len; } }; //------------------------------------------------ // Wrappers [Vertex, Face, Halfedge] //------------------------------------------------ struct Wrappers_VFH:public CGAL::Polyhedron_items_3 { - // wrap vertex - template < class Refs, class Traits > struct Vertex_wrapper { - typedef struct { - public: - //typedef typename Traits::Vector_3 Vector_3; - //all types needed by the vertex... - typedef typename Traits::FT FT; - typedef typename Traits::Point_3 Point_3; - typedef typename Traits::Vector_3 Vector_3; - } FGeomTraits; - typedef typename Traits::Point_3 Point_3; - typedef My_vertex < Refs, CGAL::Tag_true, Point_3, FGeomTraits > Vertex; - }; - // wrap face //NOTE: [HDS, Face] renamed [Polyhedron, Facet] template < class Refs, class Traits > struct Face_wrapper { @@ -144,38 +47,36 @@ struct Wrappers_VFH:public CGAL::Polyhedron_items_3 { //all types needed by the facet... typedef struct { public: - // typedef typename Traits::Point_3 Point_3; - typedef typename Traits::Vector_3 Vector_3; + typedef typename Traits::Vector_3 Vector_3; } FGeomTraits; //custom type instantiated... typedef My_facet < Refs, CGAL::Tag_true, FGeomTraits > Face; }; - - // wrap halfedge - template < class Refs, class Traits > struct Halfedge_wrapper { - typedef My_halfedge < Refs, - CGAL::Tag_true, - CGAL::Tag_true, CGAL::Tag_true > Halfedge; - }; }; //------------------------------------------------ -//PolyhedralSurf +//PolyhedralSurf with facet normal operations //------------------------------------------------ -typedef double DFT; -typedef CGAL::Cartesian Data_Kernel; -typedef CGAL::Polyhedron_3 < Data_Kernel, Wrappers_VFH > Polyhedron; -typedef Data_Kernel::Vector_3 Vector_3; +typedef double FT; +typedef CGAL::Cartesian Kernel; +typedef CGAL::Polyhedron_3 < Kernel, Wrappers_VFH > Polyhedron; +typedef Kernel::Vector_3 Vector_3; class PolyhedralSurf:public Polyhedron { public: PolyhedralSurf() {} - static Vector_3 getHalfedge_vector(Halfedge * h); - void compute_edges_length(); - double compute_mean_edges_length_around_vertex(Vertex * v); + //static Vector_3 getHalfedge_vector(Halfedge * h); + //double compute_mean_edges_length_around_vertex(Vertex * v); + //void compute_edges_length(); + void compute_facets_normals(); Vector_3 computeFacetsAverageUnitNormal(Vertex * v); }; #endif + + + + + diff --git a/Ridges_3/examples/Ridges_3/PolyhedralSurf_operations.h b/Ridges_3/examples/Ridges_3/PolyhedralSurf_operations.h index bf346d3fac9..7170bc6b779 100644 --- a/Ridges_3/examples/Ridges_3/PolyhedralSurf_operations.h +++ b/Ridges_3/examples/Ridges_3/PolyhedralSurf_operations.h @@ -1,16 +1,16 @@ #ifndef _POLY_OP_H_ #define _POLY_OP_H_ -struct Edge_length { - template < class HalfEdge > - void operator() (HalfEdge & h) - { - double d = - CGAL::squared_distance(h.prev()->vertex()->point(), - h.vertex()->point()); - h.setLength(CGAL::sqrt(d)); - } -}; +/* struct Edge_length { */ +/* template < class HalfEdge > */ +/* void operator() (HalfEdge & h) */ +/* { */ +/* double d = */ +/* CGAL::squared_distance(h.prev()->vertex()->point(), */ +/* h.vertex()->point()); */ +/* h.setLength(CGAL::sqrt(d)); */ +/* } */ +/* }; */ //the facet stores the normal struct Facet_unit_normal { diff --git a/Ridges_3/examples/Ridges_3/PolyhedralSurf_rings.h b/Ridges_3/examples/Ridges_3/PolyhedralSurf_rings.h index 94d01a1733c..59deec6c193 100644 --- a/Ridges_3/examples/Ridges_3/PolyhedralSurf_rings.h +++ b/Ridges_3/examples/Ridges_3/PolyhedralSurf_rings.h @@ -3,6 +3,9 @@ using namespace std; +//--------------------------------------------------------------------------- +//T_PolyhedralSurf_rings +//--------------------------------------------------------------------------- template < class TPoly > class T_PolyhedralSurf_rings { protected: @@ -12,39 +15,50 @@ protected: typedef typename TPoly::Facet Facet; typedef typename TPoly::Halfedge_around_vertex_circulator Halfedge_around_vertex_circulator; typedef typename TPoly::Vertex_iterator Vertex_iterator; + typedef std::map Vertex2int_map_type; + Vertex2int_map_type ring_index_map; - //vertex indices are initialised to -1 - static void reset_ring_indices(std::vector < Vertex * >&vces); + //vertex indices are initialised to -1 + void reset_ring_indices(std::vector < Vertex * >&vces); //i >= 1; from a start vertex on the current i-1 ring, push non-visited neighbors //of start in the nextRing and set indices to i. Also add these vertices in all. - static void push_neighbours_of(Vertex * start, int ith, + void push_neighbours_of(Vertex * start, int ith, std::vector < Vertex * >&nextRing, std::vector < Vertex * >&all); //i >= 1, from a currentRing i-1, collect all neighbors, set indices //to i and store them in nextRing and all. - static void collect_ith_ring(int ith, + void collect_ith_ring(int ith, std::vector < Vertex * >¤tRing, std::vector < Vertex * >&nextRing, std::vector < Vertex * >&all); - + public: + T_PolyhedralSurf_rings(TPoly& P); + //collect i>=1 rings : all neighbours up to the ith ring, - static void - collect_i_rings(Vertex* v, - int ring_i, - std::vector < Vertex * >& all); + void collect_i_rings(Vertex* v, + int ring_i, + std::vector < Vertex * >& all); //collect enough rings (at least 1), to get at least min_nb of neighbors - static void - collect_enough_rings(Vertex* v, - unsigned int min_nb, - std::vector < Vertex * >& all); + void collect_enough_rings(Vertex* v, + unsigned int min_nb, + std::vector < Vertex * >& all); }; ////IMPLEMENTATION///////////////////////////////////////////////////////////////////// +template < class TPoly > +T_PolyhedralSurf_rings :: +T_PolyhedralSurf_rings(TPoly& P) +{ + //init the ring_index_map + Vertex_iterator itb = P.vertices_begin(), ite = P.vertices_end(); + for(;itb!=ite;itb++) ring_index_map[&*itb] = -1; +} + template < class TPoly > void T_PolyhedralSurf_rings :: push_neighbours_of(Vertex * start, int ith, @@ -58,9 +72,9 @@ push_neighbours_of(Vertex * start, int ith, CGAL_For_all(hedgeb, hedgee) { v = &*(hedgeb->opposite()->vertex()); - if (v->getRingIndex() != -1) continue;//if visited: next + if (ring_index_map[v] != -1) continue;//if visited: next - v->setRingIndex(ith); + ring_index_map[v] = ith; nextRing.push_back(v); all.push_back(v); } @@ -84,7 +98,7 @@ reset_ring_indices(std::vector < Vertex * >&vces) { typename std::vector < Vertex * >::iterator itb = vces.begin(), ite = vces.end(); - CGAL_For_all(itb, ite) (*itb)->resetRingIndex(); + CGAL_For_all(itb, ite) ring_index_map[*itb] = -1; } template @@ -99,7 +113,7 @@ collect_i_rings(Vertex* v, //initialize p_current_ring = ¤t_ring; p_next_ring = &next_ring; - v->setRingIndex(0); + ring_index_map[v] = 0; current_ring.push_back(v); all.push_back(v); @@ -126,7 +140,7 @@ collect_enough_rings(Vertex* v, //initialize p_current_ring = ¤t_ring; p_next_ring = &next_ring; - v->setRingIndex(0); + ring_index_map[v] = 0; current_ring.push_back(v); all.push_back(v); diff --git a/Ridges_3/examples/Ridges_3/README b/Ridges_3/examples/Ridges_3/README index 44dca7bddca..09df8c88d18 100644 --- a/Ridges_3/examples/Ridges_3/README +++ b/Ridges_3/examples/Ridges_3/README @@ -1,7 +1,6 @@ - -Program blind.exe +Program blind ----------------- -takes an filename.off file as input, +takes a filename.off file as input, it computes a jet fitting to set the monge data at each vertex computes the ridge lines @@ -25,28 +24,29 @@ Usage is : blind with options Note : if the nb of collected points is less than the required min number of points to make the approxiamtion possible (which is constrained by the deg) - then the vertex is skipped. + then the program exits. + - ./blind.exe -f data/ellipe0.003.off -d4 -m4 -a3 -t4 -./blind.exe -f data/poly2x^2+y^2-0.062500.off -d4 -m4 -a0 -t4 - ./blind.exe -f data/poly2x^2+y^2-0.062500.off -d4 -m4 -p20 -t4 + ./blind -f data/ellipe0.003.off -d4 -m4 -a3 -t4 +./blind -f data/poly2x^2+y^2-0.062500.off -d4 -m4 -a0 -t4 + ./blind -f data/poly2x^2+y^2-0.062500.off -d4 -m4 -p20 -t4 - ./blind.exe -f data/ellipsoid_u_0.02.off -d4 -m3 -a3 -u2 -t4 ok 4 wedge umbilics + ./blind -f data/ellipsoid_u_0.02.off -d4 -m3 -a3 -u2 -t4 ok 4 wedge umbilics visu with: -introspect-qt.exe ../../examples/Ridges_3/data/poly2x^2+y^2-0.062500.off ../../examples/Ridges_3/data_poly2x^2+y^2-0.062500.off.4ogl.txt +introspect-qt ../../examples/Ridges_3/data/poly2x^2+y^2-0.062500.off ../../examples/Ridges_3/data_poly2x^2+y^2-0.062500.off.4ogl.txt sur ellipsoid plus precise: -./blind.exe -f data/ellipsoid_u_0.02 -d4 -m4 -a3 -t4 -../../demo/Ridges_3/introspect-qt.exe data/ellipsoid_u_0.02.off data_ellipsoid_u_0.02.4ogl.txt +./blind -f data/ellipsoid_u_0.02 -d4 -m4 -a3 -t4 +../../demo/Ridges_3/introspect-qt data/ellipsoid_u_0.02.off data_ellipsoid_u_0.02.4ogl.txt si dans demo dir: -introspect-qt.exe ../../examples/Ridges_3/data/ellipsoid_u_0.02 ../../examples/Ridges_3/data_ellipsoid_u_0.02.4ogl.txt +introspect-qt ../../examples/Ridges_3/data/ellipsoid_u_0.02 ../../examples/Ridges_3/data_ellipsoid_u_0.02.4ogl.txt diff --git a/Ridges_3/examples/Ridges_3/blind.cpp b/Ridges_3/examples/Ridges_3/blind.cpp index b5b02410751..14b6f5ccd89 100644 --- a/Ridges_3/examples/Ridges_3/blind.cpp +++ b/Ridges_3/examples/Ridges_3/blind.cpp @@ -7,45 +7,77 @@ #include #include #include +#include -#include "../../include/CGAL/Ridges.h" -//#include "../../include/CGAL/Umbilic.h" +#include +#include +// #include //does not work since not in the release yet +// #include #include "../../../Jet_fitting_3/include/CGAL/Monge_via_jet_fitting.h" -#include "../../../Jet_fitting_3/examples/Jet_fitting_3/LinAlg_lapack.h" +#include "../../../Jet_fitting_3/include/CGAL/Lapack/Linear_algebra_lapack.h" +//this is a enriched Polyhedron with facets' normal #include "PolyhedralSurf.h" #include "PolyhedralSurf_rings.h" #include "options.h"//parsing command line -//Kernel of the PolyhedralSurf -typedef double DFT; -typedef CGAL::Cartesian Data_Kernel; -typedef Data_Kernel::Point_3 DPoint; -typedef Data_Kernel::Vector_3 DVector; -typedef PolyhedralSurf::Vertex Vertex; +typedef double FT; +typedef CGAL::Cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef Kernel::Vector_3 Vector_3; +typedef PolyhedralSurf::Vertex Vertex; +typedef PolyhedralSurf::Vertex_handle Vertex_handle; typedef PolyhedralSurf::Vertex_iterator Vertex_iterator; -typedef PolyhedralSurf::Vertex Vertex; typedef T_PolyhedralSurf_rings Poly_rings; -//Kernel for local computations -typedef double LFT; -typedef CGAL::Cartesian Local_Kernel; -typedef CGAL::Monge_via_jet_fitting My_Monge_via_jet_fitting; -typedef CGAL::Monge_rep My_Monge_rep; -typedef CGAL::Monge_info My_Monge_info; +typedef CGAL::Monge_via_jet_fitting Monge_via_jet_fitting; +typedef Monge_via_jet_fitting::Monge_form Monge_form; +typedef Monge_via_jet_fitting::Monge_form_condition_numbers Monge_form_condition_numbers; +//Property maps +//Vertex property map, with std::map +struct Vertex_cmp{ + bool operator()(Vertex_handle a, Vertex_handle b) const{ + return &*a < &*b; + } +}; +typedef std::map Vertex2FT_map_type; +typedef boost::associative_property_map< Vertex2FT_map_type > Vertex2FT_PM_type; +typedef std::map Vertex2Vector_map_type; +typedef boost::associative_property_map< Vertex2Vector_map_type > Vertex2Vector_PM_type; + +typedef CGAL::Differential_quantities< Vertex2FT_PM_type, + Vertex2Vector_PM_type> Differential_quantities; + //RIDGES typedef CGAL::Ridge_line Ridge_line; typedef CGAL::Ridge_approximation < PolyhedralSurf, - back_insert_iterator< std::vector > > Ridge_approximation; -extern CGAL::Ridge_type NONE, BLUE_RIDGE, RED_RIDGE, CREST, BE, BH, BC, RE, RH, RC; + back_insert_iterator< std::vector >, + Vertex2FT_PM_type, + Vertex2Vector_PM_type > Ridge_approximation; +extern CGAL::Ridge_type NONE, BLUE_RIDGE, RED_RIDGE, CREST, + BLUE_ELLIPTIC_RIDGE, BLUE_HYPERBOLIC_RIDGE, BLUE_CREST, + RED_ELLIPTIC_RIDGE, RED_HYPERBOLIC_RIDGE, RED_CREST; //UMBILICS typedef CGAL::Umbilic Umbilic; typedef CGAL::Umbilic_approximation < PolyhedralSurf, - back_insert_iterator< std::vector > > Umbilic_approximation; + back_insert_iterator< std::vector >, + Vertex2FT_PM_type, + Vertex2Vector_PM_type > Umbilic_approximation; extern CGAL::Umbilic_type NON_GENERIC, WEDGE, TRISECTOR; +//create property maps, to be moved in main? +Vertex2FT_map_type vertex2k1_map, vertex2k2_map, + vertex2b0_map, vertex2b3_map, + vertex2P1_map, vertex2P2_map; +Vertex2Vector_map_type vertex2d1_map, vertex2d2_map; + +Vertex2FT_PM_type vertex2k1_pm(vertex2k1_map), vertex2k2_pm(vertex2k2_map), + vertex2b0_pm(vertex2b0_map), vertex2b3_pm(vertex2b3_map), + vertex2P1_pm(vertex2P1_map), vertex2P2_pm(vertex2P2_map); +Vertex2Vector_PM_type vertex2d1_pm(vertex2d1_map), vertex2d2_pm(vertex2d2_map); + //Syntax requirred by Options static const char *const optv[] = { @@ -72,25 +104,29 @@ double umb_size = 1; bool verbose = false; unsigned int min_nb_points = (d_fitting + 1) * (d_fitting + 2) / 2; -//gather points around the vertex v using rings on the -//polyhedralsurf. the collection of points resorts to 3 alternatives: -// 1. the exact number of points to be used -// 2. the exact number of rings to be used -// 3. nothing is specified +/* gather points around the vertex v using rings on the + polyhedralsurf. the collection of points resorts to 3 alternatives: + 1. the exact number of points to be used + 2. the exact number of rings to be used + 3. nothing is specified +*/ void gather_fitting_points(Vertex* v, - std::vector &in_points) - //Vertex_PM_type& vpm) + std::vector &in_points, + PolyhedralSurf& P) { //container to collect vertices of v on the PolyhedralSurf std::vector gathered; //initialize in_points.clear(); + + //create a Poly_rings object + Poly_rings poly_rings(P); //OPTION -p nb_points_to_use, with nb_points_to_use != 0. Collect //enough rings and discard some points of the last collected ring to //get the exact "nb_points_to_use" if ( nb_points_to_use != 0 ) { - Poly_rings::collect_enough_rings(v, nb_points_to_use, gathered);//, vpm); + poly_rings.collect_enough_rings(v, nb_points_to_use, gathered);//, vpm); if ( gathered.size() > nb_points_to_use ) gathered.resize(nb_points_to_use); } else { // nb_points_to_use=0, this is the default and the option -p is not considered; @@ -98,8 +134,8 @@ void gather_fitting_points(Vertex* v, // enough rings to get the min_nb_points required for the fitting // else collect the nb_rings required if ( nb_rings == 0 ) - Poly_rings::collect_enough_rings(v, min_nb_points, gathered);//, vpm); - else Poly_rings::collect_i_rings(v, nb_rings, gathered);//, vpm); + poly_rings.collect_enough_rings(v, min_nb_points, gathered);//, vpm); + else poly_rings.collect_i_rings(v, nb_rings, gathered);//, vpm); } //store the gathered points @@ -108,173 +144,71 @@ void gather_fitting_points(Vertex* v, CGAL_For_all(itb,ite) in_points.push_back((*itb)->point()); } - - -// //gather points around the vertex v using rings on the polyhedralsurf -// //for the fitting -// void gather_fitting_points( Vertex* v, -// std::vector &in_points) -// { -// //container to collect vertices of v on the PolyhedralSurf -// std::vector current_ring, next_ring, gathered; -// std::vector *p_current_ring, *p_next_ring; - -// //initialize -// unsigned int nbp = 0, //current nb of collected points -// ith = 0; //i-th ring index -// current_ring.clear(); -// next_ring.clear(); -// p_current_ring = ¤t_ring; -// p_next_ring = &next_ring; -// gathered.clear(); -// in_points.clear(); - -// //DO NOT FORGET TO UNTAG AT THE END! -// v->setRingIndex(ith); -// //collect 0th ring : the vertex v! -// gathered.push_back(v); -// nbp = 1; -// //collect 1-ring -// ith = 1; -// nbp = Poly_rings::push_neighbours_of(v, ith, current_ring, gathered); -// //collect more neighbors depending on options... - -// //OPTION -p nb, with nb != 0 -// //for approximation/interpolation with a fixed nb of points, collect -// // enough rings and discard some points of the last collected ring -// // to get the exact "nb_points_to_use" -// if ( nb_points_to_use != 0 ) { -// while( gathered.size() < nb_points_to_use ) { -// ith++; -// //using tags -// nbp += Poly_rings:: -// collect_ith_ring_neighbours(ith, *p_current_ring, -// *p_next_ring, gathered); -// //next round must be launched from p_nextRing... -// p_current_ring->clear(); -// std::swap(p_current_ring, p_next_ring); -// } -// //clean up -// Poly_rings::reset_ring_indices(gathered); -// //discard non-required collected points of the last ring -// gathered.resize(nb_points_to_use, NULL); -// assert(gathered.size() == nb_points_to_use ); -// } -// else{ -// //OPTION -a nb, with nb = 0 -// // select the mini nb of rings needed to make approx possible -// if (nb_rings == 0) { -// while ( gathered.size() < min_nb_points ) { -// ith++; -// nbp += Poly_rings:: -// collect_ith_ring_neighbours(ith, *p_current_ring, -// *p_next_ring, gathered); -// //next round must be launched from p_nextRing... -// p_current_ring->clear(); -// std::swap(p_current_ring, p_next_ring); -// } -// } -// //OPTION -a nb, with nb = 1, nothing to do! we have already -// // collected the 1 ring -// //OPTION -a nb, with nb > 1 -// //for approximation with a fixed nb of rings, collect -// // neighbors up to the "nb_rings"th ring -// if (nb_rings > 1) -// while (ith < nb_rings) { -// ith++; -// nbp += Poly_rings:: -// collect_ith_ring_neighbours(ith, *p_current_ring, -// *p_next_ring, gathered); -// //next round must be launched from p_nextRing... -// p_current_ring->clear(); -// std::swap(p_current_ring, p_next_ring); -// } - -// //clean up -// Poly_rings::reset_ring_indices(gathered); -// } //END ELSE - -// //store the gathered points -// std::vector::iterator itb = gathered.begin(), -// ite = gathered.end(); -// CGAL_For_all(itb,ite) in_points.push_back((*itb)->point()); -// } - - +/* Use the jet_fitting package and the class Poly_rings to compute + diff quantities. +*/ void compute_differential_quantities(PolyhedralSurf& P) { //container for approximation points - std::vector in_points; - -//debug -// int count=0; + std::vector in_points; //MAIN LOOP Vertex_iterator vitb = P.vertices_begin(), vite = P.vertices_end(); for (; vitb != vite; vitb++) { //initialize - Vertex* v = &(*vitb); + Vertex* v = &(*vitb);//should be removed in_points.clear(); - My_Monge_rep monge_rep; - My_Monge_info monge_info; + Monge_form monge_form; + Monge_form_condition_numbers monge_form_condition_numbers; - //gather points arourd the vertex using rings - gather_fitting_points( v, in_points); + //gather points around the vertex using rings + gather_fitting_points(v, in_points, P); //exit if the nb of points is too small if ( in_points.size() < min_nb_points ) - {std::cerr << "nb of points is to small" << std::endl; exit(0);} + {std::cerr << "Too few points to perform the fitting" << std::endl; exit(0);} //For Ridges we need at least 3rd order info assert( d_monge >= 3); // run the main fct : perform the fitting - My_Monge_via_jet_fitting do_it(in_points.begin(), in_points.end(), - d_fitting, d_monge, - monge_rep, monge_info); + Monge_via_jet_fitting do_it(in_points.begin(), in_points.end(), + d_fitting, d_monge, + monge_form, monge_form_condition_numbers); //switch min-max ppal curv/dir wrt the mesh orientation - const DVector normal_mesh = P.computeFacetsAverageUnitNormal(v); - monge_rep.comply_wrt_given_normal(normal_mesh); + const Vector_3 normal_mesh = P.computeFacetsAverageUnitNormal(v); + monge_form.comply_wrt_given_normal(normal_mesh); - // Store monge data needed for ridge computations in v - v->d1() = monge_rep.d1(); - v->d2() = monge_rep.d2(); - v->k1() = monge_rep.coefficients()[0]; - v->k2() = monge_rep.coefficients()[1]; - v->b0() = monge_rep.coefficients()[2]; - v->b3() = monge_rep.coefficients()[5]; + // Store monge data needed for ridge computations in v in property maps + vertex2d1_pm[v] = monge_form.d1(); + vertex2d2_pm[v] = monge_form.d2(); + vertex2k1_pm[v] = monge_form.coefficients()[0]; + vertex2k2_pm[v] = monge_form.coefficients()[1]; + vertex2b0_pm[v] = monge_form.coefficients()[2]; + vertex2b3_pm[v] = monge_form.coefficients()[5]; if ( d_monge >= 4) { //= 3*b1^2+(k1-k2)(c0-3k1^3) - v->P1() = - 3*monge_rep.coefficients()[3]*monge_rep.coefficients()[3] - +(v->k1()-v->k2()) - *(monge_rep.coefficients()[6]-3*v->k1()*v->k1()*v->k1()) ; + vertex2P1_pm[v] = + 3*monge_form.coefficients()[3]*monge_form.coefficients()[3] + +(monge_form.coefficients()[0]-monge_form.coefficients()[1]) + *(monge_form.coefficients()[6] + -3*monge_form.coefficients()[0]*monge_form.coefficients()[0] + *monge_form.coefficients()[0]); //= 3*b2^2+(k2-k1)(c4-3k2^3) - v->P2() = - 3*monge_rep.coefficients()[4]*monge_rep.coefficients()[4] - +(-v->k1()+v->k2()) - *(monge_rep.coefficients()[10]-3*v->k2()*v->k2()*v->k2()) ; + vertex2P2_pm[v] = + 3*monge_form.coefficients()[4]*monge_form.coefficients()[4] + +(-monge_form.coefficients()[0]+monge_form.coefficients()[1]) + *(monge_form.coefficients()[10] + -3*monge_form.coefficients()[1]*monge_form.coefficients()[1] + *monge_form.coefficients()[1]); } - -// //debug -// count++; -// std::cout << std::endl << "vertex " << count << std::endl; -// monge_rep.dump_verbose(std::cout); - - - } //END FOR LOOP } int main(int argc, char *argv[]) { - char *if_name = NULL, //input file name - *w_if_name = NULL; //as above, but / replaced by _ - char* res4openGL_fname; - char* verbose_fname; - std::ofstream *out_4ogl = NULL, *out_verbose = NULL; - + std::string if_name, of_name;// of_name same as if_name with '/' -> '_' int optchar; char *optarg; Options opts(*argv, optv); @@ -306,108 +240,104 @@ int main(int argc, char *argv[]) min_nb_points = (d_fitting + 1) * (d_fitting + 2) / 2; //prepare output file names - assert(if_name != NULL); - w_if_name = new char[strlen(if_name)+1]; - strcpy(w_if_name, if_name); - for(unsigned int i=0; i PolyhedralSurf P; - std::ifstream stream(if_name); + std::ifstream stream(if_name.c_str()); stream >> P; fprintf(stderr, "loadMesh %d Ves %d Facets\n", P.size_of_vertices(), P.size_of_facets()); if(verbose) - (*out_verbose) << "Polysurf with " << P.size_of_vertices() - << " vertices and " << P.size_of_facets() - << " facets. " << std::endl; + out_verb << "Polysurf with " << P.size_of_vertices() + << " vertices and " << P.size_of_facets() + << " facets. " << std::endl; //exit if not enough points in the model if (min_nb_points > P.size_of_vertices()) {std::cerr << "not enough points in the model" << std::endl; exit(0);} - //initialize Polyhedral data : length of edges, normal of facets and - //monge data - P.compute_edges_length(); + + //initialize Polyhedral data : normal of facets P.compute_facets_normals(); - compute_differential_quantities( P); - - /////////////////////////////////////////// - //RIDGES!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - /////////////////////////////////////////// - //recall: -// typedef CGAL::Ridge_approximation < PolyhedralSurf, -// back_insert_iterator< std::vector > > Ridge_approximation; - - Ridge_approximation ridge_approximation; + + //initialize the diff quantities property maps + compute_differential_quantities(P); + + //--------------------------------------------------------------------------- + //Ridges + //-------------------------------------------------------------------------- + // Differential_quantities diff_q; + Ridge_approximation ridge_approximation(P, + vertex2k1_pm, vertex2k2_pm, + vertex2b0_pm, vertex2b3_pm, + vertex2P1_pm, vertex2P2_pm, + vertex2d1_pm, vertex2d2_pm); std::vector ridge_lines; - back_insert_iterator > ii(ridge_lines); - + + //Find BLUE_RIDGE, RED_RIDGE, CREST or all ridges + // ridge_approximation.compute_ridges(P, CGAL::BLUE_RIDGE, ii, tag_order); + // ridge_approximation.compute_ridges(P, CGAL::RED_RIDGE, ii, tag_order); + ridge_approximation.compute_ridges(P, CGAL::CREST, ii, tag_order); // ridge_approximation.compute_all_ridges(P, ii, tag_order); - //Find BLUE_RIDGE, RED_RIDGE or CREST ridges -// ridge_approximation.compute_ridges(P, CGAL::BLUE_RIDGE, ii, tag_order); -// ridge_approximation.compute_ridges(P, CGAL::RED_RIDGE, ii, tag_order); - ridge_approximation.compute_ridges(P, CGAL::CREST, ii, tag_order); - std::vector::iterator iter_lines = ridge_lines.begin(), iter_end = ridge_lines.end(); //OpenGL output - for (;iter_lines!=iter_end;iter_lines++) + for (;iter_lines!=iter_end;iter_lines++) (*iter_lines)->dump_4ogl(out_4ogl); + + //verbose txt output + if (verbose) + for (iter_lines = ridge_lines.begin();iter_lines!=iter_end;iter_lines++) + out_verb << **iter_lines; + + //--------------------------------------------------------------------------- + // UMBILICS + //-------------------------------------------------------------------------- + Umbilic_approximation umbilic_approximation(P, + vertex2k1_pm, vertex2k2_pm, + vertex2d1_pm, vertex2d2_pm); + std::vector umbilics; + back_insert_iterator > umb_it(umbilics); + umbilic_approximation.compute(P, umb_it, umb_size); + + std::vector::iterator iter_umb = umbilics.begin(), + iter_umb_end = umbilics.end(); + // output + std::cout << "nb of umbilics " << umbilics.size() << std::endl; + for (;iter_umb!=iter_umb_end;iter_umb++) { - (*iter_lines)->dump_4ogl(*out_4ogl); - // (*iter_lines)->dump_4ogl(std::cout); + std::cout << "umbilic type " << (*iter_umb)->umb_type << std::endl; } - - // //verbose txt output - // if (verbose){ - // (*out_verbose) << std::endl ; - // } //END IF - - - -// //UMBOLICS -// Umbilic_approximation umbilic_approximation; -// std::vector umbilics; -// back_insert_iterator > umb_it(umbilics); -// umbilic_approximation.compute(P, umb_it, umb_size); -// std::vector::iterator iter_umb = umbilics.begin(), -// iter_umb_end = umbilics.end(); -// // output -// std::cout << "nb of umbilics " << umbilics.size() << std::endl; -// for (;iter_umb!=iter_umb_end;iter_umb++) -// { -// std::cout << "umbilic type " << (*iter_umb)->umb_type << std::endl; -// } - - - - //cleanup filenames - delete res4openGL_fname; - out_4ogl->close(); - delete out_4ogl; - if(verbose) { - delete verbose_fname; - out_verbose->close(); - delete out_verbose; - } + return 1; } diff --git a/Ridges_3/examples/Ridges_3/makefile b/Ridges_3/examples/Ridges_3/makefile index be41a046a1e..ac9657316bf 100644 --- a/Ridges_3/examples/Ridges_3/makefile +++ b/Ridges_3/examples/Ridges_3/makefile @@ -12,11 +12,13 @@ CFLAGS=${PROFOPT} #---------------------------------------------------------------------# # compiler flags #---------------------------------------------------------------------# -#GSL_DIR=/usr/local/gsl LAPACK_INCDIRS = -I$(LAPACK_DIR)/SRC -I$(LAPACK_DIR) +#note line -I../../../Jet_fitting_3/include needed since +#jet_fitting_3 not in the release yet CXXFLAGS = \ -I../../include \ + -I../../../Jet_fitting_3/include \ $(CGAL_CXXFLAGS) \ $(LONG_NAME_PROBLEM_CXXFLAGS) \ $(LAPACK_INCDIRS) \ @@ -25,7 +27,6 @@ CXXFLAGS = \ #---------------------------------------------------------------------# # linker flags #---------------------------------------------------------------------# -#GSL_LIBS=-L${GSL_DIR}/lib -lgsl -lgslcblas -lm F2CDIR = $(LAPACK_DIR)/F2CLIBS LAPACK_LDLIBS = $(LAPACK_DIR)/lapack_LINUX.a \ $(LAPACK_DIR)/blas_LINUX.a $(LAPACK_DIR)/tmglib_LINUX.a \ @@ -48,17 +49,11 @@ all: \ BLIND_OBJS=options.o PolyhedralSurf.o blind.o blind: $(BLIND_OBJS) - $(CGAL_CXX) $(LIBPATH) -o blind.exe $(BLIND_OBJS) \ + $(CGAL_CXX) $(LIBPATH) -o blind $(BLIND_OBJS) \ $(LDFLAGS) - -rmexe: - rm *.exe - clean: \ - blind.clean options.clean PolyhedralSurf.clean \ - rmexe - + blind.clean options.clean PolyhedralSurf.clean depend: makedepend *.[Ch] @@ -72,13 +67,129 @@ depend: # DO NOT DELETE -blind.o: ../../include/CGAL/Ridges.h +blind.o: /usr/include/boost/property_map.hpp /usr/include/boost/config.hpp +blind.o: /usr/include/boost/config/user.hpp +blind.o: /usr/include/boost/config/select_compiler_config.hpp +blind.o: /usr/include/boost/config/compiler/gcc.hpp +blind.o: /usr/include/boost/config/select_stdlib_config.hpp +blind.o: /usr/include/boost/config/select_platform_config.hpp +blind.o: /usr/include/boost/config/suffix.hpp /usr/include/limits.h +blind.o: /usr/include/features.h /usr/include/sys/cdefs.h +blind.o: /usr/include/gnu/stubs.h /usr/include/bits/posix1_lim.h +blind.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h +blind.o: /usr/include/bits/posix2_lim.h +blind.o: /usr/include/boost/pending/cstddef.hpp +blind.o: /usr/include/boost/detail/iterator.hpp /usr/include/boost/config.hpp +blind.o: /usr/include/boost/concept_check.hpp /usr/include/boost/iterator.hpp +blind.o: /usr/include/boost/type_traits/conversion_traits.hpp +blind.o: /usr/include/boost/type_traits/is_convertible.hpp +blind.o: /usr/include/boost/type_traits/detail/yes_no_type.hpp +blind.o: /usr/include/boost/type_traits/config.hpp +blind.o: /usr/include/boost/type_traits/is_array.hpp +blind.o: /usr/include/boost/type_traits/detail/bool_trait_def.hpp +blind.o: /usr/include/boost/type_traits/detail/template_arity_spec.hpp +blind.o: /usr/include/boost/mpl/int.hpp /usr/include/boost/mpl/int_fwd.hpp +blind.o: /usr/include/boost/mpl/aux_/adl_barrier.hpp +blind.o: /usr/include/boost/mpl/aux_/config/adl.hpp +blind.o: /usr/include/boost/mpl/aux_/config/msvc.hpp +blind.o: /usr/include/boost/mpl/aux_/config/intel.hpp +blind.o: /usr/include/boost/mpl/aux_/config/gcc.hpp +blind.o: /usr/include/boost/mpl/aux_/config/workaround.hpp +blind.o: /usr/include/boost/detail/workaround.hpp +blind.o: /usr/include/boost/mpl/aux_/nttp_decl.hpp +blind.o: /usr/include/boost/mpl/aux_/config/nttp.hpp +blind.o: /usr/include/boost/preprocessor/cat.hpp +blind.o: /usr/include/boost/preprocessor/config/config.hpp +blind.o: /usr/include/boost/mpl/aux_/integral_wrapper.hpp +blind.o: /usr/include/boost/mpl/integral_c_tag.hpp +blind.o: /usr/include/boost/mpl/aux_/config/static_constant.hpp +blind.o: /usr/include/boost/mpl/aux_/static_cast.hpp +blind.o: /usr/include/boost/mpl/aux_/template_arity_fwd.hpp +blind.o: /usr/include/boost/mpl/aux_/preprocessor/params.hpp +blind.o: /usr/include/boost/mpl/aux_/config/preprocessor.hpp +blind.o: /usr/include/boost/preprocessor/comma_if.hpp +blind.o: /usr/include/boost/preprocessor/punctuation/comma_if.hpp +blind.o: /usr/include/boost/preprocessor/control/if.hpp +blind.o: /usr/include/boost/preprocessor/control/iif.hpp +blind.o: /usr/include/boost/preprocessor/logical/bool.hpp +blind.o: /usr/include/boost/preprocessor/facilities/empty.hpp +blind.o: /usr/include/boost/preprocessor/punctuation/comma.hpp +blind.o: /usr/include/boost/preprocessor/repeat.hpp +blind.o: /usr/include/boost/preprocessor/repetition/repeat.hpp +blind.o: /usr/include/boost/preprocessor/debug/error.hpp +blind.o: /usr/include/boost/preprocessor/detail/auto_rec.hpp +blind.o: /usr/include/boost/preprocessor/tuple/eat.hpp +blind.o: /usr/include/boost/preprocessor/inc.hpp +blind.o: /usr/include/boost/preprocessor/arithmetic/inc.hpp +blind.o: /usr/include/boost/mpl/aux_/config/lambda.hpp +blind.o: /usr/include/boost/mpl/aux_/config/ttp.hpp +blind.o: /usr/include/boost/mpl/aux_/config/ctps.hpp +blind.o: /usr/include/boost/mpl/aux_/config/overload_resolution.hpp +blind.o: /usr/include/boost/type_traits/integral_constant.hpp +blind.o: /usr/include/boost/mpl/bool.hpp /usr/include/boost/mpl/bool_fwd.hpp +blind.o: /usr/include/boost/mpl/integral_c.hpp +blind.o: /usr/include/boost/mpl/integral_c_fwd.hpp +blind.o: /usr/include/boost/mpl/aux_/lambda_support.hpp +blind.o: /usr/include/boost/type_traits/detail/bool_trait_undef.hpp +blind.o: /usr/include/boost/type_traits/add_reference.hpp +blind.o: /usr/include/boost/type_traits/is_reference.hpp +blind.o: /usr/include/boost/type_traits/detail/type_trait_def.hpp +blind.o: /usr/include/boost/type_traits/detail/type_trait_undef.hpp +blind.o: /usr/include/boost/type_traits/ice.hpp +blind.o: /usr/include/boost/type_traits/detail/ice_or.hpp +blind.o: /usr/include/boost/type_traits/detail/ice_and.hpp +blind.o: /usr/include/boost/type_traits/detail/ice_not.hpp +blind.o: /usr/include/boost/type_traits/detail/ice_eq.hpp +blind.o: /usr/include/boost/type_traits/is_arithmetic.hpp +blind.o: /usr/include/boost/type_traits/is_integral.hpp +blind.o: /usr/include/boost/type_traits/is_float.hpp +blind.o: /usr/include/boost/type_traits/is_abstract.hpp +blind.o: /usr/include/boost/static_assert.hpp +blind.o: /usr/include/boost/type_traits/is_class.hpp +blind.o: /usr/include/boost/type_traits/is_union.hpp +blind.o: /usr/include/boost/type_traits/remove_cv.hpp +blind.o: /usr/include/boost/type_traits/broken_compiler_spec.hpp +blind.o: /usr/include/boost/type_traits/detail/cv_traits_impl.hpp +blind.o: /usr/include/boost/type_traits/intrinsics.hpp +blind.o: /usr/include/boost/mpl/identity.hpp +blind.o: /usr/include/boost/mpl/aux_/na_spec.hpp +blind.o: /usr/include/boost/mpl/lambda_fwd.hpp +blind.o: /usr/include/boost/mpl/void_fwd.hpp +blind.o: /usr/include/boost/mpl/aux_/na.hpp +blind.o: /usr/include/boost/mpl/aux_/na_fwd.hpp +blind.o: /usr/include/boost/mpl/aux_/lambda_arity_param.hpp +blind.o: /usr/include/boost/mpl/aux_/arity.hpp +blind.o: /usr/include/boost/mpl/aux_/config/dtp.hpp +blind.o: /usr/include/boost/mpl/aux_/preprocessor/enum.hpp +blind.o: /usr/include/boost/mpl/aux_/preprocessor/def_params_tail.hpp +blind.o: /usr/include/boost/mpl/limits/arity.hpp +blind.o: /usr/include/boost/preprocessor/logical/and.hpp +blind.o: /usr/include/boost/preprocessor/logical/bitand.hpp +blind.o: /usr/include/boost/preprocessor/identity.hpp +blind.o: /usr/include/boost/preprocessor/facilities/identity.hpp +blind.o: /usr/include/boost/preprocessor/empty.hpp +blind.o: /usr/include/boost/preprocessor/arithmetic/add.hpp +blind.o: /usr/include/boost/preprocessor/arithmetic/dec.hpp +blind.o: /usr/include/boost/preprocessor/control/while.hpp +blind.o: /usr/include/boost/preprocessor/list/fold_left.hpp +blind.o: /usr/include/boost/preprocessor/list/detail/fold_left.hpp +blind.o: /usr/include/boost/preprocessor/control/expr_iif.hpp +blind.o: /usr/include/boost/preprocessor/list/adt.hpp +blind.o: /usr/include/boost/preprocessor/detail/is_binary.hpp +blind.o: /usr/include/boost/preprocessor/detail/check.hpp +blind.o: /usr/include/boost/preprocessor/logical/compl.hpp +blind.o: /usr/include/boost/preprocessor/list/fold_right.hpp +blind.o: /usr/include/boost/preprocessor/list/detail/fold_right.hpp +blind.o: /usr/include/boost/preprocessor/list/reverse.hpp +blind.o: /usr/include/boost/preprocessor/control/detail/while.hpp +blind.o: /usr/include/boost/preprocessor/tuple/elem.hpp +blind.o: /usr/include/boost/preprocessor/arithmetic/sub.hpp +blind.o: /usr/include/boost/mpl/aux_/config/eti.hpp +blind.o: /usr/include/boost/concept_archetype.hpp blind.o: ../../../Jet_fitting_3/include/CGAL/Monge_via_jet_fitting.h -blind.o: ../../../Jet_fitting_3/include/CGAL/jet_fitting_3_assertions.h -blind.o: /usr/include/math.h /usr/include/features.h /usr/include/sys/cdefs.h -blind.o: /usr/include/gnu/stubs.h /usr/include/bits/huge_val.h +blind.o: /usr/include/math.h /usr/include/bits/huge_val.h blind.o: /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h -blind.o: ../../../Jet_fitting_3/examples/Jet_fitting_3/LinAlg_lapack.h +blind.o: ../../../Jet_fitting_3/include/CGAL/Lapack/Linear_algebra_lapack.h blind.o: /usr/include/stdlib.h /usr/include/sys/types.h blind.o: /usr/include/bits/types.h /usr/include/bits/wordsize.h blind.o: /usr/include/bits/typesizes.h /usr/include/time.h @@ -91,60 +202,6 @@ blind.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h blind.o: /usr/include/wchar.h /usr/include/bits/wchar.h /usr/include/gconv.h blind.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h blind.o: PolyhedralSurf_operations.h PolyhedralSurf_rings.h options.h -GSL.o: /usr/include/gsl/gsl_linalg.h /usr/include/gsl/gsl_mode.h -GSL.o: /usr/include/gsl/gsl_permutation.h /usr/include/stdlib.h -GSL.o: /usr/include/features.h /usr/include/sys/cdefs.h -GSL.o: /usr/include/gnu/stubs.h /usr/include/sys/types.h -GSL.o: /usr/include/bits/types.h /usr/include/bits/wordsize.h -GSL.o: /usr/include/bits/typesizes.h /usr/include/time.h -GSL.o: /usr/include/endian.h /usr/include/bits/endian.h -GSL.o: /usr/include/sys/select.h /usr/include/bits/select.h -GSL.o: /usr/include/bits/sigset.h /usr/include/bits/time.h -GSL.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h -GSL.o: /usr/include/bits/sched.h /usr/include/alloca.h -GSL.o: /usr/include/gsl/gsl_types.h /usr/include/gsl/gsl_errno.h -GSL.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h -GSL.o: /usr/include/wchar.h /usr/include/bits/wchar.h /usr/include/gconv.h -GSL.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h -GSL.o: /usr/include/errno.h /usr/include/bits/errno.h -GSL.o: /usr/include/linux/errno.h /usr/include/asm/errno.h -GSL.o: /usr/include/asm-i386/errno.h /usr/include/gsl/gsl_check_range.h -GSL.o: /usr/include/gsl/gsl_vector.h -GSL.o: /usr/include/gsl/gsl_vector_complex_long_double.h -GSL.o: /usr/include/gsl/gsl_complex.h -GSL.o: /usr/include/gsl/gsl_vector_long_double.h -GSL.o: /usr/include/gsl/gsl_block_long_double.h -GSL.o: /usr/include/gsl/gsl_vector_complex.h -GSL.o: /usr/include/gsl/gsl_block_complex_long_double.h -GSL.o: /usr/include/gsl/gsl_vector_complex_double.h -GSL.o: /usr/include/gsl/gsl_vector_double.h -GSL.o: /usr/include/gsl/gsl_block_double.h -GSL.o: /usr/include/gsl/gsl_block_complex_double.h -GSL.o: /usr/include/gsl/gsl_vector_complex_float.h -GSL.o: /usr/include/gsl/gsl_vector_float.h /usr/include/gsl/gsl_block_float.h -GSL.o: /usr/include/gsl/gsl_block_complex_float.h -GSL.o: /usr/include/gsl/gsl_vector_ulong.h /usr/include/gsl/gsl_block_ulong.h -GSL.o: /usr/include/gsl/gsl_vector_long.h /usr/include/gsl/gsl_block_long.h -GSL.o: /usr/include/gsl/gsl_vector_uint.h /usr/include/gsl/gsl_block_uint.h -GSL.o: /usr/include/gsl/gsl_vector_int.h /usr/include/gsl/gsl_block_int.h -GSL.o: /usr/include/gsl/gsl_vector_ushort.h -GSL.o: /usr/include/gsl/gsl_block_ushort.h -GSL.o: /usr/include/gsl/gsl_vector_short.h /usr/include/gsl/gsl_block_short.h -GSL.o: /usr/include/gsl/gsl_vector_uchar.h /usr/include/gsl/gsl_block_uchar.h -GSL.o: /usr/include/gsl/gsl_vector_char.h /usr/include/gsl/gsl_block_char.h -GSL.o: /usr/include/gsl/gsl_matrix.h -GSL.o: /usr/include/gsl/gsl_matrix_complex_long_double.h -GSL.o: /usr/include/gsl/gsl_matrix_complex_double.h -GSL.o: /usr/include/gsl/gsl_matrix_complex_float.h -GSL.o: /usr/include/gsl/gsl_matrix_long_double.h -GSL.o: /usr/include/gsl/gsl_matrix_double.h -GSL.o: /usr/include/gsl/gsl_matrix_float.h -GSL.o: /usr/include/gsl/gsl_matrix_ulong.h /usr/include/gsl/gsl_matrix_long.h -GSL.o: /usr/include/gsl/gsl_matrix_uint.h /usr/include/gsl/gsl_matrix_int.h -GSL.o: /usr/include/gsl/gsl_matrix_ushort.h -GSL.o: /usr/include/gsl/gsl_matrix_short.h -GSL.o: /usr/include/gsl/gsl_matrix_uchar.h /usr/include/gsl/gsl_matrix_char.h -GSL.o: /usr/include/gsl/gsl_eigen.h options.o: /usr/include/ctype.h /usr/include/features.h options.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h options.o: /usr/include/bits/types.h /usr/include/bits/wordsize.h