Bonjour à tous ! J'ai un projet à faire et j'aimerais réaliser un programme qui simule le mouvement d'une foule de personne dans une pièce. J'espère que la longueur de mon poste ne rebutera pas les potentiels personnes aptes à m'aider. Pour réduire la complexité de l'exercice, au début j'aimerais programmer un mouvement de foule dans une pièce rectangulaire (avec une sortie) et sans obstacle (à part les murs de la pièce). J'ai donc commencé la programmation (je suis pas très doué), j'ai quelques idées mais je bloque sur pas mal de choses aussi, je viens donc ici en espérant avoir des réponses à mes questions.
Voici les premiers codes effectués :
1 2 3
| #open "graphics";;
#open "random";;
(* initialise les librairies *) |
(dans la suite l'entier n correspond aux nombres de personnes)
On crée un point (cercle de rayon 5) au hasard dans l'espace (on fixe l = largeur = 800 pixels et h la hauteur = 600 pixels )
1 2
| let create_point h l =
fill_circle ((random__int l)+6) ((random__int h)+6) 5;; (*on ajoute 6 pour éviter que le point touche bordure inférieure car 5 = rayon du point *) |
Puis on pose la fonction qui créée une foule de n personne dans l'espace 600 800 :
1 2 3 4 5 6 7
| let create_foule n =
if n=0 then failwith "pas de foule"
else begin
for i = 0 to (n-1) do
create_point 588 788; (*poser create_point 588 788 car random__int l peut prendre valeur de 0 à l exclu. Puis on rajoute 6 à ce point d'après algo précédent et encore 5 -> 599 799 ce qui est bon*)
done;
end;; |
Enfin, on créé le cadre avec l'ouverture et la foule :
1 2 3 4 5 6 7
| let cadre = open_graph " ";
moveto 0 0; lineto 800 0; lineto 800 280; moveto 800 320;
lineto 800 600; lineto 0 600; lineto 0 0; moveto 0 0;
set_color red;
create_foule 200;
read_key();
close_graph();; |
Bien sûr il y a un soucis dans ma création de foules : deux personnes peuvent
se superposer, je pense voir comment il faudrait faire pour éviter cela mais,
pour l'instant ce n'est pas la priorité.
Ce que je cherche à faire mais dont j'ai pas franchement d'idées, c'est faire
en sorte que les points se déplace dans l'écran graphique vers la sortie et ceux sans se rentrer dedans.
Je défini donc le type personne comme suit :
1 2 3 4
| type personne = {mutable pos : int*int;
mutable vit : float;
mutable dir : int*int;
mutable dist : float};; |
j'initialise mon tableau contenant les infos des 200 personnes (position, vitesse, direction et distance de la sortie)
let tp = make_vect n {pos = (0,0); vit = 0.; dir =(0,0); dd = 0.};; (*remplacer n par 200*)
l'idée serait de mettre à jour les informations du tableau tp à chaque tour et
de "rafraichir" l'affichage graphique avec ces nouvelles informations.
Il y a donc plusieurs points sur lesquels j'aurais besoin de votre aide :
Seulement, je n'arrive pas à concevoir comment l'affichage graphique peut changer puisque caml light exécute qu'une seule fois le programme... ? Je ne vois pas non plus comment faire en sorte que les points représentants les personnes ne se traversent pas entre eux et ne traverse pas les murs (mon idée serait d'évaluer à chaque tour et pour chaque point si il existent des voisins dans un rayon de 15 pixels et d'agir en conséquence, en prenant en compte qu'à chaque tour on considère dans un premier temps que le point se déplace de 5 pixels. On peut créer une fonction auxiliaire qui calculerait la distance entre deux points).
Je vous remercie d'avance pour vos explications et vos idées.
Bonne journée
Twice22.
Partager