here2share

# Tk_3D_Cube.py

Oct 20th, 2020
621
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

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×