Как создать сетку и построить трехмерную поверхность в Python?

У меня есть координаты 6 угловых точек трехмерной поверхности, как на рисунке 1. Я хочу сгенерировать и построить трехмерную поверхность, как на рисунке 2. Мне нужно найти расстояние средней точки каждой области сетки от начала координат.
фигура 1

фигура 2

Подскажите, пожалуйста, какой модуль лучше подходит для построения сеток и построения графиков?

3 ответа

PyVista иvtkplotterочень похожи, и оба построены на базе VTK, но имеют довольно разные API / варианты дизайна. Для вашего использования было бы здорово! Вот эквивалент PyVista для полноты.

Обычно с такой простой геометрией Matplotlib, PyVista или vtkplotterвсе будет хорошо. Если вы начнете создавать более сложные модели и 3D-сцены, тогда PyVista иvtkplotter будут отличаться, поскольку они созданы для 3D, в то время как MPL действительно хорош для 2D.

PyVista особенно преуспеет в управлении данными, если вы начнете создавать сложные сетки.... бесстыдный плагин;)

import pyvista as pv
import numpy as np

# Define the nodes
pts = np.array([(-5.795555, -4, 1.55291), (-4.829629, -2, 1.294095),
       (-5.795555, 1, 1.552914), (-5.536736, -4, 2.51884),
       (-4.57081, -2, 2.260021), (-5.536736,  1, 2.51884)])
# Define the quads
faces = np.array([(4,0,3,4,1), (4,1,4,5,2)])

# Instantiate a mesh
mesh = pv.PolyData(pts, faces)

# Create a plotting window and display!
p = pv.Plotter()

# Add the mesh and some labels
p.add_mesh(mesh, show_edges=True)
p.add_point_labels(mesh.points, ["%d"%i for i in range(mesh.n_points)])

# A pretty view position
p.camera_position = [(-11.352247399703748, -3.421477319390501, 9.827830270231935),
 (-5.1831825, -1.5, 1.9064675),
 (-0.48313206526616853, 0.8593146723923926, -0.16781448484204659)]

# Render it!
p.show()

Вы можете использовать ведо:

from vedo import *

pts = [(-5.795555, -4, 1.55291), (-4.829629, -2, 1.294095),
       (-5.795555, 1, 1.552914), (-5.536736, -4, 2.51884),
       (-4.57081, -2, 2.260021), (-5.536736,  1, 2.51884)]

faces = [(0,3,4,1), (1,4,5,2)]

mesh = Mesh([pts, faces]).color('red').alpha(0.3).lineWidth(2)
labels = [Text(i, pos=pts[i], s=.2, c='k') for i in range(len(pts))]

show(mesh, labels)

Я не знаю, как выглядят ваши данные, но matplotlib может строить трехмерные поверхности на основе точек с координатами x, y и z.

См.: https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html

Другие вопросы по тегам