You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可高斯垂直变形的封闭圆柱网格?

解决方案

方案一:给变形后的CylinderStructured手动添加封闭顶盖

pv.CylinderStructured生成的是无顶盖的柱面结构化网格,我们可以通过生成匹配拓扑的结构化圆盘顶盖,与变形后的柱面合并来实现封闭效果,且能避免三角网格变形异常的问题:

步骤与代码示例

import pyvista as pv
import numpy as np

# 1. 生成原始结构化圆柱并施加高斯垂直变形
theta_res = 32  # 极向网格数
z_res = 16      # 轴向网格数
cyl = pv.CylinderStructured(radius=1, height=2, theta_resolution=theta_res, z_resolution=z_res)

# 施加高斯垂直变形(以轴向中间位置凸起为例)
deformed_points = cyl.points.copy()
z_coords = deformed_points[:, 2]
gaussian_bump = np.exp(-((z_coords) / 0.5)**2) * 0.3
deformed_points[:, 2] += gaussian_bump

# 构建变形后的柱面网格
deformed_cyl = pv.StructuredGrid()
deformed_cyl.points = deformed_points
deformed_cyl.dimensions = cyl.dimensions

# 2. 生成匹配的顶盖网格
def create_matching_lid(edge_points):
    """根据柱面边缘点生成结构化顶盖"""
    # 计算顶盖中心(取边缘点的均值)
    center = np.mean(edge_points, axis=0)
    # 构建顶盖的结构化点集:中心 + 边缘点
    lid_point_count = theta_res + 1 + 1  # 中心 + 所有边缘点
    lid_points = np.zeros((lid_point_count, 3))
    lid_points[0] = center
    lid_points[1:] = edge_points

    # 构建结构化网格(维度:极向分段数+1, 径向2段, 1)
    lid = pv.StructuredGrid()
    lid.points = lid_points
    lid.dimensions = (theta_res + 1, 2, 1)
    return lid

# 获取柱面上下边缘的点
top_edge_indices = np.arange(theta_res + 1) + z_res * (theta_res + 1)
bottom_edge_indices = np.arange(theta_res + 1)
top_edge_points = deformed_points[top_edge_indices]
bottom_edge_points = deformed_points[bottom_edge_indices]

# 生成上下顶盖
top_lid = create_matching_lid(top_edge_points)
bottom_lid = create_matching_lid(bottom_edge_points)

# 3. 合并柱面与顶盖
closed_deformed_cyl = deformed_cyl + top_lid + bottom_lid

# 可视化验证
closed_deformed_cyl.plot(show_edges=True)

关键说明

  • 顶盖采用结构化网格,与柱面拓扑匹配,避免三角网格变形时的拓扑混乱;
  • 顶盖的极向分段数与柱面完全一致,保证合并后网格边缘对齐无缝隙;
  • 仅修改轴向(z轴)坐标的垂直变形下,顶盖的x/y坐标直接复用柱面边缘点,不会出现异常变形。

方案二:直接使用带极向网格的pv.Cylinder(更高效)

你之前用pv.Cylinder效果不佳,是因为未指定足够的极向分段数。通过设置theta_resolution参数,可以生成带密集极向网格线的封闭圆柱,再直接施加变形即可:

代码示例

import pyvista as pv
import numpy as np

# 生成带极向网格的封闭圆柱
theta_res = 32  # 控制极向网格线数量
z_res = 16      # 控制轴向网格线数量
cyl = pv.Cylinder(radius=1, height=2, theta_resolution=theta_res, phi_resolution=z_res)

# 施加高斯垂直变形
deformed_points = cyl.points.copy()
z_coords = deformed_points[:, 2]
gaussian_bump = np.exp(-((z_coords) / 0.5)**2) * 0.3
deformed_points[:, 2] += gaussian_bump

# 直接更新点坐标,保留原始封闭拓扑
deformed_closed_cyl = pv.PolyData(deformed_points, cyl.faces)

# 可视化验证
deformed_closed_cyl.plot(show_edges=True)

关键说明

  • pv.Cylinder默认生成封闭的PolyData网格,自带顶盖;
  • 通过theta_resolution调整极向网格密度,解决之前缺少极向网格线的问题;
  • 变形仅修改点坐标,原始拓扑结构不变,不会出现顶盖异常变形,实现成本更低,更适合作为遗传算法输入。

遗传算法适配建议

  • 优先选择结构化网格或规则PolyData作为输入,因为顶点/面的索引有序,便于遗传算法中对变形参数的映射与调整;
  • 若需要更精细的局部变形控制,方案一的结构化网格拆分方式(柱面+顶盖)更灵活,可单独对顶盖或柱面的不同区域施加变形。

内容的提问来源于stack exchange,提问作者Tanamas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:00:12