基于Meshes.jl的隐式曲面三角网格生成及拼接问题咨询
生成目标隐式曲面连贯三角网格的简便方案
方案一:对齐参数化网格并合并(解决拼接问题)
你拆分上下两半网格时的拼接问题,本质是边界顶点未严格对齐。通过统一参数采样规则,确保两半边界顶点完全重合,就能无缝合并:
确定有效参数范围
根据根号内非负条件1 - v² - (u - v²)² ≥ 0,可得:- v ∈ [-1, 1]
- 对每个v,u ∈ [v² - √(1 - v²), v² + √(1 - v²)]
统一采样并生成网格
用对齐的采样点生成上下两半,再合并顶点和面:using Meshes # 定义曲面的上下分支 z_upper(u, v) = sqrt(max(0, 1 - v^2 - (u - v^2)^2)) z_lower(u, v) = -z_upper(u, v) # 生成对齐的参数采样点 v_samples = range(-1, 1, length=50) u_samples = [range(v^2 - sqrt(max(0,1-v^2)), v^2 + sqrt(max(0,1-v^2)), length=50) for v in v_samples] # 生成上半网格(用GridTopology简化面生成) points_upper = [Point(u, v, z_upper(u, v)) for v in v_samples, u in u_samples[findfirst(==(v), v_samples)]] topo_upper = GridTopology(size(points_upper)...) mesh_upper = SimpleMesh(points_upper, topo_upper) # 生成下半网格(采样点与上半完全一致) points_lower = [Point(u, v, z_lower(u, v)) for v in v_samples, u in u_samples[findfirst(==(v), v_samples)]] topo_lower = GridTopology(size(points_lower)...) mesh_lower = SimpleMesh(points_lower, topo_lower) # 合并网格:去重顶点并重新映射面索引 all_coords = vcat(coordinates.(vertices(mesh_upper)), coordinates.(vertices(mesh_lower))) unique_coords = unique(all_coords) idx_upper = [findfirst(==(c), unique_coords) for c in coordinates.(vertices(mesh_upper))] idx_lower = [findfirst(==(c), unique_coords) for c in coordinates.(vertices(mesh_lower))] all_faces = vcat( [TriangleFace(idx_upper[face.i], idx_upper[face.j], idx_upper[face.k]) for face in faces(mesh_upper)], [TriangleFace(idx_lower[face.i], idx_lower[face.j], idx_lower[face.k]) for face in faces(mesh_lower)] ) merged_mesh = SimpleMesh(Point.(unique_coords), all_faces)
方案二:隐式曲面直接生成连贯网格(更高效)
直接用Marching Cubes算法生成隐式曲面的网格,无需拆分拼接,更适合后续PDE模拟:
转换为标准隐式方程
你的曲面等价于F(x,y,z) = z² + y² + (x - y²)² - 1 = 0用MarchingCubes.jl配合Meshes.jl生成网格
using Meshes, MarchingCubes # 定义隐式函数 F(x,y,z) = z^2 + y^2 + (x - y^2)^2 - 1 # 设置采样范围(根据隐式方程确定有效区间) x_range = (-1, 2) y_range = (-1, 1) z_range = (-1, 1) resolution = (50, 50, 50) # 可根据精度需求调整 # 生成网格顶点和面 vertices, faces = marching_cubes(F, x_range..., y_range..., z_range..., resolution...) # 转换为Meshes.jl的SimpleMesh mesh = SimpleMesh(Point.(vertices), TriangleFace.(faces))
PDE模拟的额外提示
- 可通过
Meshes.refine(mesh, CatmullClark())加密网格,提升模拟精度 - 用
Meshes.aspectratio、Meshes.quality检查单元质量,过滤畸形三角面,避免模拟发散
内容的提问来源于stack exchange,提问作者AcK
相关产品推荐
相关产品推荐

