shape_doc 0.1
|
#include <find_minimal_edges.hpp>
Definition at line 34 of file find_minimal_edges.hpp.
typedef mmx::shape::bounding_box<double> boundingBox_t |
Definition at line 42 of file find_minimal_edges.hpp.
typedef std::vector<edgeTuple_t> edgeList_t |
Definition at line 40 of file find_minimal_edges.hpp.
typedef std::tr1::array<const node_t*, 3> edgeTuple_t |
Definition at line 39 of file find_minimal_edges.hpp.
typedef std::vector<faceTuple_t> faceList_t |
Definition at line 37 of file find_minimal_edges.hpp.
typedef std::tr1::array<const node_t*, 2> faceTuple_t |
Definition at line 36 of file find_minimal_edges.hpp.
EdgeListBuilder | ( | ) | [inline] |
Definition at line 44 of file find_minimal_edges.hpp.
: m_os( std::cerr ) {}
void cellProc | ( | const node_t * | n | ) |
Definition at line 230 of file find_minimal_edges.hpp.
bool commonFace | ( | const faceTuple_t & | f | ) | const |
Return true if two cells share a face.
Definition at line 152 of file find_minimal_edges.hpp.
{ int strict = 0; int nonstrict = 0; for ( int i = 0; i < 3; ++i ) { if ( overlapAlongAxis( f[0], f[1], i, true ) ) strict++; if ( overlapAlongAxis( f[0], f[1], i, false ) ) nonstrict++; } return ( strict >= 2 && nonstrict >= 3 ) ? true : false; }
EdgeListBuilder< node_t >::boundingBox_t computeCommonFace | ( | const faceTuple_t & | t | ) | const |
Definition at line 168 of file find_minimal_edges.hpp.
References mmx::max(), mmx::min(), bounding_box< C, V >::xmax(), bounding_box< C, V >::xmin(), bounding_box< C, V >::ymax(), bounding_box< C, V >::ymin(), bounding_box< C, V >::zmax(), and bounding_box< C, V >::zmin().
{ using std::min; using std::max; boundingBox_t b0 = f[0]->get_cell()->boundingBox(); boundingBox_t b1 = f[1]->get_cell()->boundingBox(); boundingBox_t b( max( b0.xmin(), b1.xmin() ), min( b0.xmax(), b1.xmax() ), max( b0.ymin(), b1.ymin() ), min( b0.ymax(), b1.ymax() ), max( b0.zmin(), b1.zmin() ), min( b0.zmax(), b1.zmax() ) ); return b; }
int dist | ( | const node_t * | n0, |
const node_t * | n1 | ||
) | const [inline] |
Compute the distance in the tree between two nodes.
Definition at line 51 of file find_minimal_edges.hpp.
References abs().
{ return std::abs( n0->depth() - n1->depth() ); }
const edgeList_t& edgeList | ( | ) | const [inline] |
Get the computed edgeList.
Definition at line 92 of file find_minimal_edges.hpp.
References EdgeListBuilder< node_t >::m_edgelist.
{ return m_edgelist; }
edgeList_t& edgeList | ( | ) | [inline] |
Get the computed edgeList, const version.
Definition at line 95 of file find_minimal_edges.hpp.
References EdgeListBuilder< node_t >::m_edgelist.
{ return m_edgelist; }
void edgeProc | ( | const node_t * | n0, |
const node_t * | n1, | ||
const node_t * | n2, | ||
int | split_dir | ||
) |
Definition at line 325 of file find_minimal_edges.hpp.
{ #ifdef ELB_DEBUG m_os << __FUNCTION__ << std::endl; #endif if ( n0->is_leaf() && n1->is_leaf() && n2->is_leaf() ) { edgeTuple_t n = {{ n0, n1, n2 }}; m_edgelist.push_back( n ); #ifdef ELB_DEBUG m_os << "Found nodeTuple.\n"; for ( int i = 0; i < 3; ++i ) { m_os << n[i]->get_cell()->boundingBox() << std::endl; } m_os << std::endl; #endif } else { edgeProc_helper( n0, n1, n2, split_dir ); edgeProc_helper( n1, n2, n0, split_dir ); edgeProc_helper( n2, n0, n1, split_dir ); } }
void edgeProc_helper | ( | const node_t * | n0, |
const node_t * | n1, | ||
const node_t * | n2, | ||
int | split_dir | ||
) | [protected] |
Definition at line 311 of file find_minimal_edges.hpp.
faceList_t& faceList | ( | ) | [inline] |
Get the computed edgeList, const version.
Definition at line 101 of file find_minimal_edges.hpp.
References EdgeListBuilder< node_t >::m_facelist.
{ return m_facelist; }
const faceList_t& faceList | ( | ) | const [inline] |
Get the computed edgeList.
Definition at line 98 of file find_minimal_edges.hpp.
References EdgeListBuilder< node_t >::m_facelist.
{ return m_facelist; }
bool faceProc | ( | const node_t * | left, |
const node_t * | right, | ||
int | split_dir | ||
) |
Find the common edges of two cells. The cells are assumed to share a face in the v direction, it is the responsibility of the caller to ensure that this is fullfilled.
Definition at line 250 of file find_minimal_edges.hpp.
References mmx::shape_ssi::left(), and mmx::shape_ssi::right().
{ #ifdef ELB_DEBUG m_os << __FUNCTION__ << std::endl; // m_os << left->get_cell()->boundingBox() << std::endl; // m_os << right->get_cell()->boundingBox() << std::endl; #endif // Check that boxes overlap //if ( !overlapAlongAxis( left, right, split_dir ) ) // return false; faceTuple_t f = {{left, right}}; if ( !commonFace( f ) ) return false; if ( left->is_leaf() && right->is_leaf() ) { faceTuple_t f = {{ left, right }}; #ifdef ELB_DEBUG m_os << "Inserted\n"; m_os << left->get_cell()->boundingBox() << std::endl; m_os << right->get_cell()->boundingBox() << std::endl; #endif #ifdef ELB_RUNTIME_CHECK if ( std::find( m_facelist.begin(), m_facelist.end(), f ) != m_facelist.end() ) { m_os << "Face already inserted!\n"; exit(0); } #endif m_facelist.push_back( f ); m_facesplitdir.push_back( split_dir ); return true; } // We naively split into both children cells and test for // overlap at the start of the recursive step. if ( !left->is_leaf() ) { if ( left->split_dir() != split_dir ) { //edgeProc( left->left(), left->right(), right, split_dir ); faceProc( left->left(), right, split_dir ); faceProc( left->right(), right, split_dir ); } else { // left->split_dir() == split_dir faceProc( left->right(), right, split_dir ); } } else if ( !right->is_leaf() ) { if ( right->split_dir() != split_dir ) { //edgeProc( left, right->left(), right->right(), split_dir ); faceProc( left, right->left(), split_dir ); faceProc( left, right->right(), split_dir ); } else { // right->split_dir() == split_dir faceProc( left, right->left(), split_dir ); } } return false; }
const node_t* getChild | ( | const node_t * | n, |
typename node_t::NODE_TYPE | nt | ||
) | const [inline] |
Return either the left or the right child of a node.
Definition at line 56 of file find_minimal_edges.hpp.
{ assert( !n->is_leaf() && "Trying to take children of leaf node." ); switch ( nt ) { case node_t::LEFT : return n->left(); break; case node_t::RIGHT: return n->right(); break; default: return 0; } }
node_t::NODE_TYPE getSplitDirParentType | ( | const node_t * | n, |
const int | split_dir | ||
) | const [inline] |
Get type of nearest parent which was split in split_dir.
Definition at line 80 of file find_minimal_edges.hpp.
{ while ( n->parent() != 0 && n->parent()->split_dir() != split_dir ) { n = n->parent(); } if ( n->parent() == 0 ) std::cerr << "Could not find a parent that was split in " << split_dir << " direction.\n"; return n->type(); }
bool overlapAlongAxis | ( | const node_t * | n0, |
const node_t * | n1, | ||
int | axis, | ||
bool | strict | ||
) | const |
Return true if the extents (boundingboxes) of two nodes has overlap along the given axis.
Definition at line 188 of file find_minimal_edges.hpp.
{ // Intervals for the boundingbox std::tr1::array<double, 2> a, b; switch( axis ) { case 0: a[0] = n0->get_cell()->boundingBox().xmin(); b[0] = n1->get_cell()->boundingBox().xmin(); a[1] = n0->get_cell()->boundingBox().xmax(); b[1] = n1->get_cell()->boundingBox().xmax(); break; case 1: a[0] = n0->get_cell()->boundingBox().ymin(); b[0] = n1->get_cell()->boundingBox().ymin(); a[1] = n0->get_cell()->boundingBox().ymax(); b[1] = n1->get_cell()->boundingBox().ymax(); break; case 2: a[0] = n0->get_cell()->boundingBox().zmin(); b[0] = n1->get_cell()->boundingBox().zmin(); a[1] = n0->get_cell()->boundingBox().zmax(); b[1] = n1->get_cell()->boundingBox().zmax(); break; default: std::cerr << "Trying to take boudningbox along unknown axis!\n"; return false; } // Now check the overlap of these intervals // Test taken from overlap method of boost::interval. if ( strict ) return ( a[0] <= b[0] && b[0] < a[1] ) || ( b[0] <= a[0] && a[0] < b[1] ); else return ( a[0] <= b[0] && b[0] <= a[1] ) || ( b[0] <= a[0] && a[0] <= b[1] ); }
void verifyFaceList | ( | ) | const |
Verify facelist.
Definition at line 112 of file find_minimal_edges.hpp.
References bounding_box< C, V >::xmax(), bounding_box< C, V >::xmin(), bounding_box< C, V >::ymax(), bounding_box< C, V >::ymin(), bounding_box< C, V >::zmax(), and bounding_box< C, V >::zmin().
{ size_t errs = 0; for ( size_t i = 0; i < m_facelist.size(); ++i ) { if ( !commonFace( m_facelist[i] ) ) { errs++; m_os << "Invalid facetuple found: \n"; m_os << m_facelist[i][0]->get_cell()->boundingBox() << std::endl; m_os << m_facelist[i][1]->get_cell()->boundingBox() << std::endl; m_os << m_facelist[i][0]->split_dir() << ", " << m_facelist[i][1]->split_dir() << "\n"; m_os << "Split dir: " << m_facesplitdir[i] << std::endl; const node_t* n0 = m_facelist[i][0]; const node_t* n1 = m_facelist[i][1]; while ( n0->parent() != 0 ) { m_os << n0->get_cell()->boundingBox() << std::endl; n0 = n0->parent(); } m_os << std::endl; while ( n1->parent() != 0 ) { m_os << n1->get_cell()->boundingBox() << std::endl; n1 = n1->parent(); } exit ( 0 ); } else { m_os << m_facelist[i][0]->get_cell()->boundingBox() << std::endl; m_os << m_facelist[i][1]->get_cell()->boundingBox() << std::endl; boundingBox_t c = computeCommonFace( m_facelist[i] ); m_os << "[" << c.xmin() << ", " << c.xmax() << "] x [" << c.ymin() << ", " << c.ymax() << "] x [" << c.zmin() << ", " << c.zmax() << "]\n\n" ; } } m_os << "Errors found: " << errs << " (total " << m_facelist.size() << ")\n"; }
edgeList_t m_edgelist [protected] |
Definition at line 105 of file find_minimal_edges.hpp.
Referenced by EdgeListBuilder< node_t >::edgeList().
faceList_t m_facelist [protected] |
Definition at line 106 of file find_minimal_edges.hpp.
Referenced by EdgeListBuilder< node_t >::faceList().
std::vector<int> m_facesplitdir [protected] |
Definition at line 107 of file find_minimal_edges.hpp.
std::ostream& m_os [protected] |
Definition at line 109 of file find_minimal_edges.hpp.