#include #include int main() { // 初始化Gmsh gmsh::initialize(); // 创建一个新的模型 gmsh::model::add("complex_shape"); // 定义曲面1的三角片 std::vector> triangles1 = { {1, 2, 3}, {3, 4, 1} }; // 定义曲面2的三角片 std::vector> triangles2 = { {5, 6, 7}, {7, 8, 5} }; // 添加曲面1的顶点和三角片 std::vector coordinates1 = { 0.0, 0.0, 0.0, // 顶点1 1.0, 0.0, 0.0, // 顶点2 1.0, 1.0, 0.0, // 顶点3 0.0, 1.0, 0.0 // 顶点4 }; for (size_t i = 0; i < coordinates1.size() / 3; ++i) { gmsh::model::geo::addPoint(coordinates1[3*i], coordinates1[3*i+1], coordinates1[3*i+2], 0.1, i+1); } for (const auto& triangle : triangles1) { gmsh::model::geo::addLine(triangle[0], triangle[1], 10 + (&triangle - &triangles1[0]) * 3); gmsh::model::geo::addLine(triangle[1], triangle[2], 11 + (&triangle - &triangles1[0]) * 3); gmsh::model::geo::addLine(triangle[2], triangle[0], 12 + (&triangle - &triangles1[0]) * 3); } std::vector lines1 = {10, 11, 12, 13}; gmsh::model::geo::addCurveLoop(lines1, 20); // 添加曲面2的顶点和三角片 std::vector coordinates2 = { 1.0, 1.0, 0.0, // 顶点5(与曲面1的顶点3共享) 2.0, 1.0, 0.0, // 顶点6 2.0, 2.0, 0.0, // 顶点7 1.0, 2.0, 0.0 // 顶点8 }; for (size_t i = 0; i < coordinates2.size() / 3; ++i) { int pointTag = i + 1 + coordinates1.size() / 3; // 顶点标签从曲面1的最后一个顶点之后开始 gmsh::model::geo::addPoint(coordinates2[3*i], coordinates2[3*i+1], coordinates2[3*i+2], 0.1, pointTag); } for (const auto& triangle : triangles2) { gmsh::model::geo::addLine(triangle[0], triangle[1], 20 + (&triangle - &triangles2[0]) * 3); gmsh::model::geo::addLine(triangle[1], triangle[2], 21 + (&triangle - &triangles2[0]) * 3); gmsh::model::geo::addLine(triangle[2], triangle[0], 22 + (&triangle - &triangles2[0]) * 3); } std::vector lines2 = {20, 21, 22, 23}; gmsh::model::geo::addCurveLoop(lines2, 30); // 添加实体 std::vector surfaceTags = {20, 30}; gmsh::model::geo::addVolume({surfaceTags}, 40); // 设置网格划分参数 gmsh::model::mesh::setAlgorithm(gmsh::mesh::algorithm::FRONT_DELAUNAY, 0); gmsh::model::mesh::setSize(gmsh::mesh::size::LCAR, 0.1); // 执行网格划分 gmsh::model::mesh::generate(3); // 保存网格到文件 gmsh::write("complex_shape.msh"); // 清理并退出Gmsh gmsh::finalize(); return 0; }