View difference between Paste ID: x9f3rjyz and 9yrbFuNU
SHOW: | | - or go back to the newest paste.
1
import Image, ImageDraw,math, ImageFilter, random
2
3
class Ant:
4
    def __init__(self):
5
        self.pos = (256,256)
6
        # potentialEnergy is used to calculate how far it should move
7
        self.potentialEnergy = 10.0
8
        # angle is for the current directional heading
9
        self.angle=45.0
10
        # size is the radius of the ant (used for sensing pheromones
11
        self.size = 5
12
    #this method does not nessecarily go to the destination
13
    # instead it goes in the direction of the destination
14
    # based off of how much potentialEnergy is left
15
    def head_to(self, destination):
16
        # find a direction to head 
17
        angle = math.tan( destination[1]-pos[1]/destination[0]-pos[0])
18
        self.ydifference = math.sin(angle)*potentialEnergy
19
        self.xdifference = math.cos(angle)*potentialEnergy
20
        pos = (round(pos[0]+self.xdifference),round(pos[1]+self.ydifference))
21
        return
22
23-
    # rturns a touple of values at the sensor locations (left,right)
23+
    # returns a touple of values at the sensor locations (left,right)
24
    def sense(self):
25
        # set up the sensors as 15 degrees off of the angle at a given distance
26
        self.Langle = self.angle + math.pi/12.0
27
        self.Rangle = self.angle - math.pi/12.0
28
        self.Lpos = (math.cos(self.Langle)*self.size,math.sin(self.Langle)*self.size)
29
        self.Rpos = (math.cos(self.Rangle)*self.size,math.sin(self.Rangle)*self.size)
30
        self.leftResult = self.sVal(self.Lpos)
31
        self.rightResult = self.sVal(self.Rpos)
32
        return (self.leftResult,self.rightResult)
33
    # used in the above method, to return a decent value from a location
34
    def sVal(self,where):
35
        self.x = round(where[0])
36
        self.y = round(where[1])
37
        try:
38
            return play.im.getpixel((self.x,self.y))
39
        except:
40
            return 255
41
        
42
    #similar to head_to, but instead moves in the direction of the current angle
43
    # uses potentialEnergy to determine distance 
44
    def move_in(self,heading):
45
        self.ydifference = math.sin(heading)*self.potentialEnergy
46
        self.xdifference = math.cos(heading)*self.potentialEnergy
47-
        play.draw.line((self.pos,(self.pos[0]+self.xdifference,self.pos[1]+self.ydifference)),width=1)
47+
        playing.draw.line((self.pos,(self.pos[0]+self.xdifference,self.pos[1]+self.ydifference)),width=1)
48
        self.pos = (round(self.pos[0]+self.xdifference),round(self.pos[1]+self.ydifference))
49
        return
50
    def blur(self,howMuch):
51
        for i in int(howMuch):
52
            im = im.filter(ImageFilter.BLUR)
53
54
    # works in degrees
55
    def rotate(self,heading):
56
        heading = heading * 0.017453
57
        self.angle=heading+self.angle
58
    
59
    def wander(self, num_steps):
60
        self.angle_towards_p()
61
        for i in range(0,num_steps):
62
            self.rotate(random.randint(-20,20))
63
            self.move_in(self.angle)
64
65
    def turn_this_ant_around(self):
66
        # right this minute, and I mean it this time
67
        self.angle = self.angle+math.pi
68
69
    def try_a_significantly_new_angle(self):
70
        self.rotate(random.randint(-45,45))
71
72
    # this function steers the ant towards the pheromone trail
73
    # currently it is a binary steering operation
74
    # see if elif state ment, have the ant turn based on a gradient
75
    # might work much better. 
76
    def angle_towards_p(self):
77
        sensing_result = self.sense()
78
        # the signs are the way they are cause we are going towards darkness (0) away from light (255)
79
        if sensing_result[0]<sensing_result[1] - 3:
80
            self.rotate(-35)
81
        elif sensing_result[0]>sensing_result[1] + 3:
82
            self.rotate(35)
83
84
    #def handle_edge(self):
85-
    def __init__(self, number_of_ants=6, number_of_turns=2000, worldSize = (512,512)):
85+
86-
        #self.number_of_ants=6
86+
87-
        #self.number_of_turns = 2000
87+
88
class Player:
89-
        #self.worldSize = (512,512)
89+
90-
        self.im = Image.new("L",worldSize,"white")
90+
        self.number_of_ants=25
91
        self.number_of_turns = 5
92-
        for i in range(0,number_of_ants):
92+
93
        self.worldSize = (512,512)
94
        self.im = Image.new("L",self.worldSize,"white")
95-
        for i in range(0,number_of_turns):
95+
96-
            for j in range(0,number_of_ants):
96+
        for k in range(0,self.number_of_ants):
97-
                self.ant_list[j].wander(15)
97+
98-
            if (i % 50 == 0):
98+
99-
                for j in range(0,number_of_ants):
99+
        for self.NT in range(0,int(self.number_of_turns)):
100
            # there is something weird about this modulo behavior
101-
            if (i % 128 == 0):
101+
            # it seems to be triggering to often. 
102-
                self.im = self.im.filter(ImageFilter.GaussianBlur(radius = 1.5))
102+
            if self.NT % 6 == 0:
103
                self.im.show("pre-blur")
104
                self.im = self.im.filter(ImageFilter.GaussianBlur(radius = 2.0))
105
            for j in range(0,self.number_of_ants):
106
                self.ant_list[j].wander(16)
107
                if self.NT % 50 == 0:
108
                    self.ant_list[j].try_a_significantly_new_angle()
109
110
111-
play = Player()
111+
112-
play.play()
112+
113
#print im.getpixel((21,21))
114
#print math.pi
115-
play.im.show()
115+
116-
116+
117-
117+
playing = Player()
118
playing.play()
119
120
121
playing.im.show()