簡體   English   中英

DrawingPanel.py繪制一個魔方

[英]DrawingPanel.py Drawing a rubik's cube

使用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])

這是一個簡單的等距3d-to-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')

...然后可以通過交換軸類似地創建其他兩個面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM