cgma
|
#include <FacetParamTool.hpp>
Public Member Functions | |
FacetParamTool (int numn, int nume, double *nodes, int *tri) | |
FacetParamTool (Surface *surf) | |
~FacetParamTool () | |
CubitStatus | set_up_space (void) |
CubitStatus | transform_to_uv (const CubitVector &xyz_location, CubitVector &uv_location) |
CubitStatus | transform_to_xyz (CubitVector &xyz_location, const CubitVector &uv_location) |
CubitStatus | locate_point_in_uv (FacetSurface *surf, const CubitVector &the_point, CubitFacet *&tri_ptr) |
CubitStatus | exhaustive_locate_point_in_uv (FacetSurface *surf, const CubitVector &the_point, CubitFacet *&tri_ptr) |
Private Attributes | |
Surface * | refSurf |
Definition at line 21 of file FacetParamTool.hpp.
FacetParamTool::FacetParamTool | ( | int | numn, |
int | nume, | ||
double * | nodes, | ||
int * | tri | ||
) |
Definition at line 37 of file FacetParamTool.cpp.
{}
FacetParamTool::FacetParamTool | ( | Surface * | surf | ) |
Definition at line 47 of file FacetParamTool.cpp.
{ refSurf = surf; }
Definition at line 58 of file FacetParamTool.cpp.
{}
CubitStatus FacetParamTool::exhaustive_locate_point_in_uv | ( | FacetSurface * | surf, |
const CubitVector & | the_point, | ||
CubitFacet *& | tri_ptr | ||
) |
Definition at line 395 of file FacetParamTool.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; DLIList<CubitFacet *> facet_list; surf->get_eval_tool()->get_facets(facet_list); // loop until we find something CubitPoint *p0, *p1, *p2; int ii; double aa, bb, cc; double u0, u1, u2, v0, v1, v2; CubitBoolean found = CUBIT_FALSE; for(ii = 0; ii < facet_list.size() && !found; ii++) { tri_ptr = facet_list.get_and_step(); tri_ptr->points(p0, p1, p2); p0->get_uv(tri_ptr, u0, v0); p1->get_uv(tri_ptr, u1, v1); p2->get_uv(tri_ptr, u2, v2); aa = DETERM(the_point.x(), the_point.y(), u1, v1, u2, v2); bb = DETERM(u0, v0, the_point.x(), the_point.y(), u2, v2); cc = DETERM(u0, v0, u1, v1, the_point.x(), the_point.y()); if (aa > -INSIDE_TOL && bb > -INSIDE_TOL && cc > -INSIDE_TOL) { found = CUBIT_TRUE; // this is the one } } if (!found) { rv = CUBIT_FAILURE; tri_ptr = NULL; } return rv; }
CubitStatus FacetParamTool::locate_point_in_uv | ( | FacetSurface * | surf, |
const CubitVector & | the_point, | ||
CubitFacet *& | tri_ptr | ||
) |
Definition at line 331 of file FacetParamTool.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; DLIList<CubitFacet *> facet_list; int tool_id = surf->get_eval_tool()->tool_id(); surf->get_eval_tool()->get_facets(facet_list); tri_ptr = facet_list.get(); // loop until we find something CubitPoint *p0, *p1, *p2; double aa, bb, cc; double u0, u1, u2, v0, v1, v2; CubitBoolean found = CUBIT_FALSE; while(!found && rv == CUBIT_SUCCESS) { tri_ptr->points(p0, p1, p2); p0->get_uv(tri_ptr, u0, v0); p1->get_uv(tri_ptr, u1, v1); p2->get_uv(tri_ptr, u2, v2); aa = DETERM(the_point.x(), the_point.y(), u1, v1, u2, v2); bb = DETERM(u0, v0, the_point.x(), the_point.y(), u2, v2); cc = DETERM(u0, v0, u1, v1, the_point.x(), the_point.y()); if (aa > -INSIDE_TOL && bb > -INSIDE_TOL && cc > -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, &tool_id ); } else if (bb <= aa && bb <= cc) { int edge_index = 2; tri_ptr = tri_ptr->adjacent( edge_index, &tool_id ); } else { int edge_index = 0; tri_ptr = tri_ptr->adjacent( edge_index, &tool_id); } // check to see if we've left the triangulation if (tri_ptr == NULL) { rv = exhaustive_locate_point_in_uv(surf, the_point, tri_ptr ); found = CUBIT_TRUE; } } } return rv; }
CubitStatus FacetParamTool::set_up_space | ( | void | ) |
Definition at line 66 of file FacetParamTool.cpp.
{ #ifdef ROADKILL FacetEvalTool *fetool = CAST_TO(refSurf, FacetSurface)->get_eval_tool(); if ((fetool->loops())->size() != 1) { PRINT_WARNING("Cannot parameterize surface. Multiple loops detected\n"); return CUBIT_FAILURE; } DLIList<CubitPoint *> my_point_list; fetool->get_points(my_point_list); DLIList<CubitFacet *> my_facet_list; fetool->get_facets(my_facet_list); // make arrays out of the points and facets double *points = new double [3 * my_point_list.size()]; int *facets = new int [3 * my_facet_list.size()]; if (!points || !facets) { PRINT_ERROR("Could not define parameterization for surface (out of memory)\n"); return CUBIT_FAILURE; } int ii; CubitPoint *pt; my_point_list.reset(); for (ii=0; ii<my_point_list.size(); ii++) { pt = my_point_list.get_and_step(); points[ii*3] = pt->x(); points[ii*3+1] = pt->y(); points[ii*3+2] = pt->z(); pt->marked(ii); } CubitFacet *facet; CubitPoint *pts[3]; for (ii=0; ii<my_facet_list.size(); ii++) { facet = my_facet_list.get_and_step(); facet->points( pts[0], pts[1], pts[2] ); facets[ii*3] = pts[0]->marked(); facets[ii*3+1] = pts[1]->marked(); facets[ii*3+2] = pts[2]->marked(); } //debug, export facets // export_facets(my_point_list.size(), my_facet_list.size(), points, facets); // PRINT_ERROR("Debugging Failure. Please remove export_facets from FacetParamTool\n"); // return CUBIT_FAILURE; // do the parameterization ParamManager parammanager( my_point_list.size(), my_facet_list.size(), points, facets ); if(!parammanager.flatten()) { PRINT_ERROR("Surface Parameterizer Failed\n"); return CUBIT_FAILURE; } else { double ratio; double *sizes; parammanager.build_sizing(); double *uv = parammanager.get_uvs_sizing( ratio, sizes ); // update the points with uvs values TDFacetBoundaryPoint *td_fbp; CubitBoolean on_internal_boundary; my_point_list.reset(); for (ii=0; ii<my_point_list.size(); ii++) { pt = my_point_list.get_and_step(); DLIList <CubitFacet *> facet_list; pt->facets_on_surf( fetool->tool_id(), facet_list, on_internal_boundary ); if (on_internal_boundary) { td_fbp = TDFacetBoundaryPoint::get_facet_boundary_point( pt ); if (!td_fbp) { TDFacetBoundaryPoint::add_facet_boundary_point( pt ); td_fbp = TDFacetBoundaryPoint::get_facet_boundary_point( pt ); td_fbp->add_surf_facets( facet_list ); td_fbp->set_uvs( facet_list.get(), uv[ii*2], uv[ii*2+1], sizes[ii]); } else { if (td_fbp->set_uvs( facet_list.get(), uv[ii*2], uv[ii*2+1], sizes[ii] ) != CUBIT_SUCCESS) { td_fbp->add_surf_facets( facet_list ); td_fbp->set_uvs( facet_list.get(), uv[ii*2], uv[ii*2+1], sizes[ii]); } } } else { pt->set_uvs( uv[ii*2], uv[ii*2+1], sizes[ii]); } } PRINT_INFO("Surface Parameterization succeeded\n"); delete [] sizes; delete [] uv; } // clean up delete [] points; delete [] facets; return CUBIT_SUCCESS; #else return CUBIT_FAILURE; #endif }
CubitStatus FacetParamTool::transform_to_uv | ( | const CubitVector & | xyz_location, |
CubitVector & | uv_location | ||
) | [virtual] |
Implements ParamTool.
Definition at line 194 of file FacetParamTool.cpp.
{ DLIList<CubitFacet *> facet_list; FacetEvalTool *fetool; CubitFacet *tri_ptr; CubitBoolean outside = CUBIT_FALSE; CubitVector closest_point; CubitVector area_coord; double u, v, s; double compare_tol; // find best compare_tol fetool = CAST_TO(refSurf, FacetSurface)->get_eval_tool(); compare_tol = 1e-3*(fetool->bounding_box().diagonal().length()); // locate point CubitStatus rv = CUBIT_SUCCESS; fetool->get_facets(facet_list); rv = FacetEvalTool::project_to_facets(facet_list, tri_ptr, 0, compare_tol, xyz_location, CUBIT_FALSE, &outside, &closest_point, NULL); // determine barycentric coordinates for in facet if(rv == CUBIT_SUCCESS) { FacetEvalTool::facet_area_coordinate(tri_ptr, closest_point, area_coord); // extract data double u0, u1, u2, v0, v1, v2, s0, s1, s2; CubitPoint *p0, *p1, *p2; tri_ptr->points(p0, p1, p2); p0->get_uvs(tri_ptr, u0, v0, s0); p1->get_uvs(tri_ptr, u1, v1, s1); p2->get_uvs(tri_ptr, u2, v2, s2); // determine u coordinate u = (area_coord.x()*u0) + (area_coord.y()*u1) + (area_coord.z()*u2); // determine v coordinate v = (area_coord.x()*v0) + (area_coord.y()*v1) + (area_coord.z()*v2); // determine sizing s = (area_coord.x()*s0) + (area_coord.y()*s1) + (area_coord.z()*s2); uv_location.set(u,v,s); } return rv; }
CubitStatus FacetParamTool::transform_to_xyz | ( | CubitVector & | xyz_location, |
const CubitVector & | uv_location | ||
) | [virtual] |
Implements ParamTool.
Definition at line 255 of file FacetParamTool.cpp.
{ CubitStatus rv = CUBIT_SUCCESS; CubitFacet *tri_ptr; FacetSurface *facet_surf = CAST_TO(refSurf, FacetSurface); CubitVector area_coord; double x, y, z; //locate point rv = locate_point_in_uv(facet_surf, uv_location, tri_ptr); if(rv == CUBIT_SUCCESS) { // create uv facet CubitPoint* uvpoint_array[3]; DLIList<CubitPoint *> point_list; CubitPoint *pt_ptr; double u,v; int ii; tri_ptr->points(point_list); for(ii = 0; ii<3; ii++) { pt_ptr = point_list.get_and_step(); pt_ptr->get_uv(tri_ptr, u, v); uvpoint_array[ii] = (CubitPoint *) new CubitPointData(u, v, 0.0); } CubitFacet *uvfacet_ptr = (CubitFacet *) new CubitFacetData( uvpoint_array[0], uvpoint_array[1], uvpoint_array[2] ); // determine barycentric coordinates of uv point in uv facet FacetEvalTool::facet_area_coordinate(uvfacet_ptr, uv_location, area_coord); //delete created objects delete uvfacet_ptr; for(ii = 0; ii<3; ii++) { pt_ptr = uvpoint_array[ii]; delete pt_ptr; } CubitPoint *p0, *p1, *p2; CubitVector coord0, coord1, coord2; tri_ptr->points(p0,p1,p2); coord0 = p0->coordinates(); coord1 = p1->coordinates(); coord2 = p2->coordinates(); //determine x coordinate x = (area_coord.x()*coord0.x()) + (area_coord.y()*coord1.x()) + (area_coord.z()*coord2.x()); //determine y coordinate y = (area_coord.x()*coord0.y()) + (area_coord.y()*coord1.y()) + (area_coord.z()*coord2.y()); //determine z coordinate z = (area_coord.x()*coord0.z()) + (area_coord.y()*coord1.z()) + (area_coord.z()*coord2.z()); xyz_location.set(x,y,z); } return rv; }
Surface* FacetParamTool::refSurf [private] |
Definition at line 45 of file FacetParamTool.hpp.