2016-06-16 3 views
1

Я пытаюсь создать 3D-окно, которое появится в сюжете Mayavi mlab.points3d.Как определить координаты x, y, z для mlab.mesh для Mayavi?

Я полагаю, что это должно быть возможно, используя mlab.mesh функцию, что-то вроде этого:

points = mlab.points3d(xp,yp,zp,sp) 
3Dbox = mlab.mesh(xbox,ybox,zbox) 
mlab.show() 

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

Может ли кто-нибудь просветить меня, пожалуйста? Особенно рекомендуется оценить пример точек данных x, y, z для 3D-окна.

ответ

2

Вы можете видеть, что 3D-массив разбит на 3 матрицы для осей x, y и z. Каждый индекс матрицы будет отображать координаты, и каждая точка этих координат будет связана с этими соседями. Таким образом, вы можете начать определять 6 плоскостей, чтобы сделать ваш ящик:

import numpy 
import mayavi.mlab 


#    pt1_ _ _ _ _ _ _ _ _pt2 
#    /|     /| 
#   /|    /| 
#   pt3/_ | _ _ _ _ _ _pt4/ | 
#   | |    | | 
#   | |    | | 
#   | pt5_ _ _ _ _ _ _|_ _|pt6 
#   |/    |/
#   |/    |/
#  pt7|/_ _ _ _ _ _ _ _ _|/pt8 

# Where : 
x1, y1, z1 = (0, 1, 1) # | => pt1 
x2, y2, z2 = (1, 1, 1) # | => pt2 
x3, y3, z3 = (0, 0, 1) # | => pt3 
x4, y4, z4 = (1, 0, 1) # | => pt4 
x5, y5, z5 = (0, 1, 0) # | => pt5 
x6, y6, z6 = (1, 1, 0) # | => pt6 
x7, y7, z7 = (0, 0, 0) # | => pt7 
x8, y8, z8 = (1, 0, 0) # | => pt8 


box_points = numpy.array([[x1, y1, z1], [x2, y2, z2], [x3, y3, z3], 
          [x4, y4, z4], [x5, y5, z5], [x6, y6, z6], 
          [x7, y7, z7], [x8, y8, z8]]) 

mayavi.mlab.points3d(box_points[:, 0], box_points[:, 1], box_points[:, 2], 
        mode="axes", color=(1, 0, 0)) 


mayavi.mlab.mesh([[x1, x2], 
        [x3, x4]], # | => x coordinate 

       [[y1, y2], 
        [y3, y4]], # | => y coordinate 

       [[z1, z2], 
        [z3, z4]], # | => z coordinate 

       color=(0, 0, 0)) # black 

# Where each point will be connected with this neighbors : 
# (link = -) 
# 
# x1 - x2  y1 - y2  z1 - z2 | => pt1 - pt2 
# - - and - - and - - | => -  - 
# x3 - x4  y3 - y4  z3 - z4 | => pt3 - pt4 


mayavi.mlab.mesh([[x5, x6], [x7, x8]], 
       [[y5, y6], [y7, y8]], 
       [[z5, z6], [z7, z8]], 
       color=(1, 0, 0)) # red 

mayavi.mlab.mesh([[x1, x3], [x5, x7]], 
       [[y1, y3], [y5, y7]], 
       [[z1, z3], [z5, z7]], 
       color=(0, 0, 1)) # blue 

mayavi.mlab.mesh([[x1, x2], [x5, x6]], 
       [[y1, y2], [y5, y6]], 
       [[z1, z2], [z5, z6]], 
       color=(1, 1, 0)) # yellow 

mayavi.mlab.mesh([[x2, x4], [x6, x8]], 
       [[y2, y4], [y6, y8]], 
       [[z2, z4], [z6, z8]], 
       color=(1, 1, 1)) # white 

mayavi.mlab.mesh([[x3, x4], [x7, x8]], 
       [[y3, y4], [y7, y8]], 
       [[z3, z4], [z7, z8]], 
       color=(1, 0, 1)) # pink 

mayavi.mlab.show() 

enter image description here

В противном случае, вы можете также сделать сетку, которые показывают в по картингу больше лиц с одного вызова. С два вызова mayavi.mlab.mesh:

