cgma
|
#include <FBIntersect.hpp>
Public Member Functions | |
FBIntersect () | |
CubitStatus | intersect (const std::vector< double > &Ticoords, const std::vector< int > &Ticonnections, const std::vector< double > &Tjcoords, const std::vector< int > &Tjconnections, std::vector< int > &duddedTiFacets, std::vector< int > &duddedTjFacets, std::vector< int > &newTiFacets, std::vector< int > &newTjFacets, std::vector< int > &newTiFacetsIndex, std::vector< int > &newTjFacetsIndex, std::vector< double > &newTiPoints, std::vector< double > &newTjPoints, std::vector< int > &edgesTi, std::vector< int > &edgesTj) |
CubitStatus | intersect (const std::vector< double > &Ticoords, const std::vector< int > &Ticonnections, const std::vector< double > &Tjcoords, const std::vector< int > &Tjconnections, std::vector< int > &newTiFacets, std::vector< int > &newTjFacets, std::vector< int > *indices1, std::vector< int > *indices2) |
~FBIntersect () | |
void | set_classify_flag (bool value) |
CubitStatus | gather_by_boolean (std::vector< double > &out_coords, std::vector< int > &out_connections, std::vector< int > *out_surf_index, std::vector< int > *out_curve_index, std::vector< bool > *is_body_1, const CubitFacetboolOp op) |
CubitStatus | update_surfs_and_curves (std::vector< double > &out_coords, std::vector< int > &out_connections, std::vector< int > *out_surf_index, std::vector< int > *out_curve_index, const int whichone) |
CubitStatus | get_persistent_entity_info (bool *surfs_in, bool *curves_in, bool *surfs_out, bool *curves_out, const CubitFacetboolOp op, const int whichparent) |
void | set_body1_planar () |
void | set_body2_planar () |
void | set_imprint () |
Private Member Functions | |
CubitStatus | pair_intersect () |
int | get_vertex (FBPolyhedron *poly, int vtx, IntegerHash *hashobj, std::vector< double > &out_coords, int &num_sofar) |
int | makeahashvaluefrom_coord (double x, double y, double z) |
CubitStatus | tri_tri_intersect (FB_Triangle *tri1, FB_Triangle *tri2) |
CubitStatus | add_intersection_edges (FB_Triangle *tri1, FB_Triangle *tri2, double *tt, int *edge_vert_type) |
void | get_point_from_parameter (double parameter, double *x, double *y, double *z) |
double | get_distance_parameter (double *xc0, double *xc1, double d0, double d1) |
double | get_distance_parameter_single (double *xc) |
int | get_intersectionline_parameter_values (double d0, double d1, double d2, double *pt0, double *pt1, double *pt2, double &t0, double &t1, int &vert_type_0, int &vert_type_1) |
int | determine_edge_vert_type (int vtype1, int vtype2) |
void | newplanecoefficients (FBPolyhedron *poly, FB_Triangle *tri) |
CubitStatus | store_connectivity (std::vector< int > &out_connections, int vertnum1, int vertnum2, int vertnum3) |
Private Attributes | |
double | linecoeff [3] |
double | linept [3] |
FBPolyhedron * | poly1 |
FBPolyhedron * | poly2 |
bool | do_edges_only |
bool | do_classify |
bool | do_imprint |
bool | body1_is_plane |
bool | body2_is_plane |
bool | nothing_intersected |
std::vector< int > * | f_c_indices1 |
std::vector< int > * | f_c_indices2 |
FBClassify * | classify1 |
FBClassify * | classify2 |
Definition at line 39 of file FBIntersect.hpp.
Definition at line 35 of file FBIntersect.cpp.
{ poly1 = poly2 = 0; do_classify = false; do_edges_only = false; do_imprint = false; classify1 = classify2 = 0; body1_is_plane = body2_is_plane = false; f_c_indices1 = f_c_indices2 = 0; nothing_intersected = false; }
CubitStatus FBIntersect::add_intersection_edges | ( | FB_Triangle * | tri1, |
FB_Triangle * | tri2, | ||
double * | tt, | ||
int * | edge_vert_type | ||
) | [private] |
Definition at line 713 of file FBIntersect.cpp.
{ int v10, v11, v20, v21; bool ifoundit, exists; FB_Edge *edge; double x1pt, y1pt, z1pt, x2pt, y2pt, z2pt; int edge1_vert0_type, edge1_vert1_type, edge2_vert0_type, edge2_vert1_type; ifoundit = false; edge1_vert0_type = edge1_vert1_type = edge2_vert0_type = edge2_vert1_type = UNKNOWN; // Try to handle the epsilon cases by forcing tt[] values that are almost // equal to be equal. if ( fabs(tt[0]-tt[2]) < EPSILON ) tt[2] = tt[0]; if ( fabs(tt[0]-tt[3]) < EPSILON ) tt[3] = tt[0]; if ( fabs(tt[1]-tt[2]) < EPSILON ) tt[2] = tt[1]; if ( fabs(tt[1]-tt[3]) < EPSILON ) tt[3] = tt[1]; // cases 0 and 9, no overlap // if ( (tt[1] < tt[2]) || (tt[3] < tt[0]) ) return CUBIT_SUCCESS; if ( tt[1] < tt[2] ) { return CUBIT_SUCCESS; } if ( tt[3] < tt[0] ) { return CUBIT_SUCCESS; } // These next four cases are by far the most common forms of overlap, // so check for them first. // The 1's (e.g.: 11111111) refer to the portion of the line of intersection // that is in tri1; the 2's for tri2. The case numbers were arbirtarily assigned. // case 4 // 11111111 // 2222 if ( (tt[2] > tt[0]) && (tt[3] < tt[1]) ) { ifoundit = true; get_point_from_parameter(tt[2],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[3],&x2pt,&y2pt,&z2pt); edge1_vert0_type = INTERIOR_VERT; edge1_vert1_type = INTERIOR_VERT; edge2_vert0_type = edge_vert_type[2]; edge2_vert1_type = edge_vert_type[3]; // case 2 // 11111111 // 22222222 } else if ( (tt[2] < tt[1]) && (tt[2] > tt[0]) && (tt[3] > tt[1]) ) { ifoundit = true; get_point_from_parameter(tt[2],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[1],&x2pt,&y2pt,&z2pt); edge1_vert0_type = INTERIOR_VERT; edge1_vert1_type = edge_vert_type[1]; edge2_vert0_type = edge_vert_type[2]; edge2_vert1_type = INTERIOR_VERT; // case 7 // 11111111 // 22222222 } else if ( (tt[0] < tt[3]) && (tt[0] > tt[2]) && (tt[1] > tt[3]) ) { ifoundit = true; get_point_from_parameter(tt[0],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[3],&x2pt,&y2pt,&z2pt); edge1_vert0_type = edge_vert_type[0]; edge1_vert1_type = INTERIOR_VERT; edge2_vert0_type = INTERIOR_VERT; edge2_vert1_type = edge_vert_type[3]; // case 12 // 1111 // 22222222 } else if ( (tt[0] > tt[2]) && (tt[1] < tt[3]) ) { ifoundit = true; get_point_from_parameter(tt[0],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[1],&x2pt,&y2pt,&z2pt); edge1_vert0_type = edge_vert_type[0]; edge1_vert1_type = edge_vert_type[1]; edge2_vert0_type = INTERIOR_VERT; edge2_vert1_type = INTERIOR_VERT; // case 1 // 11111111 // 22222222 } else if ( fabs(tt[1]-tt[2]) < EPSILON ) { ifoundit = true; // return CUBIT_SUCCESS; get_point_from_parameter(tt[1],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[1],&x2pt,&y2pt,&z2pt); edge1_vert0_type = edge_vert_type[1]; edge1_vert1_type = edge_vert_type[1]; edge2_vert0_type = edge_vert_type[2]; edge2_vert1_type = edge_vert_type[2]; // case 3 } else if ( tt[0] < tt[2] ) { // case 3 // 11111111 // 22222 if ( tt[1] == tt[3] ) { ifoundit = true; get_point_from_parameter(tt[2],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[3],&x2pt,&y2pt,&z2pt); edge1_vert0_type = INTERIOR_VERT; edge1_vert1_type = edge_vert_type[1]; edge2_vert0_type = edge_vert_type[2]; edge2_vert1_type = edge_vert_type[3]; } // case 5, 6, or 11 } else if ( fabs(tt[0]-tt[2]) < EPSILON ) { // case 5 // 11111111 // 22222222 if ( tt[1] == tt[3] ) { ifoundit = true; get_point_from_parameter(tt[0],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[1],&x2pt,&y2pt,&z2pt); edge1_vert0_type = edge_vert_type[0]; edge1_vert1_type = edge_vert_type[1]; edge2_vert0_type = edge_vert_type[2]; edge2_vert1_type = edge_vert_type[3]; // case 6 // 11111111 // 2222 } else if ( tt[1] > tt[3] ) { ifoundit = true; get_point_from_parameter(tt[2],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[3],&x2pt,&y2pt,&z2pt); edge1_vert0_type = edge_vert_type[0]; edge1_vert1_type = INTERIOR_VERT; edge2_vert0_type = edge_vert_type[2]; edge2_vert1_type = edge_vert_type[3]; // case 11 // 1111 // 22222222 } else { ifoundit = true; get_point_from_parameter(tt[0],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[1],&x2pt,&y2pt,&z2pt); edge1_vert0_type = edge_vert_type[0]; edge1_vert1_type = edge_vert_type[1]; edge2_vert0_type = edge_vert_type[2]; edge2_vert1_type = INTERIOR_VERT; } // case 8 or 10 } else { // case 8 // 11111111 // 22222222 if ( fabs(tt[0]-tt[3]) < EPSILON ) { ifoundit = true; // return CUBIT_SUCCESS; get_point_from_parameter(tt[0],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[0],&x2pt,&y2pt,&z2pt); edge1_vert0_type = edge_vert_type[0]; edge1_vert1_type = edge_vert_type[0]; edge2_vert0_type = edge_vert_type[3]; edge2_vert1_type = edge_vert_type[3]; // case 10 // 1111 // 22222222 } else if ( fabs(tt[1]-tt[3]) < EPSILON ) { ifoundit = true; get_point_from_parameter(tt[0],&x1pt,&y1pt,&z1pt); get_point_from_parameter(tt[1],&x2pt,&y2pt,&z2pt); edge1_vert0_type = edge_vert_type[0]; edge1_vert1_type = edge_vert_type[1]; edge2_vert0_type = INTERIOR_VERT; edge2_vert1_type = edge_vert_type[3]; } } if ( ifoundit == false ) { PRINT_ERROR("unaccounted for case in add_intersection_edges: tt[] = %e %e %e %e\n", tt[0],tt[1],tt[2],tt[3]); return CUBIT_FAILURE; } else { tri1->dudded = true; v10 = poly1->addavertex(x1pt,y1pt,z1pt); v11 = poly1->addavertex(x2pt,y2pt,z2pt); if ( v10 != v11 ) { exists = poly1->edge_exists_in_tri(*tri1,v10,v11); if ( exists == false ) { if ( edge1_vert0_type == INTERIOR_VERT ) edge1_vert0_type = determine_edge_vert_type(edge_vert_type[0], edge_vert_type[1]); if ( edge1_vert1_type == INTERIOR_VERT ) edge1_vert1_type = determine_edge_vert_type(edge_vert_type[0], edge_vert_type[1]); edge = new FB_Edge(v10,v11,edge1_vert0_type,edge1_vert1_type,true); tri1->edge_list.push_back(edge); if ( poly1->edge_exists(v10,v11) == false ) poly1->intersection_edges.push_back(edge); } } else { int edge_type = UNKNOWN; int vtype1 = UNKNOWN_VERT, vtype2 = UNKNOWN_VERT; int v_other1 = UNKNOWN_VERT, v_other2 = UNKNOWN_VERT; // edge_type = UNKNOWN; if ( edge1_vert0_type == EDGE_2 ) { v_other1 = tri1->v0; v_other2 = tri1->v2; edge_type = EDGE_2; vtype1 = VERTEX_0; vtype2 = VERTEX_2; } else if ( edge1_vert0_type == EDGE_1 ) { v_other1 = tri1->v1; v_other2 = tri1->v2; edge_type = EDGE_1; vtype1 = VERTEX_1; vtype2 = VERTEX_2; } else if ( edge1_vert0_type == EDGE_0 ) { v_other1 = tri1->v0; v_other2 = tri1->v1; edge_type = EDGE_0; vtype1 = VERTEX_0; vtype2 = VERTEX_1; } if ( edge_type != UNKNOWN ) { exists = poly1->edge_exists_in_tri(*tri1,v_other1,v10); if ( exists == false ) { edge = new FB_Edge(v_other1,v10,vtype1,edge_type,false); tri1->edge_list.push_back(edge); if ( poly1->edge_exists(v_other1,v10) == false ) poly1->intersection_edges.push_back(edge); } exists = poly1->edge_exists_in_tri(*tri1,v10,v_other2); if ( exists == false ) { edge = new FB_Edge(v10,v_other2,edge_type,vtype2,false); tri1->edge_list.push_back(edge); if ( poly1->edge_exists(v10,v_other2) == false ) poly1->intersection_edges.push_back(edge); } } } tri2->dudded = true; v20 = poly2->addavertex(x1pt,y1pt,z1pt); v21 = poly2->addavertex(x2pt,y2pt,z2pt); if ( v20 != v21) { exists = poly2->edge_exists_in_tri(*tri2,v20,v21); if ( exists == false ) { if ( edge2_vert0_type == INTERIOR_VERT ) edge2_vert0_type = determine_edge_vert_type(edge_vert_type[2], edge_vert_type[3]); if ( edge2_vert1_type == INTERIOR_VERT ) edge2_vert1_type = determine_edge_vert_type(edge_vert_type[2], edge_vert_type[3]); edge = new FB_Edge(v20,v21,edge2_vert0_type,edge2_vert1_type,true); tri2->edge_list.push_back(edge); if ( poly2->edge_exists(v20,v21) == false ) poly2->intersection_edges.push_back(edge); } } else { int edge_type = UNKNOWN; int vtype1 = UNKNOWN_VERT, vtype2 = UNKNOWN_VERT; int v_other1 = UNKNOWN_VERT, v_other2 = UNKNOWN_VERT; // edge_type = UNKNOWN; if ( edge2_vert0_type == EDGE_2 ) { v_other1 = tri2->v0; v_other2 = tri2->v2; edge_type = EDGE_2; vtype1 = VERTEX_0; vtype2 = VERTEX_2; } else if ( edge2_vert0_type == EDGE_1 ) { v_other1 = tri2->v1; v_other2 = tri2->v2; edge_type = EDGE_1; vtype1 = VERTEX_1; vtype2 = VERTEX_2; } else if ( edge2_vert0_type == EDGE_0 ) { v_other1 = tri2->v0; v_other2 = tri2->v1; edge_type = EDGE_0; vtype1 = VERTEX_0; vtype2 = VERTEX_1; } if ( edge_type != UNKNOWN ) { exists = poly2->edge_exists_in_tri(*tri2,v_other1,v20); if ( exists == false ) { edge = new FB_Edge(v_other1,v20,vtype1,edge_type,false); tri2->edge_list.push_back(edge); if ( poly2->edge_exists(v_other1,v20) == false ) poly2->intersection_edges.push_back(edge); } exists = poly2->edge_exists_in_tri(*tri2,v20,v_other2); if ( exists == false ) { edge = new FB_Edge(v20,v_other2,edge_type,vtype2,false); tri2->edge_list.push_back(edge); if ( poly2->edge_exists(v20,v_other2) == false ) poly2->intersection_edges.push_back(edge); } } } } return CUBIT_SUCCESS; }
int FBIntersect::determine_edge_vert_type | ( | int | vtype1, |
int | vtype2 | ||
) | [inline, private] |
Definition at line 141 of file FBIntersect.hpp.
{ if ( ( (vtype1 == VERTEX_0) && (vtype2 == VERTEX_1) ) || ( (vtype1 == VERTEX_1) && (vtype2 == VERTEX_0) ) ) return EDGE_0; else if ( ( (vtype1 == VERTEX_1) && (vtype2 == VERTEX_2) ) || ( (vtype1 == VERTEX_2) && (vtype2 == VERTEX_1) ) ) return EDGE_1; else if ( ( (vtype1 == VERTEX_2) && (vtype2 == VERTEX_0) ) || ( (vtype1 == VERTEX_0) && (vtype2 == VERTEX_2) ) ) return EDGE_2; else return INTERIOR_VERT; }
CubitStatus FBIntersect::gather_by_boolean | ( | std::vector< double > & | out_coords, |
std::vector< int > & | out_connections, | ||
std::vector< int > * | out_surf_index, | ||
std::vector< int > * | out_curve_index, | ||
std::vector< bool > * | is_body_1, | ||
const CubitFacetboolOp | op | ||
) |
Definition at line 1337 of file FBIntersect.cpp.
{ CubitStatus status; std::vector<int> *group1, *group2, *groupcharacterization1, *groupcharacterization2; std::vector<int>::iterator it, ig; int booltest1, booltest2; if ( nothing_intersected == true && op !=CUBIT_FB_UNION) { return CUBIT_SUCCESS; } if ( !poly1 || !poly2 ) { PRINT_ERROR("Error: Objects for Booleans must first be created.\n"); return CUBIT_FAILURE; } if ( !classify1 || !classify2 ) { PRINT_ERROR("Error: Objects for Booleans must first be classified.\n"); return CUBIT_FAILURE; } if ( op == CUBIT_FB_UNION ) { booltest1 = FB_ORIENTATION_OUTSIDE + FB_ORIENTATION_SAME; booltest2 = FB_ORIENTATION_OUTSIDE; } else if ( op == CUBIT_FB_INTERSECTION ) { booltest1 = FB_ORIENTATION_INSIDE + FB_ORIENTATION_SAME; booltest2 = FB_ORIENTATION_INSIDE; } else if ( op == CUBIT_FB_SUBTRACTION ) { booltest1 = FB_ORIENTATION_OUTSIDE+ FB_ORIENTATION_OPPOSITE; booltest2 = FB_ORIENTATION_INSIDE; } else { PRINT_ERROR("Error: Unrecognized Boolean operation.\n"); return CUBIT_FAILURE; } classify1->get_group(&group1, &groupcharacterization1); classify2->get_group(&group2, &groupcharacterization2); IntegerHash *hashobj = new IntegerHash(NUMHASHBINS,20); it = group1->begin(); ig = groupcharacterization1->begin(); unsigned int i; int vtx, vertnum1, vertnum2, vertnum3, verts_sofar; i = 0; verts_sofar = 0; while ( it != group1->end() ) { if ( ( *(ig + *it) & booltest1 ) != 0 ) { vtx = poly1->tris[i]->v0; vertnum1 = get_vertex(poly1, vtx, hashobj, out_coords, verts_sofar); vtx = poly1->tris[i]->v1; vertnum2 = get_vertex(poly1, vtx, hashobj, out_coords, verts_sofar); vtx = poly1->tris[i]->v2; vertnum3 = get_vertex(poly1, vtx, hashobj, out_coords, verts_sofar); if ( store_connectivity( out_connections, vertnum1, vertnum2, vertnum3 ) != CUBIT_SUCCESS ) { return CUBIT_FAILURE; } if ( out_surf_index ) { out_surf_index->push_back(poly1->tris[i]->cubitsurfaceindex); } if ( out_curve_index ) { out_curve_index->push_back(poly1->tris[i]->cubitedge0index); out_curve_index->push_back(poly1->tris[i]->cubitedge1index); out_curve_index->push_back(poly1->tris[i]->cubitedge2index); } if ( is_body_1 ) is_body_1->push_back(true); } it++; i++; } it = group2->begin(); ig = groupcharacterization2->begin(); i = 0; while ( it != group2->end() ) { if ( ( *(ig + *it) & booltest2 ) != 0 ) { vtx = poly2->tris[i]->v0; vertnum1 = get_vertex(poly2, vtx, hashobj, out_coords, verts_sofar); vtx = poly2->tris[i]->v1; vertnum2 = get_vertex(poly2, vtx, hashobj, out_coords, verts_sofar); vtx = poly2->tris[i]->v2; vertnum3 = get_vertex(poly2, vtx, hashobj, out_coords, verts_sofar); if ( op == CUBIT_FB_SUBTRACTION ) // reverse the winding { if ( store_connectivity( out_connections, vertnum1, vertnum3, vertnum2 ) != CUBIT_SUCCESS ) { return CUBIT_FAILURE; } if ( out_curve_index ) { out_curve_index->push_back(poly2->tris[i]->cubitedge2index); out_curve_index->push_back(poly2->tris[i]->cubitedge1index); out_curve_index->push_back(poly2->tris[i]->cubitedge0index); } } else { if ( store_connectivity( out_connections, vertnum1, vertnum2, vertnum3 ) != CUBIT_SUCCESS ) { return CUBIT_FAILURE; } if ( out_curve_index ) { out_curve_index->push_back(poly2->tris[i]->cubitedge0index); out_curve_index->push_back(poly2->tris[i]->cubitedge1index); out_curve_index->push_back(poly2->tris[i]->cubitedge2index); } } if ( out_surf_index ) out_surf_index->push_back(poly2->tris[i]->cubitsurfaceindex); if ( is_body_1 ) is_body_1->push_back(false); } it++; i++; } // GfxDebug::clear(); // poly1->debug_draw_boundary_edges(CUBIT_MAGENTA_INDEX); // GfxDebug::mouse_xforms(); // GfxDebug::clear(); // poly2->debug_draw_boundary_edges(CUBIT_GREEN_INDEX); delete hashobj; status = CUBIT_SUCCESS; return status; }
double FBIntersect::get_distance_parameter | ( | double * | xc0, |
double * | xc1, | ||
double | d0, | ||
double | d1 | ||
) | [inline, private] |
Definition at line 1036 of file FBIntersect.cpp.
{ double v1dot, v2dot; // dot the coordinates onto the line. // Assume that it has been checked already that d0 != d1. v1dot = linecoeff[0]*(xc0[0] - linept[0]) + linecoeff[1]*(xc0[1] - linept[1]) + linecoeff[2]*(xc0[2] - linept[2]); v2dot = linecoeff[0]*(xc1[0] - linept[0]) + linecoeff[1]*(xc1[1] - linept[1]) + linecoeff[2]*(xc1[2] - linept[2]); return v1dot + (v2dot - v1dot)*d0/(d0-d1); }
double FBIntersect::get_distance_parameter_single | ( | double * | xc | ) | [inline, private] |
Definition at line 1056 of file FBIntersect.cpp.
int FBIntersect::get_intersectionline_parameter_values | ( | double | d0, |
double | d1, | ||
double | d2, | ||
double * | pt0, | ||
double * | pt1, | ||
double * | pt2, | ||
double & | t0, | ||
double & | t1, | ||
int & | vert_type_0, | ||
int & | vert_type_1 | ||
) | [private] |
Definition at line 1073 of file FBIntersect.cpp.
{ int ret = 0; // ret holds the nnumber of intersections of the line with the triangle. if ( fabs(d0) < EPSILON ) { if ( fabs(d1) < EPSILON ) { if ( fabs(d2) < EPSILON ) { // coplanar ret = 0; } else { // d0 = d1 = 0 t0 = get_distance_parameter_single(pt0); t1 = get_distance_parameter_single(pt1); vert_type_0 = VERTEX_0; vert_type_1 = VERTEX_1; ret = 2; } } else if ( fabs(d2) < EPSILON ) { // d0 = d2 = 0 t0 = get_distance_parameter_single(pt0); t1 = get_distance_parameter_single(pt2); vert_type_0 = VERTEX_0; vert_type_1 = VERTEX_2; ret = 2; } else if ( d1*d2 < 0.0 ) { // d0 = 0 and edge 12 crosses t0 = get_distance_parameter_single(pt0); t1 = get_distance_parameter(pt1,pt2,d1,d2); vert_type_0 = VERTEX_0; vert_type_1 = EDGE_1; ret = 2; } else { // d0 = 0 and no edges cross ret = 0; } } else if ( fabs(d1) < EPSILON ) { if ( fabs(d2) < EPSILON ) { // d1 = d2 = 0 t0 = get_distance_parameter_single(pt1); t1 = get_distance_parameter_single(pt2); vert_type_0 = VERTEX_1; vert_type_1 = VERTEX_2; ret = 2; } else if ( d0*d2 < 0.0 ) { // d1 = 0 and edge 20 crosses t0 = get_distance_parameter_single(pt1); t1 = get_distance_parameter(pt0,pt2,d0,d2); vert_type_0 = VERTEX_1; vert_type_1 = EDGE_2; ret = 2; } else { // d1 = 0 and no edges cross ret = 0; } } else if ( fabs(d2) < EPSILON ) { if ( d0*d1 < 0.0 ) { // d2 = 0 and edge 01 crosses t0 = get_distance_parameter_single(pt2); t1 = get_distance_parameter(pt0,pt1,d0,d1); vert_type_0 = VERTEX_2; vert_type_1 = EDGE_0; ret = 2; } else { // d2 = 0 and no edges cross ret = 0; } } else if ( d0*d1 < 0.0 ) { if ( d0*d2 < 0.0 ) { // edges 01 and 02 cross t0 = get_distance_parameter(pt0,pt1,d0,d1); t1 = get_distance_parameter(pt0,pt2,d0,d2); vert_type_0 = EDGE_0; vert_type_1 = EDGE_2; ret = 2; } else { // edges 01 and 12 cross t0 = get_distance_parameter(pt0,pt1,d0,d1); t1 = get_distance_parameter(pt1,pt2,d1,d2); vert_type_0 = EDGE_0; vert_type_1 = EDGE_1; ret = 2; } } else { // edges 02 and 12 cross t0 = get_distance_parameter(pt0,pt2,d0,d2); t1 = get_distance_parameter(pt1,pt2,d1,d2); vert_type_0 = EDGE_2; vert_type_1 = EDGE_1; ret = 2; } if ( ret == 2 ) { // Sort them if necessary. if ( t0 > t1 ) { int itemp; double dtemp; dtemp = t0; t0 = t1; t1 = dtemp; itemp = vert_type_0; vert_type_0 = vert_type_1; vert_type_1 = itemp; } } return ret; }
CubitStatus FBIntersect::get_persistent_entity_info | ( | bool * | surfs_in, |
bool * | curves_in, | ||
bool * | surfs_out, | ||
bool * | curves_out, | ||
const CubitFacetboolOp | op, | ||
const int | whichparent | ||
) |
Definition at line 1197 of file FBIntersect.cpp.
{ std::vector<int> *group, *groupcharacterization; std::vector<int>::iterator it, ig; int booltest1, booltest2, booltest1a, booltest2a, booltest_in, booltest_out; FBPolyhedron *poly; if ( nothing_intersected == true ) return CUBIT_SUCCESS; if ( !poly1 || !poly2 ) { PRINT_ERROR("Error: Objects for Booleans must first be created.\n"); return CUBIT_FAILURE; } if ( !classify1 || !classify2 ) { PRINT_ERROR("Error: Objects for Booleans must first be classified.\n"); return CUBIT_FAILURE; } if ( (whichparent < 1) || (whichparent > 2) ) { PRINT_ERROR("Error: Requested nonexistent object.\n"); return CUBIT_FAILURE; } if ( op == CUBIT_FB_UNION ) { booltest1 = FB_ORIENTATION_INSIDE + FB_ORIENTATION_SAME; booltest2 = FB_ORIENTATION_INSIDE; booltest1a = FB_ORIENTATION_OUTSIDE + FB_ORIENTATION_SAME; booltest2a = FB_ORIENTATION_OUTSIDE; } else if ( op == CUBIT_FB_INTERSECTION ) { booltest1 = FB_ORIENTATION_INSIDE + FB_ORIENTATION_SAME; booltest2 = FB_ORIENTATION_INSIDE; booltest1a = FB_ORIENTATION_OUTSIDE+ FB_ORIENTATION_OPPOSITE; booltest2a = FB_ORIENTATION_INSIDE; } else if ( op == CUBIT_FB_SUBTRACTION ) { booltest1 = FB_ORIENTATION_OUTSIDE+ FB_ORIENTATION_OPPOSITE; booltest2 = FB_ORIENTATION_INSIDE; booltest1a = FB_ORIENTATION_INSIDE + FB_ORIENTATION_SAME; booltest2a = FB_ORIENTATION_INSIDE; } else { PRINT_ERROR("Error: Unrecognized Boolean operation.\n"); return CUBIT_FAILURE; } if ( whichparent == 1 ) { booltest_in = booltest1; booltest_out = booltest1a; classify1->get_group(&group, &groupcharacterization); poly = poly1; } else { booltest_in = booltest2; booltest_out = booltest2a; classify2->get_group(&group, &groupcharacterization); poly = poly2; } unsigned int i; int isurf, icurve0, icurve1, icurve2; it = group->begin(); ig = groupcharacterization->begin(); i = 0; while ( it != group->end() ) { if ( ( *(ig + *it) & booltest_in ) != 0 ) { // vtx = poly1->tris[i]->v0; isurf = poly->tris[i]->cubitsurfaceindex; if ( isurf > 0 ) surfs_in[isurf] = true; icurve0 = poly->tris[i]->cubitedge0index; if ( icurve0 > 0 ) curves_in[icurve0] = true; icurve1 = poly->tris[i]->cubitedge1index; if ( icurve1 > 0 ) curves_in[icurve1] = true; icurve2 = poly->tris[i]->cubitedge2index; if ( icurve2 > 0 ) curves_in[icurve2] = true; } it++; i++; } it = group->begin(); ig = groupcharacterization->begin(); i = 0; while ( it != group->end() ) { if ( ( *(ig + *it) & booltest_out ) != 0 ) { isurf = poly->tris[i]->cubitsurfaceindex; if ( isurf > 0 ) surfs_out[isurf] = true; icurve0 = poly->tris[i]->cubitedge0index; if ( icurve0 > 0 ) curves_out[icurve0] = true; icurve1 = poly->tris[i]->cubitedge1index; if ( icurve1 > 0 ) curves_out[icurve1] = true; icurve2 = poly->tris[i]->cubitedge2index; if ( icurve2 > 0 ) curves_out[icurve2] = true; } it++; i++; } return CUBIT_SUCCESS; }
void FBIntersect::get_point_from_parameter | ( | double | parameter, |
double * | x, | ||
double * | y, | ||
double * | z | ||
) | [inline, private] |
int FBIntersect::get_vertex | ( | FBPolyhedron * | poly, |
int | vtx, | ||
IntegerHash * | hashobj, | ||
std::vector< double > & | out_coords, | ||
int & | num_sofar | ||
) | [private] |
Definition at line 1521 of file FBIntersect.cpp.
{ double xx, yy, zz, xval, yval, zval; int i, hashvalue, *hasharrayptr, hasharraysize, hptr, ifoundit; xx = poly->verts[vtx]->coord[0]; yy = poly->verts[vtx]->coord[1]; zz = poly->verts[vtx]->coord[2]; hashvalue = makeahashvaluefrom_coord(xx,yy,zz); hasharrayptr = hashobj->getHashBin(hashvalue,&hasharraysize); ifoundit = -1; for ( i = 0; i < hasharraysize; i++ ) { hptr = hasharrayptr[i]; xval = out_coords[3*hptr]; yval = out_coords[3*hptr+1]; zval = out_coords[3*hptr+2]; if ( ( fabs(xval-xx) < EPSILON ) && ( fabs(yval-yy) < EPSILON ) && ( fabs(zval-zz) < EPSILON ) ) { ifoundit = hasharrayptr[i]; break; } } if ( ifoundit == -1 ) { ifoundit = num_sofar; hashobj->addtoHashList(hashvalue,num_sofar); out_coords.push_back(xx); out_coords.push_back(yy); out_coords.push_back(zz); num_sofar++; } return ifoundit; }
CubitStatus FBIntersect::intersect | ( | const std::vector< double > & | Ticoords, |
const std::vector< int > & | Ticonnections, | ||
const std::vector< double > & | Tjcoords, | ||
const std::vector< int > & | Tjconnections, | ||
std::vector< int > & | duddedTiFacets, | ||
std::vector< int > & | duddedTjFacets, | ||
std::vector< int > & | newTiFacets, | ||
std::vector< int > & | newTjFacets, | ||
std::vector< int > & | newTiFacetsIndex, | ||
std::vector< int > & | newTjFacetsIndex, | ||
std::vector< double > & | newTiPoints, | ||
std::vector< double > & | newTjPoints, | ||
std::vector< int > & | edgesTi, | ||
std::vector< int > & | edgesTj | ||
) |
Definition at line 55 of file FBIntersect.cpp.
{ CubitStatus status; bool boxes_intersect; status = CUBIT_SUCCESS; if ( Ticoords.size()%3 != 0 ) { PRINT_ERROR("Bad coordinates for first part fed to FBIntersect.\n"); return CUBIT_FAILURE; } if ( Tjcoords.size()%3 != 0 ) { PRINT_ERROR("Bad coordinates for second part fed to FBIntersect.\n"); return CUBIT_FAILURE; } if ( Ticonnections.size()%3 != 0 ) { PRINT_ERROR("Bad connection list for first part fed to FBIntersect.\n"); return CUBIT_FAILURE; } if ( Tjconnections.size()%3 != 0 ) { PRINT_ERROR("Bad connection list for second part fed to FBIntersect.\n"); return CUBIT_FAILURE; } poly1 = new FBPolyhedron; status = poly1->makepoly(Ticoords,Ticonnections,f_c_indices1); if ( status != CUBIT_SUCCESS ) { return status; } poly2 = new FBPolyhedron; status = poly2->makepoly(Tjcoords,Tjconnections,f_c_indices2); if ( status != CUBIT_SUCCESS ) { return status; } boxes_intersect = poly1->boxintersection(poly2); if ( boxes_intersect == false ) { nothing_intersected = true; return status; } status = pair_intersect(); if ( status != CUBIT_SUCCESS ) { return status; } poly1->putnewpoints(newTiPoints); poly2->putnewpoints(newTjPoints); poly1->putedges(edgesTi); poly2->putedges(edgesTj); status = poly1->retriangulate(newTiFacets, newTiFacetsIndex); if ( status != CUBIT_SUCCESS ) { return status; } status = poly2->retriangulate(newTjFacets, newTjFacetsIndex); if ( status != CUBIT_SUCCESS ) { return status; } unsigned int i; for ( i = 0; i < poly1->tris.size(); i++ ) { if ( poly1->tris[i]->dudded == true ) duddedTiFacets.push_back(i); } for ( i = 0; i < poly2->tris.size(); i++ ) { if ( poly2->tris[i]->dudded == true ) duddedTjFacets.push_back(i); } // newxxFacets is updated in FBRetriangulate::make_this_tri() after // a new triangle has been made. Also newxxFacetsIndex is updated if // any new facets were made. But this update points to the start of // newxxFacets. Therefore we have to add on the last member to // newxxFacetsIndex here. newTiFacetsIndex.push_back(newTiFacets.size()); newTjFacetsIndex.push_back(newTjFacets.size()); // If classification of the intersected surface parts is needed, we need to // do some things. bool other_is_planar; if ( do_classify == true ) { poly1->add_new_triangle_data(); poly2->add_new_triangle_data(); poly1->removeduddedtriangles(); poly2->removeduddedtriangles(); classify1 = new FBClassify; classify1->SetPoly(poly1, poly2); status = classify1->Group(1); if ( status != CUBIT_SUCCESS ) { return status; } other_is_planar = body2_is_plane; status = classify1->CharacterizeGroups(1,other_is_planar); if ( status != CUBIT_SUCCESS ) { return status; } classify2 = new FBClassify; classify2->SetPoly(poly1, poly2); status = classify2->Group(2); if ( status != CUBIT_SUCCESS ) { return status; } other_is_planar = body1_is_plane; status = classify2->CharacterizeGroups(2,other_is_planar); if ( status != CUBIT_SUCCESS ) { return status; } } return status; }
CubitStatus FBIntersect::intersect | ( | const std::vector< double > & | Ticoords, |
const std::vector< int > & | Ticonnections, | ||
const std::vector< double > & | Tjcoords, | ||
const std::vector< int > & | Tjconnections, | ||
std::vector< int > & | newTiFacets, | ||
std::vector< int > & | newTjFacets, | ||
std::vector< int > * | indices1, | ||
std::vector< int > * | indices2 | ||
) |
Definition at line 194 of file FBIntersect.cpp.
{ CubitStatus status; bool boxes_intersect; status = CUBIT_SUCCESS; if ( Ticoords.size()%3 != 0 ) { PRINT_ERROR("Bad coordinates for first part fed to FBIntersect.\n"); return CUBIT_FAILURE; } if ( Tjcoords.size()%3 != 0 ) { PRINT_ERROR("Bad coordinates for second part fed to FBIntersect.\n"); return CUBIT_FAILURE; } if ( Ticonnections.size()%3 != 0 ) { PRINT_ERROR("Bad connection list for first part fed to FBIntersect.\n"); return CUBIT_FAILURE; } if ( Tjconnections.size()%3 != 0 ) { PRINT_ERROR("Bad connection list for second part fed to FBIntersect.\n"); return CUBIT_FAILURE; } f_c_indices1 = indices1; f_c_indices2 = indices2; poly1 = new FBPolyhedron; status = poly1->makepoly(Ticoords,Ticonnections,f_c_indices1); if ( status != CUBIT_SUCCESS ) { return status; } poly2 = new FBPolyhedron; status = poly2->makepoly(Tjcoords,Tjconnections,f_c_indices2); if ( status != CUBIT_SUCCESS ) { return status; } double min_angle=0.0, max_angle=0.0; int mydebug = 0; if(mydebug){ poly1->min_max_angles_in_polyhedron(min_angle, max_angle); PRINT_INFO("(0) Min angle in poly1 %f, max angle %f\n", min_angle, max_angle); poly2->min_max_angles_in_polyhedron(min_angle, max_angle); PRINT_INFO("(0) Min angle in poly2 %f, max angle %f\n", min_angle, max_angle); } boxes_intersect = poly1->boxintersection(poly2); if ( boxes_intersect == false ) { nothing_intersected = true; //don't return because in the case of union we need to unite the //bodies even if they do not intersect //return status; } else{ status = pair_intersect(); if ( status != CUBIT_SUCCESS ) { return status; } } if(mydebug){ poly1->min_max_angles_in_polyhedron(min_angle, max_angle); PRINT_INFO("(1) Min angle in poly1 %f, max angle %f\n", min_angle, max_angle); poly2->min_max_angles_in_polyhedron(min_angle, max_angle); PRINT_INFO("(1) Min angle in poly2 %f, max angle %f\n", min_angle, max_angle); } status = poly1->retriangulate(newTiFacets); if ( status != CUBIT_SUCCESS ) { return status; } status = poly2->retriangulate(newTjFacets); if ( status != CUBIT_SUCCESS ) { return status; } if(mydebug){ GfxDebug::clear(); poly1->debug_draw_boundary_edges(CUBIT_BLUE_INDEX); GfxDebug::mouse_xforms(); GfxDebug::clear(); poly2->debug_draw_boundary_edges(CUBIT_RED_INDEX); GfxDebug::mouse_xforms(); poly1->min_max_angles_in_polyhedron(min_angle, max_angle); PRINT_INFO("(2) Min angle in poly1 %f, max angle %f\n", min_angle, max_angle); poly2->min_max_angles_in_polyhedron(min_angle, max_angle); PRINT_INFO("(2) Min angle in poly2 %f, max angle %f\n", min_angle, max_angle); } // If classification of the intersected surface parts is needed, we need to // do some things. bool other_is_planar; if ( do_classify == true ) { poly1->add_new_triangle_data(); poly2->add_new_triangle_data(); poly1->removeduddedtriangles(); poly2->removeduddedtriangles(); classify1 = new FBClassify; classify1->SetPoly(poly1, poly2); status = classify1->Group(1); if ( status != CUBIT_SUCCESS ) { return status; } other_is_planar = body2_is_plane; status = classify1->CharacterizeGroups(1,other_is_planar); if ( status != CUBIT_SUCCESS ) { return status; } classify2 = new FBClassify; classify2->SetPoly(poly1, poly2); status = classify2->Group(2); if ( status != CUBIT_SUCCESS ) { return status; } other_is_planar = body1_is_plane; status = classify2->CharacterizeGroups(2,other_is_planar); if ( status != CUBIT_SUCCESS ) { return status; } } return status; }
int FBIntersect::makeahashvaluefrom_coord | ( | double | x, |
double | y, | ||
double | z | ||
) | [private] |
Definition at line 1559 of file FBIntersect.cpp.
{ double mantissasum; if ( fabs(x) < 1.e-3 ) x = 0.0; if ( fabs(y) < 1.e-3 ) y = 0.0; if ( fabs(z) < 1.e-3 ) z = 0.0; mantissasum = (int)(10000.0*fabs(x) + 0.5) + (int)(10000.0*fabs(y) + 0.5) + (int)(10000.0*fabs(z) + 0.5); return (int)(mantissasum) % NUMHASHBINS; }
void FBIntersect::newplanecoefficients | ( | FBPolyhedron * | poly, |
FB_Triangle * | tri | ||
) | [private] |
Definition at line 1589 of file FBIntersect.cpp.
{ FB_Coord *mycoord; double x1, x2, x3, y1, y2, y3, z1, z2, z3, e1x, e1y, e1z, e2x, e2y, e2z; double a, b, c, d, dtemp; mycoord = poly->verts[tri->v0]; x1 = mycoord->coord[0]; y1 = mycoord->coord[1]; z1 = mycoord->coord[2]; mycoord = poly->verts[tri->v1]; x2 = mycoord->coord[0]; y2 = mycoord->coord[1]; z2 = mycoord->coord[2]; mycoord = poly->verts[tri->v2]; x3 = mycoord->coord[0]; y3 = mycoord->coord[1]; z3 = mycoord->coord[2]; e1x = x1 - x2; e1y = y1 - y2; e1z = z1 - z2; e2x = x3 - x2; e2y = y3 - y2; e2z = z3 - z2; a = e1z*e2y - e2z*e1y; b = e1x*e2z - e2x*e1z; c = e1y*e2x - e2y*e1x; dtemp = sqrt(a*a + b*b + c*c); if ( dtemp > EPSILON2 ) { a /= dtemp; b /= dtemp; c /= dtemp; } else { PRINT_WARNING("small-area triangle\n"); } d = -(a*x1 + b*y1 + c*z1); tri->a = a; tri->b = b; tri->c = c; tri->d = d; }
CubitStatus FBIntersect::pair_intersect | ( | ) | [private] |
Definition at line 344 of file FBIntersect.cpp.
{ CubitStatus status; unsigned int i, j, k; int numboxesfound, *boxlist; double dtemp; boxlist = new int[poly2->tris.size()]; status = CUBIT_SUCCESS; for ( i = 0; i < poly1->tris.size(); i++ ) { FB_Triangle *tri1 = poly1->tris[i]; if ( (tri1->boundingbox.xmax < poly2->polyxmin) || (tri1->boundingbox.xmin > poly2->polyxmax) || (tri1->boundingbox.ymax < poly2->polyymin) || (tri1->boundingbox.ymin > poly2->polyymax) || (tri1->boundingbox.zmax < poly2->polyzmin) || (tri1->boundingbox.zmin > poly2->polyzmax) ) continue; poly2->kdtree->box_kdtree_intersect(tri1->boundingbox,&numboxesfound,boxlist); for ( j = 0; j < (unsigned int)numboxesfound; j++ ) { FB_Triangle *tri2 = poly2->tris[boxlist[j]]; if ( (tri1->boundingbox.xmax < tri2->boundingbox.xmin) || (tri1->boundingbox.xmin > tri2->boundingbox.xmax) || (tri1->boundingbox.ymax < tri2->boundingbox.ymin) || (tri1->boundingbox.ymin > tri2->boundingbox.ymax) || (tri1->boundingbox.zmax < tri2->boundingbox.zmin ) || (tri1->boundingbox.zmin > tri2->boundingbox.zmax) ) continue; int mydebug = 0; if ( mydebug ) { // Draw the 2 facets which are intersecting. GfxDebug::clear(); poly1->debug_draw_boundary_edges(CUBIT_YELLOW_INDEX); poly2->debug_draw_boundary_edges(CUBIT_PINK_INDEX); poly1->debug_draw_fb_triangle(tri1); poly2->debug_draw_fb_triangle(tri2); GfxDebug::mouse_xforms(); } // Find the line of intersection of the two triangle planes. linecoeff[0] = tri1->c*tri2->b - tri1->b*tri2->c; linecoeff[1] = tri1->a*tri2->c - tri1->c*tri2->a; linecoeff[2] = tri1->b*tri2->a - tri1->a*tri2->b; if ( (fabs(linecoeff[0]) < EPSILON) && (fabs(linecoeff[1]) < EPSILON) && (fabs(linecoeff[2]) < EPSILON) ) { if ( do_imprint == true ) continue; // Don't intersect nearly-coplanar triangles. // calculate the distance between the triangles. Just because they are coplanar // does not mean we have to intersect. If the distance between them is larger than // GEOMETRY_RESABS, then just continue on. double dist = poly1->verts[tri1->v2]->coord[0]*tri2->a + poly1->verts[tri1->v2]->coord[1]*tri2->b + poly1->verts[tri1->v2]->coord[2]*tri2->c + tri2->d; if ( dist > GEOMETRY_RESABS ) { continue; } // coplanar triangles; tilt each vertex of the triangle up successively // and then do the usual tri-tri intersection. double ta, tb, tc, td; double tx1[3],ty1[3],tz1[3]; // triangle 1 ta = tri1->a; tb = tri1->b; tc = tri1->c; td = tri1->d; for ( k = 0; k < 3; k++ ) { tx1[k] = poly1->verts[tri1->v0]->coord[k]; ty1[k] = poly1->verts[tri1->v1]->coord[k]; tz1[k] = poly1->verts[tri1->v2]->coord[k]; } poly1->verts[tri1->v2]->coord[0] += ta; poly1->verts[tri1->v2]->coord[1] += tb; poly1->verts[tri1->v2]->coord[2] += tc; // Compute new normal and linecoeff newplanecoefficients(poly1, tri1); linecoeff[0] = tri1->c*tri2->b - tri1->b*tri2->c; linecoeff[1] = tri1->a*tri2->c - tri1->c*tri2->a; linecoeff[2] = tri1->b*tri2->a - tri1->a*tri2->b; dtemp = sqrt(linecoeff[0]*linecoeff[0] + linecoeff[1]*linecoeff[1] + linecoeff[2]*linecoeff[2]); linecoeff[0] /= dtemp; linecoeff[1] /= dtemp; linecoeff[2] /= dtemp; status = tri_tri_intersect(tri1,tri2); if ( status != CUBIT_SUCCESS ) { return status; } // Restore values. poly1->verts[tri1->v2]->coord[0] = tz1[0]; poly1->verts[tri1->v2]->coord[1] = tz1[1]; poly1->verts[tri1->v2]->coord[2] = tz1[2]; tri1->a = ta; tri1->b = tb; tri1->c = tc; tri1->d = td; poly1->verts[tri1->v1]->coord[0] += ta; poly1->verts[tri1->v1]->coord[1] += tb; poly1->verts[tri1->v1]->coord[2] += tc; // Compute new normal and linecoeff newplanecoefficients(poly1, tri1); linecoeff[0] = tri1->c*tri2->b - tri1->b*tri2->c; linecoeff[1] = tri1->a*tri2->c - tri1->c*tri2->a; linecoeff[2] = tri1->b*tri2->a - tri1->a*tri2->b; dtemp = sqrt(linecoeff[0]*linecoeff[0] + linecoeff[1]*linecoeff[1] + linecoeff[2]*linecoeff[2]); linecoeff[0] /= dtemp; linecoeff[1] /= dtemp; linecoeff[2] /= dtemp; status = tri_tri_intersect(tri1,tri2); if ( status != CUBIT_SUCCESS ) { return status; } // Restore values. poly1->verts[tri1->v1]->coord[0] = ty1[0]; poly1->verts[tri1->v1]->coord[1] = ty1[1]; poly1->verts[tri1->v1]->coord[2] = ty1[2]; tri1->a = ta; tri1->b = tb; tri1->c = tc; tri1->d = td; poly1->verts[tri1->v0]->coord[0] += ta; poly1->verts[tri1->v0]->coord[1] += tb; poly1->verts[tri1->v0]->coord[2] += tc; // Compute new normal and linecoeff newplanecoefficients(poly1, tri1); linecoeff[0] = tri1->c*tri2->b - tri1->b*tri2->c; linecoeff[1] = tri1->a*tri2->c - tri1->c*tri2->a; linecoeff[2] = tri1->b*tri2->a - tri1->a*tri2->b; dtemp = sqrt(linecoeff[0]*linecoeff[0] + linecoeff[1]*linecoeff[1] + linecoeff[2]*linecoeff[2]); linecoeff[0] /= dtemp; linecoeff[1] /= dtemp; linecoeff[2] /= dtemp; status = tri_tri_intersect(tri1,tri2); if ( status != CUBIT_SUCCESS ) { return status; } // Restore values. poly1->verts[tri1->v0]->coord[0] = tx1[0]; poly1->verts[tri1->v0]->coord[1] = tx1[1]; poly1->verts[tri1->v0]->coord[2] = tx1[2]; tri1->a = ta; tri1->b = tb; tri1->c = tc; tri1->d = td; // triangle 2 ta = tri2->a; tb = tri2->b; tc = tri2->c; td = tri2->d; for ( k = 0; k < 3; k++ ) { tx1[k] = poly2->verts[tri2->v0]->coord[k]; ty1[k] = poly2->verts[tri2->v1]->coord[k]; tz1[k] = poly2->verts[tri2->v2]->coord[k]; } poly2->verts[tri2->v2]->coord[0] += ta; poly2->verts[tri2->v2]->coord[1] += tb; poly2->verts[tri2->v2]->coord[2] += tc; // Compute new normal and linecoeff newplanecoefficients(poly2, tri2); linecoeff[0] = tri1->c*tri2->b - tri1->b*tri2->c; linecoeff[1] = tri1->a*tri2->c - tri1->c*tri2->a; linecoeff[2] = tri1->b*tri2->a - tri1->a*tri2->b; dtemp = sqrt(linecoeff[0]*linecoeff[0] + linecoeff[1]*linecoeff[1] + linecoeff[2]*linecoeff[2]); linecoeff[0] /= dtemp; linecoeff[1] /= dtemp; linecoeff[2] /= dtemp; status = tri_tri_intersect(tri1,tri2); if ( status != CUBIT_SUCCESS ) { return status; } // Restore values. poly2->verts[tri2->v2]->coord[0] = tz1[0]; poly2->verts[tri2->v2]->coord[1] = tz1[1]; poly2->verts[tri2->v2]->coord[2] = tz1[2]; tri2->a = ta; tri2->b = tb; tri2->c = tc; tri2->d = td; poly2->verts[tri2->v1]->coord[0] += ta; poly2->verts[tri2->v1]->coord[1] += tb; poly2->verts[tri2->v1]->coord[2] += tc; // Compute new normal and linecoeff newplanecoefficients(poly2, tri2); linecoeff[0] = tri1->c*tri2->b - tri1->b*tri2->c; linecoeff[1] = tri1->a*tri2->c - tri1->c*tri2->a; linecoeff[2] = tri1->b*tri2->a - tri1->a*tri2->b; dtemp = sqrt(linecoeff[0]*linecoeff[0] + linecoeff[1]*linecoeff[1] + linecoeff[2]*linecoeff[2]); linecoeff[0] /= dtemp; linecoeff[1] /= dtemp; linecoeff[2] /= dtemp; status = tri_tri_intersect(tri1,tri2); if ( status != CUBIT_SUCCESS ) { return status; } // Restore values. poly2->verts[tri2->v1]->coord[0] = ty1[0]; poly2->verts[tri2->v1]->coord[1] = ty1[1]; poly2->verts[tri2->v1]->coord[2] = ty1[2]; tri2->a = ta; tri2->b = tb; tri2->c = tc; tri2->d = td; poly2->verts[tri2->v0]->coord[0] += ta; poly2->verts[tri2->v0]->coord[1] += tb; poly2->verts[tri2->v0]->coord[2] += tc; // Compute new normal and linecoeff newplanecoefficients(poly2, tri2); linecoeff[0] = tri1->c*tri2->b - tri1->b*tri2->c; linecoeff[1] = tri1->a*tri2->c - tri1->c*tri2->a; linecoeff[2] = tri1->b*tri2->a - tri1->a*tri2->b; dtemp = sqrt(linecoeff[0]*linecoeff[0] + linecoeff[1]*linecoeff[1] + linecoeff[2]*linecoeff[2]); linecoeff[0] /= dtemp; linecoeff[1] /= dtemp; linecoeff[2] /= dtemp; status = tri_tri_intersect(tri1,tri2); if ( status != CUBIT_SUCCESS ) { return status; } // Restore values. poly2->verts[tri2->v0]->coord[0] = tx1[0]; poly2->verts[tri2->v0]->coord[1] = tx1[1]; poly2->verts[tri2->v0]->coord[2] = tx1[2]; tri2->a = ta; tri2->b = tb; tri2->c = tc; tri2->d = td; continue; } if ( do_imprint == true ) { // Don't intersect nearly-coplanar triangles. if ( fabs(tri1->a*tri2->a + tri1->b*tri2->b +tri1->c*tri2->c) > 0.8 ) continue; } double dtemp; dtemp = sqrt(linecoeff[0]*linecoeff[0] + linecoeff[1]*linecoeff[1] + linecoeff[2]*linecoeff[2]); linecoeff[0] /= dtemp; linecoeff[1] /= dtemp; linecoeff[2] /= dtemp; status = tri_tri_intersect(tri1,tri2); if ( status != CUBIT_SUCCESS ) { return status; } } // end of loop over poly2 } // end of loop over poly1 //delete entire array. delete [] boxlist; return status; }
void FBIntersect::set_body1_planar | ( | ) |
Definition at line 1574 of file FBIntersect.cpp.
{ body1_is_plane = true; }
void FBIntersect::set_body2_planar | ( | ) |
Definition at line 1579 of file FBIntersect.cpp.
{ body2_is_plane = true; }
void FBIntersect::set_classify_flag | ( | bool | value | ) |
Definition at line 1192 of file FBIntersect.cpp.
{ do_classify = value; }
void FBIntersect::set_imprint | ( | ) |
Definition at line 1584 of file FBIntersect.cpp.
{ do_imprint = true; }
CubitStatus FBIntersect::store_connectivity | ( | std::vector< int > & | out_connections, |
int | vertnum1, | ||
int | vertnum2, | ||
int | vertnum3 | ||
) | [private] |
Definition at line 1501 of file FBIntersect.cpp.
{ if ( vertnum1 == vertnum2 || vertnum2 == vertnum3 || vertnum1 == vertnum3 ) { PRINT_ERROR( "Cannot continue without generating a degenerate facet.\n" ); return CUBIT_FAILURE; } out_connections.push_back(vertnum1); out_connections.push_back(vertnum2); out_connections.push_back(vertnum3); return CUBIT_SUCCESS; }
CubitStatus FBIntersect::tri_tri_intersect | ( | FB_Triangle * | tri1, |
FB_Triangle * | tri2 | ||
) | [private] |
Definition at line 621 of file FBIntersect.cpp.
{ int ret1, ret2, i; double xc10[3], xc11[3],xc12[3]; // coords for poly1 triangle double xc20[3], xc21[3],xc22[3]; // coords for poly2 triangle double d10, d11, d12, d20, d21, d22; // distance of vertex from plane of other triangle double tt[4]; int edge_vert_type[4]; CubitStatus status; int mydebug = 0; status = CUBIT_SUCCESS; tt[0] = tt[1] = tt[2] = tt[3] = CUBIT_DBL_MAX; // Is tri1 entirely on one side of tri2? for ( i = 0; i < 3; i++ ) { xc10[i] = poly1->verts[tri1->v0]->coord[i]; xc11[i] = poly1->verts[tri1->v1]->coord[i]; xc12[i] = poly1->verts[tri1->v2]->coord[i]; } // distance of each tri1 vert to plane of tri2 d10 = xc10[0]*tri2->a + xc10[1]*tri2->b + xc10[2]*tri2->c + tri2->d; d11 = xc11[0]*tri2->a + xc11[1]*tri2->b + xc11[2]*tri2->c + tri2->d; d12 = xc12[0]*tri2->a + xc12[1]*tri2->b + xc12[2]*tri2->c + tri2->d; if ( ( (d10 < -EPSILON2) && (d11 < -EPSILON2) && (d12 < -EPSILON2) ) || ( (d10 > EPSILON2) && (d11 > EPSILON2) && (d12 > EPSILON2) ) ) return CUBIT_SUCCESS; // Is tri2 entirely on one side of tri1? for ( i = 0; i < 3; i++ ) { xc20[i] = poly2->verts[tri2->v0]->coord[i]; xc21[i] = poly2->verts[tri2->v1]->coord[i]; xc22[i] = poly2->verts[tri2->v2]->coord[i]; } // distance of each tri2 vert to plane of tri1 d20 = xc20[0]*tri1->a + xc20[1]*tri1->b + xc20[2]*tri1->c + tri1->d; d21 = xc21[0]*tri1->a + xc21[1]*tri1->b + xc21[2]*tri1->c + tri1->d; d22 = xc22[0]*tri1->a + xc22[1]*tri1->b + xc22[2]*tri1->c + tri1->d; if ( ( (d20 < -EPSILON2) && (d21 < -EPSILON2) && (d22 < -EPSILON2) ) || ( (d20 > EPSILON2) && (d21 > EPSILON2) && (d22 > EPSILON2) ) ) return CUBIT_SUCCESS; // Get a point on the line of intersection to serve as a reference point. double ta, tb, ts1, ts2, tdot11; ts1 = -tri1->d; ts2 = -tri2->d; tdot11 = tri1->a*tri2->a + tri1->b*tri2->b + tri1->c*tri2->c; ta = (ts2*tdot11 - ts1)/(tdot11*tdot11 - 1); tb = (ts1*tdot11 - ts2)/(tdot11*tdot11 - 1); linept[0] = ta*tri1->a + tb*tri2->a; linept[1] = ta*tri1->b + tb*tri2->b; linept[2] = ta*tri1->c + tb*tri2->c; // There are several cases for the distances. // ret1 holds the number of intersections of the triangle with the // intersection line. // Do tri1. ret1 = get_intersectionline_parameter_values(d10,d11,d12, xc10,xc11,xc12, tt[0],tt[1], edge_vert_type[0],edge_vert_type[1]); // Do tri2. ret2 = get_intersectionline_parameter_values(d20,d21,d22, xc20,xc21,xc22, tt[2],tt[3], edge_vert_type[2],edge_vert_type[3]); // If not two intersections for each triangle, no intersection edge exists. if ( (ret1 == 2) && (ret2 == 2) ) { status = add_intersection_edges(tri1,tri2,tt,edge_vert_type); if ( status != CUBIT_SUCCESS ) { return status; } } if(mydebug){ double min_angle_1, max_angle_1; double min_angle_2, max_angle_2; poly1->min_max_angles_in_fb_triangle(tri1, min_angle_1, max_angle_1); poly2->min_max_angles_in_fb_triangle(tri2, min_angle_2, max_angle_2); if(min_angle_1 < 10 || min_angle_2 < 10){ PRINT_INFO(" Tri 1 min angle = %f\n",min_angle_1); PRINT_INFO(" Tri 2 min angle = %f\n",min_angle_2); } } return status; }
CubitStatus FBIntersect::update_surfs_and_curves | ( | std::vector< double > & | out_coords, |
std::vector< int > & | out_connections, | ||
std::vector< int > * | out_surf_index, | ||
std::vector< int > * | out_curve_index, | ||
const int | whichone | ||
) |
Definition at line 1308 of file FBIntersect.cpp.
{ unsigned int i; FBPolyhedron *poly; if ( whichone == 1 ) poly = poly1; else poly = poly2; for ( i = 0; i < poly->verts.size(); i++ ) { out_coords.push_back(poly->verts[i]->coord[0]); out_coords.push_back(poly->verts[i]->coord[1]); out_coords.push_back(poly->verts[i]->coord[2]); } for ( i = 0; i < poly->tris.size(); i++ ) { if ( poly->tris[i]->dudded == true ) continue; out_connections.push_back(poly->tris[i]->v0); out_connections.push_back(poly->tris[i]->v1); out_connections.push_back(poly->tris[i]->v2); out_surf_index->push_back(poly->tris[i]->cubitsurfaceindex); out_curve_index->push_back(poly->tris[i]->cubitedge0index); out_curve_index->push_back(poly->tris[i]->cubitedge1index); out_curve_index->push_back(poly->tris[i]->cubitedge2index); } return CUBIT_SUCCESS; }
bool FBIntersect::body1_is_plane [private] |
Definition at line 108 of file FBIntersect.hpp.
bool FBIntersect::body2_is_plane [private] |
Definition at line 108 of file FBIntersect.hpp.
FBClassify* FBIntersect::classify1 [private] |
Definition at line 111 of file FBIntersect.hpp.
FBClassify * FBIntersect::classify2 [private] |
Definition at line 111 of file FBIntersect.hpp.
bool FBIntersect::do_classify [private] |
Definition at line 106 of file FBIntersect.hpp.
bool FBIntersect::do_edges_only [private] |
Definition at line 105 of file FBIntersect.hpp.
bool FBIntersect::do_imprint [private] |
Definition at line 107 of file FBIntersect.hpp.
std::vector<int>* FBIntersect::f_c_indices1 [private] |
Definition at line 110 of file FBIntersect.hpp.
std::vector<int> * FBIntersect::f_c_indices2 [private] |
Definition at line 110 of file FBIntersect.hpp.
double FBIntersect::linecoeff[3] [private] |
Definition at line 102 of file FBIntersect.hpp.
double FBIntersect::linept[3] [private] |
Definition at line 103 of file FBIntersect.hpp.
bool FBIntersect::nothing_intersected [private] |
Definition at line 109 of file FBIntersect.hpp.
FBPolyhedron* FBIntersect::poly1 [private] |
Definition at line 104 of file FBIntersect.hpp.
FBPolyhedron * FBIntersect::poly2 [private] |
Definition at line 104 of file FBIntersect.hpp.