rev |
line source |
ksenia_yashina@0
|
1 import Tkinter |
ksenia_yashina@0
|
2 import time |
ksenia_yashina@0
|
3 from math import * |
ksenia_yashina@0
|
4 import random |
ksenia_yashina@0
|
5 |
ksenia_yashina@0
|
6 class Vector(object): |
ksenia_yashina@0
|
7 def __init__(self,x,y): |
ksenia_yashina@0
|
8 self.x=x |
ksenia_yashina@0
|
9 self.y=y |
ksenia_yashina@0
|
10 def __abs__(self): |
ksenia_yashina@0
|
11 return sqrt(self.x**2+self.y**2) |
ksenia_yashina@0
|
12 def __add__(self,other): |
ksenia_yashina@0
|
13 return Vector(self.x+other.x,self.y+other.y) |
ksenia_yashina@0
|
14 def __mul__(self,digit): |
ksenia_yashina@0
|
15 return Vector(digit*self.x,digit*self.y) |
ksenia_yashina@0
|
16 def angle(self): |
ksenia_yashina@0
|
17 if self.x==0: |
ksenia_yashina@0
|
18 if self.y>0: |
ksenia_yashina@0
|
19 return -pi/2 |
ksenia_yashina@0
|
20 else: |
ksenia_yashina@0
|
21 return pi/2 |
ksenia_yashina@0
|
22 if self.y==0: |
ksenia_yashina@0
|
23 if self.x>0: |
ksenia_yashina@0
|
24 return 0 |
ksenia_yashina@0
|
25 else: |
ksenia_yashina@0
|
26 return pi |
ksenia_yashina@0
|
27 m=abs(self) |
ksenia_yashina@0
|
28 if acos(self.x/m)>pi/2 or (acos(self.x/m)>pi/2 and asin(self.y/m)<0): |
ksenia_yashina@0
|
29 return atan(self.y/self.x)-pi |
ksenia_yashina@0
|
30 else: |
ksenia_yashina@0
|
31 return atan(self.y/self.x) |
ksenia_yashina@0
|
32 def angleToCoord(self,angle): |
ksenia_yashina@0
|
33 magn=abs(self) |
ksenia_yashina@0
|
34 self.x=magn*cos(angle) |
ksenia_yashina@0
|
35 self.y=magn*sin(angle) |
ksenia_yashina@0
|
36 return self |
ksenia_yashina@0
|
37 def magnitToCoord(self,m): |
ksenia_yashina@0
|
38 ang=self.angle() |
ksenia_yashina@0
|
39 self.x=m*cos(ang) |
ksenia_yashina@0
|
40 self.y=m*sin(ang) |
ksenia_yashina@0
|
41 return self |
ksenia_yashina@0
|
42 |
ksenia_yashina@0
|
43 class Ball(object): |
ksenia_yashina@0
|
44 def __init__(self,position,velocity): |
ksenia_yashina@0
|
45 self.position=position |
ksenia_yashina@0
|
46 self.velocity=velocity |
ksenia_yashina@0
|
47 def bounds(self): |
ksenia_yashina@0
|
48 if self.position.x>=595: |
ksenia_yashina@0
|
49 self.position.x=595 |
ksenia_yashina@0
|
50 self.velocity=self.velocity.angleToCoord(pi-self.velocity.angle()) |
ksenia_yashina@0
|
51 elif self.position.x<=2: |
ksenia_yashina@0
|
52 self.position.x=2 |
ksenia_yashina@0
|
53 self.velocity=self.velocity.angleToCoord(pi-self.velocity.angle()) |
ksenia_yashina@0
|
54 if self.position.y>=595: |
ksenia_yashina@0
|
55 self.position.y=595 |
ksenia_yashina@0
|
56 self.velocity=self.velocity.angleToCoord(-self.velocity.angle()) |
ksenia_yashina@0
|
57 elif self.position.y<=2: |
ksenia_yashina@0
|
58 self.position.y=2 |
ksenia_yashina@0
|
59 self.velocity=self.velocity.angleToCoord(-self.velocity.angle()) |
ksenia_yashina@0
|
60 def collision(self,other): |
ksenia_yashina@0
|
61 if abs(self.position.y-other.position.y)<70 and abs(self.position.x-other.position.x)<70: |
ksenia_yashina@0
|
62 self.velocity.angleToCoord(2*pi*random.random()) |
ksenia_yashina@0
|
63 other.velocity.angleToCoord(2*pi*random.random()) |
ksenia_yashina@0
|
64 root = Tkinter.Tk() |
ksenia_yashina@0
|
65 c = Tkinter.Canvas( root, width = 670, height = 670 ) |
ksenia_yashina@0
|
66 c.pack() |
ksenia_yashina@0
|
67 |
ksenia_yashina@0
|
68 b1=Ball(Vector(440,100),Vector(5,7)) |
ksenia_yashina@0
|
69 b2=Ball(Vector(40,90),Vector(-3,-1)) |
ksenia_yashina@0
|
70 b3=Ball(Vector(100,250),Vector(0,5)) |
ksenia_yashina@0
|
71 b4=Ball(Vector(150,250),Vector(-1,2)) |
ksenia_yashina@0
|
72 ball1 = c.create_oval(0,0,0,0) |
ksenia_yashina@0
|
73 ball2 = c.create_oval(0,0,0,0) |
ksenia_yashina@0
|
74 ball3 = c.create_oval(0,0,0,0) |
ksenia_yashina@0
|
75 ball4 = c.create_oval(0,0,0,0) |
ksenia_yashina@0
|
76 while True: |
ksenia_yashina@0
|
77 time.sleep( 0.02 ) |
ksenia_yashina@0
|
78 c.delete(ball1) |
ksenia_yashina@0
|
79 c.delete(ball2) |
ksenia_yashina@0
|
80 c.delete(ball3) |
ksenia_yashina@0
|
81 c.delete(ball4) |
ksenia_yashina@0
|
82 ball1=c.create_oval(b1.position.x, b1.position.y, b1.position.x+75, b1.position.y+75,fill="blue" ) |
ksenia_yashina@0
|
83 ball2=c.create_oval(b2.position.x, b2.position.y, b2.position.x+75, b2.position.y+75,fill="red") |
ksenia_yashina@0
|
84 ball3=c.create_oval(b3.position.x, b3.position.y, b3.position.x+75, b3.position.y+75,fill="yellow") |
ksenia_yashina@0
|
85 ball4=c.create_oval(b4.position.x, b4.position.y, b4.position.x+75, b4.position.y+75,fill="green") |
ksenia_yashina@0
|
86 b1.bounds() |
ksenia_yashina@0
|
87 b2.bounds() |
ksenia_yashina@0
|
88 b3.bounds() |
ksenia_yashina@0
|
89 b4.bounds() |
ksenia_yashina@0
|
90 b1.collision(b2) |
ksenia_yashina@0
|
91 b2.collision(b3) |
ksenia_yashina@0
|
92 b1.collision(b3) |
ksenia_yashina@0
|
93 b1.collision(b4) |
ksenia_yashina@0
|
94 b3.collision(b4) |
ksenia_yashina@0
|
95 b2.collision(b4) |
ksenia_yashina@0
|
96 b1.position = b1.position+b1.velocity |
ksenia_yashina@0
|
97 b2.position = b2.position+b2.velocity |
ksenia_yashina@0
|
98 b3.position = b3.position+b3.velocity |
ksenia_yashina@0
|
99 b4.position = b4.position+b4.velocity |
ksenia_yashina@0
|
100 c.update() |