#author("2021-12-05T10:08:33+09:00","default:Real2Virtual202111","Real2Virtual202111")
#author("2021-12-08T00:25:16+09:00","default:Real2Virtual202111","Real2Virtual202111")
[[Real2Virtual202111]]

* Cube.py [#nb46e7a0]
-- https://www.bing.com/search?q=python+3dcg+matrix.py+Vector3d&qs=n&form=QBRE&sp=-1&pq=python+3dcg+matrix.py+vector3d&sc=0-30&sk=&cvid=D233A67E1D964129BFAA58A87460A23F
- このライブラリを使わせていただいています。感謝します。
-- https://sites.google.com/site/3dprogramminginpython/

code(python{{
#code(Python){{

import math
from tkinter import *
import tkinter.font as tkFont
import matrix
import copy
import threading
import re

class Cube:
    ''' Coordiante-system: Right-handed, Matrices are column-major ones '''
    def __init__(self,space):
                # set space
                self.space=space
                self.name=""
                
		#Let these be in World-coordinates (worldview-matrix already applied)
		#In right-handed, counter-clockwise order
                # original cube
                self.org_cube = [
                        matrix.Vector3D(-0.5,0.5,-0.5),
                        matrix.Vector3D(0.5,0.5,-0.5),
                        matrix.Vector3D(0.5,-0.5,-0.5),
                        matrix.Vector3D(-0.5,-0.5,-0.5),
                        matrix.Vector3D(-0.5,0.5,0.5),
                        matrix.Vector3D(0.5,0.5,0.5),
                        matrix.Vector3D(0.5,-0.5,0.5),
                        matrix.Vector3D(-0.5,-0.5,0.5)
                        ]
                #
                #            0------- 1
                #         4 ------ 5- |
                #         |  |     |  |
                #         |  |     |  |
                #         |  3---  |  2
                #         7--------6
                #    y
                #    |
                #    |
                #    +------>x
                #   /
                #  z
                #

		# Define the vertices that compose each of the 6 faces. These numbers are
		# indices to the vertices list defined above.
                self.cubefaces = [(0,4,5,1),(0,1,2,3),(4,0,3,7),(5,4,7,6),(1,5,6,2),(3,2,6,7)]
                self.cls = ['red', 'blue', 'yellow', 'green', 'gray', 'white']


		#The matrices (Scale, Shear, Rotate, Translate) apply to locally translated cube
                self.ang = [0.0, 0.0, 0.0] # phi(x), theta(y), psi(z) of the local cube, apply to the original cube
                self.trans = [0.0, 0.0, 0.0] # translation (x, y, z) of the local cube, apply to the original cube

                #The Scale Matrix
                self.Scale = matrix.Matrix(4, 4)
                Scalex = 1.0
                Scaley = 1.0
                Scalez = 1.0
                self.Scale[(0,0)] = Scalex
                self.Scale[(1,1)] = Scaley
                self.Scale[(2,2)] = Scalez

                #The Shear Matrix
                self.Shearxy = matrix.Matrix(4, 4)
                self.Shearxy[(0,2)] = 0.0
                self.Shearxy[(1,2)] = 0.0
                self.Shearxz = matrix.Matrix(4, 4)
                self.Shearxz[(0,1)] = 0.0
                self.Shearxz[(2,1)] = 0.0
                self.Shearyz = matrix.Matrix(4, 4)
                self.Shearyz[(1,0)] = 0.0
                self.Shearyz[(2,0)] = 0.0
                self.Shear = self.Shearxy*self.Shearxz*self.Shearyz

                #The Rotation Matrices
                self.Rotx = matrix.Matrix(4,4)
                self.Roty = matrix.Matrix(4,4)
                self.Rotz = matrix.Matrix(4,4)

                #The Translation Matrix (will contain xoffset, yoffset, zoffset)
                self.Tr = matrix.Matrix(4, 4)
                self.Tr[(0,3)] = self.trans[0]
                self.Tr[(1,3)] = self.trans[1]
                self.Tr[(2,3)] = self.trans[2]
                                
                # LED-s(+) and a photo-tr(*) on a face
                #
                #     0----------------1
                #     |                |
                #     |    +           |
                #     |             +  |
                #     |                |
                #     |                |
                #     |  +             |
                #     |    *      +    |
                #     |                |
                #     4----------------5
                #
                #
                self.led_face = [
                        #0 matrix.Vector3D(-0.5,0.5,-0.5),
                           matrix.Vector3D(0.3,0.5, 0.4),
                        #1 matrix.Vector3D(0.5,0.5,-0.5),
                           matrix.Vector3D(0.4,0.5, -0.3),
                        #2 matrix.Vector3D(-0.5,0.5,0.5),
                           matrix.Vector3D(-0.3,0.5,-0.4),
                        #3 matrix.Vector3D(0.5,0.5,0.5),
                           matrix.Vector3D(-0.4,0.5,0.3)
                        ]
                self.phtr_face = matrix.Vector3D(-0.3,0.5,0.4)
                self.face_00=copy.deepcopy([self.led_face,self.phtr_face])
                #
                self.face_01=self.rotateFaceTo(90.0,0.0,0.0,self.face_00)
                self.face_02=self.rotateFaceTo(0.0,-90.0,0.0,self.face_01)
                self.face_03=self.rotateFaceTo(0.0,-180.0,0.0,self.face_01)
                self.face_04=self.rotateFaceTo(0.0,-270.0,0.0,self.face_01)
                self.face_05=self.rotateFaceTo(0.0,0.0,90.0,self.face_04)
                self.org_cfaces=[self.face_00,self.face_01,self.face_02,self.face_03,self.face_04,self.face_05]
                
                self.update()
                
    def moveTo(self,x,y,z):
        self.trans=[x,y,z]
        self.update()
        
    def rotateTo(self,phy,theta,psi):
        print("rotateTo(",end="")
        print(phy,theta,psi,end="")
        print(")")
        px=self.get_face_vector(0)
        #print("b face_vector(0)=",end="")
        #print(px)
        px=self.get_face_vector(1)
        #print("b face_vector(1)=",end="")
        #print(px)
        self.ang=[phy,theta,psi]
        self.update()
        px=self.get_face_vector(0)
        #print("a face_vector(0)=",end="")
        #print(px)
        px=self.get_face_vector(1)
        #print("a face_vector(1)=",end="")
        #print(px)
        
    def rotateFaceTo(self,phy,theta,psi,orgface):
        ang=[phy,theta,psi]
        #transform original cube to local cube
        #The Rotation Matrices
        _Rotx = matrix.Matrix(4,4)
        _Roty = matrix.Matrix(4,4)
        _Rotz = matrix.Matrix(4,4)
        #
        _Rotx[(1,1)] = math.cos(math.radians(360.0-ang[0]))
        _Rotx[(1,2)] = -math.sin(math.radians(360.0-ang[0]))
        _Rotx[(2,1)] = math.sin(math.radians(360.0-ang[0]))
        _Rotx[(2,2)] = math.cos(math.radians(360.0-ang[0]))
        
        _Roty[(0,0)] = math.cos(math.radians(360.0-ang[1]))
        _Roty[(0,2)] = math.sin(math.radians(360.0-ang[1]))
        _Roty[(2,0)] = -math.sin(math.radians(360.0-ang[1]))
        _Roty[(2,2)] = math.cos(math.radians(360.0-ang[1]))

        _Rotz[(0,0)] = math.cos(math.radians(360.0-ang[2]))
        _Rotz[(0,1)] = -math.sin(math.radians(360.0-ang[2]))
        _Rotz[(1,0)] = math.sin(math.radians(360.0-ang[2]))
        _Rotz[(1,1)] = math.cos(math.radians(360.0-ang[2]))

        _Tr = matrix.Matrix(4,4)
        _trans = [0.0, 0.0, 0.0]
        #The Rotation matrix
        _Rot = _Rotx*_Roty*_Rotz
        
        #Translation (just copying)
        _Tr[(0,3)] = -_trans[0]
        _Tr[(1,3)] = -_trans[1]
        _Tr[(2,3)] = -_trans[2]
        
        #The Transformation matrix
        _Tsf = _Tr*self.Scale*self.Shear*_Rot
        #orgface=[self.led_face,self.phtr_face]
        newface=copy.deepcopy(orgface)
        xface=newface[0]
        for j in range(len(xface)):
            v = xface[j]
                
            # Scale, Shear, Rotate the vertex around X axis, then around Y axis, and finally around Z axis and Translate.
            r = _Tsf*v
            xface[j]=r
        v=newface[1]
        r = _Tsf*v
        newface[1]=r
        return newface
        
    def rotate(self,phy,theta,psi):
        print(self.get_name(),end="");
        print(".rotate(",end="")
        print(phy,theta,psi,end="")
        print(")")
        px=self.get_face_vector(0)
        #print("b face_vector(0)=",end="")
        #print(px)
        px=self.get_face_vector(1)
        #print("b face_vector(1)=",end="")
        #print(px)
        self.ang=[(self.ang[0]+phy)%360.0,(self.ang[1]+theta)%360.0,(self.ang[2]+psi)%360.0]
        self.update()
        px=self.get_face_vector(0)
        #print("a face_vector(0)=",end="")
        #print(px)
        px=self.get_face_vector(1)
        #print("a face_vector(1)=",end="")
        #print(px)

    def set_name(self,x):
        self.name=x

    def get_name(self):
        return self.name

    def get_cube_center(self):
        print("get_cube_center ",self.get_name(),end="")
        p1=self.cube[0]
        p2=self.cube[6]
        px=p2+p1
        px.x=px.x/2
        px.y=px.y/2
        px.z=px.z/2
        print(px)
        return px

    def get_face_vector(self,f):
        print(self.get_name(),".get_face_vector(",end="")
        #print("cube_id")
        print(f,end="")
        print(")=",end="")
        #print(f)
        fx=self.cubefaces[f]
        fx01=fx[0]
        #print("fx01")
        #print(fx01)
        fx02=fx[2]
        #print("fx02")
        #print(fx02)
        fv01=self.cube[fx01]
        #print("fv01")
        #print(fv01)
        fv02=self.cube[fx02]
        cc=self.get_cube_center()
        fv01=fv01-cc
        fv02=fv02-cc
        #print("fv02")
        #print(fv02)
        r=fv01+fv02
        r.x=r.x/2
        r.y=r.y/2
        r.z=r.z/2
        #print("get_face_vector return ",end="")
        print(r)
        return r

    def get_next_place_position(self,f):
        print("get_next_place_position ",self.get_name()," f=",end="")
        print(f)
        nfv=self.get_face_vector(f)
        #print("nfv=")
        #print(nfv)
        #The Scale Matrix
        _Scale = matrix.Matrix(4, 4)
        Scalex = 2.0
        Scaley = 2.0
        Scalez = 2.0
        _Scale[(0,0)] = Scalex
        _Scale[(1,1)] = Scaley
        _Scale[(2,2)] = Scalez
        v=_Scale*nfv
        #print("v=")
        #print(v)
        cc=self.get_cube_center()
        px_x=v.x+cc.x
        px_y=v.y+cc.y
        px_z=v.z+cc.z
        pv=matrix.Vector3D(px_x,px_y,px_z)
        print("get_next_place_position return ",end="")
        #print("new position=")
        print(pv)
        return pv
    
    def is_next_door_face(self,my_face,cubex,facex):
        print("is_nextdoor_face(",end="")
        print(self.get_name())
        print(",my_face=",end="") 
        print(my_face,end="")
        print(",cubex=",end="")
        print(cubex.get_name(),end="")
        print(",facex=",end="")
        print(facex,end="")
        print(")")
        v1=self.get_face_vector(my_face)
        tx=matrix.Vector3D(self.trans[0],self.trans[1],self.trans[2])
        #print("cube1 position")
        #print(tx)
        p1=v1+tx
        #print("cube1.f position")
        #print(p1)
        v2=cubex.get_face_vector(facex)
        #print("cube2 f position")
        #print(v2)
        tx2=matrix.Vector3D(cubex.trans[0],cubex.trans[1],cubex.trans[2])
        #print("cube2 position")
        #print(tx2)
        p2=v2+tx2
        #print("cube2.f position")
        #print(p2)
        dx=p1-p2
        #print("dx")
        #print(dx)
        dxx=math.sqrt(dx.x*dx.x+dx.y*dx.y+dx.z*dx.z)
        print("dxx=",end="")
        print(dxx)
        if dxx<0.1:
            return True
        return False
    
    def rotate_nextdoor_cube_until_match_the_face(self,my_face, next_cube,x_face):
        print("rotate_nextdoor_cube_until_match_the_face(",end="")
        print(self.get_name(),",",end="")
        print("my_face=",end="") 
        print(my_face,end="")
        print(",next_cube=",end="")
        print(next_cube.get_name(),end="")
        print(",x_face=",end="")
        print(x_face,end="")
        print(")")
        #self.print_cfaces()
        #next_cube.print_cfaces()
        if self.is_next_door_face( my_face, next_cube, x_face):
            return True
        dcx=self.get_face_vector(my_face)
        if abs(dcx.y) <=0.01 and abs(dcx.z) <=0.01:
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_next_door_face(my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_next_door_face(my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
        if abs(dcx.x) <=0.01 and abs(dcx.z) <=0.01:
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
        if abs(dcx.x) <=0.01 and abs(dcx.y) <=0.01:
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_next_door_face( my_face, next_cube, x_face):
                return True
        return False
    def is_connect_with_the_direction(self, my_face, cubex, facex, d):
        print("is_connect_with_the_direction(",self.get_name(),",",end="")
        xface=cubex.cfaces[facex]
        print(my_face,end="")
        print(",",cubex.get_name(),",",end="")
        print(facex,end="")
        print(",d=",end="")
        print(d,end="")
        print(")")
        xxface=xface[0]
        #print("xxface=")
        #print(xxface)
        ledx=xxface[d]
        print("ledx=",end="")
        print(ledx)
        #cubex_pos=cubex.get_cube_center()
        #ledxx=ledx+cubex_pos
        #print("ledxx=",end="")
        #print(ledxx)
        mfacex=self.cfaces[my_face]
        #print("mfacex=",end="")
        #print(mfacex)
        ptrx=mfacex[1]
        print("ptrx=",end="")
        print(ptrx)
        #mycube_pos=self.get_cube_center()
        #ptrxx=ptrx+mycube_pos
        #print("ptrxx=",end="")
        #print(ptrxx)
        #dx=ledxx-ptrxx
        dx=ledx-ptrx
        print("dx=",end="")
        print(dx)
        dxx=math.sqrt(dx.x*dx.x+dx.y*dx.y+dx.z*dx.z)
        print("dxx=",end="")
        print(dxx)
        if dxx<0.1:
            return True
        return False
        
    def rotate_nextdoor_cube_until_match_the_direction(self,my_face, next_cube,x_face,d):
        print("rotate_nextdoor_cube_until_match_the_direction(",self.get_name(),end="")
        print(",my_face=",end="") 
        print(my_face,end="")
        print(",next_cube=",next_cube.get_name(),end="")
        print(",x_face=",end="")
        print(x_face,end="")
        print(",d=",end="")
        print(d,end="")
        print(")")
        #self.print_cfaces()
        #next_cube.print_cfaces()
        if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
            return True
        dcx=self.get_face_vector(my_face)
        if abs(dcx.y) <=0.01 and abs(dcx.z) <=0.01:
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
        if abs(dcx.x) <=0.01 and abs(dcx.z)<=0.01:
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
        if abs(dcx.x) <=0.01 and abs(dcx.y)<=0.01:
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,0.0,90.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True                
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(90.0,0.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
            next_cube.rotate(0.0,90.0,0.0)
            if self.is_connect_with_the_direction(my_face, next_cube, x_face,d):
                return True
        return False

    def update(self):
        #transform original cube to local cube
        self.Rotx[(1,1)] = math.cos(math.radians(360.0-self.ang[0]))
        self.Rotx[(1,2)] = -math.sin(math.radians(360.0-self.ang[0]))
        self.Rotx[(2,1)] = math.sin(math.radians(360.0-self.ang[0]))
        self.Rotx[(2,2)] = math.cos(math.radians(360.0-self.ang[0]))
        
        self.Roty[(0,0)] = math.cos(math.radians(360.0-self.ang[1]))
        self.Roty[(0,2)] = math.sin(math.radians(360.0-self.ang[1]))
        self.Roty[(2,0)] = -math.sin(math.radians(360.0-self.ang[1]))
        self.Roty[(2,2)] = math.cos(math.radians(360.0-self.ang[1]))
        
        self.Rotz[(0,0)] = math.cos(math.radians(360.0-self.ang[2]))
        self.Rotz[(0,1)] = -math.sin(math.radians(360.0-self.ang[2]))
        self.Rotz[(1,0)] = math.sin(math.radians(360.0-self.ang[2]))
        self.Rotz[(1,1)] = math.cos(math.radians(360.0-self.ang[2]))
        
        #The Rotation matrix
        self.Rot = self.Rotx*self.Roty*self.Rotz
        
        #Translation (just copying)
        self.Tr[(0,3)] = self.trans[0]
        self.Tr[(1,3)] = self.trans[1]
        self.Tr[(2,3)] = self.trans[2]
        
        #The Transformation matrix
        self.Tsf = self.Tr*self.Scale*self.Shear*self.Rot
        self.cube=copy.deepcopy(self.org_cube)
        for i in range(len(self.cubefaces)):
            for j in range(len(self.cubefaces[0])):
                v = self.org_cube[self.cubefaces[i][j]]
                #print("v[%d,%d]="%(i,j))
                #print(v)
                # Scale, Shear, Rotate the vertex around X axis, then around Y axis, and finally around Z axis and Translate.
                r = self.Tsf*v
                #print("r[%d,%d]="%(i,j))
                #print(v)
                self.cube[self.cubefaces[i][j]]=r
        self.cfaces=copy.deepcopy(self.org_cfaces)
        #print("update cube ",self.get_name())
        for i in range(len(self.cfaces)):
            #print("face(",end="")
            #print(i,end="")
            #print(")")
            xface=self.cfaces[i]
            xface_led=xface[0]
            for j in range(len(xface_led)):
                #print("b led(",end="")
                #print(j,end="")
                #print(")=",end="")
                v = xface_led[j]
                #print(v)
                # Scale, Shear, Rotate the vertex around X axis, then around Y axis, and finally around Z axis and Translate.
                r = self.Tsf*v
                xface_led[j]=r
                #print("a led(",end="")
                #print(j,end="")
                #print(")=",end="")
                #print(r)
            v=xface[1]
            #print("b ptr()=",end="")
            r=self.Tsf*v
            xface[1]=r
            #print(r)
            self.cfaces[i]=xface

    def print_cfaces(self):
        print("cfaces cube=",self.get_name())
        for i in range(len(self.cfaces)):
            print("face(",end="")
            print(i,end="")
            print(")")
            xface=self.cfaces[i]
            xface_led=xface[0]
            for j in range(len(xface_led)):
                print(" led(",end="")
                print(j,end="")
                print(")=",end="")
                v = xface_led[j]
                print(v)
                # Scale, Shear, Rotate the vertex around X axis, then around Y axis, and finally around Z axis and Translate.
            v=xface[1]
            print("ptr()=",end="")
            print(v)
        

}}
----
#counter


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS