• API
• FAQ
• Tools
• Archive
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-pos/destination-pos)
23.         self.ydifference = math.sin(angle)*potentialEnergy
24.         self.xdifference = math.cos(angle)*potentialEnergy
25.         pos = (round(pos+self.xdifference),round(pos+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)
42.         self.y = round(where)
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
51.         self.ydifference = math.sin(heading)*self.potentialEnergy
52.         self.xdifference = math.cos(heading)*self.potentialEnergy
53.         playing.draw.line((self.pos,(self.pos+self.xdifference,self.pos+self.ydifference)),width=1)
54.         self.pos = (round(self.pos+self.xdifference),round(self.pos+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
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<sensing_result - 3:
92.             self.rotate(self.how_much_to_turn(sensing_result))
93.         elif sensing_result>sensing_result + 3:
94.             self.rotate(35)
95.
96.     #def handle_edge(self):
97.     #    if self.pos>worldSize
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),random.randint(0,self.worldSize)))
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]+self.food_size,self.food_list[fo]+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.

Top