使用 python 我想根据这张图片画一个魔方http://vixra.files.wordpress.com/2010/0 ... s-cube.jpg
这是我当前的代码 http://pastebin.com/MfF07ze4
但我希望代码至少有 5 个 for 循环和 5 个有助于创建多维数据集的函数。在为魔方的 1x1 立方体创建 3 个点时,我还需要算法方面的帮助。
使用 python 我想根据这张图片画一个魔方http://vixra.files.wordpress.com/2010/0 ... s-cube.jpg
这是我当前的代码 http://pastebin.com/MfF07ze4
但我希望代码至少有 5 个 for 循环和 5 个有助于创建多维数据集的函数。在为魔方的 1x1 立方体创建 3 个点时,我还需要算法方面的帮助。
我没有drawingpanel
模块,所以这是未经测试的:
from drawingpanel import *
panel = DrawingPanel(600, 600)
from math import *
import numpy as np
class Projection(object):
def __init__(self, origin, dx, dy, dz):
self.o = np.matrix([origin[0], origin[1], 0.])
self.p = np.matrix([
[dx[0], dx[1], 0.],
[dy[0], dy[1], 0.],
[dz[0], dz[1], 0.]
])
def proj(self, x, y, z):
res = self.o + np.matrix([x, y, z]) * self.p
return (res[0,0], res[0,1])
这是一个简单的等距 3d 到 2d 投影 - 它采用 3d 坐标并返回相应的 2d 屏幕坐标。
proj = Projection((175,130), ( 50, -24), (-50, -24), ( 0, 70)).proj
我创建了一个特定的投影 - 根据您的图像,我将立方体的前角设为 (175,130) 的原点。+X 跑到立方体的右上角,我把那个角点设为(3,0,0),方便细分立方体,也就是说(1,0,0)的屏幕投影是( 215, 106), 使 dx (50, -24); 然后类似地 +Y 到左上角和 +Z 到前下角。
def make_poly_pts(*args):
return [coord for pt in args for coord in proj(*pt)]
这是一个实用函数 - 它接受一个 3d 点列表并返回一个 [x1, y1, x2, y2, ... xN, yN] 坐标列表以提供给 create_polygon。
# allow for a gap between stickers
offs = 0.05
ooffs = 1. - offs
# draw top face (XY)
panel.canvas.create_polygon(*make_poly_pts((0,0,0), (3,0,0), (3,3,0), (0,3,0)), outline='black', fill='black')
for i in xrange(3):
for j in xrange(3):
panel.canvas.create_polygon(*make_poly_pts((i+offs,j+offs,0), (i+ooffs,j+offs,0), (i+ooffs,j+ooffs,0), (i+offs,j+ooffs,0)), outline='black', fill='yellow')
...然后可以通过交换轴类似地创建其他两个面。