void MshEditor::get2DSurfaceNodes(const std::vector<MeshLib::Node*> &all_nodes, std::vector<MeshLib::Node*> &sfc_nodes, const std::vector<MeshLib::Element*> &sfc_elements, std::vector<unsigned> &node_id_map) { const size_t nNewElements (sfc_elements.size()); std::vector<const MeshLib::Node*> tmp_nodes(all_nodes.size(), NULL); const size_t nNodes (tmp_nodes.size()); for (unsigned i=0; i<nNewElements; ++i) { const MeshLib::Element* elem (sfc_elements[i]); for (unsigned j=0; j<elem->getNNodes(); ++j) { const MeshLib::Node* node (elem->getNode(j)); tmp_nodes[node->getID()] = node; } } for (unsigned i=0; i<nNodes; ++i) { if (tmp_nodes[i]) { node_id_map[i] = sfc_nodes.size(); sfc_nodes.push_back(new MeshLib::Node(tmp_nodes[i]->getCoords(), tmp_nodes[i]->getID())); } } }
void MeshSurfaceExtraction::get2DSurfaceNodes(std::vector<MeshLib::Node*> &sfc_nodes, std::size_t n_all_nodes, const std::vector<MeshLib::Element*> &sfc_elements, std::vector<std::size_t> &node_id_map) { const std::size_t nNewElements (sfc_elements.size()); std::vector<const MeshLib::Node*> tmp_nodes(n_all_nodes, nullptr); for (std::size_t i=0; i<nNewElements; ++i) { const MeshLib::Element* elem (sfc_elements[i]); for (unsigned j=0; j<elem->getNBaseNodes(); ++j) { const MeshLib::Node* node (elem->getNode(j)); tmp_nodes[node->getID()] = node; } } const std::size_t nNodes (tmp_nodes.size()); for (unsigned i=0; i<nNodes; ++i) { if (tmp_nodes[i]) { node_id_map[i] = sfc_nodes.size(); sfc_nodes.push_back(new MeshLib::Node(tmp_nodes[i]->getCoords(), tmp_nodes[i]->getID())); } } }
MeshLib::Mesh* MshEditor::getMeshSurface(const MeshLib::Mesh &mesh, const double* dir) { std::cout << "Extracting mesh surface..." << std::endl; const std::vector<MeshLib::Element*> elements = mesh.getElements(); std::vector<MeshLib::Element*> new_elements; const size_t nElements (mesh.getNElements()); bool complete_surface = ((dir[0]*dir[0] + dir[1]*dir[1] + dir[2]*dir[2]) == 0) ? true : false; // 2D meshes if (mesh.getDimension() == 2 ) { if (complete_surface) return new MeshLib::Mesh(mesh); // simply copy the mesh else // check only surface normal directions of all elements { for (unsigned i=0; i<nElements; i++) { MeshLib::Face* face = dynamic_cast<MeshLib::Face*>(elements[i]); double normal[3]; face->getSurfaceNormal(normal); if (MathLib::scpr(normal, dir, 3) > 0) new_elements.push_back(static_cast<MeshLib::Element*>(face)); } } } // 3D meshes else if (mesh.getDimension() == 3) // { for (unsigned i=0; i<nElements; i++) { if (const MeshLib::Cell* cell = dynamic_cast<MeshLib::Cell*>(elements[i])) { if (cell->isOnSurface()) { const unsigned nFaces (cell->getNFaces()); for (unsigned j=0; j<nFaces; j++) { if (cell->getNeighbor(i) == NULL) { const MeshLib::Face* face = static_cast<const MeshLib::Face*>(cell->getFace(i)); if (!complete_surface) { double normal[3]; face->getSurfaceNormal(normal); if (MathLib::scpr<double,3>(normal, dir) <= 0) continue; } if (face->getType() == MshElemType::TRIANGLE) new_elements.push_back(new MeshLib::Tri(*static_cast<const MeshLib::Tri*>(face))); else new_elements.push_back(new MeshLib::Quad(*static_cast<const MeshLib::Quad*>(face))); } } } } } // now copy nodes const size_t nNewElements (new_elements.size()); std::vector<const MeshLib::Node*> tmp_nodes(mesh.getNNodes(), NULL); const size_t nNodes (tmp_nodes.size()); for (unsigned i=0; i<nNewElements; i++) { const MeshLib::Element* elem (new_elements[i]); for (unsigned j=0; j<elem->getNNodes(); j++) { const MeshLib::Node* node (elem->getNode(i)); tmp_nodes[node->getID()] = node; } } std::vector<MeshLib::Node*> new_nodes; for (unsigned i=0; i<nNodes; i++) if (tmp_nodes[i]) new_nodes.push_back(new MeshLib::Node(tmp_nodes[i]->getCoords())); } }