cgma
|
#include <FacetorUtil.hpp>
Public Member Functions | |
FacetorUtil () | |
~FacetorUtil () | |
Static Public Member Functions | |
static CubitStatus | insert_node (NODE *node_ptr, DLIList< TRI * > &facet_list, SURF *surface_ptr, int &curr_visit_flag, TRI *&last_tri) |
static CubitStatus | insert_at_circumcenter (TRI *tri_ptr, DLIList< TRI * > &facet_list, TRI *&start_tri, int &curr_visit_flag, SURF *surface_ptr, DLIList< TRI * > *sorted_lists, const int num_lists, const double interval, const double quality_angle, SIZEFUNC *sizing_function, ParamTool *p_tool) |
static CubitStatus | classify_tri_by_angle (TRI *tri_ptr, DLIList< TRI * > *sorted_lists, const int num_lists, const double interval, const double quality_angle) |
Static Private Member Functions | |
static CubitBoolean | tri_visited (TRI *tri_ptr, int curr_visit_flag) |
static void | tri_visited (TRI *tri_ptr, CubitBoolean visited, int curr_visit_flag) |
static CubitStatus | exhaustive_locate_point (CubitVector &the_point, DLIList< TRI * > &facet_list, TRI *&tri_ptr) |
static CubitStatus | point_in_circumcircle (CubitVector &the_point, TRI *tri_ptr, DLIList< TRI * > &tri_list, SURF *surface_ptr, int curr_visit_flag) |
static CubitStatus | locate_point (CubitVector &the_point, DLIList< TRI * > &facet_list, TRI *starting_tri, SURF *owning_surface, TRI *&tri_ptr) |
static CubitStatus | valid_void (NODE *, DLIList< TRI * > &tri_list, SURF *surface_ptr, int curr_visit_flag) |
static CubitStatus | natural_neighbor_tris (CubitVector &the_point, DLIList< TRI * > &facet_list, TRI *&start_tri, SURF *surface_ptr, int &curr_visit_flag, DLIList< TRI * > &tri_list) |
static CubitStatus | bowyer_watson_insert (NODE *point_ptr, DLIList< TRI * > &tri_list, DLIList< TRI * > &facet_list, int &curr_visit_flag, SURF *surf_ptr, TRI *&last_tri) |
static CubitBoolean | are_nodes_colinear (TRI *tri_ptr) |
static CubitVector & | circumcenter (TRI *tri_ptr) |
static double | get_size (CubitVector &cc, TRI *tri_ptr) |
static void | tri_sort_list (TRI *tri_ptr, int sort_list_index) |
static int | tri_sort_list (TRI *tri_ptr) |
static double | radius (TRI *tri_ptr) |
Definition at line 27 of file FacetorUtil.hpp.
FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::FacetorUtil | ( | ) | [inline] |
Definition at line 30 of file FacetorUtil.hpp.
{}
FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::~FacetorUtil | ( | ) | [inline] |
Definition at line 31 of file FacetorUtil.hpp.
{}
MY_INLINE CubitBoolean FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::are_nodes_colinear | ( | TRI * | tri_ptr | ) | [static, private] |
Definition at line 164 of file FacetorUtil.cpp.
{ NODE *nodes[3]; tri_ptr->tri_nodes( nodes[0], nodes[1], nodes[2] ); double det = DETERM( nodes[0]->coordinates().x(), nodes[0]->coordinates().y(), nodes[1]->coordinates().x(), nodes[1]->coordinates().y(), nodes[2]->coordinates().x(), nodes[2]->coordinates().y()); //PRINT_INFO("Det = %f\n",det); if(fabs(det) > CUBIT_DBL_MIN){ return CUBIT_TRUE; } return CUBIT_FALSE; }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::bowyer_watson_insert | ( | NODE * | point_ptr, |
DLIList< TRI * > & | tri_list, | ||
DLIList< TRI * > & | facet_list, | ||
int & | curr_visit_flag, | ||
SURF * | surf_ptr, | ||
TRI *& | last_tri | ||
) | [static, private] |
Definition at line 465 of file FacetorUtil.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; // mark the tris in the list so we can distinguish them from their // neighbors curr_visit_flag++; int ii, jj; TRI *tri_ptr; for (ii=0; ii<tri_list.size(); ii++) { tri_ptr = tri_list.get_and_step(); tri_visited( tri_ptr, CUBIT_TRUE, curr_visit_flag ); } //MBREWER: This is not an optimal test. But, we need need to //do some tests to try to ensure that the void is valid for what //we need. This is attempting to avoid crashes by not allowing nodes //to be inserted when the mesh starts diverging from the Delaunay //criteria. rv = valid_void( point_ptr, tri_list, surface_ptr, curr_visit_flag ); if(!rv) return rv; // find all edges at the boundary of the visited triangles and create // new triangles with them // create a new triangle with this edge and the node TRI *adjtri_ptr; TRI *new_tri = NULL; EDGE *edge_ptr; DLIList<EDGE *> edge_list; for (ii=0; ii<tri_list.size(); ii++) { tri_ptr = tri_list.get_and_step(); for (jj=0; jj<3; jj++){ int kk = jj; // - if TRI == CubitFacet // - kk will be corrected in adjacent() to // - give the correct EDGE index adjtri_ptr = tri_ptr->adjacent( kk, surface_ptr ); if (!adjtri_ptr || !tri_visited( adjtri_ptr, curr_visit_flag )) { edge_ptr = tri_ptr->edge(kk); assert(edge_list.append_unique( edge_ptr )); if(tri_ptr->sense(kk) == CUBIT_FORWARD) new_tri = (TRI *) new TRICHILD( edge_ptr->start_node(), edge_ptr->end_node(), point_ptr, surface_ptr); else new_tri = (TRI *) new TRICHILD( edge_ptr->end_node(), edge_ptr->start_node(), point_ptr, surface_ptr); facet_list.append(new_tri); } } } last_tri = new_tri; // delete the triangles in the original triangle list EDGE *del_edge_ptr; DLIList<EDGE *> del_edge_list; for (ii=0; ii<tri_list.size(); ii++) { tri_ptr = tri_list.get_and_step(); del_edge_list.clean_out(); facet_list.move_to(tri_ptr); facet_list.extract(); tri_ptr->edges( del_edge_list ); delete tri_ptr; // delete the unused edges for (jj=0; jj<del_edge_list.size(); jj++) { del_edge_ptr = del_edge_list.get_and_step(); if (del_edge_ptr->number_tris() == 0 && del_edge_ptr->number_faces() == 0 ) delete del_edge_ptr; } } return rv; }
MY_INLINE CubitVector & FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::circumcenter | ( | TRI * | tri_ptr | ) | [static, private] |
Definition at line 190 of file FacetorUtil.cpp.
{ ToolData *td = tri_ptr->get_TD( TDDelaunay<TRI,NODE>::is_delaunay ); TDDelaunay< TRI, NODE > *td_del = dynamic_cast<TDDelaunay< TRI, NODE >*> (td); if(td_del == NULL) { td_del = new TDDelaunay<TRI, NODE>(); tri_ptr->add_TD( td_del ); } return td_del->circumcenter2d( tri_ptr ); }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::classify_tri_by_angle | ( | TRI * | tri_ptr, |
DLIList< TRI * > * | sorted_lists, | ||
const int | num_lists, | ||
const double | interval, | ||
const double | quality_angle | ||
) | [static] |
Definition at line 695 of file FacetorUtil.cpp.
{ //CubitStatus rv = CUBIT_SUCCESS; // Determine the minimum angle NODE *nodes[3]; tri_ptr->tri_nodes( nodes[0], nodes[1], nodes[2] ); double x0 = nodes[0]->coordinates().x(); double y0 = nodes[0]->coordinates().y(); double x1 = nodes[1]->coordinates().x(); double y1 = nodes[1]->coordinates().y(); double x2 = nodes[2]->coordinates().x(); double y2 = nodes[2]->coordinates().y(); double ax = x1 - x0; double ay = y1 - y0; double bx = x2 - x0; double by = y2 - y0; double dot = ax*bx + ay*by; double a_mag = sqrt( ax*ax + ay*ay ); double b_mag = sqrt( bx*bx + by*by ); double angle0 = dot / ( a_mag * b_mag ); angle0 = acos( angle0 ); ax = -ax; ay = -ay; bx = x2 - x1; by = y2 - y1; dot = ax*bx + ay*by; b_mag = sqrt( bx*bx + by*by ); double angle1 = dot / ( a_mag * b_mag ); angle1 = acos( angle1 ); double angle2 = CUBIT_PI - angle0 - angle1; double min_angle = CUBIT_MIN( CUBIT_MIN(angle0,angle1), CUBIT_MIN(angle1,angle2) ); if (min_angle < 0.0) { assert(0); return CUBIT_FAILURE; } // If it is greater than the QUALITY_ANGLE then place it in // the triSortArray[0], otherwise place it in one of the other deques // depending upon its minimum angle // Determine which list int index; if (min_angle >= quality_angle) { index = 0; } else { index = 1 + (int)(min_angle/interval); if (index < 1) index = 1; if (index > num_lists-1) index = num_lists-1; } // Place it on a list sorted_lists[index].append( tri_ptr ); tri_sort_list( tri_ptr, index ); return CUBIT_SUCCESS; }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::exhaustive_locate_point | ( | CubitVector & | the_point, |
DLIList< TRI * > & | facet_list, | ||
TRI *& | tri_ptr | ||
) | [static, private] |
Definition at line 114 of file FacetorUtil.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; // loop until we find something int ii; NODE *n0, *n1, *n2; double aa, bb, cc; CubitBoolean found = CUBIT_FALSE; for (ii=0; ii<facet_list.size() && !found; ii++) { tri_ptr = facet_list.get_and_step(); tri_ptr->tri_nodes( n0, n1, n2 ); aa = DETERM(the_point.x(), the_point.y(), n1->coordinates().x(), n1->coordinates().y(), n2->coordinates().x(), n2->coordinates().y()); bb = DETERM(n0->coordinates().x(), n0->coordinates().y(), the_point.x(), the_point.y(), n2->coordinates().x(), n2->coordinates().y()); cc = DETERM(n0->coordinates().x(), n0->coordinates().y(), n1->coordinates().x(), n1->coordinates().y(), the_point.x(), the_point.y()); if (aa > -FT_INSIDE_TOL && bb > -FT_INSIDE_TOL && cc > -FT_INSIDE_TOL) { found = CUBIT_TRUE; // this is the one } } if (!found) { rv = CUBIT_FAILURE; tri_ptr = NULL; } return rv; }
MY_INLINE double FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::get_size | ( | CubitVector & | cc, |
TRI * | tri_ptr | ||
) | [static, private] |
Definition at line 599 of file FacetorUtil.cpp.
{ //extract data NODE *n0,*n1,*n2; CubitVector area_coord; tri_ptr->tri_nodes(n0,n1,n2); if (n0->coordinates().z() - 1.0 < fabs(FT_INSIDE_TOL) && n1->coordinates().z() - 1.0 < fabs(FT_INSIDE_TOL) && n2->coordinates().z() - 1.0 < fabs(FT_INSIDE_TOL) ) return 1.0; else { //get vectors CubitVector v0 = n0->coordinates(); CubitVector v1 = n1->coordinates(); CubitVector v2 = n2->coordinates(); //set z direction v0.z(cc.z()); v1.z(cc.z()); v2.z(cc.z()); //create points CubitPoint *p0 = (CubitPoint*) new CubitPointData(v0); CubitPoint *p1 = (CubitPoint*) new CubitPointData(v1); CubitPoint *p2 = (CubitPoint*) new CubitPointData(v2); //create facet CubitFacet *temp_facet = (CubitFacet*) new CubitFacetData(p0,p1,p2); FacetEvalTool::facet_area_coordinate(temp_facet, cc, area_coord); delete p0; delete p1; delete p2; delete temp_facet; return (area_coord.x()*n0->coordinates().z()) + (area_coord.y()*n1->coordinates().z()) + (area_coord.z()*n2->coordinates().z()); } }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::insert_at_circumcenter | ( | TRI * | tri_ptr, |
DLIList< TRI * > & | facet_list, | ||
TRI *& | start_tri, | ||
int & | curr_visit_flag, | ||
SURF * | surface_ptr, | ||
DLIList< TRI * > * | sorted_lists, | ||
const int | num_lists, | ||
const double | interval, | ||
const double | quality_angle, | ||
SIZEFUNC * | sizing_function, | ||
ParamTool * | p_tool | ||
) | [static] |
Definition at line 775 of file FacetorUtil.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; // find the cicumcenter of the triangle and the target size there //if nodes are colinear do not try to find circumenter if(!are_nodes_colinear(tri_ptr)) { PRINT_ERROR("Can't evaluate center of circumcircle\n"); return CUBIT_FAILURE; } CubitVector cc = circumcenter( tri_ptr ); //translate cc into 3D space CubitVector cc_xyz; p_tool->transform_to_xyz(cc_xyz, cc); // get target length in 3D space double target_length = sizing_function->size_at_point( cc_xyz ); // get new size double size = get_size(cc, tri_ptr); // update size cc.z(size); // update target_length target_length = target_length*size; // Determine if we should now insert the point. Allow insertions // in the general case down to circumcircle size of ALPHA times the // interpolated target edge length size. For tris with small // angles, allow additional inserts to improve the quality down // to 1/2 the target size if(!are_nodes_colinear(tri_ptr)) { PRINT_ERROR("Can't evaluate radius of circumcircle\n"); return CUBIT_FAILURE; } double r2 = radius( tri_ptr ); CubitBoolean insert = CUBIT_FALSE; int tsindex = tri_sort_list( tri_ptr ); assert(tsindex > -1); if (tsindex == 0) { if (r2 > SQR(ALPHA*target_length)) { insert = CUBIT_TRUE; } } else { if (r2 > SQR(0.5*ALPHA*target_length)) { insert = CUBIT_TRUE; } } if (insert) { // Determine the tris that will be affected by the insertion start_tri = tri_ptr; DLIList <TRI *> tri_list; rv = natural_neighbor_tris( cc, facet_list, start_tri, surface_ptr, curr_visit_flag, tri_list ); // If it was outside, then we are done with it if (tri_list.size() == 0) { return CUBIT_SUCCESS; } if (rv != CUBIT_SUCCESS) { return rv; } // See if we are too close to a boundary double x0, y0, x1, y1, cx, cy, edge_radius, dist; TRI *nntri_ptr; EDGE *edge_ptr; int ii, iedge; for (ii=0; ii<tri_list.size(); ii++) { nntri_ptr = tri_list.get_and_step(); for (iedge=0; iedge<3; iedge++) { edge_ptr = tri_ptr->edge( iedge ); // An edge encroaches if the distance from the prospective // new point to the midpoint of the edge is less than // half the length of the edge if (edge_ptr->marked()) // on the boundary? { x0 = (edge_ptr->start_node())->coordinates().x(); y0 = (edge_ptr->start_node())->coordinates().y(); x1 = (edge_ptr->end_node())->coordinates().x(); y1 = (edge_ptr->end_node())->coordinates().y(); cx = (x0 + x1) * 0.5; cy = (y0 + y1) * 0.5; edge_radius = sqrt(SQR(x1-x0) + SQR(y1-y0)) * 0.5; dist = sqrt( SQR(cx-cc.x()) + SQR(cy-cc.y()) ); // Edge encroaches: don't insert, return now if (dist - edge_radius < FT_INSIDE_TOL) { return CUBIT_SUCCESS; } } } } // Before inserting, remove all the tris on the neighbor // tri_list from the lists int index; for (ii=0; ii<tri_list.size(); ii++) { nntri_ptr = tri_list.get_and_step(); index = tri_sort_list( nntri_ptr ); assert(index >= 0); sorted_lists[index].remove( nntri_ptr ); } // Create the new node NODE *new_node_ptr = (NODE *)new NODECHILD( cc, surface_ptr ); // Insert the new node into the mesh rv = bowyer_watson_insert( new_node_ptr, tri_list, facet_list, curr_visit_flag, surface_ptr, start_tri); if (rv != CUBIT_SUCCESS) return rv; // get the new tris at the node and classify them tri_list.clean_out(); new_node_ptr->tris( tri_list ); for (ii=0; ii<tri_list.size() && rv == CUBIT_SUCCESS; ii++) { tri_ptr = tri_list.get_and_step(); rv = classify_tri_by_angle( tri_ptr, sorted_lists, num_lists, interval, quality_angle ); } } return rv; }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::insert_node | ( | NODE * | node_ptr, |
DLIList< TRI * > & | facet_list, | ||
SURF * | surface_ptr, | ||
int & | curr_visit_flag, | ||
TRI *& | last_tri | ||
) | [static] |
Definition at line 560 of file FacetorUtil.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; // get a list of all triangles whose circumcircle contain the point DLIList<TRI *> tri_list; CubitVector the_point = node_ptr->coordinates(); rv = natural_neighbor_tris( the_point, facet_list, last_tri, surface_ptr, curr_visit_flag, tri_list ); // Use a Bowyer-Watson insertion if (rv == CUBIT_SUCCESS) { rv = bowyer_watson_insert( node_ptr, tri_list, facet_list, curr_visit_flag, surface_ptr, last_tri); } return rv; }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::locate_point | ( | CubitVector & | the_point, |
DLIList< TRI * > & | facet_list, | ||
TRI * | starting_tri, | ||
SURF * | owning_surface, | ||
TRI *& | tri_ptr | ||
) | [static, private] |
Definition at line 26 of file FacetorUtil.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; // start with the last one found if (starting_tri != NULL) tri_ptr = starting_tri; // otherwise use the first one on the list else { tri_ptr = facet_list.get(); } // loop until we find something NODE *n0, *n1, *n2; double aa, bb, cc; CubitBoolean found = CUBIT_FALSE; //avoiding infinite loop int counter = 0; int max_count = facet_list.size(); while(!found && rv == CUBIT_SUCCESS) { tri_ptr->tri_nodes( n0, n1, n2 ); aa = DETERM(the_point.x(), the_point.y(), n1->coordinates().x(), n1->coordinates().y(), n2->coordinates().x(), n2->coordinates().y()); bb = DETERM(n0->coordinates().x(), n0->coordinates().y(), the_point.x(), the_point.y(), n2->coordinates().x(), n2->coordinates().y()); cc = DETERM(n0->coordinates().x(), n0->coordinates().y(), n1->coordinates().x(), n1->coordinates().y(), the_point.x(), the_point.y()); if (aa > -FT_INSIDE_TOL && bb > -FT_INSIDE_TOL && cc > -FT_INSIDE_TOL) { found = CUBIT_TRUE; // this is the one } else { // set up to check the next logical neighbor if (aa <= bb && aa <= cc) { int edge_index = 1; tri_ptr = tri_ptr->adjacent( edge_index, owning_surface ); } else if (bb <= aa && bb <= cc) { int edge_index = 2; tri_ptr = tri_ptr->adjacent( edge_index, owning_surface ); } else { int edge_index = 0; tri_ptr = tri_ptr->adjacent( edge_index, owning_surface ); } // check to see if we've left the triangulation // also make sure that we are not stuck in a cycle if (tri_ptr == NULL || counter > max_count) { if(counter>max_count){ PRINT_WARNING("Encountered problem locating a triangle; going to exhaustive search.\n"); } rv = exhaustive_locate_point( the_point, facet_list, tri_ptr ); found = CUBIT_TRUE; } } ++counter; } return rv; }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::natural_neighbor_tris | ( | CubitVector & | the_point, |
DLIList< TRI * > & | facet_list, | ||
TRI *& | start_tri, | ||
SURF * | surface_ptr, | ||
int & | curr_visit_flag, | ||
DLIList< TRI * > & | tri_list | ||
) | [static, private] |
Definition at line 337 of file FacetorUtil.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; // find the triangle the point is contained in //CubitVector areacoord; TRI *tri_ptr; rv = locate_point( the_point, facet_list, start_tri, surface_ptr, tri_ptr ); start_tri = tri_ptr; // keep track of visitation to triangles by incrementing curr_visit_flag // and comparing with the visit flag stored with the triangle curr_visit_flag++; // Recursively search, (starting with the tri the point is in) // search for all tris whose circumcircle contain the point and place // in the tri_list if (rv == CUBIT_SUCCESS) { tri_list.append( tri_ptr ); tri_visited( tri_ptr, CUBIT_TRUE, curr_visit_flag ); int iedge; TRI *adjtri_ptr; for (iedge=0; iedge<3 && rv == CUBIT_SUCCESS; iedge++) { int ii = iedge; adjtri_ptr = tri_ptr->adjacent( ii, surface_ptr ); if (adjtri_ptr != NULL && !tri_visited( adjtri_ptr, curr_visit_flag )){ rv = point_in_circumcircle( the_point, adjtri_ptr, tri_list, surface_ptr, curr_visit_flag); } } } return rv; }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::point_in_circumcircle | ( | CubitVector & | the_point, |
TRI * | tri_ptr, | ||
DLIList< TRI * > & | tri_list, | ||
SURF * | surface_ptr, | ||
int | curr_visit_flag | ||
) | [static, private] |
Definition at line 278 of file FacetorUtil.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; // check this triangle. If the nodes are colinear do not try to calculate //the circumcenter. if(!are_nodes_colinear(tri_ptr)) { PRINT_ERROR("Can't evaluate center of circumcircle\n"); return CUBIT_FAILURE; } CubitVector cc = circumcenter( tri_ptr ); tri_visited( tri_ptr, CUBIT_TRUE, curr_visit_flag ); double dist2 = SQR(the_point.x() - cc.x()) + SQR(the_point.y() - cc.y()); double r2 = radius( tri_ptr ); double tol_factor = CUBIT_MAX(CUBIT_MAX(tri_ptr->edge(0)->length(), tri_ptr->edge(1)->length()), tri_ptr->edge(2)->length()); //PRINT_INFO("Tolerance factor = %f\n", tol_factor); if (r2-dist2 > -(tol_factor*FT_INSIDE_TOL*FT_INSIDE_TOL))// inside or on circle { tri_list.append( tri_ptr ); // go to its neighbors int iedge; TRI *adjtri_ptr; for (iedge=0; iedge<3 && rv == CUBIT_SUCCESS; iedge++){ int ii = iedge; adjtri_ptr = tri_ptr->adjacent( ii, surface_ptr ); if (adjtri_ptr != NULL && !tri_visited( adjtri_ptr, curr_visit_flag )) { rv = point_in_circumcircle( the_point, adjtri_ptr, tri_list, surface_ptr, curr_visit_flag ); } } } return rv; }
MY_INLINE double FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::radius | ( | TRI * | tri_ptr | ) | [static, private] |
Definition at line 257 of file FacetorUtil.cpp.
{ ToolData *td = tri_ptr->get_TD( TDDelaunay< TRI, NODE >::is_delaunay ); TDDelaunay< TRI, NODE > *td_del = dynamic_cast<TDDelaunay< TRI, NODE >*> (td); if (td_del == NULL) { td_del = new TDDelaunay< TRI, NODE >(); tri_ptr->add_TD( td_del ); } return td_del->radius2d( tri_ptr ); }
MY_INLINE void FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::tri_sort_list | ( | TRI * | tri_ptr, |
int | sort_list_index | ||
) | [static, private] |
Definition at line 651 of file FacetorUtil.cpp.
{ ToolData *td = facet_ptr->get_TD( TDDelaunay< TRI, NODE >::is_delaunay ); TDDelaunay< TRI, NODE > *td_del = dynamic_cast<TDDelaunay< TRI, NODE >*> (td); if (td_del == NULL) { td_del = new TDDelaunay<TRI, NODE>(); facet_ptr->add_TD( td_del ); } td_del->tri_sort_list(sort_list_index); }
MY_INLINE int FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::tri_sort_list | ( | TRI * | tri_ptr | ) | [static, private] |
Definition at line 674 of file FacetorUtil.cpp.
{ ToolData *td = facet_ptr->get_TD( TDDelaunay< TRI, NODE >::is_delaunay ); TDDelaunay< TRI, NODE > *td_del = dynamic_cast<TDDelaunay< TRI, NODE >*> (td); if (td_del == NULL) { td_del = new TDDelaunay<TRI, NODE>(); facet_ptr->add_TD( td_del ); } return td_del->tri_sort_list(); }
MY_INLINE CubitBoolean FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::tri_visited | ( | TRI * | tri_ptr, |
int | curr_visit_flag | ||
) | [static, private] |
Definition at line 209 of file FacetorUtil.cpp.
{ ToolData *td = tri_ptr->get_TD( TDDelaunay< TRI, NODE >::is_delaunay ); TDDelaunay< TRI, NODE > *td_del = dynamic_cast<TDDelaunay< TRI, NODE >*> (td); if (td_del == NULL) { td_del = new TDDelaunay< TRI, NODE >(); tri_ptr->add_TD( td_del ); } return (td_del->visit_flag() == curr_visit_flag); }
MY_INLINE void FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::tri_visited | ( | TRI * | tri_ptr, |
CubitBoolean | visited, | ||
int | curr_visit_flag | ||
) | [static, private] |
Definition at line 231 of file FacetorUtil.cpp.
{ ToolData *td = facet_ptr->get_TD( TDDelaunay< TRI, NODE >::is_delaunay ); TDDelaunay< TRI, NODE > *td_del = dynamic_cast<TDDelaunay< TRI, NODE >*> (td); if (td_del == NULL) { td_del = new TDDelaunay< TRI, NODE >(); facet_ptr->add_TD( td_del ); } if (visited) td_del->visit_flag(curr_visit_flag); else td_del->visit_flag(INT_MIN); }
MY_INLINE CubitStatus FacetorUtil< SURF, TRI, EDGE, NODE, TRICHILD, NODECHILD, SIZEFUNC >::valid_void | ( | NODE * | , |
DLIList< TRI * > & | tri_list, | ||
SURF * | surface_ptr, | ||
int | curr_visit_flag | ||
) | [static, private] |
Definition at line 391 of file FacetorUtil.cpp.
{ int temp_i, temp_j; DLIList<EDGE*> boundary_edge_list; DLIList<NODE*> boundary_node_list; TRI *adjtri_ptr; TRI *tri_ptr; EDGE *edge_ptr; DLIList<EDGE *> edge_list; //loop over the tri's in tri_list and find all of the curves //on the boundary of the set (ie, on the boundary of the void). for (temp_i=0; temp_i<tri_list.size(); temp_i++) { tri_ptr = tri_list.get_and_step(); //check each edge to see whether it is a boundary edge or not for (temp_j=0; temp_j<3; temp_j++){ int kk = temp_j; // - if TRI == CubitFacet // - kk will be corrected in adjacent() to // - give the correct EDGE index adjtri_ptr = tri_ptr->adjacent( kk, surface_ptr ); if (!adjtri_ptr || !tri_visited( adjtri_ptr, curr_visit_flag )) { edge_ptr = tri_ptr->edge(kk); boundary_edge_list.append(edge_ptr); } } } int list_size = boundary_edge_list.size(); //uniquify the boundary edge list boundary_edge_list.uniquify_ordered(); //the list shouldn't have changed size during the uniquify. //if it did, there is a problem. if(list_size != boundary_edge_list.size()){ PRINT_WARNING("Unexpected result. Edge was duplicated on boundary.\n"); return CUBIT_FAILURE; } //loop over the boundary edges and get the nodes in the boundary loop for(temp_i=0; temp_i<list_size; ++temp_i){ edge_ptr=boundary_edge_list.get_and_step(); boundary_node_list.append(edge_ptr->end_node()); boundary_node_list.append(edge_ptr->start_node()); } list_size = boundary_node_list.size(); //each node should be in exactly two edges. First make sure that there //are the correct number of nodes. if(list_size%2){ PRINT_WARNING("Unexpected result. Node not listed twice.\n"); return CUBIT_FAILURE; } //now uniquify to make sure that the nodes were listed the correct number //of times. boundary_node_list.uniquify_ordered(); if( (list_size/2) != boundary_node_list.size()){ PRINT_WARNING("Unexpected result. Node was listed an incorrect number of times.\n"); return CUBIT_FAILURE; } return CUBIT_SUCCESS; }