Advertisement
jeffwincek

Dict 0.0.4

Nov 8th, 2011
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Image, ImageDraw,math, ImageFilter, random
  2. # needs PIL to run
  3. # WIP
  4. class Ant:
  5.     def __init__(self):
  6.         self.pos = (50,50)
  7.         # potentialEnergy is used to calculate how far it should move
  8.         self.potentialEnergy = 10.0
  9.         # angle is for the current directional heading
  10.         self.angle=45.0
  11.         # size is the radius of the ant (used for sensing pheromones
  12.         self.size = 3
  13.         # used for determining when to turn significantly.
  14.         # simulates a level of pheromones in an ants nose such that
  15.         # if it hasn't smelled any recently, it should turn.
  16.         self.pheromone_levels = 20
  17.     #this method does not nessecarily go to the destination
  18.     # instead it goes in the direction of the destination
  19.     # based off of how much potentialEnergy is left
  20.     def head_to(self, destination):
  21.         # find a direction to head
  22.         angle = math.tan( destination[1]-pos[1]/destination[0]-pos[0])
  23.         self.ydifference = math.sin(angle)*potentialEnergy
  24.         self.xdifference = math.cos(angle)*potentialEnergy
  25.         pos = (round(pos[0]+self.xdifference),round(pos[1]+self.ydifference))
  26.         return
  27.  
  28.     # returns a touple of values at the sensor locations (left,right)
  29.     def sense(self):
  30.         # set up the sensors as 15 degrees off of the angle at a given distance
  31.         self.Langle = self.angle + math.pi/12.0
  32.         self.Rangle = self.angle - math.pi/12.0
  33.         self.Lpos = (math.cos(self.Langle)*self.size,math.sin(self.Langle)*self.size)
  34.         self.Rpos = (math.cos(self.Rangle)*self.size,math.sin(self.Rangle)*self.size)
  35.         self.leftResult = self.sVal(self.Lpos)
  36.         self.rightResult = self.sVal(self.Rpos)
  37.         self.pheromone_levels += self.leftResult + self.rightResult
  38.         return (self.leftResult,self.rightResult)
  39.     # used in the above method, to return a decent value from a location
  40.     def sVal(self,where):
  41.         self.x = round(where[0])
  42.         self.y = round(where[1])
  43.         try:
  44.             return play.im.getpixel((self.x,self.y))
  45.         except:
  46.             return 255
  47.        
  48.     #similar to head_to, but instead moves in the direction of the current angle
  49.     # uses potentialEnergy to determine distance
  50.     def move_in(self,heading):
  51.         self.ydifference = math.sin(heading)*self.potentialEnergy
  52.         self.xdifference = math.cos(heading)*self.potentialEnergy
  53.         playing.draw.line((self.pos,(self.pos[0]+self.xdifference,self.pos[1]+self.ydifference)),width=1)
  54.         self.pos = (round(self.pos[0]+self.xdifference),round(self.pos[1]+self.ydifference))
  55.         return
  56.     def blur(self,howMuch):
  57.         for i in int(howMuch):
  58.             print "blurred in ant class"
  59.             im = im.filter(ImageFilter.BLUR)
  60.  
  61.     # works in degrees
  62.     def rotate(self,heading):
  63.         heading = heading * 0.017453
  64.         self.angle=heading+self.angle
  65.    
  66.     def wander(self, num_steps):
  67.        
  68.         for i in range(0,num_steps):
  69.             self.angle_towards_p()
  70.             if self.pheromone_levels <= 10:
  71.                 self.try_a_significantly_new_angle()
  72.             elif i % 3 == 0 and i != 0:
  73.                 self.rotate(random.randint(-20,20))
  74.             self.move_in(self.angle)
  75.             self.pheromone_levels = self.pheromone_levels / 1.3
  76.  
  77.     def turn_this_ant_around(self):
  78.         # right this minute, and I mean it this time
  79.         self.angle = self.angle+math.pi
  80.  
  81.     def try_a_significantly_new_angle(self):
  82.         self.rotate(random.randint(-120,120))
  83.  
  84.     # this function steers the ant towards the pheromone trail
  85.     # currently it is a binary steering operation
  86.     # see if elif state ment, have the ant turn based on a gradient
  87.     # might work much better.
  88.     def angle_towards_p(self):
  89.         sensing_result = self.sense()
  90.         # the signs are the way they are cause we are going towards darkness (0) away from light (255)
  91.         if sensing_result[0]<sensing_result[1] - 3:
  92.             self.rotate(self.how_much_to_turn(sensing_result))
  93.         elif sensing_result[0]>sensing_result[1] + 3:
  94.             self.rotate(35)
  95.  
  96.     #def handle_edge(self):
  97.     #    if self.pos[0]>worldSize[0]
  98.        
  99.  
  100. class Player:
  101.     def __init__(self):
  102.         self.number_of_ants=25
  103.         self.number_of_turns = 200
  104.         self.number_of_food = 10
  105.         self.ant_list = []
  106.         self.food_list = []
  107.         self.food_size = 5
  108.         self.worldSize = (512,512)
  109.         self.im = Image.new("L",self.worldSize,"white")
  110.         self.draw = ImageDraw.Draw(self.im)
  111.         for k in range(0,self.number_of_ants):
  112.             self.ant_list.append(Ant())
  113.         for f in range(0,self.number_of_food):
  114.             self.food_list.append((random.randint(0,self.worldSize[0]),random.randint(0,self.worldSize[0])))
  115.         self.food_list.sort()
  116.         print self.number_of_turns
  117.     def play(self):
  118.         for self.NT in range(0,int(self.number_of_turns)):
  119.             # there is something weird about this modulo behavior
  120.             # it seems to be triggering to often.
  121.             self.drawFood()
  122.             for j in range(0,self.number_of_ants):
  123.                 #print "wander"
  124.                 self.ant_list[j].wander(6)
  125.                 if self.NT % 50 == 0:
  126.                     self.ant_list[j].try_a_significantly_new_angle()
  127.             if self.NT % 16 == 0 and self.NT != 0:
  128.                 print "blurred"
  129.                 #self.im.show("pre-blur")
  130.                 self.im = self.im.filter(ImageFilter.GaussianBlur(radius = 2.0))
  131.     def drawFood(self):
  132.         #print "draw food"
  133.         for fo in range(0,len(self.food_list)):
  134.             other_side = (self.food_list[fo][0]+self.food_size,self.food_list[fo][1]+self.food_size)
  135.             self.draw.ellipse((self.food_list[fo],other_side),fill="black")
  136. #print im.getpixel((21,21))
  137. #print math.pi
  138. #draw.line(((0,0),(50,50)),width=2)
  139. #ant = Ant()
  140. playing = Player()
  141. playing.play()
  142.  
  143.  
  144. playing.im.show()
  145. print playing.food_list
  146.  
  147.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement