34 #ifndef __INCLUDE_MIST_FACET__
35 #define __INCLUDE_MIST_FACET__
39 #ifndef __INCLUDE_MIST_CONF_H__
43 #ifndef __INCLUDE_MIST_TYPE_TRAIT_H__
47 #ifndef __INCLUDE_MIST_MATRIX__
51 #ifndef __INCLUDE_MIST_VECTOR__
66 #define __SHOW_FACET_DEBUG_INFORMATION__ 0
106 template <
class TT >
111 template <
class TT >
137 template <
class T >
inline std::ostream &operator <<( std::ostream &out, const facet< T > &f )
139 out <<
"(" << f.normal <<
") - ";
140 out <<
"(" << f.p1 <<
"), ";
141 out <<
"(" << f.p2 <<
"), ";
142 out <<
"(" << f.p3 <<
")";
155 typedef std::vector< facet< T > > base;
174 template <
class TT >
179 template <
class TT >
184 base::operator =( f );
203 template <
class T,
class T1,
class T2 >
206 if( facets.empty( ) )
216 typedef std::pair< size_type, vector_type > value_type;
217 typedef std::multimap< difference_type, value_type > map_type;
218 typedef std::pair< difference_type, value_type > key_type;
222 faces.reserve( facets.size( ) );
224 double SCALE = 0.1 / eps;
227 for( size_type i = 0 ; i < facets.size( ) ; i++ )
230 size_type indx[ 3 ] = { 0, 0, 0 };
231 vector_type v[ 3 ] = { f.
p1, f.
p2, f.
p3 };
233 for( size_type j = 0 ; j < 3 ; j++ )
235 const vector_type &vec = v[ j ];
236 difference_type k1 =
static_cast< difference_type
> ( vec.x * SCALE );
237 difference_type k2 =
static_cast< difference_type
> ( vec.y * SCALE );
238 difference_type k3 =
static_cast< difference_type
> ( vec.z * SCALE );
239 difference_type key = k1 ^ k2 ^ k3;
241 typename map_type::iterator ite = table.find( key );
242 if( ite == table.end( ) )
244 indx[ j ] = table.size( );
245 table.insert( key_type( key, value_type( indx[ j ], vec ) ) );
249 typename map_type::iterator upper = table.upper_bound( key );
250 for( ; ite != upper ; ++ite )
252 if( ( ite->second.second - vec ).length( ) < eps )
260 indx[ j ] = table.size( );
261 table.insert( key_type( key, value_type( indx[ j ], vec ) ) );
265 indx[ j ] = ite->second.first;
271 if( f.
normal.
inner( ( v[ 1 ] - v[ 0 ] ).outer( v[ 2 ] - v[ 0 ] ) ) < 0 )
273 size_type tmp = indx[ 1 ];
274 indx[ 1 ] = indx[ 2 ];
278 if( indx[ 0 ] != indx[ 1 ] && indx[ 1 ] != indx[ 2 ] && indx[ 2 ] != indx[ 0 ] )
280 faces.push_back( ivector_type( indx[ 0 ], indx[ 1 ], indx[ 2 ] ) );
285 vertices.resize( table.size( ) );
286 for(
typename map_type::iterator ite = table.begin( ) ; ite != table.end( ) ; ++ite )
288 vertices[ ite->second.first ] = ite->second.second;
300 typedef size_t size_type;
301 typedef ptrdiff_t difference_type;
303 difference_type eid1;
304 difference_type eid2;
305 difference_type eid3;
308 __face__( ) : eid1( 0 ), eid2( 0 ), eid3( 0 ), flag( true ){ }
311 template <
class VERTEX >
314 typedef size_t size_type;
315 typedef ptrdiff_t difference_type;
316 typedef VERTEX vector_type;
320 difference_type fid1;
321 difference_type fid2;
325 __edge__( ) : fid1( 0 ), fid2( 0 ){ }
326 __edge__( difference_type vv1, difference_type vv2 ) : v1( vv1 ), v2( vv2 ), fid1( 0 ), fid2( 0 ), err( 0.0 ) { }
327 __edge__( difference_type vv1, difference_type vv2, difference_type id1 ) : v1( vv1 ), v2( vv2 ), fid1( id1 ), fid2( 0 ), err( 0.0 ) { }
329 bool operator <(
const __edge__ &v )
const
331 return( err < v.err );
335 template <
class EDGE >
338 typedef EDGE edge_type;
339 typedef typename edge_type::difference_type difference_type;
341 const std::vector< edge_type > &edges;
343 __edge_comp__(
const std::vector< edge_type > &edge_list ) : edges( edge_list )
347 bool operator ()( difference_type v1, difference_type v2 )
const
349 return( edges[ v1 ].err < edges[ v2 ].err );
353 template<
class T1,
class T2 >
354 inline T1 create_key(
const T1 v1,
const T1 v2,
const T2 stride )
358 return( v1 * stride + v2 );
362 return( v2 * stride + v1 );
368 inline T find_edge(
const T V1,
const T V2,
const T V3,
const T v1,
const T v2 )
407 template <
class T1,
class T2,
class T3 >
408 inline bool convert_to_vertex_face_list(
const std::vector< vector3< T1 > > &vertices,
const std::vector< vector3< T2 > > &faces, std::vector< __face__ > &face_lists, std::vector< __edge__< T3 > > &edge_lists )
410 if( vertices.empty( ) || faces.empty( ) )
415 typedef typename vector3< T1 >::size_type size_type;
416 typedef typename vector3< T1 >::difference_type difference_type;
417 typedef vector3< T1 > vector_type;
418 typedef vector3< T2 > ivector_type;
419 typedef __face__ face_type;
420 typedef __edge__< T3 > edge_type;
422 typedef std::map< difference_type, difference_type > map_type;
423 typedef typename map_type::iterator iterator;
428 face_lists.reserve( faces.size( ) );
431 face_lists.push_back( face_type( ) );
432 edge_lists.push_back( edge_type( ) );
435 for( size_type i = 1 ; i <= faces.size( ) ; i++ )
437 const ivector_type &f = faces[ i - 1 ];
439 difference_type key12 = create_key( f.x, f.y, vertices.size( ) );
440 difference_type key23 = create_key( f.y, f.z, vertices.size( ) );
441 difference_type key31 = create_key( f.z, f.x, vertices.size( ) );
444 iterator ite = table.find( key12 );
445 if( ite == table.end( ) )
448 table[ key12 ] = edge_lists.size( );
453 edge_lists.push_back( edge_type( f.x, f.y, i ) );
457 edge_lists.push_back( edge_type( f.y, f.x, i ) );
461 std::cerr <<
"Incorrect edge is found." << std::endl;
464 else if( edge_lists[ ite->second ].fid2 == 0 )
466 edge_lists[ ite->second ].fid2 = i;
470 std::cerr <<
"Edge may be shared among more than three faces." << std::endl;
474 ite = table.find( key23 );
475 if( ite == table.end( ) )
478 table[ key23 ] = edge_lists.size( );
483 edge_lists.push_back( edge_type( f.y, f.z, i ) );
487 edge_lists.push_back( edge_type( f.z, f.y, i ) );
491 std::cerr <<
"Incorrect edge is found." << std::endl;
494 else if( edge_lists[ ite->second ].fid2 == 0 )
496 edge_lists[ ite->second ].fid2 = i;
500 std::cerr <<
"Edge may be shared among more than three faces." << std::endl;
504 ite = table.find( key31 );
505 if( ite == table.end( ) )
508 table[ key31 ] = edge_lists.size( );
513 edge_lists.push_back( edge_type( f.z, f.x, i ) );
517 edge_lists.push_back( edge_type( f.x, f.z, i ) );
521 std::cerr <<
"Incorrect edge is found." << std::endl;
524 else if( edge_lists[ ite->second ].fid2 == 0 )
526 edge_lists[ ite->second ].fid2 = i;
530 std::cerr <<
"Edge may be shared among more than three faces." << std::endl;
535 for( size_type i = 1 ; i <= faces.size( ) ; i++ )
537 const ivector_type &F = faces[ i - 1 ];
540 difference_type key12 = create_key( F.x, F.y, vertices.size( ) );
541 difference_type key23 = create_key( F.y, F.z, vertices.size( ) );
542 difference_type key31 = create_key( F.z, F.x, vertices.size( ) );
545 iterator ite = table.find( key12 );
546 if( ite == table.end( ) )
548 std::cerr <<
"Can't find edge 1 from edge table." << std::endl;
552 edge_type &e = edge_lists[ ite->second ];
553 f.eid1 = F.x == e.v1 ? ite->second : -ite->second;
557 ite = table.find( key23 );
558 if( ite == table.end( ) )
560 std::cerr <<
"Can't find edge 2 from edge table." << std::endl;
564 edge_type &e = edge_lists[ ite->second ];
565 f.eid2 = F.y == e.v1 ? ite->second : -ite->second;
569 ite = table.find( key31 );
570 if( ite == table.end( ) )
572 std::cerr <<
"Can't find edge 3 from edge table." << std::endl;
576 edge_type &e = edge_lists[ ite->second ];
577 f.eid3 = F.z == e.v1 ? ite->second : -ite->second;
580 face_lists.push_back( f );
587 inline T ABS( T val )
589 return( val < 0 ? -val : val );
593 void contract_edges( std::vector< __edge__< T > > &edges, std::vector< __face__ > &faces, __face__::difference_type eid0, __face__::difference_type eid1, __face__::difference_type EID, __face__::difference_type FID1, __face__::difference_type FID2 )
595 typedef __edge__< T > edge_type;
596 typedef __face__ face_type;
597 typedef __face__::difference_type difference_type;
599 difference_type fid2 = 0;
600 const edge_type &E = edges[ EID ];
601 edge_type &e0 = edges[ eid0 ];
602 edge_type &e1 = edges[ eid1 ];
604 if( e0.fid1 == FID1 )
606 if( e1.fid1 == FID2 )
611 else if( e1.fid2 == FID2 )
618 std::cerr <<
"Face-edge correspondence is incorrect!!" << std::endl;
622 else if( e0.fid2 == FID1 )
624 if( e1.fid1 == FID2 )
629 else if( e1.fid2 == FID2 )
636 std::cerr <<
"Face-edge correspondence is incorrect!!" << std::endl;
641 std::cerr <<
"Unknown error occured!!" << std::endl;
646 face_type &f2 = faces[ fid2 ];
648 if( ABS( f2.eid1 ) == eid1 )
650 if( e0.v1 == e1.v1 || e0.v2 == e1.v2 )
652 f2.eid1 = f2.eid1 < 0 ? -eid0 : eid0;
654 else if( e0.v1 == e1.v2 || e0.v2 == e1.v1 )
656 f2.eid1 = f2.eid1 < 0 ? eid0 : -eid0;
660 std::cerr <<
"Vertex-edge map is incorrect!! " <<
"(" << e1.v1 <<
", " << e1.v2 <<
") <-> (" << E.v1 <<
", " << E.v2 <<
")" << std::endl;
663 else if( ABS( f2.eid2 ) == eid1 )
665 if( e0.v1 == e1.v1 || e0.v2 == e1.v2 )
667 f2.eid2 = f2.eid2 < 0 ? -eid0 : eid0;
669 else if( e0.v1 == e1.v2 || e0.v2 == e1.v1 )
671 f2.eid2 = f2.eid2 < 0 ? eid0 : -eid0;
675 std::cerr <<
"Vertex-edge map is incorrect!! " <<
"(" << e1.v1 <<
", " << e1.v2 <<
") <-> (" << E.v1 <<
", " << E.v2 <<
")" << std::endl;
678 else if( ABS( f2.eid3 ) == eid1 )
680 if( e0.v1 == e1.v1 || e0.v2 == e1.v2 )
682 f2.eid3 = f2.eid3 < 0 ? -eid0 : eid0;
684 else if( e0.v1 == e1.v2 || e0.v2 == e1.v1 )
686 f2.eid3 = f2.eid3 < 0 ? eid0 : -eid0;
690 std::cerr <<
"Vertex-edge map is incorrect!! " <<
"(" << e1.v1 <<
", " << e1.v2 <<
") <-> (" << E.v1 <<
", " << E.v2 <<
")" << std::endl;
695 std::cerr <<
"Face-edge correspondence is incorrect!!" << std::endl;
700 template <
class T,
class Allocator >
701 inline bool inv3x3( matrix< T, Allocator > &a,
const double eps = 1.0e-6 )
703 typedef typename matrix< T, Allocator >::value_type value_type;
705 double a11 = a( 0, 0 ), a12 = a( 0, 1 ), a13 = a( 0, 2 );
706 double a21 = a( 1, 0 ), a22 = a( 1, 1 ), a23 = a( 1, 2 );
707 double a31 = a( 2, 0 ), a32 = a( 2, 1 ), a33 = a( 2, 2 );
710 double _22x33_23x32_ = a22 * a33 - a23 * a32;
711 double _21x32_22x31_ = a21 * a32 - a22 * a31;
712 double _23x31_21x33_ = a23 * a31 - a21 * a33;
715 double detA = a11 * _22x33_23x32_ + a13 * _21x32_22x31_ + a12 * _23x31_21x33_;
718 if( std::abs( detA ) > eps )
721 double A11 = _22x33_23x32_;
722 double A12 = a13 * a32 - a12 * a33;
723 double A13 = a12 * a23 - a13 * a22;
724 double A21 = _23x31_21x33_;
725 double A22 = a11 * a33 - a13 * a31;
726 double A23 = a13 * a21 - a11 * a23;
727 double A31 = _21x32_22x31_;
728 double A32 = a12 * a31 - a11 * a32;
729 double A33 = a11 * a22 - a12 * a21;
731 double _1_detA = 1.0 / detA;
732 a( 0, 0 ) =
static_cast< value_type
>( A11 * _1_detA );
733 a( 0, 1 ) =
static_cast< value_type
>( A12 * _1_detA );
734 a( 0, 2 ) =
static_cast< value_type
>( A13 * _1_detA );
735 a( 1, 0 ) =
static_cast< value_type
>( A21 * _1_detA );
736 a( 1, 1 ) =
static_cast< value_type
>( A22 * _1_detA );
737 a( 1, 2 ) =
static_cast< value_type
>( A23 * _1_detA );
738 a( 2, 0 ) =
static_cast< value_type
>( A31 * _1_detA );
739 a( 2, 1 ) =
static_cast< value_type
>( A32 * _1_detA );
740 a( 2, 2 ) =
static_cast< value_type
>( A33 * _1_detA );
750 template <
class Matrix,
class Vector >
751 inline double compute_vertex_error(
const Matrix &Q,
const Vector &v )
753 double e0 = Q( 0, 0 ) * v.x + Q( 0, 1 ) * v.y + Q( 0, 2 ) * v.z + Q( 0, 3 );
754 double e1 = Q( 1, 0 ) * v.x + Q( 1, 1 ) * v.y + Q( 1, 2 ) * v.z + Q( 1, 3 );
755 double e2 = Q( 2, 0 ) * v.x + Q( 2, 1 ) * v.y + Q( 2, 2 ) * v.z + Q( 2, 3 );
756 double e3 = Q( 3, 0 ) * v.x + Q( 3, 1 ) * v.y + Q( 3, 2 ) * v.z + Q( 3, 3 );
757 return( e0 * v.x + e1 * v.y + e2 * v.z + e3 );
760 template <
class T1,
class T2,
class Matrix >
761 inline void update_edge(
const std::vector< vector3< T1 > > &vertices,
const std::vector< Matrix > &Q, __edge__< T2 > &edge,
bool use_optimal_vertex_placement )
763 typedef Matrix matrix_type;
764 typedef vector3< T1 > vector_type;
767 matrix_type QQ = Q[ edge.v1 ] + Q[ edge.v2 ];
768 matrix_type QQQ = matrix_type::_33( QQ( 0, 0 ), QQ( 0, 1 ), QQ( 0, 2 ),
769 QQ( 1, 0 ), QQ( 1, 1 ), QQ( 1, 2 ),
770 QQ( 2, 0 ), QQ( 2, 1 ), QQ( 2, 2 ) );
773 if( use_optimal_vertex_placement && inv3x3( QQQ ) )
775 matrix_type V = QQQ * matrix_type::_31( QQ( 0, 3 ), QQ( 1, 3 ), QQ( 2, 3 ) );
776 edge.v = vector_type( -V[ 0 ], -V[ 1 ], -V[ 2 ] );
777 edge.err = compute_vertex_error( QQ, edge.v );
781 vector_type vs = vertices[ edge.v1 ];
782 vector_type ve = vertices[ edge.v2 ];
785 for(
double s = 0.0 ; s <= 1.0 ; s += 0.0625 )
787 vector_type v = vs + ( ve - vs ) * s;
788 double err = compute_vertex_error( QQ, v );
799 template <
class T1,
class T2 >
800 inline double compute_penalty(
const std::vector< vector3< T1 > > &vertices,
const std::vector< __edge__< T2 > > &edges,
const __face__ &f,
typename __edge__< T2 >::difference_type vid,
const typename __edge__< T2 >::vector_type &v )
802 typedef __face__ face_type;
803 typedef __edge__< T2 > edge_type;
804 typedef typename edge_type::vector_type vector_type;
805 typedef typename edge_type::difference_type difference_type;
807 const vector_type &v1 = v;
810 const edge_type &e1 = edges[ f.eid1 < 0 ? -f.eid1 : f.eid1 ];
811 const edge_type &e2 = edges[ f.eid2 < 0 ? -f.eid2 : f.eid2 ];
812 const edge_type &e3 = edges[ f.eid3 < 0 ? -f.eid3 : f.eid3 ];
813 difference_type vid1 = f.eid1 < 0 ? e1.v2 : e1.v1;
814 difference_type vid2 = f.eid2 < 0 ? e2.v2 : e2.v1;
815 difference_type vid3 = f.eid3 < 0 ? e3.v2 : e3.v1;
819 v2 = vertices[ vid2 ];
820 v3 = vertices[ vid3 ];
822 else if( vid2 == vid )
824 v2 = vertices[ vid1 ];
825 v3 = vertices[ vid3 ];
827 else if( vid3 == vid )
829 v2 = vertices[ vid1 ];
830 v3 = vertices[ vid2 ];
834 std::cout <<
"Can't find vertices from the specified face." << std::endl;
837 const double coeff = 6.9282032302755091741097853660235;
838 double w = 0.5 * ( ( v2 - v1 ).outer( v3 - v1 ) ).length( );
839 double l1 = ( v2 - v1 ).inner( v2 - v1 );
840 double l2 = ( v3 - v2 ).inner( v3 - v2 );
841 double l3 = ( v1 - v3 ).inner( v1 - v3 );
843 return( coeff * w / ( l1 + l2 + l3 ) );
846 template <
class T1,
class T2 >
847 inline bool is_collapsed_after_contraction(
const std::vector< vector3< T1 > > &vertices,
const std::vector< __edge__< T2 > > &edges,
const __face__ &f,
typename __edge__< T2 >::difference_type vid,
const typename __edge__< T2 >::vector_type &v )
849 typedef __face__ face_type;
850 typedef __edge__< T2 > edge_type;
851 typedef typename edge_type::vector_type vector_type;
852 typedef typename edge_type::difference_type difference_type;
854 const vector_type &v0 = vertices[ vid ];
855 const vector_type &v1 = v;
858 const edge_type &e1 = edges[ f.eid1 < 0 ? -f.eid1 : f.eid1 ];
859 const edge_type &e2 = edges[ f.eid2 < 0 ? -f.eid2 : f.eid2 ];
860 const edge_type &e3 = edges[ f.eid3 < 0 ? -f.eid3 : f.eid3 ];
861 difference_type vid1 = f.eid1 < 0 ? e1.v2 : e1.v1;
862 difference_type vid2 = f.eid2 < 0 ? e2.v2 : e2.v1;
863 difference_type vid3 = f.eid3 < 0 ? e3.v2 : e3.v1;
867 v2 = vertices[ vid2 ];
868 v3 = vertices[ vid3 ];
870 else if( vid2 == vid )
872 v2 = vertices[ vid1 ];
873 v3 = vertices[ vid3 ];
875 else if( vid3 == vid )
877 v2 = vertices[ vid1 ];
878 v3 = vertices[ vid2 ];
882 std::cout <<
"Can't find vertices from the specified face." << std::endl;
885 vector_type n1 = ( v2 - v0 ).outer( v3 - v0 );
886 vector_type n2 = ( v2 - v1 ).outer( v3 - v1 );
888 return( n1.inner( n2 ) < 0.0 );
891 template <
class MULTIMAP,
class T1,
class T2 >
892 inline void apply_penalties(
const MULTIMAP &vertex_edge_map,
const std::vector< vector3< T1 > > &vertices,
const std::vector< __face__ > &faces, std::vector< __edge__< T2 > > &edges,
typename __edge__< T2 >::difference_type EID,
double threshold_for_triangle_compactness )
894 typedef MULTIMAP vertex_edge_map_type;
895 typedef typename vertex_edge_map_type::const_iterator const_iterator;
897 typedef __face__ face_type;
898 typedef __edge__< T2 > edge_type;
899 typedef typename edge_type::vector_type vector_type;
900 typedef typename edge_type::difference_type difference_type;
902 edge_type &edge = edges[ EID ];
904 double penalty = 1.0e100;
906 std::set< difference_type > face_map1;
907 std::set< difference_type > face_map2;
910 const_iterator ite = vertex_edge_map.find( edge.v1 );
911 if( ite != vertex_edge_map.end( ) )
913 const_iterator upper = vertex_edge_map.upper_bound( edge.v1 );
914 for( ; ite != upper ; ++ite )
916 face_map1.insert( edges[ ite->second ].fid1 );
917 face_map1.insert( edges[ ite->second ].fid2 );
921 for(
typename std::set< difference_type >::iterator ite = face_map1.begin( ) ; ite != face_map1.end( ) ; ++ite )
925 double ppp = compute_penalty( vertices, edges, faces[ *ite ], edge.v1, edge.v );
935 std::set< difference_type > face_map;
936 const_iterator ite = vertex_edge_map.find( edge.v2 );
937 if( ite != vertex_edge_map.end( ) )
939 const_iterator upper = vertex_edge_map.upper_bound( edge.v2 );
940 for( ; ite != upper ; ++ite )
942 face_map2.insert( edges[ ite->second ].fid1 );
943 face_map2.insert( edges[ ite->second ].fid2 );
947 for(
typename std::set< difference_type >::iterator ite = face_map2.begin( ) ; ite != face_map2.end( ) ; ++ite )
951 double ppp = compute_penalty( vertices, edges, faces[ *ite ], edge.v2, edge.v );
960 if( penalty < threshold_for_triangle_compactness )
962 edge.err += 1.0 - penalty;
967 for(
typename std::set< difference_type >::iterator ite = face_map1.begin( ) ; ite != face_map1.end( ) ; ++ite )
969 if( *ite != 0 && face_map2.find( *ite ) == face_map2.end( ) )
971 if( is_collapsed_after_contraction( vertices, edges, faces[ *ite ], edge.v1, edge.v ) )
978 for(
typename std::set< difference_type >::iterator ite = face_map2.begin( ) ; ite != face_map2.end( ) ; ++ite )
980 if( *ite != 0 && face_map1.find( *ite ) == face_map1.end( ) )
982 if( is_collapsed_after_contraction( vertices, edges, faces[ *ite ], edge.v2, edge.v ) )
991 inline bool is_sharp_edge(
const __edge__< T > &edge )
993 return( edge.fid1 * edge.fid2 == 0 );
996 template <
class MULTIMAP,
class T >
997 inline size_t number_of_sharp_edges(
const MULTIMAP &vertex_edge_map,
const std::vector< __edge__< T > > &edges,
typename MULTIMAP::difference_type vid )
999 typedef MULTIMAP vertex_edge_map_type;
1000 typedef typename vertex_edge_map_type::const_iterator const_iterator;
1001 typedef typename vertex_edge_map_type::difference_type difference_type;
1003 difference_type count = 0;
1005 const_iterator ite = vertex_edge_map.find( vid );
1006 if( ite != vertex_edge_map.end( ) )
1008 const_iterator upper = vertex_edge_map.upper_bound( vid );
1009 for( ; ite != upper ; ++ite )
1011 if( is_sharp_edge( edges[ ite->second ] ) )
1021 template <
class T >
1022 inline void compute_edge_connections(
const std::vector< __edge__< T > > &edges, __face__::difference_type EID, __face__::difference_type eid,
1023 __face__::difference_type vs, __face__::difference_type vt, __face__::difference_type &vv,
1024 __face__::difference_type &eid1, __face__::difference_type &eid2 )
1026 typedef __edge__< T > edge_type;
1030 const edge_type &e = edges[ eid ];
1031 if( e.v1 == vs && eid1 == 0 )
1037 else if( e.v2 == vs && eid1 == 0 )
1043 else if( e.v1 == vt )
1049 else if( e.v2 == vt )
1057 std::cerr <<
"Incorrect edge pairs." << std::endl;
1062 template <
class T >
1063 inline bool compute_edge_connections(
const std::vector< __face__ > &faces,
const std::vector< __edge__< T > > &edges, __face__::difference_type EID,
1064 __face__::difference_type vs, __face__::difference_type vt, __face__::difference_type &vl, __face__::difference_type &vr, __face__::difference_type eid[ 4 ] )
1066 typedef __edge__< T > edge_type;
1067 typedef __face__ face_type;
1068 typedef __face__::difference_type difference_type;
1070 const edge_type &EDGE = edges[ EID ];
1072 if( is_sharp_edge( EDGE ) )
1078 const face_type &f1 = faces[ EDGE.fid1 ];
1079 const face_type &f2 = faces[ EDGE.fid2 ];
1081 eid[ 0 ] = eid[ 1 ] = eid[ 2 ] = eid[ 3 ] = 0;
1083 const edge_type &e11 = edges[ f1.eid1 < 0 ? -f1.eid1 : f1.eid1 ];
1084 const edge_type &e12 = edges[ f1.eid2 < 0 ? -f1.eid2 : f1.eid2 ];
1085 const edge_type &e13 = edges[ f1.eid3 < 0 ? -f1.eid3 : f1.eid3 ];
1086 const edge_type &e21 = edges[ f2.eid1 < 0 ? -f2.eid1 : f2.eid1 ];
1087 const edge_type &e22 = edges[ f2.eid2 < 0 ? -f2.eid2 : f2.eid2 ];
1088 const edge_type &e23 = edges[ f2.eid3 < 0 ? -f2.eid3 : f2.eid3 ];
1091 compute_edge_connections( edges, EID, f1.eid1 < 0 ? -f1.eid1 : f1.eid1, vs, vt, vl, eid[ 0 ], eid[ 1 ] );
1092 compute_edge_connections( edges, EID, f1.eid2 < 0 ? -f1.eid2 : f1.eid2, vs, vt, vl, eid[ 0 ], eid[ 1 ] );
1093 compute_edge_connections( edges, EID, f1.eid3 < 0 ? -f1.eid3 : f1.eid3, vs, vt, vl, eid[ 0 ], eid[ 1 ] );
1096 compute_edge_connections( edges, EID, f2.eid1 < 0 ? -f2.eid1 : f2.eid1, vs, vt, vr, eid[ 3 ], eid[ 2 ] );
1097 compute_edge_connections( edges, EID, f2.eid2 < 0 ? -f2.eid2 : f2.eid2, vs, vt, vr, eid[ 3 ], eid[ 2 ] );
1098 compute_edge_connections( edges, EID, f2.eid3 < 0 ? -f2.eid3 : f2.eid3, vs, vt, vr, eid[ 3 ], eid[ 2 ] );
1100 return( eid[ 0 ] * eid[ 1 ] * eid[ 2 ] * eid[ 3 ] != 0 );
1103 template <
class MULTIMAP >
1104 inline void remove_edge_from_map( MULTIMAP &vertex_edge_map,
typename MULTIMAP::key_type key,
typename MULTIMAP::mapped_type val )
1106 typename MULTIMAP::iterator ite = vertex_edge_map.find( key );
1107 if( ite != vertex_edge_map.end( ) )
1109 typename MULTIMAP::iterator upper = vertex_edge_map.upper_bound( key );
1110 for( ; ite != upper ; )
1112 if( ite->second == val )
1115 ite = vertex_edge_map.erase( ite );
1125 template <
class SET >
1126 inline void remove_edge_from_set( SET &edge_set,
typename SET::value_type EID )
1128 typename SET::iterator ite = edge_set.find( EID );
1129 if( ite != edge_set.end( ) )
1131 edge_set.erase( ite );
1135 template <
class MULTIMAP,
class T >
1136 inline bool check_topology_change(
const MULTIMAP &vertex_edge_map,
const std::vector< __face__ > &faces,
const std::vector< __edge__< T > > &edges, __face__::difference_type EID )
1138 typedef MULTIMAP vertex_edge_map_type;
1139 typedef typename vertex_edge_map_type::const_iterator const_iterator;
1141 typedef __edge__< T > edge_type;
1142 typedef __face__ face_type;
1143 typedef __face__::difference_type difference_type;
1145 const edge_type &EDGE = edges[ EID ];
1147 if( is_sharp_edge( EDGE ) )
1154 difference_type vs = EDGE.v1;
1155 difference_type vt = EDGE.v2;
1156 difference_type vl, vr;
1157 difference_type eid[ 4 ];
1158 if( !__mc__::compute_edge_connections( faces, edges, EID, vs, vt, vl, vr, eid ) )
1169 if( is_sharp_edge( edges[ eid[ 0 ] ] ) && is_sharp_edge( edges[ eid[ 1 ] ] ) )
1173 else if( is_sharp_edge( edges[ eid[ 3 ] ] ) && is_sharp_edge( edges[ eid[ 2 ] ] ) )
1178 difference_type nvs = number_of_sharp_edges( vertex_edge_map, edges, vs );
1179 difference_type nvt = number_of_sharp_edges( vertex_edge_map, edges, vt );
1181 if( nvs >= 1 && nvt >= 1 )
1186 std::set< difference_type > vertex_list;
1189 const_iterator ite = vertex_edge_map.find( EDGE.v1 );
1190 if( ite != vertex_edge_map.end( ) )
1192 const_iterator upper = vertex_edge_map.upper_bound( EDGE.v1 );
1193 for( ; ite != upper ; ++ite )
1195 if( ite->second != EID )
1197 const edge_type &e = edges[ ite->second ];
1198 if( e.fid1 != EDGE.fid1 && e.fid2 != EDGE.fid2 && e.fid1 != EDGE.fid2 && e.fid2 != EDGE.fid1 )
1200 if( e.v1 != EDGE.v1 )
1202 vertex_list.insert( e.v1 );
1206 vertex_list.insert( e.v2 );
1215 const_iterator ite = vertex_edge_map.find( EDGE.v2 );
1216 if( ite != vertex_edge_map.end( ) )
1218 const_iterator upper = vertex_edge_map.upper_bound( EDGE.v2 );
1219 for( ; ite != upper ; ++ite )
1221 if( ite->second != EID )
1223 const edge_type &e = edges[ ite->second ];
1224 if( e.fid1 != EDGE.fid1 && e.fid2 != EDGE.fid2 && e.fid1 != EDGE.fid2 && e.fid2 != EDGE.fid1 )
1226 if( e.v1 != EDGE.v2 )
1228 if( vertex_list.find( e.v1 ) != vertex_list.end( ) )
1236 if( vertex_list.find( e.v2 ) != vertex_list.end( ) )
1268 template <
class T >
1269 inline bool surface_simplification(
facet_list< T > &facets,
size_t number_of_facets,
bool use_optimal_vertex_placement =
true,
double threshold_for_triangle_compactness = 0.0,
const double eps = 1.0e-3 )
1272 typedef typename facet_type::size_type size_type;
1273 typedef typename facet_type::difference_type difference_type;
1274 typedef typename facet_type::vector_type vector_type;
1276 typedef __mc__::__edge__< vector_type > edge_type;
1277 typedef __mc__::__face__ face_type;
1279 typedef std::vector< edge_type > edge_list_type;
1282 std::vector< vector_type > vertices;
1283 std::vector< ivector_type > face_ids;
1284 std::vector< face_type > faces;
1285 edge_list_type edges;
1304 std::vector< matrix_type > Q( vertices.size( ) );
1305 for( size_type i = 0 ; i < Q.size( ) ; i++ )
1307 Q[ i ].resize( 4, 4 );
1311 for( size_type i = 1 ; i < faces.size( ) ; i++ )
1313 const face_type &f = faces[ i ];
1314 const difference_type v1 = f.eid1 < 0 ? edges[ -f.eid1 ].v2 : edges[ f.eid1 ].v1;
1315 const difference_type v2 = f.eid2 < 0 ? edges[ -f.eid2 ].v2 : edges[ f.eid2 ].v1;
1316 const difference_type v3 = f.eid3 < 0 ? edges[ -f.eid3 ].v2 : edges[ f.eid3 ].v1;
1317 const vector_type &p1 = vertices[ v1 ];
1318 const vector_type &p2 = vertices[ v2 ];
1319 const vector_type &p3 = vertices[ v3 ];
1320 vector_type n = ( ( p2 - p1 ).outer( p3 - p1 ) ).unit( );
1326 vector_type p0 = ( p1 + p2 + p3 ) / 3.0;
1327 vector_type d12 = ( p2 - p1 ).unit( );
1328 vector_type d23 = ( p3 - p2 ).unit( );
1329 vector_type d31 = ( p1 - p3 ).unit( );
1330 vector_type p12 = p1 + d12 * ( p0 - p1 ).inner( d12 );
1331 vector_type p23 = p2 + d23 * ( p0 - p2 ).inner( d23 );
1332 vector_type p31 = p3 + d31 * ( p0 - p3 ).inner( d31 );
1335 double area1 = ( ( p0 - p1 ).outer( p12 - p1 ) ).length( ) * 0.5;
1336 double area2 = ( ( p0 - p1 ).outer( p31 - p1 ) ).length( ) * 0.5;
1337 double d = -( a * p1.x + b * p1.y + c * p1.z );
1338 Q[ v1 ] += matrix_type::_44( a * a, a * b, a * c, a * d,
1339 a * b, b * b, b * c, b * d,
1340 a * c, b * c, c * c, c * d,
1341 a * d, b * d, c * d, d * d ) * ( area1 + area2 );
1345 double area1 = ( ( p0 - p2 ).outer( p12 - p1 ) ).length( ) * 0.5;
1346 double area2 = ( ( p0 - p2 ).outer( p23 - p1 ) ).length( ) * 0.5;
1347 double d = -( a * p2.x + b * p2.y + c * p2.z );
1348 Q[ v2 ] += matrix_type::_44( a * a, a * b, a * c, a * d,
1349 a * b, b * b, b * c, b * d,
1350 a * c, b * c, c * c, c * d,
1351 a * d, b * d, c * d, d * d ) * ( area1 + area2 );
1355 double area1 = ( ( p0 - p3 ).outer( p23 - p1 ) ).length( ) * 0.5;
1356 double area2 = ( ( p0 - p3 ).outer( p31 - p1 ) ).length( ) * 0.5;
1357 double d = -( a * p3.x + b * p3.y + c * p3.z );
1358 Q[ v3 ] += matrix_type::_44( a * a, a * b, a * c, a * d,
1359 a * b, b * b, b * c, b * d,
1360 a * c, b * c, c * c, c * d,
1361 a * d, b * d, c * d, d * d ) * ( area1 + area2 );
1367 typedef __mc__::__edge_comp__< edge_type > edge_compare_type;
1368 typedef std::set< difference_type, edge_compare_type > edge_map_type;
1369 typedef std::multimap< size_type, difference_type > vertex_edge_map_type;
1370 typedef std::pair< size_type, difference_type > vertex_edge_map_pair_type;
1372 vertex_edge_map_type vertex_edge_map;
1373 edge_compare_type ecomp( edges );
1374 edge_map_type edge_map( ecomp );
1375 for( size_type i = 1 ; i < edges.size( ) ; i++ )
1377 edge_type &e = edges[ i ];
1380 if( !__mc__::is_sharp_edge( edges[ i ] ) )
1383 __mc__::update_edge( vertices, Q, edges[ i ], use_optimal_vertex_placement );
1384 edge_map.insert( i );
1387 vertex_edge_map.insert( vertex_edge_map_pair_type( e.v1, i ) );
1388 vertex_edge_map.insert( vertex_edge_map_pair_type( e.v2, i ) );
1391 size_t num_facets = faces.size( ) - 1;
1394 for( ; num_facets - 2 >= number_of_facets && !edge_map.empty( ) ; num_facets -= 2 )
1396 typename edge_map_type::iterator mite = edge_map.end( );
1398 for(
typename edge_map_type::iterator ite = edge_map.begin( ) ; ite != edge_map.end( ) ; )
1400 const edge_type &e = edges[ *ite ];
1402 if( __mc__::is_sharp_edge( e ) )
1404 ite = edge_map.erase( ite );
1406 else if( !__mc__::check_topology_change( vertex_edge_map, faces, edges, *ite ) )
1418 if( mite == edge_map.end( ) )
1424 difference_type EID = *mite < 0 ? -( *mite ) : *mite;
1425 edge_type &EDGE = edges[ EID ];
1427 #if defined( __SHOW_FACET_DEBUG_INFORMATION__ ) && __SHOW_FACET_DEBUG_INFORMATION__ >= 1
1428 std::cout <<
"Contraction [" << num_facets <<
"] : #" << EID <<
" <" << EDGE.v2 <<
" -> " << EDGE.v1 <<
">" << std::endl;
1432 edge_map.erase( mite );
1435 difference_type vs = EDGE.v1;
1436 difference_type vt = EDGE.v2;
1437 difference_type vl, vr;
1438 difference_type eid[ 4 ];
1439 if( !__mc__::compute_edge_connections( faces, edges, EID, vs, vt, vl, vr, eid ) )
1441 std::cerr <<
"Unknown error occured!!" << std::endl;
1446 face_type &f1 = faces[ EDGE.fid1 ];
1447 face_type &f2 = faces[ EDGE.fid2 ];
1452 vertices[ EDGE.v1 ] = EDGE.v;
1453 vertices[ EDGE.v2 ] = EDGE.v;
1456 __mc__::contract_edges( edges, faces, eid[ 0 ], eid[ 1 ], EID, EDGE.fid1, EDGE.fid1 );
1457 __mc__::contract_edges( edges, faces, eid[ 3 ], eid[ 2 ], EID, EDGE.fid2, EDGE.fid2 );
1460 matrix_type QQQ = Q[ EDGE.v1 ] + Q[ EDGE.v2 ];
1464 std::set< difference_type > emap;
1466 typename vertex_edge_map_type::iterator ite = vertex_edge_map.find( vs );
1467 if( ite != vertex_edge_map.end( ) )
1469 typename vertex_edge_map_type::iterator upper = vertex_edge_map.upper_bound( vs );
1470 for( ; ite != upper ; )
1472 if( ite->second == EID )
1475 ite = vertex_edge_map.erase( ite );
1479 emap.insert( ite->second );
1486 typename vertex_edge_map_type::iterator ite = vertex_edge_map.find( vt );
1487 if( ite != vertex_edge_map.end( ) )
1489 std::vector< difference_type > combine_edge;
1490 typename vertex_edge_map_type::iterator upper = vertex_edge_map.upper_bound( vt );
1491 for( ; ite != upper ; )
1493 if( ite->second == EID )
1496 ite = vertex_edge_map.erase( ite );
1500 if( ite->second == eid[ 1 ] || ite->second == eid[ 2 ] )
1505 emap.insert( ite->second );
1506 combine_edge.push_back( ite->second );
1508 if( edges[ ite->second ].v1 == EDGE.v2 )
1510 edges[ ite->second ].v1 = EDGE.v1;
1512 else if( edges[ ite->second ].v2 == EDGE.v2 )
1514 edges[ ite->second ].v2 = EDGE.v1;
1518 std::cerr <<
"Incorrect edge is found!!" << std::endl;
1522 ite = vertex_edge_map.erase( ite );
1527 __mc__::remove_edge_from_map( vertex_edge_map, vl, eid[ 1 ] );
1528 __mc__::remove_edge_from_map( vertex_edge_map, vr, eid[ 2 ] );
1531 __mc__::remove_edge_from_set( edge_map, eid[ 1 ] );
1532 __mc__::remove_edge_from_set( edge_map, eid[ 2 ] );
1535 for( size_type ii = 0 ; ii < combine_edge.size( ) ; ii++ )
1537 vertex_edge_map.insert( vertex_edge_map_pair_type( vs, combine_edge[ ii ] ) );
1544 for(
typename std::set< difference_type >::iterator ite = emap.begin( ) ; ite != emap.end( ) ; ++ite )
1546 __mc__::remove_edge_from_set( edge_map, *ite );
1549 if( !__mc__::is_sharp_edge( edges[ *ite ] ) )
1552 __mc__::update_edge( vertices, Q, edges[ *ite ], use_optimal_vertex_placement );
1553 __mc__::apply_penalties( vertex_edge_map, vertices, faces, edges, *ite, threshold_for_triangle_compactness );
1554 edge_map.insert( *ite );
1558 #if defined( __SHOW_FACET_DEBUG_INFORMATION__ ) && __SHOW_FACET_DEBUG_INFORMATION__ >= 2
1559 for( vertex_edge_map_type::iterator ite = vertex_edge_map.begin( ) ; ite != vertex_edge_map.end( ) ; ++ite )
1561 edge_type &e = edges[ ite->second ];
1562 if( e.fid1 > 0 && !faces[ e.fid1 ].flag )
1564 std::cerr <<
"Edge " << ite->second <<
" connects to disappeared face." << std::endl;
1566 if( e.fid2 > 0 && !faces[ e.fid2 ].flag )
1568 std::cerr <<
"Edge " << ite->second <<
" connects to disappeared face." << std::endl;
1571 difference_type vs = e.v1;
1572 difference_type vt = e.v2;
1573 difference_type vl, vr;
1574 difference_type eid[ 4 ];
1575 if( !__mc__::compute_edge_connections( faces, edges, ite->second, vs, vt, vl, vr, eid ) )
1577 std::cerr <<
"Edge " << ite->second <<
" is invalid." << std::endl;
1582 std::cerr <<
"Edge " << ite->second <<
" share duplicated faces." << std::endl;
1587 for( size_type i = 1 ; i < faces.size( ) ; i++ )
1589 const face_type &f = faces[ i ];
1592 const difference_type eid1 = f.eid1 < 0 ? -f.eid1 : f.eid1;
1593 const difference_type eid2 = f.eid2 < 0 ? -f.eid2 : f.eid2;
1594 const difference_type eid3 = f.eid3 < 0 ? -f.eid3 : f.eid3;
1596 if( eid1 != 0 && edges[ eid1 ].fid1 != i && edges[ eid1 ].fid2 != i )
1598 std::cerr <<
"Face-edge relationships is broken." << std::endl;
1600 if( eid2 != 0 && edges[ eid2 ].fid1 != i && edges[ eid2 ].fid2 != i )
1602 std::cerr <<
"Face-edge relationships is broken." << std::endl;
1604 if( eid3 != 0 && edges[ eid3 ].fid1 != i && edges[ eid3 ].fid2 != i )
1606 std::cerr <<
"Face-edge relationships is broken." << std::endl;
1609 if( eid1 * eid2 * eid3 != 0 )
1611 const edge_type &e1 = edges[ eid1 ];
1612 const edge_type &e2 = edges[ eid2 ];
1613 const edge_type &e3 = edges[ eid3 ];
1614 difference_type v11 = f.eid1 < 0 ? e1.v2 : e1.v1;
1615 difference_type v12 = f.eid1 < 0 ? e1.v1 : e1.v2;
1616 difference_type v21 = f.eid2 < 0 ? e2.v2 : e2.v1;
1617 difference_type v22 = f.eid2 < 0 ? e2.v1 : e2.v2;
1618 difference_type v31 = f.eid3 < 0 ? e3.v2 : e3.v1;
1619 difference_type v32 = f.eid3 < 0 ? e3.v1 : e3.v2;
1621 if( v12 == v21 && v22 == v31 && v32 == v11 )
1626 std::cerr <<
"Face-edge connection is broken." << std::endl;
1627 std::cout <<
"(" << v11 <<
", " << v12 <<
") -> (" << v21 <<
", " << v22 <<
") -> (" << v31 <<
", " << v32 <<
")" << std::endl;
1634 #if defined( __SHOW_FACET_DEBUG_INFORMATION__ ) && __SHOW_FACET_DEBUG_INFORMATION__ == 3
1635 for( size_type i = 1 ; i < faces.size( ) ; i++ )
1637 const face_type &f = faces[ i ];
1640 std::cout << i <<
": ";
1643 std::cout << edges[ -f.eid1 ].v2 <<
", " << edges[ -f.eid1 ].v1 <<
"[" << -f.eid1 <<
"] -> ";
1647 std::cout << edges[ f.eid1 ].v1 <<
", " << edges[ f.eid1 ].v2 <<
"[" << f.eid1 <<
"] -> ";
1652 std::cout << edges[ -f.eid2 ].v2 <<
", " << edges[ -f.eid2 ].v1 <<
"[" << -f.eid2 <<
"] -> ";
1656 std::cout << edges[ f.eid2 ].v1 <<
", " << edges[ f.eid2 ].v2 <<
"[" << f.eid2 <<
"] -> ";
1661 std::cout << edges[ -f.eid3 ].v2 <<
", " << edges[ -f.eid3 ].v1 <<
"[" << -f.eid3 <<
"]" << std::endl;
1665 std::cout << edges[ f.eid3 ].v1 <<
", " << edges[ f.eid3 ].v2 <<
"[" << f.eid3 <<
"]" << std::endl;
1669 std::cout << std::endl;
1670 #elif defined( __SHOW_FACET_DEBUG_INFORMATION__ ) && __SHOW_FACET_DEBUG_INFORMATION__ >= 4
1671 for( size_type i = 1 ; i < faces.size( ) ; i++ )
1673 const face_type &f = faces[ i ];
1676 printf(
"%2d: ", i );
1678 difference_type eid1 = f.eid1 < 0 ? -f.eid1 : f.eid1;
1679 difference_type eid2 = f.eid2 < 0 ? -f.eid2 : f.eid2;
1680 difference_type eid3 = f.eid3 < 0 ? -f.eid3 : f.eid3;
1681 edge_type &e1 = edges[ eid1 ];
1682 edge_type &e2 = edges[ eid2 ];
1683 edge_type &e3 = edges[ eid3 ];
1687 printf(
"%2d, %2d [%2d] (%2d, %2d) -> ", e1.v2, e1.v1, eid1, e1.fid1, e1.fid2 );
1691 printf(
"%2d, %2d [%2d] (%2d, %2d) -> ", e1.v1, e1.v2, eid1, e1.fid1, e1.fid2 );
1696 printf(
"%2d, %2d [%2d] (%2d, %2d) -> ", e2.v2, e2.v1, eid2, e2.fid1, e2.fid2 );
1700 printf(
"%2d, %2d [%2d] (%2d, %2d) -> ", e2.v1, e2.v2, eid2, e2.fid1, e2.fid2 );
1705 printf(
"%2d, %2d [%2d] (%2d, %2d)\n", e3.v2, e3.v1, eid3, e3.fid1, e3.fid2 );
1709 printf(
"%2d, %2d [%2d] (%2d, %2d)\n", e3.v1, e3.v2, eid3, e3.fid1, e3.fid2 );
1713 std::cout << std::endl;
1719 for( size_type i = 1 ; i < faces.size( ) ; i++ )
1721 const face_type &f = faces[ i ];
1724 const difference_type v1 = f.eid1 < 0 ? edges[ -f.eid1 ].v2 : edges[ f.eid1 ].v1;
1725 const difference_type v2 = f.eid2 < 0 ? edges[ -f.eid2 ].v2 : edges[ f.eid2 ].v1;
1726 const difference_type v3 = f.eid3 < 0 ? edges[ -f.eid3 ].v2 : edges[ f.eid3 ].v1;
1727 facets.push_back( facet_type( vertices[ v1 ], vertices[ v2 ], vertices[ v3 ] ) );
1741 template <
class T >
1745 typedef typename facet_type::size_type size_type;
1746 typedef typename facet_type::difference_type difference_type;
1747 typedef typename facet_type::vector_type vector_type;
1749 typedef __mc__::__edge__< vector_type > edge_type;
1750 typedef __mc__::__face__ face_type;
1752 typedef std::vector< edge_type > edge_list_type;
1755 std::vector< vector_type > vertices;
1756 std::vector< ivector_type > faces;
1766 typedef std::multimap< size_type, difference_type > vertex_face_map_type;
1767 typedef typename std::multimap< size_type, difference_type >::iterator iterator;
1768 typedef std::pair< size_type, difference_type > vertex_face_map_pair_type;
1770 typedef std::multimap< size_type, size_type > group_map_type;
1771 typedef std::pair< size_type, size_type > group_map_type_pair_type;
1773 vertex_face_map_type vertex_face_map;
1774 group_map_type gmap;
1775 std::vector< size_type > groups( faces.size( ) );
1776 for( size_type i = 0 ; i < faces.size( ) ; i++ )
1778 ivector_type &f = faces[ i ];
1780 vertex_face_map.insert( vertex_face_map_pair_type( f.x, i ) );
1781 vertex_face_map.insert( vertex_face_map_pair_type( f.y, i ) );
1782 vertex_face_map.insert( vertex_face_map_pair_type( f.z, i ) );
1785 gmap.insert( group_map_type_pair_type( i, i ) );
1789 for( size_type i = 0 ; i < faces.size( ) ; i++ )
1791 ivector_type &f = faces[ i ];
1792 size_type &g1 = groups[ i ];
1795 iterator ite = vertex_face_map.find( f.x );
1796 if( ite != vertex_face_map.end( ) )
1798 iterator upper = vertex_face_map.upper_bound( f.x );
1799 for( ; ite != upper ; ++ite )
1801 if( ite->second != i )
1803 size_type &g2 = groups[ ite->second ];
1807 typename group_map_type::iterator lower = gmap.find( g2 );
1808 typename group_map_type::iterator upper = gmap.upper_bound( g2 );
1810 std::vector< size_type > gtmp;
1811 for(
typename group_map_type::iterator gite = lower ; gite != upper ; ++gite )
1813 gtmp.push_back( gite->second );
1816 gmap.erase( lower, upper );
1818 for( size_type i = 0 ; i < gtmp.size( ) ; i++ )
1820 groups[ gtmp[ i ] ] = g1;
1821 gmap.insert( group_map_type_pair_type( g1, gtmp[ i ] ) );
1826 typename group_map_type::iterator lower = gmap.find( g1 );
1827 typename group_map_type::iterator upper = gmap.upper_bound( g1 );
1829 std::vector< size_type > gtmp;
1830 for(
typename group_map_type::iterator gite = lower ; gite != upper ; ++gite )
1832 gtmp.push_back( gite->second );
1835 gmap.erase( lower, upper );
1837 for( size_type i = 0 ; i < gtmp.size( ) ; i++ )
1839 groups[ gtmp[ i ] ] = g2;
1840 gmap.insert( group_map_type_pair_type( g2, gtmp[ i ] ) );
1849 iterator ite = vertex_face_map.find( f.y );
1850 if( ite != vertex_face_map.end( ) )
1852 iterator upper = vertex_face_map.upper_bound( f.y );
1853 for( ; ite != upper ; ++ite )
1855 if( ite->second != i )
1857 size_type &g2 = groups[ ite->second ];
1861 typename group_map_type::iterator lower = gmap.find( g2 );
1862 typename group_map_type::iterator upper = gmap.upper_bound( g2 );
1864 std::vector< size_type > gtmp;
1865 for(
typename group_map_type::iterator gite = lower ; gite != upper ; ++gite )
1867 gtmp.push_back( gite->second );
1870 gmap.erase( lower, upper );
1872 for( size_type i = 0 ; i < gtmp.size( ) ; i++ )
1874 groups[ gtmp[ i ] ] = g1;
1875 gmap.insert( group_map_type_pair_type( g1, gtmp[ i ] ) );
1880 typename group_map_type::iterator lower = gmap.find( g1 );
1881 typename group_map_type::iterator upper = gmap.upper_bound( g1 );
1883 std::vector< size_type > gtmp;
1884 for(
typename group_map_type::iterator gite = lower ; gite != upper ; ++gite )
1886 gtmp.push_back( gite->second );
1889 gmap.erase( lower, upper );
1891 for( size_type i = 0 ; i < gtmp.size( ) ; i++ )
1893 groups[ gtmp[ i ] ] = g2;
1894 gmap.insert( group_map_type_pair_type( g2, gtmp[ i ] ) );
1904 iterator ite = vertex_face_map.find( f.z );
1905 if( ite != vertex_face_map.end( ) )
1907 iterator upper = vertex_face_map.upper_bound( f.z );
1908 for( ; ite != upper ; ++ite )
1910 if( ite->second != i )
1912 size_type &g2 = groups[ ite->second ];
1916 typename group_map_type::iterator lower = gmap.find( g2 );
1917 typename group_map_type::iterator upper = gmap.upper_bound( g2 );
1919 std::vector< size_type > gtmp;
1920 for(
typename group_map_type::iterator gite = lower ; gite != upper ; ++gite )
1922 gtmp.push_back( gite->second );
1925 gmap.erase( lower, upper );
1927 for( size_type i = 0 ; i < gtmp.size( ) ; i++ )
1929 groups[ gtmp[ i ] ] = g1;
1930 gmap.insert( group_map_type_pair_type( g1, gtmp[ i ] ) );
1935 typename group_map_type::iterator lower = gmap.find( g1 );
1936 typename group_map_type::iterator upper = gmap.upper_bound( g1 );
1938 std::vector< size_type > gtmp;
1939 for(
typename group_map_type::iterator gite = lower ; gite != upper ; ++gite )
1941 gtmp.push_back( gite->second );
1944 gmap.erase( lower, upper );
1946 for( size_type i = 0 ; i < gtmp.size( ) ; i++ )
1948 groups[ gtmp[ i ] ] = g2;
1949 gmap.insert( group_map_type_pair_type( g2, gtmp[ i ] ) );
1958 size_type mgroup = 0;
1959 size_type mcount = 0;
1960 for(
typename group_map_type::iterator ite = gmap.begin( ) ; ite != gmap.end( ) ; )
1962 size_type count = gmap.count( ite->first );
1963 if( count > mcount )
1966 mgroup = ite->first;
1969 ite = gmap.upper_bound( ite->first );
1970 if( ite == gmap.end( ) )
1982 typename group_map_type::iterator lower = gmap.find( mgroup );
1983 if( lower != gmap.end( ) )
1985 typename group_map_type::iterator upper = gmap.upper_bound( mgroup );
1986 for( ; lower != upper ; ++lower )
1988 ivector_type &f = faces[ lower->second ];
1989 facets.push_back( facet_type( vertices[ f.x ], vertices[ f.y ], vertices[ f.z ] ) );
2004 #endif // __INCLUDE_MIST_FACET__