Форум сайта python.su
Дан текстовый файл, содержащий координаты примитивов (четырехугольных и трехугольных площадок) некоторой трехмерной поверхности. Помогите считать из файла эти координаты и отобразить их:
#!/usr/bin/python
from numpy import *
import pylab as p
#import matplotlib.axes3d as p3
import mpl_toolkits.mplot3d.axes3d as p3
# Здесь нужно как-то считать данные
fig=p.figure()
ax = p3.Axes3D(fig)
# x, y, and z are 100x100 arrays
ax.plot_surface(x,y,z)
ax.set_xlabel('x_1')
ax.set_ylabel('x_2')
ax.set_zlabel('x_3')
p.show()
0.0000000000 0.0000000000 1.0000000000
0.1081190184 0.0000000000 0.9941379572
0.1075065026 0.0114923473 0.9941379572
0.0000000000 0.0000000000 1.0000000000
0.0000000000 0.0000000000 1.0000000000
0.1075065026 0.0114923473 0.9941379572
0.1056758951 0.0228544818 0.9941379572
0.0000000000 0.0000000000 1.0000000000
0.0000000000 0.0000000000 1.0000000000
0.1056758951 0.0228544818 0.9941379572
0.1026479375 0.0339576658 0.9941379572
0.0000000000 0.0000000000 1.0000000000
...
Офлайн
советую повторить примеры отсюда
http://jenyay.net/Programming/Python3d
собственно сразу видно что X и Y - двумерные массивы
офтоп - а что .beginer с одной N ? ))
Отредактировано (Март 28, 2011 16:56:30)
Офлайн
asv13в Питон совсем новичек. Помогите стартануть,
советую повторить примеры отсюда
http://jenyay.net/Programming/Python3d
собственно сразу видно что X и Y - двумерные массивы
[x,y,z] = [[float(i) for i in line.split()] for line in open('surf')]
Отредактировано (Март 28, 2011 21:23:45)
Офлайн
У matplotlib это обычное поведение по умолчанию. С каждой новой командой дорисовываются новые примитивы к старым, пока не сотрете результат.
Офлайн
doza_andА как нарисовать площадку заданную своими четырмя координатами?
У matplotlib это обычное поведение по умолчанию. С каждой новой командой дорисовываются новые примитивы к старым, пока не сотрете результат.
Офлайн
matplotlib - можно наверное и заставить, но все таки эта библиотека заточена для построения функций а не отдельных “площадок”.
Я бы смотрел в сторону библиотек для 3D, MayaVi например. Можно скачать бинарники здесь http://pythonxy.googlecode.com/files/EnthoughtToolSuite-3.6.0_py26.exe
примеры будут в папке Python26/Doc/
Офлайн
вот вам слегка модифицированный пример из документации который иллюстрирует последовательное рисование фигур
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 20 * np.outer(np.sin(u), np.sin(v))
z = 5 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')
plt.show()
Офлайн
doza_andДействительно, vpyhon сильно облегчит работу!
Довольно просто использовать vpython, он получше подходит для таких примитивов как у вас
cylinder Start with cylinder: much of what is said here applies to other objects as well.Чем бы мне наприсовать площадку, заданную четырмя вершинами и так чтобы с одна сторона была внешняя другая внутренняя (одна отражала сильно свет другая не очень). Маленькими box придеться строить или я что-то другое не заметил? curve не подходит, т.к. не получается поверхности, а получаются рамки (проволочная фигура, а она мне не нужна и ее gnuplot правильно строит с гораздо меньшими усилиями)
arrow label
cone frame: combining several objects into one
pyramid faces: low-level object for special purposes
sphere Additional Attributes: visible, frame, display, class, members
ring Convenient Defaults
box Rotating an Object
ellipsoid Specifying Colors
curve Deleting an Object
helix
python-visual - VPython 3D scientific visualization libraryИспользую Ubuntu 10.10.
Офлайн
Уважаемые форумчане, что-то получилось в octave, помогите переложить. Вроде можно, т.к. matplotlib д.б. похож на Matlab. Может какие книги по 3Д графиге в Питон порекомендуете.
Рабочий код
#!/usr/bin/octave -q
M=load('surf');
x=reshape(M(:,1),4,[]);
y=reshape(M(:,2),4,[]);
z=reshape(M(:,3),4,[]);
patch(x,y,z,'r');
view(3);
pause
M=load('surf');
x=M(1:end,1)';
y=M(1:end,2)';
z=M(1:end,3)';
tri = delaunay(x,y);
#trimesh(tri,x,y,z)
trisurf(tri,x,y,z)
#trimesh(tri,x,y,zeros(size(x)))
pause
Офлайн