# Define 2 mesh objects with 3 planes connected among themselves : 
# 
# pt1 - pt2 - pt6  pt8 - pt6 - pt2 
# -  -  -   -  -  - 
# pt3 - pt4 - pt8 AND pt7 pt5 - pt1 
# -  -  -   -  -  - 
# pt7 - pt8 - pt8  pt3 - pt1 - pt1 

mayavi.mlab.figure() 
mayavi.mlab.mesh([[x1, x2, x6], [x3, x4, x8], [x7, x8, x8]], 
       [[y1, y2, y6], [y3, y4, y8], [y7, y8, y8]], 
       [[z1, z2, z6], [z3, z4, z8], [z7, z8, z8]], 
       color=(1, 0, 0)) # red 

mayavi.mlab.mesh([[x8, x6, x2], [x7, x5, x1], [x3, x1, x1]], 
       [[y8, y6, y2], [y7, y5, y1], [y3, y1, y1]], 
       [[z8, z6, z2], [z7, z5, z1], [z3, z1, z1]], 
       color=(0, 0, 1)) # blue 

mayavi.mlab.show() 

enter image description here

С один вызов mayavi.mlab.mesh:

# Merge previous mesh objects in single one: 
# 
# pt1 - pt2 - pt6    | => pt1 - pt2 - pt6 - pt6 - pt6 
# -  -  -    | => -  -  -  -  - 
# pt3 - pt4 - pt8    | => pt3 - pt4 - pt8 - pt6 - pt2 
# -  -  -    | => -  -  -  -  - 
# pt7 - pt8 - pt8 - pt6 - pt2 | => pt7 - pt8 - pt8 - pt6 - pt2 
#    -  - - | => -  -  -  - - 
#    pt7 pt5 - pt1 | => pt7 - pt7 - pt7 pt5 - pt1 
#    -  -  - | => -  -  -  -  - 
#    pt3 - pt1 - pt1 | => pt7 - pt3 - pt3 - pt1 - pt1 


mayavi.mlab.figure() 
mayavi.mlab.mesh([[x1, x2, x6, x6, x6], 
        [x3, x4, x8, x6, x2], 
        [x7, x8, x8, x6, x2], 
        [x7, x7, x7, x5, x1], 
        [x7, x3, x3, x1, x1]], 

       [[y1, y2, y6, y6, y6], 
        [y3, y4, y8, y6, y2], 
        [y7, y8, y8, y6, y2], 
        [y7, y7, y7, y5, y1], 
        [y7, y3, y3, y1, y1]], 

       [[z1, z2, z6, z6, z6], 
        [z3, z4, z8, z6, z2], 
        [z7, z8, z8, z6, z2], 
        [z7, z7, z7, z5, z1], 
        [z7, z3, z3, z1, z1]]) 

mayavi.mlab.show() 

enter image description here

+0

Спасибо очень много для вашего примера Geodor, но я до сих пор не очень понимаю соглашение, которое используется mlab.mesh для определения каждой из шести плоскостей в вашем кубе, например. mayavi.mlab.mesh ([[0, 1], [0, 1]], [[0, 0], [1, 1]], [[1, 1], [1, 1]]). Например, каков первый список, [[0, 1], [0, 1]], предназначенный для представления? – dreme

+0

Эй, Geodor, THX для разработки вашего ответа. Я очень ценю детали, которые вы им вложили, и думаю, что теперь я это понимаю. Исходя из вашего примера выше, я вижу, что вы можете создать треугольник, сделав x3 = x4, например. mayavi.mlab.mesh ([[0, 1], [0.5, 0.5]], [[0, 0], [1, 1]], [[1, 1], [1, 1]]) – dreme

+0

Привет, THX, рад, что я мог бы помочь. Вы имеете право, вы также можете сделать треугольник, так как вы определяете одну и ту же координату для двух точек. mayavi.mlab.mesh ([[0, 1], [0,5, 0,5], [0, 1]], [[0, 0], [1, 1], [2, 2]], [[ 1, 1], [1, 1], [1, 1]]) – Geodor

Смежные вопросы