Advertisement
Guest User

Eto che?

a guest
May 23rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.92 KB | None | 0 0
  1. from tkinter import Tk, Canvas, mainloop
  2. from math import cos, sin, pi, sqrt
  3.  
  4. from numpy import dot
  5. # dot = lambda X, Y: [[sum(a*b for a, b in zip(X_row, Y_col)) for Y_col in zip(*Y)] for X_row in X]
  6.  
  7. master = Tk()
  8.  
  9. # constants
  10. dimensions = {'width': 400, 'height': 400}
  11. center = {k: v // 2 for k, v in dimensions.items()}
  12.  
  13. delta_alpha = - pi / 2**10
  14. delta_beta = - pi / 2**8
  15.  
  16. # globals
  17. alpha = 0
  18. beta = 0
  19.  
  20. canvas = Canvas(master, **dimensions)
  21. canvas.pack()
  22.  
  23.  
  24. def transform(x, y, z, alpha, beta):
  25.     transformation = [
  26.         [cos(beta), 0, -sin(beta)],
  27.         [-sin(alpha) * sin(beta), cos(alpha), -sin(alpha) * cos(beta)],
  28.         [0, 0, 0]
  29.     ]
  30.     res = dot(transformation, [[x], [y], [z]])
  31.     return res[0][0], res[1][0]
  32.  
  33.  
  34. def draw_2D_line(x, y, color):
  35.     canvas.create_line(center['width'], center['height'], center['width'] + x, center['height'] - y, fill=color)
  36.  
  37.  
  38. def draw3Dline(x, y, z, color='black'):
  39.     x, y = transform(x, y, z, alpha, beta)
  40.     draw_2D_line(x, y, color)
  41.  
  42.  
  43. def draw3Dpolygon(points, color='grey'):
  44.     points = map(lambda p: transform(p[0], p[1], p[2], alpha, beta), points)  # transform points
  45.     points = list(map(lambda p: (center['width'] + p[0], center['height'] - p[1]), points))  # center points
  46.     canvas.create_polygon(points, outline=color, fill='')
  47.  
  48.  
  49. def update_canvas():
  50.     # update transformation
  51.     global alpha, beta
  52.     alpha += delta_alpha
  53.     beta += delta_beta
  54.  
  55.     canvas.delete('all')
  56.  
  57.     size = 200
  58.  
  59.     draw3Dline(50, 0, 0, 'blue')  # x
  60.     draw3Dline(0, 50, 0, 'green')  # y
  61.     draw3Dline(0, 0, 50, 'red')  # z
  62.  
  63.     a = (-size / 2, 0, size / 4)
  64.     b = (size / 2, 0, size / 4)
  65.     c = (0, 0, -size * sqrt(3) / 4)
  66.     d = (0, size / 2, 0)
  67.     draw3Dpolygon([a, b, c])
  68.     draw3Dpolygon([a, b, d])
  69.     draw3Dpolygon([b, c, d])
  70.     draw3Dpolygon([a, c, d])
  71.  
  72.     master.after(20, update_canvas)
  73.  
  74.  
  75. update_canvas()
  76. mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement