Сетка графика хранится в виде вершин и граней - PullRequest
0 голосов
/ 12 июня 2019

У меня есть сетка, хранящаяся как набор трехмерных граней и вершин, например,

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 в качестве четвертого узла.

Можно ли построить сетку с 3-х и 4-х сторонними гранями, не разбивая четырехугольники на три?

1 Ответ

1 голос
/ 12 июня 2019

Вы можете построить 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()

enter image description here

Обратите внимание, что вам нужно раскрасить грани, а не узлы (поскольку узлы не могут иметь цвета), поэтому я изобрел еще несколько значений в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...