here2share

# Tk_3D_Cube.py

Oct 20th, 2020
524
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Tk_3D_Cube.py
  2.  
  3. from tkinter import *
  4. import math
  5.  
  6. class coords():
  7.     def __init__(self, x,y,z):
  8.         self.x = x
  9.         self.y = y
  10.         self.z = z
  11.  
  12.         self.rxy = (self.x**2+self.y**2)**(1/2)
  13.         self.rxz = (self.x**2+self.z**2)**(1/2)
  14.         self.ryz = (self.y**2+self.z**2)**(1/2)
  15.         self.arg()
  16.  
  17.     def arg(self):
  18.         if self.x > 0 and self.y > 0 :
  19.             self.txy = math.atan(self.y/self.x)
  20.         elif self.x > 0 and self.y < 0 :
  21.             self.txy = 2*math.pi + math.atan(self.y/self.x)
  22.         elif self.x < 0 and self.y > 0 :
  23.             self.txy = math.pi + math.atan(self.y/self.x)
  24.         elif self.x < 0 and self.y < 0 :
  25.             self.txy = math.pi + math.atan(self.y/self.x)
  26.  
  27.         if self.z > 0 and self.x > 0 :
  28.             self.txz = math.atan(self.x/self.z )
  29.         elif self.z > 0 and self.x < 0 :
  30.             self.txz = 2*math.pi + math.atan(self.x/self.z )
  31.         elif self.z < 0 and self.x > 0 :
  32.             self.txz = math.pi + math.atan(self.x/self.z )
  33.         elif self.z < 0 and self.x < 0 :
  34.             self.txz = math.pi + math.atan(self.x/self.z )
  35.  
  36.         if self.y > 0 and self.z > 0 :
  37.             self.tyz = math.atan(self.z/self.y)
  38.         elif self.y > 0 and self.z < 0 :
  39.             self.tyz = 2*math.pi + math.atan(self.z/self.y)
  40.         elif self.y < 0 and self.z > 0 :
  41.             self.tyz = math.pi + math.atan(self.z/self.y)
  42.         elif self.y < 0 and self.z < 0 :
  43.             self.tyz = math.pi + math.atan(self.z/self.y)
  44.  
  45.  
  46.     def rotZ(self,t):
  47.         self.txy = self.txy + t if self.txy + t >= 0 else self.txy + t  + 2*math.pi
  48.  
  49.         self.x = math.cos(self.txy)*self.rxy
  50.         self.y = math.sin(self.txy)*self.rxy
  51.  
  52.         self.rxz = (self.x**2+self.z**2)**(1/2)
  53.         self.ryz = (self.y**2+self.z**2)**(1/2)
  54.         self.arg()
  55.  
  56.     def rotY(self,t):
  57.         self.txz = self.txz + t if self.txz + t >= 0 else self.txz + t  + 2*math.pi
  58.         self.z = math.cos(self.txz)*self.rxz
  59.         self.x = math.sin(self.txz)*self.rxz
  60.         self.rxy = (self.x**2+self.y**2)**(1/2)
  61.         self.ryz = (self.y**2+self.z**2)**(1/2)
  62.         self.arg()
  63.     def rotX(self,t):
  64.         self.tyz = self.tyz + t if self.tyz + t >= 0 else self.tyz + t  + 2*math.pi
  65.  
  66.         self.y = math.cos(self.tyz)*self.ryz
  67.         self.z = math.sin(self.tyz)*self.ryz
  68.  
  69.         self.rxy = (self.x**2+self.y**2)**(1/2)
  70.         self.rxz = (self.x**2+self.z**2)**(1/2)
  71.         self.arg()
  72. class Win():
  73.     def __init__(self,master):
  74.         self.master = master
  75.         self.master.geometry("{}x{}+0+0".format(WIDTH,HEIGHT))
  76.         self.C = Canvas(self.master,width=WIDTH,height=HEIGHT)
  77.  
  78.         self.M1 = self.C.create_oval(M[0].x+Va,M[0].z+Vb,M[0].x+Va+1,M[0].z+Vb+1)
  79.         self.M2 = self.C.create_oval(M[1].x+Va,M[1].z+Vb,M[1].x+Va+1,M[1].z+Vb+1)
  80.         self.M3 = self.C.create_oval(M[2].x+Va,M[2].z+Vb,M[2].x+Va+1,M[2].z+Vb+1)
  81.         self.M4 = self.C.create_oval(M[3].x+Va,M[3].z+Vb,M[3].x+Va+1,M[3].z+Vb+1)
  82.         self.M5 = self.C.create_oval(M[4].x+Va,M[4].z+Vb,M[4].x+Va+1,M[4].z+Vb+1)
  83.         self.M6 = self.C.create_oval(M[5].x+Va,M[5].z+Vb,M[5].x+Va+1,M[5].z+Vb+1)
  84.         self.M7 = self.C.create_oval(M[6].x+Va,M[6].z+Vb,M[6].x+Va+1,M[6].z+Vb+1)
  85.         self.M8 = self.C.create_oval(M[7].x+Va,M[7].z+Vb,M[7].x+Va+1,M[7].z+Vb+1)
  86.  
  87.         self.L1 = self.C.create_line(M[0].x+Va,M[0].z+Vb,M[1].x+Va,M[1].z+Vb)
  88.         self.L2 = self.C.create_line(M[1].x+Va,M[1].z+Vb,M[2].x+Va,M[2].z+Vb)
  89.         self.L3 = self.C.create_line(M[2].x+Va,M[2].z+Vb,M[3].x+Va,M[3].z+Vb)
  90.         self.L4 = self.C.create_line(M[3].x+Va,M[3].z+Vb,M[0].x+Va,M[0].z+Vb)
  91.  
  92.         self.L5 = self.C.create_line(M[4].x+Va,M[4].z+Vb,M[5].x+Va,M[5].z+Vb)
  93.         self.L6 = self.C.create_line(M[5].x+Va,M[5].z+Vb,M[6].x+Va,M[6].z+Vb)
  94.         self.L7 = self.C.create_line(M[6].x+Va,M[6].z+Vb,M[7].x+Va,M[7].z+Vb)
  95.         self.L8 = self.C.create_line(M[7].x+Va,M[7].z+Vb,M[4].x+Va,M[4].z+Vb)
  96.  
  97.         self.L9 = self.C.create_line(M[4].x+Va,M[4].z+Vb,M[0].x+Va,M[0].z+Vb)
  98.         self.L10 = self.C.create_line(M[5].x+Va,M[5].z+Vb,M[1].x+Va,M[1].z+Vb)
  99.         self.L11 = self.C.create_line(M[6].x+Va,M[6].z+Vb,M[2].x+Va,M[2].z+Vb)
  100.         self.L12 = self.C.create_line(M[7].x+Va,M[7].z+Vb,M[3].x+Va,M[3].z+Vb)
  101.  
  102.         self.master.bind("<Key-a>", lambda event: self.Rot(event,"Zp"))
  103.         self.master.bind("<Key-z>", lambda event: self.Rot(event,"Zm"))
  104.         self.master.bind("<Key-q>", lambda event: self.Rot(event,"Xp"))
  105.         self.master.bind("<Key-s>", lambda event: self.Rot(event,"Xm"))
  106.         self.master.bind("<Key-w>", lambda event: self.Rot(event,"Yp"))
  107.         self.master.bind("<Key-x>", lambda event: self.Rot(event,"Ym"))
  108.  
  109.         self.C.pack()
  110.     def Rot(self,event,axe) :
  111.         if axe =="Zp":
  112.             for i in range(8):
  113.                 M[i].rotZ(0.03)
  114.         elif axe =="Zm":
  115.             for i in range(8):
  116.                 M[i].rotZ(-0.03)
  117.         elif axe =="Xp":
  118.             for i in range(8):
  119.                 M[i].rotX(0.03)
  120.         elif axe =="Xm":
  121.             for i in range(8):
  122.                 M[i].rotX(-0.03)
  123.         elif axe =="Yp":
  124.             for i in range(8):
  125.                 M[i].rotY(0.03)
  126.         elif axe =="Ym":
  127.             for i in range(8):
  128.                 M[i].rotY(-0.03)
  129.  
  130.         self.C.coords(self.M1,M[0].x+Va,M[0].z+Vb,M[0].x+Va+1,M[0].z+Vb+1)
  131.         self.C.coords(self.M2,M[1].x+Va,M[1].z+Vb,M[1].x+Va+1,M[1].z+Vb+1)
  132.         self.C.coords(self.M3,M[2].x+Va,M[2].z+Vb,M[2].x+Va+1,M[2].z+Vb+1)
  133.         self.C.coords(self.M4,M[3].x+Va,M[3].z+Vb,M[3].x+Va+1,M[3].z+Vb+1)
  134.         self.C.coords(self.M5,M[4].x+Va,M[4].z+Vb,M[4].x+Va+1,M[4].z+Vb+1)
  135.         self.C.coords(self.M6,M[5].x+Va,M[5].z+Vb,M[5].x+Va+1,M[5].z+Vb+1)
  136.         self.C.coords(self.M7,M[6].x+Va,M[6].z+Vb,M[6].x+Va+1,M[6].z+Vb+1)
  137.         self.C.coords(self.M8,M[7].x+Va,M[7].z+Vb,M[7].x+Va+1,M[7].z+Vb+1)
  138.  
  139.         self.C.coords(self.L1,M[0].x+Va,M[0].z+Vb,M[1].x+Va,M[1].z+Vb)
  140.         self.C.coords(self.L2,M[1].x+Va,M[1].z+Vb,M[2].x+Va,M[2].z+Vb)
  141.         self.C.coords(self.L3,M[2].x+Va,M[2].z+Vb,M[3].x+Va,M[3].z+Vb)
  142.         self.C.coords(self.L4,M[3].x+Va,M[3].z+Vb,M[0].x+Va,M[0].z+Vb)
  143.  
  144.         self.C.coords(self.L5,M[4].x+Va,M[4].z+Vb,M[5].x+Va,M[5].z+Vb)
  145.         self.C.coords(self.L6,M[5].x+Va,M[5].z+Vb,M[6].x+Va,M[6].z+Vb)
  146.         self.C.coords(self.L7,M[6].x+Va,M[6].z+Vb,M[7].x+Va,M[7].z+Vb)
  147.         self.C.coords(self.L8,M[7].x+Va,M[7].z+Vb,M[4].x+Va,M[4].z+Vb)
  148.  
  149.         self.C.coords(self.L9,M[4].x+Va,M[4].z+Vb,M[0].x+Va,M[0].z+Vb)
  150.         self.C.coords(self.L10,M[5].x+Va,M[5].z+Vb,M[1].x+Va,M[1].z+Vb)
  151.         self.C.coords(self.L11,M[6].x+Va,M[6].z+Vb,M[2].x+Va,M[2].z+Vb)
  152.         self.C.coords(self.L12,M[7].x+Va,M[7].z+Vb,M[3].x+Va,M[3].z+Vb)
  153.  
  154. M = [coords(50,50,-50), coords(-50,50,-50), coords(-50,50,50), coords(50,50,50), coords(50,-50,-50), coords(-50,-50,-50), coords(-50,-50,50), coords(50,-50,50)]
  155.  
  156. win = Tk()
  157. win.title("3D Cube")
  158. WIDTH = 400
  159. HEIGHT = 400
  160. Va = WIDTH/2
  161. Vb = WIDTH/2
  162.    
  163. app = Win(win)
  164.  
  165. win.mainloop()
RAW Paste Data