Cube.py
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[Real2Virtual202111]]
* Cube.py [#nb46e7a0]
- このライブラリを使わせていただいています。感謝します。
-- https://sites.google.com/site/3dprogramminginpython/
#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 col...
def __init__(self,space):
# set space
self.space=space
self.name=""
#Let these be in World-coordinates (worldview-matrix al...
#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....
# indices to the vertices list defined above.
self.cubefaces = [(0,4,5,1),(0,1,2,3),(4,...
self.cls = ['red', 'blue', 'yellow', 'gre...
#The matrices (Scale, Shear, Rotate, Translate) apply t...
self.ang = [0.0, 0.0, 0.0] # phi(x), thet...
self.trans = [0.0, 0.0, 0.0] # translatio...
#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*se...
#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 xof...
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...
self.face_00=copy.deepcopy([self.led_face...
#
self.face_01=self.rotateFaceTo(90.0,0.0,0...
self.face_02=self.rotateFaceTo(0.0,-90.0,...
self.face_03=self.rotateFaceTo(0.0,-180.0...
self.face_04=self.rotateFaceTo(0.0,-270.0...
self.face_05=self.rotateFaceTo(0.0,0.0,90...
self.org_cfaces=[self.face_00,self.face_0...
self.update()
def get_top_face(self):
for fx in range(6):
fv=self.get_face_vector(fx)
if fv.y>0.45:
if abs(fv.x)<0.05:
if abs(fv.z)<0.05:
return fx
def get_front_face(self):
for fx in range(6):
fv=self.get_face_vector(fx)
if fv.z> 0.45:
if abs(fv.x)<0.05:
if abs(fv.y)<0.05:
return fx
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 ax...
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]+th...
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(),...
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],se...
#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]...
#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...
print("rotate_nextdoor_cube_until_match_the_face(...
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_...
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...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face(my_face, next_cube,...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face(my_face, next_cube,...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
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...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
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...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
return False
def is_connect_with_the_direction(self, my_face, cube...
print("is_connect_with_the_direction(",self.get_n...
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(se...
print("rotate_nextdoor_cube_until_match_the_direc...
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, ne...
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...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
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...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
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...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
return False
def update(self):
#transform original cube to local cube
self.Rotx[(1,1)] = math.cos(math.radians(360.0-se...
self.Rotx[(1,2)] = -math.sin(math.radians(360.0-s...
self.Rotx[(2,1)] = math.sin(math.radians(360.0-se...
self.Rotx[(2,2)] = math.cos(math.radians(360.0-se...
self.Roty[(0,0)] = math.cos(math.radians(360.0-se...
self.Roty[(0,2)] = math.sin(math.radians(360.0-se...
self.Roty[(2,0)] = -math.sin(math.radians(360.0-s...
self.Roty[(2,2)] = math.cos(math.radians(360.0-se...
self.Rotz[(0,0)] = math.cos(math.radians(360.0-se...
self.Rotz[(0,1)] = -math.sin(math.radians(360.0-s...
self.Rotz[(1,0)] = math.sin(math.radians(360.0-se...
self.Rotz[(1,1)] = math.cos(math.radians(360.0-se...
#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 ...
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 ...
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 ...
v=xface[1]
print("ptr()=",end="")
print(v)
}}
----
#counter
終了行:
[[Real2Virtual202111]]
* Cube.py [#nb46e7a0]
- このライブラリを使わせていただいています。感謝します。
-- https://sites.google.com/site/3dprogramminginpython/
#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 col...
def __init__(self,space):
# set space
self.space=space
self.name=""
#Let these be in World-coordinates (worldview-matrix al...
#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....
# indices to the vertices list defined above.
self.cubefaces = [(0,4,5,1),(0,1,2,3),(4,...
self.cls = ['red', 'blue', 'yellow', 'gre...
#The matrices (Scale, Shear, Rotate, Translate) apply t...
self.ang = [0.0, 0.0, 0.0] # phi(x), thet...
self.trans = [0.0, 0.0, 0.0] # translatio...
#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*se...
#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 xof...
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...
self.face_00=copy.deepcopy([self.led_face...
#
self.face_01=self.rotateFaceTo(90.0,0.0,0...
self.face_02=self.rotateFaceTo(0.0,-90.0,...
self.face_03=self.rotateFaceTo(0.0,-180.0...
self.face_04=self.rotateFaceTo(0.0,-270.0...
self.face_05=self.rotateFaceTo(0.0,0.0,90...
self.org_cfaces=[self.face_00,self.face_0...
self.update()
def get_top_face(self):
for fx in range(6):
fv=self.get_face_vector(fx)
if fv.y>0.45:
if abs(fv.x)<0.05:
if abs(fv.z)<0.05:
return fx
def get_front_face(self):
for fx in range(6):
fv=self.get_face_vector(fx)
if fv.z> 0.45:
if abs(fv.x)<0.05:
if abs(fv.y)<0.05:
return fx
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 ax...
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]+th...
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(),...
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],se...
#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]...
#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...
print("rotate_nextdoor_cube_until_match_the_face(...
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_...
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...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face(my_face, next_cube,...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face(my_face, next_cube,...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
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...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_next_door_face( my_face, next_cube...
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...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_next_door_face( my_face, next_cube...
return True
return False
def is_connect_with_the_direction(self, my_face, cube...
print("is_connect_with_the_direction(",self.get_n...
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(se...
print("rotate_nextdoor_cube_until_match_the_direc...
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, ne...
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...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
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...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
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...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,0.0,90.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(90.0,0.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
next_cube.rotate(0.0,90.0,0.0)
if self.is_connect_with_the_direction(my_face...
return True
return False
def update(self):
#transform original cube to local cube
self.Rotx[(1,1)] = math.cos(math.radians(360.0-se...
self.Rotx[(1,2)] = -math.sin(math.radians(360.0-s...
self.Rotx[(2,1)] = math.sin(math.radians(360.0-se...
self.Rotx[(2,2)] = math.cos(math.radians(360.0-se...
self.Roty[(0,0)] = math.cos(math.radians(360.0-se...
self.Roty[(0,2)] = math.sin(math.radians(360.0-se...
self.Roty[(2,0)] = -math.sin(math.radians(360.0-s...
self.Roty[(2,2)] = math.cos(math.radians(360.0-se...
self.Rotz[(0,0)] = math.cos(math.radians(360.0-se...
self.Rotz[(0,1)] = -math.sin(math.radians(360.0-s...
self.Rotz[(1,0)] = math.sin(math.radians(360.0-se...
self.Rotz[(1,1)] = math.cos(math.radians(360.0-se...
#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 ...
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 ...
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 ...
v=xface[1]
print("ptr()=",end="")
print(v)
}}
----
#counter
ページ名: