如何挤出不规则多边形?

问题描述

我在平面中有一组 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')

successfully extruded surface: wall with a base shaped like a random polygon

如果在挤出后需要闭合曲面,则必须从实心多边形开始(即面而不是线):

# 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')

similar to before,but the surface is capped

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...