我将网格存储为3D面和顶点的集合,例如
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
中的标量作为每个节点的颜色图将其绘制为网格。这类似于使用patch('Faces',F,'Vertices',V)
命令(doc)在Matlab中实现的功能
是否可以使用matplotlib或更广泛地使用python实现此目标?
奖励问题:
更一般而言,我的脸部可以具有可变数量的顶点。在我的矩阵中,我既有tri面又有quad面,其中tri面用np.nan填充为第四个节点。
是否可以在不将四边形拆分为三边的情况下绘制同时具有3个和4个侧面的网格?
答案 0 :(得分:1)
您可以使用面Poly3DCollection
的边缘坐标绘制v[f]
。
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()
请注意,您将需要给脸部着色,而不是给节点着色(因为节点不能具有颜色)-因此我在C
中发明了一些其他值。