Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.cmm.msu.ru/trac/petri_dish/browser/bacteria.py?format=txt
Дата изменения: Thu Dec 23 16:58:48 2010
Дата индексирования: Fri Feb 11 14:24:57 2011
Кодировка:
import random
from math import *
import vector

class Bacteria (object):
def __init__(self, position, velocity, lifetime, mutated):
self.position = position
self.velocity = velocity
self.lifetime = lifetime
self.mutated = mutated

def __eq__(self,other):
if self.position==other.position and\
self.velocity==other.velocity and\
self.lifetime==other.lifetime and\
self.mutated==other.mutated:
return True
return False

def __ne__(self,other):
return not(self==other)

def check_collision(self, bacteria, delta, bact_r,delta_t):
for bact in bacteria:
if 0 < abs(self.position - bact.position) < delta + 2*bact_r:
return bact
return False

def check_dish_wall(self,position,radius,delta,bact_r):
if abs(position) > radius - (bact_r + delta):
return True
return False

def move(self, bacteria, delta_t, radius, delta, bact_r):
if self.check_dish_wall(self.position,radius,delta,bact_r):
self.velocity = self.velocity.angleToCoord(-(pi/2 -
self.velocity.angle()))
self.position += self.velocity*delta_t

def collision(self, other, bacteria, delta_t, radius, delta, bact_r):
self.velocity, other.velocity = other.velocity, self.velocity
self.move(bacteria, delta_t, radius, delta, bact_r)
other.move(bacteria, delta_t, radius, delta, bact_r)

def reprod(self, type, env, p_max):
if type == 's':
prob = 1 - p_max*(env/100)
else:
prob = 0.001
return random.random() < prob

def asexual(self, bacteria, delta_t, radius, delta, bact_r, full_lifetime):
if self.find_place_a(bacteria, delta, bact_r)\
and not(self.check_dish_wall(self.position,radius,delta,3*bact_r)):
pos1=self.position + vector.Vector(-(bact_r + 0.75*delta),0)
vel1=vector.Vector(1,0).angleToCoord(self.velocity.angle())
bacteria.append(Bacteria(pos1, self.rnd_velocity(pi),
full_lifetime, self.if_mutated_a()))
pos2=self.position + vector.Vector((bact_r + 0.75*delta),0)
bacteria.append(Bacteria(pos2, self.rnd_velocity(0),
full_lifetime, self.if_mutated_a()))
bacteria.remove(self)
return 1
return 0


def sexual (self, other, bacteria, delta_t, radius, delta, bact_r,
full_lifetime):
num_of_mut=1
center = (self.position+other.position)*0.5
if self.find_place_s(other, bacteria, delta, bact_r) and\
not(self.check_dish_wall(center,radius,delta,bact_r*3)):
bacteria.append(Bacteria(center +
vector.Vector(-(bact_r*sqrt(2) + 0.75*delta),0),
self.rnd_velocity(pi), full_lifetime,
self.if_mutated_s(other,num_of_mut)))
bacteria.append(Bacteria(center +
vector.Vector((bact_r*sqrt(2) + 0.75*delta),0),
self.rnd_velocity(0), full_lifetime,
self.if_mutated_s(other,num_of_mut)))
bacteria.append(Bacteria(center +
vector.Vector(0, -(bact_r*sqrt(2) + 0.75*delta)),
self.rnd_velocity(3*pi/2), full_lifetime,
self.if_mutated_s(other,num_of_mut)))
bacteria.append(Bacteria(center +
vector.Vector(0, (bact_r*sqrt(2) + 0.75*delta)),
self.rnd_velocity(pi/2), full_lifetime,
self.if_mutated_s(other,num_of_mut)))
bacteria.remove(other)
bacteria.remove(self)
return num_of_mut
else:
self.collision(other,bacteria,delta_t,radius,delta,bact_r)
return 0

def find_place_a(self, bacteria, delta, bact_r): #searches for place for children
for bact in bacteria:
if 0 < abs(bact.position - self.position) < (bact_r*3 + delta*2):
return False
return True


def find_place_s(self, other, bacteria, delta, bact_r):
for bact in bacteria:
if bact!=self and bact!=other:
if 0 < abs(bact.position - (self.position + other.position)*0.5)\
< ((sqrt(2) + 1)*bact_r*2 + delta*2):
return False
return True


def rnd_velocity(self,angle):
vel=vector.Vector(1,0)
return vel.angleToCoord(angle + pi*random.randrange(-4,5)/16)

def if_mutated_a(self):
return self.mutated

def if_mutated_s(self,other,n):
if self.mutated==False and other.mutated == False:
return False
r = (random.randint(0, 3) == 0)
if r:
n+=1
return r