示例#1
0
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()));
		}
	}
}
示例#2
0
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()));
		}
	}
}
示例#3
0
文件: MshEditor.cpp 项目: JobstM/ogs
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()));
	}


}