DrawingPanel.py 绘制魔方



使用python我想根据这张图片绘制一个rubik的立方体http://vixra.files.wordpress.com/2010/0。。。s-cube.jpg

这是我当前的代码http://pastebin.com/MfF07ze4

但我希望代码至少有5个for循环和5个函数,这些函数将有助于创建多维数据集。此外,我需要在创建rubik立方体的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])

这是一个简单的等角三维到二维投影-它采用三维坐标并返回相应的二维屏幕坐标。

proj = Projection((175,130), ( 50, -24), (-50, -24), (  0,  70)).proj

我创建了一个特定的投影——根据你的图像,我将立方体的前角作为原点(175130)+X延伸到立方体的右上角,我使该角点(3,0,0)易于细分立方体,这意味着(1,0,0)的屏幕投影为(215106),使dx(50,-24);则类似地+Y到左上角并且+Z到前下角。

def make_poly_pts(*args):
    return [coord for pt in args for coord in proj(*pt)]

这是一个实用函数-它获取一个三维点列表,并返回一个[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')

则可以通过交换轴来类似地创建其他两个面。

相关内容

  • 没有找到相关文章

最新更新