
25.09.2010, 12:44
|
|
Новичок
|
|
Регистрация: 26.12.2008
Сообщений: 24
|
|
|
3D поверхность в Python
Помогите найти алгоритм построения поверхности в Питон или описание порядка расположения точек в массивах X, Y, Z. Алгоритм скорее всего один и для Питона, и для C++, например. Но для C++ z не нашел.
точки я читаю из файла, и формат его такой, сначала идут координаты вершин первой элементарной площадки, зачем второй ...
|
Код:
|
$ cat data.txt
-3.5453532005 -1.2945206358 2.3019377358
-3.5817236434 -2.3326455834 1.7469796037
-3.2584007852 -2.2306977781 1.7469796037
-3.5453532005 -1.2945206358 2.3019377358
-3.5453532005 -1.2945206358 2.3019377358
-3.2584007852 -2.2306977781 1.7469796037
-3.3659225510 -1.2379438722 2.3019377358
-3.5453532005 -1.2945206358 2.3019377358
-3.3659225510 -1.2379438722 2.3019377358
-3.2584007852 -2.2306977781 1.7469796037
-2.9768526261 -1.7430420618 1.7469796037
-3.3659225510 -1.2379438722 2.3019377358
-3.3659225510 -1.2379438722 2.3019377358
-2.9768526261 -1.7430420618 1.7469796037
-3.2096751106 -0.9673153668 2.3019377358
-3.3659225510 -1.2379438722 2.3019377358 |
ориентируясь на один и тот же пример, размноженный в инете написал такой скрипт
|
Код:
|
$ cat my_figure.py
#!/usr/bin/python
import pylab
from mpl_toolkits.mplot3d import Axes3D
from numpy import *
import numpy
import matplotlib
x,y,z = loadtxt('data.txt', usecols=[0,1,2], unpack=True)
print "data from data.txt = ", x,y,z
X, Y = numpy.meshgrid(x,y)
Z = matplotlib.mlab.griddata(x,y,z,X,Y,interp='nn')
fig = pylab.figure()
axes = Axes3D(fig)
axes.plot_surface(X, Y, Z)
pylab.show() |
но, рисует он явно не четыре площадки.
А вот так скрипт нарисовал эллипсоид
Uploaded with ImageShack.us
эллипсоид нормальный, в гнуплот например,
Uploaded with ImageShack.us
гнуплот не устраивает из-за того, что рисует проволочную поверхность
|
|

01.10.2010, 14:00
|
|
Новичок
|
|
Регистрация: 26.12.2008
Сообщений: 24
|
|
Помогите понять порядок заполнения двумерных матриц. Вот рабочий пример.
|
Код:
|
$ cat test.py
#!/usr/bin/python
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = Axes3D(fig)
u = np.linspace(0, np.pi, 6)
v = np.linspace(0, 0.2*np.pi, 6)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))
print "x = ", x
print "y = ", y
print "z = ", z
ax.plot_surface(x, y, z, rstride=1, cstride=1, color='b')
plt.show()
$ ./test.py
x = [[ 0. 0.12533323 0.24868989 0.36812455 0.48175367 0.58778525]
[ 0. 0.10139672 0.20119435 0.29781902 0.38974691 0.47552826]
[ 0. 0.0387301 0.0768494 0.11375674 0.14887007 0.18163563]
[-0. -0.0387301 -0.0768494 -0.11375674 -0.14887007 -0.18163563]
[-0. -0.10139672 -0.20119435 -0.29781902 -0.38974691 -0.47552826]
[-0. -0.12533323 -0.24868989 -0.36812455 -0.48175367 -0.58778525]]
y = [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 7.36690263e-02 1.46176248e-01 2.16378183e-01
2.83167705e-01 3.45491503e-01]
[ 0.00000000e+00 1.19198988e-01 2.36518138e-01 3.50107255e-01
4.58174971e-01 5.59016994e-01]
[ 0.00000000e+00 1.19198988e-01 2.36518138e-01 3.50107255e-01
4.58174971e-01 5.59016994e-01]
[ 0.00000000e+00 7.36690263e-02 1.46176248e-01 2.16378183e-01
2.83167705e-01 3.45491503e-01]
[ 0.00000000e+00 1.53483874e-17 3.04547216e-17 4.50807666e-17
5.89958610e-17 7.19805555e-17]]
z = [[ 1. 0.9921147 0.96858316 0.92977649 0.87630668 0.80901699]
[ 1. 0.9921147 0.96858316 0.92977649 0.87630668 0.80901699]
[ 1. 0.9921147 0.96858316 0.92977649 0.87630668 0.80901699]
[ 1. 0.9921147 0.96858316 0.92977649 0.87630668 0.80901699]
[ 1. 0.9921147 0.96858316 0.92977649 0.87630668 0.80901699]
[ 1. 0.9921147 0.96858316 0.92977649 0.87630668 0.80901699]] |
|
|

01.10.2010, 14:15
|
|
Местный
|
|
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,368
|
|
|
>Помогите понять порядок заполнения двумерных матриц
u задать от 10 до 90 c шагом 10, v от 1 до 9 с шагом 1, x = u+v, и порядок сразу будет виден
|
|

01.10.2010, 15:01
|
|
Новичок
|
|
Регистрация: 26.12.2008
Сообщений: 24
|
|
всеравно не пойму в каком порядке множество точек (x_i,y_i,z_i) скидывать в двумерные массивы. Наверняка, какая-то теория где-то есть :-)
|
Код:
|
$ cat test_order.py
#!/usr/bin/python
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = Axes3D(fig)
u = np.linspace(10, 30, 3)
v = np.linspace(1, 3, 3)
print u , v
x = np.outer(u+v,u)
y = np.outer(u-v,v)
z = np.outer(np.ones(np.size(u)), v)
print "x = ", x
print "y = ", y
print "z = ", z
ax.plot_surface(x, y, z, rstride=1, cstride=1, color='b')
plt.show()
$ ./test_order.py
[ 10. 20. 30.] [ 1. 2. 3.]
x = [[ 110. 220. 330.]
[ 220. 440. 660.]
[ 330. 660. 990.]]
y = [[ 9. 18. 27.]
[ 18. 36. 54.]
[ 27. 54. 81.]]
z = [[ 1. 2. 3.]
[ 1. 2. 3.]
[ 1. 2. 3.]] |
|
|
| Опции темы |
Поиск в этой теме |
|
|
|
| Опции просмотра |
Линейный вид
|
|
| |