changes according to Ralf Osbild:

The optional messages (verbose) were improved in both files:
OFF_to_nef_3.h
vertex_cycle_to_nef_3.h

Correction in OFF_to_nef_3.h:
old: V.reserve(NOI);
new: V_f.reserve(NOI);

Changes in vertex_cycle_to_nef_3.h
The meaning of the parameter 'normal' is now less mandatory.
Because of this, the structure of the funtion body slightly changed.
This commit is contained in:
Peter Hachenberger 2006-03-07 19:48:46 +00:00
parent 3a3ece0364
commit cd704b9cda
2 changed files with 30 additions and 53 deletions

View File

@ -100,7 +100,7 @@ bool projected_vertex_cycle_to_nef_3 (typename Nef_3::SNC_structure &snc,
if ( v_it == v_last ) break; // while-end if ( v_it == v_last ) break; // while-end
if ( *v_pred_it == *v_it ) continue ; // no self-loops if ( *v_pred_it == *v_it ) continue ; // no self-loops
ctp.insert_constraint (*v_pred_it, *v_it); ctp.insert_constraint (*v_pred_it, *v_it);
if ( ctp.number_of_vertices() != nov ) break; // error if ( ctp.number_of_vertices() != nov ) break; // constraints intersect
} }
if ( v_it == v_last && *v_pred_it != *v_first) // no self-loops if ( v_it == v_last && *v_pred_it != *v_first) // no self-loops
{ ctp.insert_constraint (*v_pred_it, *v_first); { ctp.insert_constraint (*v_pred_it, *v_first);
@ -109,14 +109,6 @@ bool projected_vertex_cycle_to_nef_3 (typename Nef_3::SNC_structure &snc,
// assertion // assertion
if ( ctp.number_of_vertices() != nov ) if ( ctp.number_of_vertices() != nov )
{ ostr << " -> Vertex cycle is not simple; edges intersect."; { ostr << " -> Vertex cycle is not simple; edges intersect.";
/* old
if (verb)
{ std::cerr << "\n" << __FILE__ << ", line " << __LINE__
<< ": assertion violation: vertex cycle is not simple!"
<< " (edges intersect)"
<< std::endl;
}
*/
return false; return false;
} }
CGAL_assertion (ctp.is_valid()); CGAL_assertion (ctp.is_valid());
@ -229,18 +221,6 @@ bool projected_vertex_cycle_to_nef_3 (typename Nef_3::SNC_structure &snc,
} while (t_vh != t_vh_0) } while (t_vh != t_vh_0)
; // do-while ends ; // do-while ends
#ifdef CGAL_NEF_VERTEX_CYCLE_INFO
{ // test information
int count = 0;
for (typename CTP::Subconstraint_iterator scit = ctp.subconstraints_begin();
scit != ctp.subconstraints_end(); ++scit) ++count;
std::cout << "The number of resulting constrained edges is "
<< count << "\n"
<< "number of vertices= " << ctp.number_of_vertices() << "\n"
<< "number of faces= " << ctp.number_of_faces() << "\n";
}
#endif
return true; return true;
} }
@ -286,13 +266,13 @@ typedef CGAL::Constrained_triangulation_plus_2<YZ_tri> YZ_tri_plus;
std::ostringstream ostr; std::ostringstream ostr;
if ( normal == NULL_VECTOR ) if ( normal == NULL_VECTOR )
{ // assertion violation { // report it
// This case can occur if vertex cycle is not simple! ostr << " -> function parameter 'normal' is NULL_VECTOR"
is_nef = false; << " (this can be a symptom of an error).";
ostr << " -> normal == NULL_VECTOR.";
} }
else
{ // direction of projection? if ( normal != NULL_VECTOR )
{ // projection depending on normal vector
direc='z'; direc='z';
if ( CGAL::abs(normal.x()) > CGAL::abs(normal.y()) ) if ( CGAL::abs(normal.x()) > CGAL::abs(normal.y()) )
{ if ( CGAL::abs(normal.x()) > CGAL::abs(normal.z()) ) direc='x'; { if ( CGAL::abs(normal.x()) > CGAL::abs(normal.z()) ) direc='x';
@ -303,6 +283,7 @@ typedef CGAL::Constrained_triangulation_plus_2<YZ_tri> YZ_tri_plus;
// project and triangulate vertices, // project and triangulate vertices,
// convert result to Nef polyhedron // convert result to Nef polyhedron
ostr << " Direction of projection is '" << direc << "'.";
if ( direc == 'x' ) if ( direc == 'x' )
{ is_nef = projected_vertex_cycle_to_nef_3<YZ_tri_plus,Nef_3> ( { is_nef = projected_vertex_cycle_to_nef_3<YZ_tri_plus,Nef_3> (
snc, v_first, v_last, ostr); snc, v_first, v_last, ostr);
@ -316,29 +297,33 @@ typedef CGAL::Constrained_triangulation_plus_2<YZ_tri> YZ_tri_plus;
is_nef = projected_vertex_cycle_to_nef_3<XY_tri_plus,Nef_3> ( is_nef = projected_vertex_cycle_to_nef_3<XY_tri_plus,Nef_3> (
snc, v_first, v_last, ostr); snc, v_first, v_last, ostr);
} }
}
// if input data is corrupted, try again if ( !is_nef )
if ( !is_nef && direc != 'x' && normal.x() != 0 ) { // if conversion is unsuccessful so far, try another projection
{ is_nef = projected_vertex_cycle_to_nef_3<YZ_tri_plus,Nef_3> ( if ( !is_nef && direc != 'x' )
{ ostr << " Now, direction of projection is 'x'.";
is_nef = projected_vertex_cycle_to_nef_3<YZ_tri_plus,Nef_3> (
snc, v_first, v_last, ostr); snc, v_first, v_last, ostr);
} }
if ( !is_nef && direc != 'y' && normal.y() != 0 ) if ( !is_nef && direc != 'y' )
{ is_nef = projected_vertex_cycle_to_nef_3<XZ_tri_plus,Nef_3> ( { ostr << " Now, direction of projection is 'y'.";
is_nef = projected_vertex_cycle_to_nef_3<XZ_tri_plus,Nef_3> (
snc, v_first, v_last, ostr); snc, v_first, v_last, ostr);
} }
if ( !is_nef && direc != 'z' && normal.z() != 0 ) if ( !is_nef && direc != 'z' )
{ is_nef = projected_vertex_cycle_to_nef_3<XY_tri_plus,Nef_3> ( { ostr << " Now, direction of projection is 'z'.";
is_nef = projected_vertex_cycle_to_nef_3<XY_tri_plus,Nef_3> (
snc, v_first, v_last, ostr); snc, v_first, v_last, ostr);
} }
} }
// convertion impossible? // no successful conversion?
if ( !is_nef && verb ) if ( !is_nef && verb )
{ // TO DO + Fehlermeldungsstring { std::cerr << "\nConversion from vertex cycle to Nef_polyhedron_3"
std::cerr << "\n" << __FILE__ << ", line " << __LINE__ << " was not successful. Error history:"
<< ": error history:"
<< ostr.str().c_str() << ostr.str().c_str()
<< " -> Empty Nef_polyhedron_3 constructed." << std::endl; << " Finally, empty Nef_polyhedron_3 was constructed." << std::endl;
} }
return is_nef; return is_nef;

View File

@ -19,7 +19,6 @@
#include <CGAL/Nef_polyhedron_3.h> #include <CGAL/Nef_polyhedron_3.h>
// --- begin preliminary number type converter ----------------- // --- begin preliminary number type converter -----------------
// --- (to be excluded some day?) ------------------------------
#ifndef NUMBER_TYPE_CONVERTER_NEF_3_H #ifndef NUMBER_TYPE_CONVERTER_NEF_3_H
#define NUMBER_TYPE_CONVERTER_NEF_3_H #define NUMBER_TYPE_CONVERTER_NEF_3_H
@ -164,7 +163,7 @@ OFF_to_nef_3 (std::istream &i_st, Nef_3 &nef_union, bool verb=false)
Scan_point_set V_f_scan; Scan_point_set V_f_scan;
V_f_scan.reserve(NOI); V_f_scan.reserve(NOI);
Point_set V_f; Point_set V_f;
V.reserve(NOI); V_f.reserve(NOI);
Scan_index_it ind_it = f_it->begin(); Scan_index_it ind_it = f_it->begin();
for (jdx=0; ind_it != f_it->end(); ++ind_it, ++jdx) for (jdx=0; ind_it != f_it->end(); ++ind_it, ++jdx)
@ -177,6 +176,7 @@ OFF_to_nef_3 (std::istream &i_st, Nef_3 &nef_union, bool verb=false)
NOI = jdx; NOI = jdx;
bool is_nef = false; bool is_nef = false;
CGAL_assertion_msg( V_f.size() >= 1 || !verb, "empty vertex cycle");
if ( V_f.size() >= 1 ) if ( V_f.size() >= 1 )
{ // compute Newell vector <double> { // compute Newell vector <double>
Scan_vector normal; Scan_vector normal;
@ -189,20 +189,12 @@ OFF_to_nef_3 (std::istream &i_st, Nef_3 &nef_union, bool verb=false)
is_nef = true; is_nef = true;
} }
} }
else
{ if (verb)
{ std::cerr << "\n" << __FILE__ << ", line " << __LINE__
<< ": error: -> Empty vertex cycle."
<< std::endl;
}
}
if ( !is_nef ) if ( !is_nef )
{ ++discarded_facets; { ++discarded_facets;
if (verb) if (verb)
{ std::cerr << "(Within context:)" { std::cerr << "Hence, discard input facet " << (idx+1)
<< " Discard input facet " << (idx+1) << " (enumerated beginning with 1)."
<< " (numbered from 1)."
<< " Check semantics!\n" << std::endl; << " Check semantics!\n" << std::endl;
} }
} }
@ -210,7 +202,7 @@ OFF_to_nef_3 (std::istream &i_st, Nef_3 &nef_union, bool verb=false)
#ifdef CGAL_NEF_OFF_TO_NEF_TIMER #ifdef CGAL_NEF_OFF_TO_NEF_TIMER
t_convert.stop(); t_convert.stop();
std::cout << "time conversion: " << t_convert.time()<< std::endl; std::cout << "time (conversion): " << t_convert.time()<< std::endl;
#endif #endif
// union of queue entries // union of queue entries
@ -230,7 +222,7 @@ OFF_to_nef_3 (std::istream &i_st, Nef_3 &nef_union, bool verb=false)
#ifdef CGAL_NEF_OFF_TO_NEF_TIMER #ifdef CGAL_NEF_OFF_TO_NEF_TIMER
t_union.stop(); t_union.stop();
std::cout << "time union: " << t_union.time() << "\n" << std::endl; std::cout << "time (union): " << t_union.time() << "\n" << std::endl;
#endif #endif
// return values // return values