LINUX.ORG.RU

Нарисовать 3-мерный многогранник и покрутить

 ,


1

1

Имеется набор точек — троек координат. Хотелось бы построить по ним многогранник и покрутить его.

Без «покрутить» нормально справляются scipy.spatial + matplotlib.pyplot. А чем можно так же, но с возможностью вращения полученной 3-мерной фигуры? Например, мышью.

★★★★★

Ответ на: комментарий от question4

Угу

https://matplotlib.org/1.5.3/mpl_toolkits/mplot3d/index.html

The interactive backends also provide the ability to rotate and zoom the 3D scene. One can rotate the 3D scene by simply clicking-and-dragging the scene. Zooming is done by right-clicking the scene and dragging the mouse up and down. Note that one does not use the zoom button like one would use for regular 2D plots.

pawnhearts ★★★★★ ()

У тебя только вершины заданы? А как %программа_нейм узнает, где именно рисовать рёбра?

Если всё-таки заданы рёбра, то очень быстро можно построить с помощью gnuplot. И крутить мышкой тоже можно будет

Crocodoom ★★ ()
Ответ на: комментарий от Crocodoom

У тебя только вершины заданы? А как %программа_нейм узнает, где именно рисовать рёбра?

scipy.spatial.ConvexHull рисует по набору точек выпуклый многогранник. Думаю, для этих массивов сгодилось бы и просто соединить точки отрезками в порядке перечисления.

question4 ★★★★★ ()
Ответ на: комментарий от question4

Так, ну про выпуклость многогранника ты не уточнял в стартовом посте. Хотя я и предполагал :) Да, для него достаточно вершин

gnuplot строить выпуклую оболочку не умеет, он достаточно примитивен

Если всё-таки заданы ребра, то ему нужно скормить их табличкой

x1 y1 z1
x'1 y'1 z'1

x2 y2 z2
x'2 y'2 z'2

...
Crocodoom ★★ ()

Пока так сойдёт:

#/usr/bin/python3
from sys import argv
import numpy
import scipy.spatial
a = numpy.fromfile( argv[1], dtype=numpy.int16 )
verts = a.reshape(( a.shape[0]//3, 3 ))[:-1]
hull = scipy.spatial.ConvexHull(verts)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for simplex in hull.simplices:
    ax.plot(verts[simplex, 0], verts[simplex, 1], verts[simplex, 2], 'k-' )
plt.show()

question4 ★★★★★ ()
Ответ на: комментарий от Crocodoom

Так, ну про выпуклость многогранника ты не уточнял в стартовом посте.

Они не выпуклые. Но чтобы составить представление, обычно хватает выпуклого подмножества.

Если всё-таки заданы ребра, то ему нужно скормить их табличкой

Спасибо. Может, и пригодится.

question4 ★★★★★ ()
Ответ на: комментарий от question4

Думаю, для этих массивов сгодилось бы и просто соединить точки отрезками в порядке перечисления.

Для каких «этих»? Соединить точки в gnuplot отрезками проще простого

x1 y1 z1
x2 y2 z2
x3 y3 z3
.. .
Crocodoom ★★ ()