打印存储为顶点和面的网格

2024-09-16 06:16:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个网格存储为一个三维面和顶点的集合,例如

v = np.array([[0,0,0],
              [1,0,0],
              [1,1,0],
              [0,1,0],
              [0,0,1],
              [1,0,1],
              [1,1,1],
              [0,1,1]])
f = np.array([[0,2,1],
              [0,3,2],
              [1,2,6],
              [1,6,5],
              [0,5,4],
              [0,1,5],
              [4,5,6],
              [6,7,4],
              [3,7,6],
              [6,2,3],
              [0,4,7],
              [7,3,0]])

其中v描述节点的坐标,f描述每个面的顶点的索引。你知道吗

我有一个向量C,在每个节点上包含一个标量

C = np.array([1,2,3,4,5,6,7,8])

我想使用C中的标量作为每个节点的颜色映射,将其绘制为网格。这类似于在Matlab中使用patch('Faces',F,'Vertices',V)命令(doc)实现的功能

有没有可能用matplotlib或者更一般地说,用python来实现这一点?你知道吗

奖励问题:

一般来说,我的脸可以有不同数量的顶点。在我的矩阵中,我有三个和四个面,三个面都有填充np.nan公司作为第四个节点。你知道吗

在不将四边形拆分为三个面的情况下,是否可以绘制同时具有三个面和四个面的网格?你知道吗


Tags: 命令网格doc节点颜色np绘制array
1条回答
网友
1楼 · 发布于 2024-09-16 06:16:52

可以用面的边坐标绘制Poly3DCollection。你知道吗

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D, art3d

v = np.array([[0,0,0], [1,0,0], [1,1,0], [0,1,0], 
              [0,0,1], [1,0,1], [1,1,1], [0,1,1]])

f = np.array([[0,2,1], [0,3,2], [1,2,6], [1,6,5],
              [0,5,4], [0,1,5], [4,5,6], [6,7,4],
              [3,7,6], [6,2,3], [0,4,7], [7,3,0]])

C = np.array([1,2,3,4,5,6,7,8,2,3,4,5])


fig = plt.figure()
ax = fig.add_subplot(projection="3d")

norm = plt.Normalize(C.min(), C.max())
colors = plt.cm.viridis(norm(C))

pc = art3d.Poly3DCollection(v[f], facecolors=colors, edgecolor="black")
ax.add_collection(pc)

plt.show()

enter image description here

请注意,您需要为面着色,而不是节点着色(因为节点不能有颜色)-因此我在C中又发明了一些值。你知道吗

相关问题 更多 >