| 134 | # BOID RULE IMPLEMENTATION CLASS |
| 135 | |
| 136 | class Boid: |
| 137 | |
| 138 | def __init__(self, width, height, offset, move_divider): |
| 139 | self.velocity = TwoD(0, 0) |
| 140 | self.position = TwoD(*self.random_start(width, height, offset)) |
| 141 | self.move_divider = move_divider * 5 |
| 142 | |
| 143 | def random_start(self, width, height, offset): |
| 144 | if random.randint(0, 1): |
| 145 | # along left and right |
| 146 | y = random.randint(1, height) |
| 147 | if random.randint(0, 1): |
| 148 | # along left |
| 149 | x = -offset |
| 150 | else: |
| 151 | # along right |
| 152 | x = width + offset |
| 153 | else: |
| 154 | # along top and bottom |
| 155 | x = random.randint(1, width) |
| 156 | if random.randint(0, 1): |
| 157 | # along top |
| 158 | y = -offset |
| 159 | else: |
| 160 | # along bottom |
| 161 | y = height + offset |
| 162 | return x, y |
| 163 | |
| 164 | |
| 165 | def update_velocity(self, boids): |
| 166 | v1 = self.rule1(boids) |
| 167 | v2 = self.rule2(boids) |
| 168 | v3 = self.rule3(boids) |
| 169 | self.__temp = v1 + v2 + v3 |
| 170 | |
| 171 | def move(self): |
| 172 | self.velocity += self.__temp |
| 173 | limit_speed(self) |
| 174 | self.position += self.velocity / self.move_divider |
| 175 | |
| 176 | def rule1(self, boids): |
| 177 | # clumping |
| 178 | vector = TwoD(0, 0) |
| 179 | for boid in boids: |
| 180 | if boid is not self: |
| 181 | vector += boid.position |
| 182 | vector /= len(boids) - 1 |
| 183 | return (vector - self.position) / 7.5 |
| 184 | |
| 185 | def rule2(self, boids): |
| 186 | # avoidance |
| 187 | vector = TwoD(0, 0) |
| 188 | for boid in boids: |
| 189 | if boid is not self: |
| 190 | if (self.position - boid.position).mag() < 30: |
| 191 | vector -= (boid.position - self.position) |
| 192 | return vector * 1.5 |
| 193 | |