2012-07-14 75 views
0

使用python,我想在此基础上图片http://vixra.files.wordpress.com/2010/0绘制魔方...... S-cube.jpgDrawingPanel.py绘制一个魔方

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

但我希望代码至少有5个for循环和5个函数,这将有助于创建多维数据集。我还需要帮助算法为魔方的1x1立方体创建3个点。

+0

为什么不一次只显示一张脸,并将颜色存储在一个列表中,列表中有六个内部列表,每个列表中有9个项目用于正方形的颜色? – Zimm3r 2012-07-14 01:09:48

+0

您的'此图片'链接不起作用,请修复它! – 2012-07-14 01:17:34

+0

...看起来应该是http://vixra.files.wordpress.com/2010/08/rubiks-cube.jpg – 2012-07-14 01:22:54

回答

2

我没有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投影 - 它采用三维坐标,并返回对应的2D屏幕坐标。

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

我创建了一个特定的投影 - 基于您的图像,我让该角的立方体的原点在(175,130)。 + X运行到立方体的右上角,并使角点(3,0,0)易于细分立方体,这意味着(1,0,0)的屏幕投影是(使得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') 

...然后可以通过交换轴类似地创建另外两个面。

+0

谢谢!虽然这比我能完全理解的复杂得多,但我仍然感谢你的帮助! – 2012-07-18 22:56:49