Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/petri_dish/annotate/15d7afe555a4/tk1.py
Дата изменения: Unknown
Дата индексирования: Sat Mar 1 00:10:59 2014
Кодировка:
petri_dish: tk1.py annotate

petri_dish

annotate tk1.py @ 17:15d7afe555a4

Automated merge with ssh://kodomo/petri_dish
author Daniil Alexeyevsky <me.dendik@gmail.com>
date Wed, 15 Dec 2010 15:49:24 +0300
parents
children
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()