2016-06-16 1 views
1

Mayavi mlab.points3d 플롯에 나타나는 3D 상자를 만들려고합니다. Mayavi의 mlab.mesh에 대해 x, y, z 좌표가 어떻게 정의됩니까?

나는이이 같은 뭔가 mlab.mesh 기능을 사용 할 수 있어야 그림 : 나는 mesh에 대한 MLAB 수동 입력을 검토 한

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

을하지만, 내 인생 이해할 수 없다 메쉬의 x, y, z 데이터 포인트가 정의되는 방법.

나에게 계몽 수 있습니까? 3D 상자의 x, y, z 데이터 포인트의 예가 특히 좋습니다.

답변

2

x, y 및 z 축에 대해 3 행렬로 3D 배열을 분할하는 것을 볼 수 있습니다. 각 매트릭스 인덱스는 좌표를 나타내고이 좌표의 각 점은이 이웃과 연결됩니다. 그래서 당신은으로 시작하여 상자를 만들기 위해 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

그렇지 않으면, 당신은 또한 하나의 호출로 더 많은 얼굴을 이동 중에도에서 보여 메쉬를 만들 수 있습니다.

# 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

덕분에 아주 두 호출 mayavi.mlab.mesh 에와 당신의 사례 인 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, 답을 자세히 설명해주세요. 당신이 그것에 담은 세부 사항을 정말 고맙게 생각하고, 지금 내가 그것을 이해하고 있다고 생각합니다. 위에 나온 예제를 통해 x3 = x4로 삼각형을 만들 수 있음을 알 수 있습니다. mayavi.mlab.mesh ([[0, 1], [0.5, 0.5]], [[0, 0], [1, 1]], [[1, 1], [1, 1]]) – dreme

+0

안녕하세요. 기꺼이 도와 드리겠습니다. 맞습니다. 두 지점에 대해 동일한 좌표를 정의했기 때문에 삼각형을 만들 수도 있습니다. mayavi.mlab.mesh ([[0, 1], [0.5, 0.5], [0,1]], [[0, 0], [1, 1], [2, 2] 1, 1], [1, 1], [1, 1]]) – Geodor

관련 문제