0
y 축과 x 축의 각도에서 데이터 큐브를 따라 슬라이스하는 4 개의 다각형으로 3D 공간에 점을 그립니다.상자 주위를 감싸는 동시에 3 차원 좌표 주위에 다각형을 그립니다.
상자 안의 각 검은 색 데이터 포인트에 대해 데이터 포인트를 중심으로 한 정사각형의 좌표를 계산하고 싶습니다. 이 좌표를 사용하여 나는 지금하고있는 것과 같은 방식으로 polgyon을 그릴 수 있습니다. 이 사각형의 치수는 7 행에 정의 된 너비 값과 동일해야합니다. 그려지는 사각형은 기존의 플롯 된 평면에 정확하게 놓 이도록 기울여야합니다.
아무에게도 접근하는 가장 좋은 방법을 알고 있습니까? 다른 어려운 점은 상자가 상자를 떠난다면 상자의 다른면을 감싸 야합니다. 상자는 수평으로 그리고 똑같은 상자로 수직으로 쌓을 수 있으며 무한히 쌓아 올릴 수 있습니다.
이 내 코드가 belw 찾을 수 있습니다 (죄송는 지저분한의) :
import matplotlib.pyplot as pyplot
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
angle = np.arctan2(1,4)
xangle = np.arctan2(1,4)
width = 100/np.cos(angle)
print 'angle:', angle*(180/np.pi)
print 'xangle:', xangle*(180/np.pi)
print 'width:', width
x1 = [0, 0, 0, 0, 50, 50, 50, 50]
y1 = [50,50,50,50,50,50,50,50]
z1 = [12.5,37.5,62.5,87.5,25,50,75,0]
x2 = [0,0,0,0,0,0,0,0,50,50,50,50,50,50,50,50]
y2 = [0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50]
z2 = [0,12.5,25,37.5,50,62.5,75,87.5,12.5,25,37.5,50,62.5,75,87.5,0]
fig = pyplot.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.set_xlim(0,100)
ax.set_ylim(0,100)
ax.set_zlim(0,100)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
#ax.view_init(elev=90, azim=90)
#ax.scatter(x1, y1, z1, zdir='z', s=20, c='g')
ax.scatter(x2, y2, z2, zdir='z', s=20, c='r') #THESE ARE RICHARD'S COORDINATES notice how they do not lie on the plane
xa = [0,100,100,0]
ya = [0,0,100,100]
za = [0,-6.25,18.75,25]
verts = [zip(xa,ya,za)]
ax.add_collection3d(Poly3DCollection(verts))
xb = [0,100,100,0]
yb = [0,0,100,100]
zb = [25,-6.25+25,18.75+25,50]
verts = [zip(xb,yb,zb)]
ax.add_collection3d(Poly3DCollection(verts))
xc = [0,100,100,0]
yc = [0,0,100,100]
zc = [50,-6.25+25*2,18.75+25*2,75]
verts = [zip(xc,yc,zc)]
ax.add_collection3d(Poly3DCollection(verts))
xd = [0,100,100,0]
yd = [0,0,100,100]
zd = [75,-6.25+25*3,18.75+25*3,100]
verts = [zip(xd,yd,zd)]
ax.add_collection3d(Poly3DCollection(verts))
#pyplot.show()
x = [0]
y = [0]
z = [0]
for i in range(1,100):
new_x = x[(len(x)-1)] + 50
new_y = y[(len(y)-1)] + 12.5
new_z = z[(len(z)-1)]
if new_x >= 100:
new_x = new_x - 100
new_z = new_z + 6.25
if new_y >= 100:
new_y = new_y - 100
if new_z >= 100:
new_z = new_z - 100
if new_x == 0 and new_y == 0 and new_z == 0:
print 'done!', i
x.append(new_x)
y.append(new_y)
z.append(new_z)
ax.scatter(x, y, z, zdir='z', s=20, c='k', zorder=1)
pyplot.show()