-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathboid.py
More file actions
106 lines (85 loc) · 3 KB
/
boid.py
File metadata and controls
106 lines (85 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from math import cos,sin,pi
import random
################################
# Classe correspondant aux boids
# Un boid possède :
# - une position x
# - une position y
# - Une vitesse v (qu'on considère comme constante pour l'instant)
# - Un angle a
# - nouveau_x et nouveau_y pour gérer les trucs
# - ...
# Un boid peut :
# - boidMove() : Se déplacer
# - boidMeet() : Rencontrer quelqu'un et adapter son comportement en conséquence
# - boidAvoid() : Changer de trajectoire en approchant un obstacle
# - ...
###############################
class boid:
def __init__(self,x,y,v,a):
self.x = x
self.y = y
self.v = v
self.v_save = v
self.a = a
self.nouveau_x = 0
self.nouveau_y = 0
self.chmgt_angle = 0
self.wall_bas = 0
self.wall_haut = 760
self.wall_gauche = 0
self.wall_droite = 1130
self.bordure_safe = 3 * self.v
self.avoided = False
self.cpt_avoided = 0
def boidBehave(self):
self.boidAvoid()
self.boidMove()
self.boidUpdate()
# Boid se déplace
def boidMove(self):
self.nouveau_x = self.x + self.v * cos(self.a)
self.nouveau_y = self.y + self.v * sin(self.a)
# Attention gérer les autres dudez
def boidMeet(self):
pass
# Gestion des frontières : changer d'angle ?
def boidAvoid(self):
if(self.x <= (self.wall_bas+self.bordure_safe) or self.x >= (self.wall_haut-self.bordure_safe) or self.y <= (self.wall_gauche+self.bordure_safe) or self.y >= (self.wall_droite-self.bordure_safe)):
self.avoided = True
#correction_random = random.uniform(pi/2 - pi/8 ,pi/2 + pi/8 )
#self.a = self.a + correction_random
self.a = self.a + pi / 2
self.cpt_avoided = self.cpt_avoided + 1
if(self.cpt_avoided >= 10):
self.v = self.v + 0.1
else:
self.avoided = False
self.cpt_avoided = 0
self.v = self.v_save
# Mise à jour des x et y, et rajout de hasard dans l'orientation
def boidUpdate(self):
self.x = self.nouveau_x
self.y = self.nouveau_y
if(self.avoided == False):
if(self.chmgt_angle == 20):
nouveau_a = (random.uniform(-pi/4,pi/4))
self.a = self.a + nouveau_a
self.chmgt_angle = 0
else:
self.chmgt_angle = self.chmgt_angle + 1
nouveau_a = (random.uniform(-pi/32,pi/32))
self.a = self.a + nouveau_a
# Pour débug
def boidPrint(self):
print("x : " + str(self.x) + " & y : " + str(self.y))
print(" New x : "+ str(self.nouveau_x) +" New y :" + str(self.nouveau_y))
print("------------------")
def get_x(self):
return self.x
def get_y(self):
return self.y
def get_nv_x(self):
return self.get_nv_x
def get_nv_y(self):
return self.get_nv_y