SHARE
TWEET

Dict 0.0.4

jeffwincek Nov 8th, 2011 22 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.  
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top