//------------------------------------------------------------------------- // Purpose : Returns the volume of the Lump // // Special Notes : // // Creator : // // Creation Date : //------------------------------------------------------------------------- double FacetLump::measure() { DLIList<CubitFacet*> bounding_facets; DLIList<CubitPoint*> bounding_points; DLIList<FacetSurface*> surfaces; Surface *curr_surface; FacetSurface *facet_surface; //if this is a sheet body... return 0.0 //Body *tmp_body = CAST_TO(myBodyPtr->topology_entity(), Body); if( is_sheet() ) return 0.0; int ii; get_surfaces(surfaces); if (surfaces.size() > 0) { for ( ii = surfaces.size(); ii > 0; ii-- ) { curr_surface = surfaces.get_and_step(); facet_surface = CAST_TO(curr_surface, FacetSurface); if ( facet_surface == NULL ) { PRINT_ERROR("Facet lump has surfaces that aren't facets?"); return 1; } facet_surface->get_my_facets(bounding_facets, bounding_points); } } double volume, curr_facet_area, summation = 0.0; CubitFacet *curr_facet; CubitVector normal_of_curr_facet, vector_of_point; CubitPoint *point_1, *point_2, *point_3; for( int jj = bounding_facets.size(); jj > 0; jj-- ) { curr_facet = bounding_facets.get_and_step(); curr_facet_area = curr_facet->area(); // Current facet's area normal_of_curr_facet = curr_facet->normal(); // Current facet's normal curr_facet->points(point_1, point_2, point_3); // Current facet's points vector_of_point = point_1->coordinates(); // One point's vector summation += ( double(vector_of_point % normal_of_curr_facet) * curr_facet_area); } volume = summation / 3; return volume; }
void FacetPoint::get_shells( DLIList<FacetShell*>& result_list ) { DLIList<FacetSurface*> surface_list; DLIList<FacetShell*> temp_list; get_surfaces( surface_list ); surface_list.reset(); for ( int i = surface_list.size(); i--; ) { FacetSurface* surface = surface_list.get_and_step(); temp_list.clean_out(); surface->get_shells( temp_list ); result_list.merge_unique( temp_list ); } }
auto load_scene(const std::string& name) { // Attempt to load from file path. wayverb::core::scene_data_loader loader{name}; const auto scene_data = loader.get_scene_data(); if (!scene_data) { throw std::runtime_error{"Failed to load scene."}; } return wayverb::core::make_scene_data( scene_data->get_triangles(), scene_data->get_vertices(), util::aligned::vector< wayverb::core::surface<wayverb::core::simulation_bands>>( scene_data->get_surfaces().size(), wayverb::core::surface<wayverb::core::simulation_bands>{})); }
CubitStatus FacetLump::mass_properties( CubitVector& centroid, double& volume ) { int i; DLIList<FacetShell*> shells( myShells.size() ); CAST_LIST( myShells, shells, FacetShell ); assert( myShells.size() == shells.size() ); DLIList<FacetSurface*> surfaces; DLIList<FacetShell*> surf_shells; get_surfaces( surfaces ); DLIList<CubitFacet*> facets, surf_facets; DLIList<CubitPoint*> junk; DLIList<CubitSense> senses; for (i = surfaces.size(); i--; ) { FacetSurface* surf = surfaces.step_and_get(); surf_shells.clean_out(); surf->get_shells( surf_shells ); surf_shells.intersect( shells ); assert( surf_shells.size() ); CubitSense sense = surf->get_shell_sense( surf_shells.get() ); if (surf_shells.size() == 1 && CUBIT_UNKNOWN != sense) { surf_facets.clean_out(); junk.clean_out(); surf->get_my_facets( surf_facets, junk ); facets += surf_facets; for (int j = surf_facets.size(); j--; ) senses.append(sense); } } const CubitVector p0 = bounding_box().center(); CubitVector p1, p2, p3, normal; centroid.set( 0.0, 0.0, 0.0 ); volume = 0.0; facets.reset(); senses.reset(); for (i = facets.size(); i--; ) { CubitFacet* facet = facets.get_and_step(); CubitSense sense = senses.get_and_step(); p1 = facet->point(0)->coordinates(); p2 = facet->point(1)->coordinates(); p3 = facet->point(2)->coordinates(); normal = (p3 - p1) * (p2 - p1); double two_area = normal.length(); if (two_area > CUBIT_RESABS ) { if (CUBIT_REVERSED == sense) normal = -normal; normal /= two_area; double height = normal % (p0 - p1); double vol = two_area * height; volume += vol; centroid += vol * (p0 + p1 + p2 + p3); } } if (volume > CUBIT_RESABS) centroid /= 4.0 * volume; volume /= 6.0; return CUBIT_SUCCESS; }