cgma
|
#include <CubitOctreeNode.hpp>
Definition at line 31 of file CubitOctreeNode.hpp.
CubitOctreeNode::CubitOctreeNode | ( | const CubitVector & | cen, |
CubitOctreeCell * | parent_cell, | ||
const int | i, | ||
const int | j, | ||
const int | k | ||
) |
Definition at line 34 of file CubitOctreeNode.cpp.
{ initialize_constructor( cen.x(), cen.y(), cen.z() ); adjCell[x_index][y_index][z_index] = parent_cell; }
CubitOctreeNode::CubitOctreeNode | ( | const double & | x, |
const double & | y, | ||
const double & | z | ||
) |
Definition at line 40 of file CubitOctreeNode.cpp.
{ initialize_constructor( x, y, z ); }
CubitOctreeNode::~CubitOctreeNode | ( | void | ) |
Definition at line 45 of file CubitOctreeNode.cpp.
{ int i; OctreeIntersectionData *idata; for (i=0; i < octreeIntersectionDataList.size(); ++i) { idata = octreeIntersectionDataList.get_and_step(); if (idata != NULL) { delete idata; } } octreeIntersectionDataList.clean_out(); }
void CubitOctreeNode::append_list_item | ( | CubitVector | facet_normal | ) |
void CubitOctreeNode::append_list_item | ( | OctreeIntersectionData * | ptr_int_data | ) | [inline] |
Definition at line 159 of file CubitOctreeNode.hpp.
{ octreeIntersectionDataList.push( ptr_int_data ); }
CubitBoolean CubitOctreeNode::bfs_to_find_contained_nodes | ( | int | max_onode_per_src | ) |
void CubitOctreeNode::calc_facet_patch_distance_normal | ( | DLIList< OctreeIntersectionData * > & | idatas, |
int | num_use_idatas, | ||
double & | patch_distance, | ||
CubitVector & | patch_normal, | ||
CubitBoolean | sort, | ||
CubitBoolean | set_Refface | ||
) |
Definition at line 395 of file CubitOctreeNode.cpp.
{ int i, j; CubitBoolean duplicate = CUBIT_FALSE; for (i=0; i < idatas.size(); ++i) { idatas.reset(); idatas.step(i); OctreeIntersectionData *first = idatas.get(); for (j=i+1; j < idatas.size(); ++j) { idatas.reset(); idatas.step(j); if (idatas.get() == first) {duplicate = CUBIT_TRUE;} break; } if (duplicate == CUBIT_TRUE) {break;} } if (duplicate) {PRINT_INFO("Duplicate idatas found for node %d\n", this->get_num());} if (sort) {idatas.sort(OctreeIntersectionData::compare_function);} idatas.reset(); if (sort) { patch_distance = /*(coord - idatas.get()->get_int_point())%idatas.get()->get_facet_normal();*/ idatas.get()->get_length(); // CubitFacet *ptr_facet = idatas.get()->get_facet_ptr(); // CubitVector closest_point_on_facet = idatas.get()->get_int_point(), facet_normal = idatas.get()->get_facet_normal(); /* if (fabs((coord - closest_point_on_facet)%facet_normal) != (coord-closest_point_on_facet).length()) { SVDrawTool::clear_non_retained(); SVDrawTool::draw_vector(coord, closest_point_on_facet, CUBIT_YELLOW_INDEX); PRINT_INFO("closest length is %lf\n", idatas.get()->get_length()); DLIList<CubitFacet*> temp_facets; temp_facets.append(ptr_facet); SVDrawTool::draw_facets(temp_facets, CUBIT_YELLOW_INDEX); temp_facets.clean_out(); for (i=0; i < idatas.size(); ++i) { CubitFacet *facet = idatas.get()->get_facet_ptr(); if (facet != ptr_facet) { SVDrawTool::draw_vector(coord, idatas.get()->get_int_point(), CUBIT_RED_INDEX); PRINT_INFO("Other length is %lf\n", idatas.get()->get_length()); } idatas.step(); temp_facets.append(facet); } temp_facets.remove(ptr_facet); SVDrawTool::draw_facets(temp_facets, CUBIT_RED_INDEX); int j,k; for (i=0; i < 2; ++i) { for (j=0; j < 2; ++j) { for (k=0; k < 2; ++k) { CubitOctreeCell *CubitOctree_cell = adjCell[i][j][k]; if (CubitOctree_cell == NULL) {continue;} double corners[3]; double half_edge_length = CubitOctree_cell->get_dimension()/2.0; CubitVector center = CubitOctree_cell->get_center(); center.get_xyz(corners); float box[6] = {corners[0]-half_edge_length, corners[1]-half_edge_length, corners[2]-half_edge_length, corners[0]+half_edge_length, corners[1]+half_edge_length, corners[2]+half_edge_length}; SVDrawTool::draw_cube(box, CUBIT_GREEN_INDEX, SVDrawTool::WIRE); } } } SVDrawTool::mouse_xforms(); }*/ } else {patch_distance = -1;} if (set_Refface) {refFace = idatas.get()->get_face();} if (num_use_idatas == -1) {num_use_idatas = idatas.size();} patch_normal = CubitVector(0,0,0); /*for (i=0; i < num_use_idatas; ++i) { double len = idatas.get()->get_length(); if (len < OCTREE_EPSILON) {len = OCTREE_EPSILON;} normal += idatas.get()->get_facet_normal() * 1/(len); idatas.step(); } normal.normalize(); */ OctreeIntersectionData *ptr_data; //double denominator = 0.0; double length; //distance = 0.0; for( i=0; i < num_use_idatas; i++ ) { ptr_data = idatas.get_and_step(); // VED: important length = ptr_data->get_length(); if( length < OCTREE_EPSILON ){ patch_normal += ptr_data->get_normal() * (1/(OCTREE_EPSILON*OCTREE_EPSILON)); //distance += ( ptr_data->get_normal()%( coord - ptr_data->get_int_point() ) ) * (1/OCTREE_EPSILON)/denominator; } else{ patch_normal += ptr_data->get_normal() * (1/(length*length)); //distance += ( ptr_data->get_normal()%( coord - ptr_data->get_int_point() ) ) * (1/length)/denominator; } } patch_normal.normalize(); }
void CubitOctreeNode::calculate_size_based_on_cell_dimension | ( | double | bbox_dimension | ) |
Definition at line 366 of file CubitOctreeNode.cpp.
{ int i; int counter = 0; double sum = 0.0; for( i = 0; i < 6; i++ ){ if( adjNodeDistance[i] >= 0 ){ sum += 1.0 / pow( 2.0, adjNodeDistance[i] ); counter++; } } size = sum / counter * bbox_dimension; }
CubitBoolean CubitOctreeNode::compare_function | ( | CubitOctreeNode *& | a, |
CubitOctreeNode *& | b | ||
) | [static] |
Definition at line 898 of file CubitOctreeNode.cpp.
{ if( a->get_distance() < b->get_distance() ) return CUBIT_TRUE; else return CUBIT_FALSE; }
CubitBoolean CubitOctreeNode::dfs_to_find_contained_nodes | ( | int | max_onode_per_src | ) |
void CubitOctreeNode::display | ( | OctreeNodeConstant | type = NODE_SIZE , |
float | draw_size = -1 |
||
) |
Definition at line 114 of file CubitOctreeNode.cpp.
{ switch( type ){ case NODE_SIZE: if (draw_size < 0) { draw_size = size; } //SkeletonDebug::draw_point( coord, draw_size ); break; case NODE_DISTANCE: if( color == CUBIT_BLACK_INDEX ){ //SkeletonDebug::draw_point( coord, (float)draw_size ) ; } break; case NODE_FACE_NUM: if( refFace != NULL ){ //SkeletonDebug::draw_point( coord, (float)(( refFace->id() % 18) * 0.5) ); } else{ PRINT_INFO("ERROR: Face Ptr Doesn't Exist in White Grid Node \n"); } break; case NODE_NORMAL: if( color == CUBIT_BLACK_INDEX ){ //SkeletonDebug::draw_line(coord, draw_size, coord+mNormal,draw_size); } break; default: //SkeletonDebug::draw_point( coord, 1 ); break; } }
void CubitOctreeNode::find_distance_at_adj_node | ( | PriorityQueue< CubitOctreeNode * > * | heap | ) |
Definition at line 907 of file CubitOctreeNode.cpp.
{ int i; CubitVector mat_pnt_center; double new_node_distance; // PRINT_INFO("Testing: Face id = %d\n", mrefFace->id()); visit = CUBIT_TRUE; for( i = 0; i < 6; i++ ){ // at the boundary of solid if( adjGridNode[i] == NULL ) continue; // *************** WARNING ********* // if the adjGridNode is on boundary or outside don't do anything // Just testing white node is enough because we assume the facet and the grid // intersection done during octree generation is correct // At this point only at the boundary there is white and black nodes because of facet/octree intersection // and both at interior and outside we grey node //if( adjGridNode[i]->get_color() == CUBIT_WHITE_INDEX || adjGridNode[i]->get_color() == CUBIT_GREY_INDEX ) if( adjGridNode[i]->get_color() == CUBIT_WHITE_INDEX || adjGridNode[i]->get_color() == CUBIT_YELLOW_INDEX) continue; // meeting of the front should be the major // criteria not the size value. check for null of // grid_node->face. then check for adjacency, black_white, and size... new_node_distance = distance + ( adjGridNode[i]->coord - coord )%mNormal; // WARNING: The below condition is very important. // Therefore I think the normal calculation is wrong // Front should always go forward. if(new_node_distance <= distance) { // OPEN IT // this happens at the concave region containing many surfaces. //PRINT_DEBUG_157(" Distance Calculation is wrong (discresing)\n"); if (adjGridNode[i]->refFace != NULL) { //if (adjGridNode[i]->mrefFace != mrefFace) // { continue; //} } //if (adjGridNode[i]->mrefFace != mrefFace) //{ adjGridNode[i]->color = CUBIT_BLACK_INDEX; //new_node_distance = distance; continue; //} //SVDrawTool::draw_vector(adjGridNode[i]->coord, closest, CUBIT_RED_INDEX); } //if( adjGridNode[i]->mrefFace != mrefFace ) //{ adjGridNode[i]->color = CUBIT_BLACK_INDEX; //} if( adjGridNode[i]->refFace == NULL ){ // internal black nodes // not near skeleton adjGridNode[i]->distance = new_node_distance; adjGridNode[i]->refFace = refFace; adjGridNode[i]->mNormal = mNormal; heap->push( adjGridNode[i] ); } else{ } } }
int CubitOctreeNode::find_half_space | ( | CubitFacet * | ptr_facet | ) |
Definition at line 383 of file CubitOctreeNode.cpp.
{ if( (coord - ptr_facet->point(0)->coordinates()) % (ptr_facet->normal()) >= 0 ) { halfspaceDirection = OCTREE_POSITIVE; } return halfspaceDirection; }
CubitBoolean CubitOctreeNode::find_intersection_point | ( | int | axis, |
CubitVector | grid_node0, | ||
CubitVector | grid_node1, | ||
CubitVector & | facet_normal, | ||
CubitVector | facet_vert0, | ||
CubitVector | facet_vert1, | ||
CubitVector | facet_vert2, | ||
CubitVector & | int_point, | ||
double & | para | ||
) |
Definition at line 735 of file CubitOctreeNode.cpp.
{ double A, B, C, D; double nominator, denominator; D = - ( facet_normal%(facet_vert1 - grid_node0) ); A = facet_normal.x(); B = facet_normal.y(); C = facet_normal.z(); switch( axis ){ case OCTREE_X: if( fabs(A) < OCTREE_EPSILON ){ //line parallel to facet // both end points are intersection points return CUBIT_FALSE; } else{ nominator = D; denominator = A * ( grid_node0.x() - grid_node1.x() ); para = nominator / denominator; } break; case OCTREE_Y: if( fabs(B) < OCTREE_EPSILON ){ //line parallel to facet // both end points are intersection points return CUBIT_FALSE; } else{ nominator = D; denominator = B * ( grid_node0.y() - grid_node1.y() ); para = nominator / denominator; } break; case OCTREE_Z: if( fabs(C) < OCTREE_EPSILON ){ //line parallel to facet // both end points are intersection points return CUBIT_FALSE; } else{ nominator = D; denominator = C * ( grid_node0.z() - grid_node1.z() ); para = nominator / denominator; } break; default: break; } int_point = grid_node0 + para * ( grid_node1 - grid_node0 ); return( is_intersection_point_contained_inside_facet( int_point, facet_vert0, facet_vert1, facet_vert2 ) ); }
void CubitOctreeNode::find_intersection_with_facet | ( | CubitOctreeType | type, |
RefFace * | ptr_face, | ||
CubitFacet * | ptr_facet, | ||
DLIList< CubitOctreeNode * > & | boundary_white_node_list | ||
) |
Definition at line 629 of file CubitOctreeNode.cpp.
{ int i; CubitBoolean result; CubitVector int_point; CubitVector facet_normal; double para; facet_normal = ptr_facet->normal(); for( i = 0; i < 6; i++ ){ result = CUBIT_FALSE; if( adjGridNode[i] != NULL ){ if( adjGridNode[i]->halfspaceDirection == OCTREE_NEGATIVE && adjGridNode[i]->mark == CUBIT_TRUE ){ //- adj_node[0] = O_FRONT Node //- adj_node[1] = O_BACK Node //- adj_node[2] = O_RIGHT Node //- adj_node[3] = O_LEFT Node //- adj_node[4] = O_TOP Node //- adj_node[5] = O_BOTTOM Node switch( i ){ case O_FRONT: result = find_intersection_point( OCTREE_X, coord, adjGridNode[i]->coord, facet_normal, ptr_facet->point(0)->coordinates(), ptr_facet->point(1)->coordinates(), ptr_facet->point(2)->coordinates(), int_point, para ); break; case O_BACK: result = find_intersection_point( OCTREE_X, coord, adjGridNode[i]->coord, facet_normal, ptr_facet->point(0)->coordinates(), ptr_facet->point(1)->coordinates(), ptr_facet->point(2)->coordinates(), int_point, para ); break; case O_RIGHT: result = find_intersection_point( OCTREE_Y, coord, adjGridNode[i]->coord, facet_normal, ptr_facet->point(0)->coordinates(), ptr_facet->point(1)->coordinates(), ptr_facet->point(2)->coordinates(), int_point, para ); break; case O_LEFT: result = find_intersection_point( OCTREE_Y, coord, adjGridNode[i]->coord, facet_normal, ptr_facet->point(0)->coordinates(), ptr_facet->point(1)->coordinates(), ptr_facet->point(2)->coordinates(), int_point, para ); break; case O_TOP: result = find_intersection_point( OCTREE_Z, coord, adjGridNode[i]->coord, facet_normal, ptr_facet->point(0)->coordinates(), ptr_facet->point(1)->coordinates(), ptr_facet->point(2)->coordinates(), int_point, para ); break; case O_BOTTOM: result = find_intersection_point( OCTREE_Z, coord, adjGridNode[i]->coord, facet_normal, ptr_facet->point(0)->coordinates(), ptr_facet->point(1)->coordinates(), ptr_facet->point(2)->coordinates(), int_point, para ); break; default: break; } } } if( result == CUBIT_TRUE ){ OctreeIntersectionData * ptr_data; switch( type ){ case CUBIT_OCTREE_VOLUME: // update color of boundary node if( color != CUBIT_WHITE_INDEX ){ if( color == CUBIT_BLACK_INDEX ){ // Mark the common cells incident on both end points of the edge as GREY // To resolve the intersection problems I added the SAT intersection code -ved } boundary_white_node_list.push( this ); refFace = ptr_face; //PRINT_DEBUG_157(" Testing: Face Num = %d\n", RefFace->id() ); color = CUBIT_WHITE_INDEX; distance = -1; } // WARNING: devided by zero. ptr_data = new OctreeIntersectionData( this, facet_normal * -1, int_point, (adjGridNode[i]->coord - int_point).length(), ptr_face ); adjGridNode[i]->append_list_item( ptr_data ); break; case CUBIT_OCTREE_FACE: refFace = ptr_face; color = CUBIT_BLACK_INDEX; distance = -1; adjGridNode[i]->color = CUBIT_BLACK_INDEX; break; default: PRINT_INFO("This case not yet implemented \n"); break; } } } }
Definition at line 332 of file CubitOctreeNode.cpp.
{ int i, j, k; int depth_min_depth_cell = CUBIT_INT_MAX; int depth_max_detph_cell = -CUBIT_INT_MAX; int depth; for( i = 0; i < 2; i++ ){ for( j = 0; j < 2; j++ ){ for( k = 0; k < 2; k++ ){ if( adjCell[i][j][k] != NULL ){ depth = adjCell[i][j][k]->get_depth(); if( depth < depth_min_depth_cell ){ depth_min_depth_cell = depth; minDepthCell = adjCell[i][j][k]; } if( depth > depth_max_detph_cell ){ depth_max_detph_cell = depth; } } } } } if( depth_min_depth_cell != CUBIT_INT_MAX && depth_max_detph_cell != -CUBIT_INT_MAX ){ cellDepthDifference = depth_max_detph_cell - depth_min_depth_cell; } else{ cellDepthDifference = 0; } return cellDepthDifference; }
Definition at line 871 of file CubitOctreeNode.cpp.
{ int i; double sum = 0.0; int count = 0; for( i = 0; i < 6; i ++ ){ if( adjGridNode[i] != NULL ){ // WARNING: Why we need to check for -1 //if( adjGridNode[i]->size != -1 && adjGridNode[i]->size != CUBIT_DBL_MAX && adjGridNode[i]->size != 0){ //if( adjGridNode[i]->size != CUBIT_DBL_MAX && adjGridNode[i]->size != 0.0 ){ if( adjGridNode[i]->size != 0.0 ){ sum += adjGridNode[i]->size; count++; } } } if( sum != 0.0 ){ size = sum / count; return CUBIT_TRUE; } else return CUBIT_FALSE; }
CubitOctreeCell* CubitOctreeNode::get_adj_cell | ( | const int | i, |
const int | j, | ||
const int | k | ||
) | [inline] |
Definition at line 120 of file CubitOctreeNode.hpp.
{ return adjCell[i][j][k]; }
CubitOctreeNode * CubitOctreeNode::get_adj_node | ( | int | num | ) |
Definition at line 169 of file CubitOctreeNode.cpp.
{ switch (select) { case O_LEFT: return adjGridNode[O_LEFT]; case O_RIGHT: return adjGridNode[O_RIGHT]; case O_BOTTOM: return adjGridNode[O_BOTTOM]; case O_TOP: return adjGridNode[O_TOP]; case O_BACK: return adjGridNode[O_BACK]; case O_FRONT: return adjGridNode[O_FRONT]; default: PRINT_INFO("ERROR: AdjNode index exceeded\n"); return NULL; } }
int CubitOctreeNode::get_adj_node_distance | ( | enum OctreePosition | type | ) |
Definition at line 302 of file CubitOctreeNode.cpp.
{ switch( select ){ case O_LEFT: return adjNodeDistance[O_LEFT]; case O_RIGHT: return adjNodeDistance[O_RIGHT]; case O_BOTTOM: return adjNodeDistance[O_BOTTOM]; case O_TOP: return adjNodeDistance[O_TOP]; case O_BACK: return adjNodeDistance[O_BACK]; case O_FRONT: return adjNodeDistance[O_FRONT]; default: PRINT_INFO("ERROR: AdjNode index exceeded"); return CUBIT_TRUE; } }
int CubitOctreeNode::get_cell_depth_difference | ( | ) | [inline] |
Definition at line 100 of file CubitOctreeNode.hpp.
{ return cellDepthDifference; }
int CubitOctreeNode::get_color | ( | ) | [inline] |
Definition at line 46 of file CubitOctreeNode.hpp.
{ return color; }
CubitVector& CubitOctreeNode::get_coord | ( | ) | [inline] |
Definition at line 54 of file CubitOctreeNode.hpp.
{ return coord; }
int CubitOctreeNode::get_counter | ( | ) |
Definition at line 107 of file CubitOctreeNode.cpp.
double CubitOctreeNode::get_distance | ( | ) | [inline] |
Definition at line 74 of file CubitOctreeNode.hpp.
{ return distance; }
CubitBoolean CubitOctreeNode::get_halfspace_direction | ( | ) | [inline] |
Definition at line 140 of file CubitOctreeNode.hpp.
{ return halfspaceDirection; }
DLIList<OctreeIntersectionData*>* CubitOctreeNode::get_idata_list | ( | ) | [inline] |
Definition at line 166 of file CubitOctreeNode.hpp.
{return &octreeIntersectionDataList;}
CubitBoolean CubitOctreeNode::get_mark | ( | void | ) | [inline] |
Definition at line 124 of file CubitOctreeNode.hpp.
{ return mark; }
CubitOctreeCell* CubitOctreeNode::get_min_depth_cell | ( | ) | [inline] |
Definition at line 97 of file CubitOctreeNode.hpp.
{ return minDepthCell; }
CubitVector CubitOctreeNode::get_normal | ( | ) | const [inline] |
Definition at line 132 of file CubitOctreeNode.hpp.
{return mNormal;}
int CubitOctreeNode::get_num | ( | ) | [inline] |
Definition at line 51 of file CubitOctreeNode.hpp.
{ return num; }
double CubitOctreeNode::get_size | ( | OctreeSourceEntityType | type | ) | const |
Definition at line 157 of file CubitOctreeNode.cpp.
{ return size; }
CubitBoolean CubitOctreeNode::get_visit | ( | ) | const [inline] |
Definition at line 129 of file CubitOctreeNode.hpp.
{return visit;}
int CubitOctreeNode::id | ( | void | ) | [inline] |
Definition at line 60 of file CubitOctreeNode.hpp.
{ return num; }
void CubitOctreeNode::initialize_constructor | ( | const double & | x, |
const double & | y, | ||
const double & | z | ||
) |
in CubitOctree outside nodes are GREY, inside nodes are BLACK. And boundary nodes are WHITE.
Definition at line 63 of file CubitOctreeNode.cpp.
{ int i, j, k; color = CUBIT_GREY_INDEX; // boundary nodes are colored white and inside nodes black // during facet intersection the white nodes dominates black visit = CUBIT_FALSE; // mat generation mark = CUBIT_FALSE; halfspaceDirection = OCTREE_NEGATIVE; num = get_counter(); size = 0.0; distance = CUBIT_DBL_MAX; cellDepthDifference = 0; minDepthCell = NULL; mNormal.x(0.0); mNormal.y(0.0); mNormal.z(0.0); coord.x(x); coord.y(y); coord.z(z); for( i = 0; i < 2; i++ ){ for( j = 0; j < 2; j++ ){ for( k = 0; k < 2; k++ ){ adjCell[i][j][k] = NULL; } } } // LRBTFN for( i = 0; i < 6; i++ ){ adjGridNode[i] = NULL; adjNodeDistance[i] = -1; // ? } refFace = NULL; }
CubitBoolean CubitOctreeNode::is_intersection_point_contained_inside_facet | ( | const CubitVector & | int_point, |
const CubitVector & | facet_vert0, | ||
const CubitVector & | facet_vert1, | ||
const CubitVector & | facet_vert2 | ||
) | [static] |
Definition at line 815 of file CubitOctreeNode.cpp.
{ if ( fabs((int_point-facet_vert0)%( (facet_vert1-facet_vert0) * (facet_vert2-facet_vert0) )) > OCTREE_EPSILON) { return CUBIT_FALSE; } if (is_same_side(int_point,facet_vert0, facet_vert1,facet_vert2) && is_same_side(int_point,facet_vert1, facet_vert0,facet_vert2) && is_same_side(int_point,facet_vert2, facet_vert0,facet_vert1)) {return CUBIT_TRUE;} return CUBIT_FALSE; /*CubitVector line0, line1, line2; double ang0, ang1, ang2; line0 = facet_vert0 - int_point ; line0 = line0 / line0.length(); line1 = facet_vert1 - int_point ; line1 = line1 / line1.length(); line2 = facet_vert2 - int_point ; line2 = line2 / line2.length(); //Added (M. Brewer) to check for an invalid number passed to acos //compute ang0 double temp_double = line0 % line1; if(temp_double>1.0) temp_double=1.0; else if (temp_double<-1.0) temp_double=-1.0; ang0 = acos( temp_double ); //compute ang1 temp_double = line1 % line2; if(temp_double>1.0) temp_double=1.0; else if (temp_double<-1.0) temp_double=-1.0; ang1 = acos( temp_double ); //compute ang2 temp_double = line2 % line0; if(temp_double>1.0) temp_double=1.0; else if (temp_double<-1.0) temp_double=-1.0; ang2 = acos( temp_double ); if( fabs ( ( ang0 + ang1 + ang2 ) - CUBIT_PI * 2 ) < OCTREE_EPSILON ){ return CUBIT_TRUE; } else{ return CUBIT_FALSE; }*/ }
CubitBoolean CubitOctreeNode::is_same_side | ( | const CubitVector & | p1, |
const CubitVector & | p2, | ||
const CubitVector & | a, | ||
const CubitVector & | b | ||
) | [static] |
Definition at line 802 of file CubitOctreeNode.cpp.
{ static CubitVector edge; edge = b-a; //cp1 = edge*(p1-a); //cp2 = edge*(p2-a); if ( (edge*(p1-a)) % (edge*(p2-a)) >= 0) {return CUBIT_TRUE;} return CUBIT_FALSE; }
double CubitOctreeNode::manhattan_distance_adj_node | ( | int | index | ) |
Definition at line 269 of file CubitOctreeNode.cpp.
{ switch( index ){ case O_FRONT: return fabs( coord.x() - adjGridNode[index]->coord.x() ); case O_BACK: return fabs( coord.x() - adjGridNode[index]->coord.x() ); case O_RIGHT: return fabs( coord.y() - adjGridNode[index]->coord.y() ); case O_LEFT: return fabs( coord.y() - adjGridNode[index]->coord.y() ); case O_TOP: return fabs( coord.z() - adjGridNode[index]->coord.z() ); case O_BOTTOM: return fabs( coord.z() - adjGridNode[index]->coord.z() ); default: PRINT_INFO("WARNING: Adjacent grid node index doesn't exist"); return 1.0; } }
double CubitOctreeNode::manhattan_distance_adj_node | ( | CubitOctreeNode * | ptr_adj_node | ) | [inline] |
static void CubitOctreeNode::reset_counter | ( | ) | [inline, static] |
Definition at line 106 of file CubitOctreeNode.hpp.
{mCounter = -1;}
Definition at line 518 of file CubitOctreeNode.cpp.
{ // three cases: // 1) One facet (one RefFace) => use facet's normal and distance to facet, RefFace is set to facet's owning face // 2) Multiple facets, one refFace => use distance to closest facet and its owning RefFace, IDW normal from N closest facets // 3) Multiple facets, multiple RefFaces => use distance to closest facet and its owning RefFace, IDW normal from N closest facets //int i, j, k; // case: no intersection datas, this should not happen. I should prolly put an cassertere. if (octreeIntersectionDataList.size() == 0) { PRINT_ERROR("No OctreeIntersectionDatas attached to black grid node in queue for MAT generation!\n"); return; } // case: one facet, just get distance, normal, and face from facet if (octreeIntersectionDataList.size() == 1) { distance = octreeIntersectionDataList.get()->get_length(); mNormal = octreeIntersectionDataList.get()->get_facet_normal(); refFace = octreeIntersectionDataList.get()->get_face(); // remember to delete the idata - check if this is ok delete octreeIntersectionDataList.get(); octreeIntersectionDataList.clean_out(); return; } // case: multiple facets, one face // just initialize normal, distance, and Refface // case: two faces // determine if disconnected and if normals diverge => EWC case 1 // else check angle // now find N closest facets (keep list of idatas though) // choose closest one, use distance to it and use its RefFace // then use all and IDW to get normal int num_facets_to_use; if (N_CLOSEST_FACETS_FACTOR_FOR_FRONT_NORMALS == 0.00) {num_facets_to_use = 1;} else if (N_CLOSEST_FACETS_FACTOR_FOR_FRONT_NORMALS == 1.00) {num_facets_to_use = octreeIntersectionDataList.size();} else {num_facets_to_use = (int)(N_CLOSEST_FACETS_FACTOR_FOR_FRONT_NORMALS * octreeIntersectionDataList.size());} if (num_facets_to_use == 0) {num_facets_to_use = 1;} else if (num_facets_to_use > octreeIntersectionDataList.size()) {num_facets_to_use = octreeIntersectionDataList.size();} /*DLIList<OctreeIntersectionData*> n_closest_idatas; RTree<OctreeIntersectionData*> *rtree = new RTree<OctreeIntersectionData*>; double closest = CUBIT_DBL_MAX; for (i=0; i < octreeIntersectionDataList.size(); ++i) { rtree->add(octreeIntersectionDataList.get_and_step()); } rtree->k_nearest_neighbor(coord, num_facets_to_use, closest, n_closest_idatas, OctreeIntersectionData::dist_sqr_to_vec); delete rtree; normal = CubitVector(0,0,0); // calc_facet_patch_distance_normal(octreeIntersectionDataList, num_facets_to_use, distance, normal, CUBIT_TRUE, CUBIT_TRUE); refFace = n_closest_idatas.get()->get_face(); distance = n_closest_idatas.get()->get_length(); for (i=0; i < num_facets_to_use; ++i) { double len = n_closest_idatas.get()->get_length(); normal += n_closest_idatas.get_and_step()->get_facet_normal() * 1/(len); } normal.normalize();*/ mNormal = CubitVector(0,0,0); calc_facet_patch_distance_normal(octreeIntersectionDataList, num_facets_to_use, distance, mNormal, CUBIT_TRUE, CUBIT_TRUE); /* octreeIntersectionDataList.sort(OctreeIntersectionData::compare_function); octreeIntersectionDataList.reset(); refFace = octreeIntersectionDataList.get()->get_face(); distance = octreeIntersectionDataList.get()->get_length(); for (i=0; i < num_facets_to_use; ++i) { double len = octreeIntersectionDataList.get()->get_length(); normal += octreeIntersectionDataList.get_and_step()->get_facet_normal() * 1/(len); } normal.normalize(); */ // now normal, distance to boundary, and Refface have been set }
void CubitOctreeNode::set_adj_node | ( | enum OctreePosition | type, |
CubitOctreeNode * | ptr_grid_node | ||
) |
Definition at line 197 of file CubitOctreeNode.cpp.
{ switch( select ) { case O_LEFT: adjGridNode[O_LEFT] = ptr_node; break; case O_RIGHT: adjGridNode[O_RIGHT] = ptr_node; break; case O_BOTTOM: adjGridNode[O_BOTTOM] = ptr_node; break; case O_TOP: adjGridNode[O_TOP] = ptr_node; break; case O_BACK: adjGridNode[O_BACK] = ptr_node; break; case O_FRONT: adjGridNode[O_FRONT] = ptr_node; break; default: PRINT_INFO("ERROR: AdjNode index exceeded"); } }
void CubitOctreeNode::set_adj_node_distance | ( | enum OctreePosition | type, |
int | dist | ||
) |
Definition at line 233 of file CubitOctreeNode.cpp.
{ switch( select ){ case O_LEFT: adjNodeDistance[O_LEFT] = dist; break; case O_RIGHT: adjNodeDistance[O_RIGHT] = dist; break; case O_BOTTOM: adjNodeDistance[O_BOTTOM] = dist; break; case O_TOP: adjNodeDistance[O_TOP] = dist; break; case O_BACK: adjNodeDistance[O_BACK] = dist; break; case O_FRONT: adjNodeDistance[O_FRONT] = dist; break; default: PRINT_INFO(" ERROR: AdjNode index exceeded"); } }
void CubitOctreeNode::set_color | ( | const int | new_color | ) | [inline] |
Definition at line 49 of file CubitOctreeNode.hpp.
{color = new_color;}
void CubitOctreeNode::set_halfspace_direction | ( | const CubitBoolean | type | ) | [inline] |
Definition at line 141 of file CubitOctreeNode.hpp.
{ halfspaceDirection = type ; }
void CubitOctreeNode::set_mark | ( | CubitBoolean | type | ) | [inline] |
Definition at line 123 of file CubitOctreeNode.hpp.
{ mark = type; }
void CubitOctreeNode::set_size | ( | double | s, |
int | type | ||
) |
Definition at line 163 of file CubitOctreeNode.cpp.
{ size = s; }
void CubitOctreeNode::set_visit | ( | CubitBoolean | type | ) | [inline] |
Definition at line 126 of file CubitOctreeNode.hpp.
{ visit = type; }
void CubitOctreeNode::update_adj_cell | ( | CubitOctreeCell * | ptr_cell, |
int | i, | ||
int | j, | ||
int | k | ||
) | [inline] |
Definition at line 108 of file CubitOctreeNode.hpp.
{ adjCell[i][j][k] = ptr_cell; }
double CubitOctreeNode::x | ( | ) | [inline] |
Definition at line 76 of file CubitOctreeNode.hpp.
void CubitOctreeNode::x | ( | double | value | ) | [inline] |
Definition at line 81 of file CubitOctreeNode.hpp.
double CubitOctreeNode::y | ( | ) | [inline] |
Definition at line 77 of file CubitOctreeNode.hpp.
void CubitOctreeNode::y | ( | double | value | ) | [inline] |
Definition at line 82 of file CubitOctreeNode.hpp.
double CubitOctreeNode::z | ( | ) | [inline] |
Definition at line 78 of file CubitOctreeNode.hpp.
void CubitOctreeNode::z | ( | double | value | ) | [inline] |
Definition at line 83 of file CubitOctreeNode.hpp.
CubitOctreeCell* CubitOctreeNode::adjCell[2][2][2] [private] |
???
Definition at line 239 of file CubitOctreeNode.hpp.
CubitOctreeNode* CubitOctreeNode::adjGridNode[6] [private] |
Definition at line 233 of file CubitOctreeNode.hpp.
int CubitOctreeNode::adjNodeDistance[6] [private] |
Definition at line 236 of file CubitOctreeNode.hpp.
int CubitOctreeNode::cellDepthDifference [private] |
Definition at line 221 of file CubitOctreeNode.hpp.
short CubitOctreeNode::color [private] |
Definition at line 205 of file CubitOctreeNode.hpp.
CubitVector CubitOctreeNode::coord [private] |
Definition at line 230 of file CubitOctreeNode.hpp.
double CubitOctreeNode::distance [private] |
Definition at line 228 of file CubitOctreeNode.hpp.
Definition at line 210 of file CubitOctreeNode.hpp.
CubitBoolean CubitOctreeNode::mark [private] |
Definition at line 203 of file CubitOctreeNode.hpp.
int CubitOctreeNode::mCounter = -1 [static, private] |
Definition at line 200 of file CubitOctreeNode.hpp.
CubitOctreeCell* CubitOctreeNode::minDepthCell [private] |
Definition at line 225 of file CubitOctreeNode.hpp.
CubitVector CubitOctreeNode::mNormal [private] |
Definition at line 245 of file CubitOctreeNode.hpp.
int CubitOctreeNode::num [private] |
Definition at line 197 of file CubitOctreeNode.hpp.
Definition at line 218 of file CubitOctreeNode.hpp.
RefFace* CubitOctreeNode::refFace [private] |
Definition at line 242 of file CubitOctreeNode.hpp.
double CubitOctreeNode::size [private] |
Definition at line 212 of file CubitOctreeNode.hpp.
CubitBoolean CubitOctreeNode::visit [private] |
Definition at line 202 of file CubitOctreeNode.hpp.