问题描述
我在平面中有一组 2D 顶点坐标(假设为 xy 平面),我想在 z 方向上将其挤出以形成一个可以变换和渲染的 polyData
对象。>
理想的函数将采用 nx2 ndarray 顶点和高度并返回 polyData
。
后备解决方案是在 VTK 中执行此操作并将结果包装为 PyVista 对象。
解决方法
在 3d 中嵌入 2d 顶点以创建实际多边形并挤出效果很好的直接解决方案:
import numpy as np
import pyvista as pv
rng = np.random.default_rng()
# create dummy data
N = 10
angles = np.linspace(0,2*np.pi,N,endpoint=False)
radii = rng.uniform(0.5,1.5,N)
coords = np.array([np.cos(angles),np.sin(angles)]) * radii
points_2d = coords.T # shape (N,2)
# embed in 3d,create polygon
points_3d = np.pad(points_2d,[(0,0),(0,1)]) # shape (N,3)
polygon = pv.lines_from_points(points_3d,close=True)
# extrude along z and plot
body = polygon.extrude((0,0.5))
body.plot(color='white',specular=1,screenshot='extruded.png')
如果在挤出后需要闭合曲面,则必须从实心多边形开始(即面而不是线):
# embed in 3d,create filled polygon
points_3d = np.pad(points_2d,3)
face = [N + 1] + list(range(N)) + [0] # cell connectivity for a single cell
polygon = pv.PolyData(points_3d,faces=face)
# extrude along z and plot
body = polygon.extrude((0,screenshot='extruded.png')