Advertisement
Guest User

lab3

a guest
May 25th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.67 KB | None | 0 0
  1. from Tkinter import *
  2. from time import sleep
  3. from math import cos, sin, pi
  4. import numpy as np
  5. from threading import Thread
  6.  
  7. points = list()
  8. mean = 1
  9. alpha = 0.05
  10. vecs = [np.asarray([0.0, 1.0, 0.0]), np.asarray([1.0, 0.0, 0.0]), np.asarray([0.0, 0.0, 1.0])]
  11.  
  12. def set_points():
  13.     global points
  14.     points = list()
  15.     for i in xrange(8):
  16.         coords = np.asarray([float(mean), float(mean), float(mean)])
  17.         for j in xrange(3):
  18.             if (i & (2 ** j)) != 0:
  19.                 coords += vecs[j]
  20.             else:
  21.                 coords -= vecs[j]
  22.         points.append(coords)
  23.  
  24.  
  25. def convert_point(point):
  26.     ans = np.asarray([750., 500.])
  27.  
  28.     v = [np.asarray([cos(-pi/6), sin(-pi/6)]), np.asarray([cos(7 * pi / 6), sin(7 * pi/6)]), np.asarray([0.0, 1.0])]
  29.  
  30.     for coef, vec in zip(point, v):
  31.         ans += coef * 200 * vec
  32.  
  33.     return [int(el) for el in ans]
  34.  
  35. def set_mask(a, skip, mask):
  36.     posted = 0
  37.     for bit in xrange(mask):
  38.         val = int((mask & (2 ** bit)) != 0)
  39.         for i in xrange(posted, 3):
  40.             if i == skip:
  41.                 continue
  42.             posted = i
  43.             if val == 1:
  44.                 a ^= (2 ** i)
  45.     return a
  46.  
  47.  
  48. def gen_grans():
  49.  
  50.     index_bad = sorted([(point, index) for index, point in enumerate(points)], key=lambda x: sum(el ** 2 for el in x[0]))[-1][1]
  51.  
  52.     ans = list()
  53.     for i in xrange(3):
  54.         cur_ans = list()
  55.         for mask in [0, 2, 1, 3]:
  56.             cur_ans.append(convert_point(points[set_mask(2 ** i - (index_bad & (2 ** i)), i, mask)]))
  57.         ans.append(cur_ans)
  58.     return ans
  59.  
  60. widget = None
  61.  
  62. def main():
  63.     set_points()
  64.     root = Tk()
  65.     drawing_area = Canvas(root, width=1500, height=1000)
  66.     drawing_area.config(bg='white')
  67.     drawing_area.pack()
  68.     #drawing_area.bind("<Motion>", motion)
  69.     drawing_area.bind("<ButtonPress-1>", b1down)
  70.     #drawing_area.bind("<ButtonRelease-1>", b1up)
  71.     global widget
  72.     widget = drawing_area
  73.     root.mainloop()
  74.  
  75.  
  76. def update_points():
  77.     global vecs
  78.     v0 = cos(alpha) * vecs[0] + sin(alpha) * vecs[1]
  79.     v1 = np.asarray([-v0[1], v0[0], 0.0])
  80.     vecs = [v0, v1, vecs[2]]
  81.  
  82.     set_points()
  83.     #print points
  84.  
  85.  
  86. def draw_segment(widget, segment, color):
  87.     widget.create_line(segment[0][0], segment[0][1], segment[1][0], segment[1][1], width=1, fill=color)
  88.  
  89.  
  90. def redraw(widget):
  91.     widget.delete(ALL)
  92.     update_points()
  93.  
  94.     for segment in gen_grans():
  95.         widget.create_polygon(segment, fill='blue', width=10, outline='green')
  96.     widget.update()
  97.  
  98.  
  99. def b1down(event):
  100.     for i in xrange(30):
  101.         redraw(event.widget)
  102.         sleep(0.03)
  103.  
  104.  
  105. if __name__ == "__main__":
  106.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement