Advertisement
Guest User

Untitled

a guest
May 27th, 2015
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.16 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Jan 23 13:08:19 2015
  4.  
  5. @author: Mélaine and Arthur
  6. """
  7. #programme annexe pour copier une liste
  8. def copie(a):
  9. b= []
  10. for i in a:
  11. b.append(i)
  12. return b
  13.  
  14. salle = [[]]
  15. def carte(L,l,p): #on definit la salle, longueur/largeur, position de la porte
  16. salle[0] = [L,l,p]
  17. return salle
  18.  
  19. def obstacle(p,T): #on définit l'obstacle par son coin de plus petite coordonnées+ sa longueur et sa largeur
  20. salle.append([p,T])
  21. return salle
  22. """NB: on pourrait changer et mettre des polygones pour les obstacles, mais ce serait plus
  23. compliquer à definir, il faudrait les 4 points. Si on change, bcp de fonction seront à changer
  24. a voir"""
  25.  
  26. #salle1 = carte(25,30,[14,0])
  27. #obstacle([10,4],[10,4])
  28. #obstacle([15,12],[4,8])
  29. #obstacle([4,18],[3,9])
  30.  
  31.  
  32. def quad_salle(salle,t): #qd teste: quad_salle(salle[0],t) on veut juste les dim
  33. longueur= salle[0]
  34. largeur = salle[1]
  35. if longueur % t == 0: #t = taille de chaque case
  36. i = longueur // t
  37. else:
  38. i = longueur//t +1
  39. if largeur % t == 0:
  40. j = largeur // t
  41. else:
  42. j = largeur//t +1
  43. quad = [i,j,t]
  44. return quad
  45.  
  46. def placement_dans_quadrillage_pour_les_obstacles(obstacle,quad):
  47. longueur= obstacle[1][0]
  48. largeur = obstacle[1][1]
  49. abscisse= obstacle[0][0]
  50. ordonnee= obstacle[0][1]
  51. t = quad[2]
  52. i1= abscisse//t
  53. i2= (abscisse+longueur)//t
  54. j1= ordonnee//t
  55. j2= (ordonnee+largeur)//t
  56. obstacle.append([[i1,i2],[j1,j2]])
  57. return obstacle
  58.  
  59. def quadrillage_salle_obstacle(salle):
  60. case = quad_salle(salle[0],5) #on choisit de quadriller avec des cases des 5 m
  61. for i in range (1,len(salle)):
  62. obstacle=placement_dans_quadrillage_pour_les_obstacles(salle[i],case)
  63. salle[i]= obstacle
  64. return salle
  65.  
  66. #quadrillage_salle_obstacle(salle1)
  67.  
  68. from PIL import Image, ImageDraw
  69. def dessin(salle):
  70. dessin_salle = Image.new("RGB",((salle[0][0]+1)*100,(salle[0][1]+1)*100), "white")
  71. draw = ImageDraw.Draw(dessin_salle)
  72. draw.line((0*100,0*100,0*100,salle[0][1]*100),fill=128)
  73. draw.line((0*100,0*100,salle[0][0]*100,0*100),fill=128)
  74. draw.line((0*100,salle[0][1]*100,salle[0][0]*100,salle[0][1]*100),fill=128)
  75. draw.line((salle[0][0]*100,0*100,salle[0][0]*100,salle[0][1]*100),fill=128)
  76. draw.rectangle(((salle[0][2][0]-0.5)*100,0*100,(salle[0][2][0]+0.5)*100,0.5*100), fill = 255) #on modélise la porte par un rectangle pour qu'elle apparaisse bien
  77. for i in range (1,len(salle)):
  78. draw.rectangle(((salle[i][0][0]*100,salle[i][0][1]*100),(salle[i][0][0]*100+salle[i][1][0]*100,salle[i][0][1]*100+salle[i][1][1]*100)),fill=(254,34,191))
  79. dessin_salle.save("dessin_salle.png", "PNG")
  80. Im = Image.open("dessin_salle.png")
  81. #Im.show()
  82.  
  83. #dessin(salle1)
  84.  
  85.  
  86. """fin de la représentation de la salle, on passe aux individus s'y trouvant"""
  87. """on commence par regarder comment va se déplacer un individu dans la salle"""
  88. """on va défnir les individus par des listes avec les caractéristiques qui les définissent, nom, coordonnées, vitesse etc ex [O, [10,12]..."""
  89. #on modifie le prgm car on a pas encore def chaque perso avec son nom et tout, et on considere pour l'instant chaque individu avec ses coordonnées
  90. def dessin_perso(Population):
  91. dessin_salle = Image.open("dessin_salle.png")
  92. draw = ImageDraw.Draw(dessin_salle)
  93. for i in range (len(Population)):
  94. draw.ellipse((Population[i][0][0]*100-0.5*100,Population[i][0][1]*100-0.5*100,Population[i][0][0]*100+0.5*100,Population[i][0][1]*100+0.5*100), fill=(30,224,62))
  95. dessin_salle.save("dessin_salle.png", "PNG")
  96. Im = Image.open("dessin_salle.png")
  97. #Im.show()
  98.  
  99. #dessin(salle1)
  100.  
  101.  
  102. import random
  103.  
  104. def ajout_aleatoire_individus(salle,Pop,nombre_individu):
  105. L = salle[0][0]
  106. l=salle[0][1]
  107. for i in range (nombre_individu):
  108. a = random.randint(1,L-1)
  109. o = random.randint(1,l-1)
  110. while [[a,o]] in Pop:
  111. a = random.randint(1,L-1)
  112. o = random.randint(1,l-1)
  113. Pop.append([[a,o]])
  114. personnes_a_supp = [] #individus qui sont sur un obstacle
  115. for i in range (len(Pop)):
  116. for j in range (1, len(salle)):
  117. if (salle[j][0][0]-1) <= Pop[i][0][0] <= (salle[j][0][0] + salle[j][1][0]+1) and salle[j][0][1]-1 <= Pop[i][0][1] <= salle[j][0][1] + salle[j][1][1]+1:
  118. personnes_a_supp.append(Pop[i])
  119. if personnes_a_supp == []:
  120. return Pop
  121. else:
  122. for e in range (len(personnes_a_supp)):
  123. Pop.remove(personnes_a_supp[e])
  124. nombre_individus_a_replacer = nombre_individu - (len(Pop))
  125. ajout_aleatoire_individus(salle,Pop,nombre_individus_a_replacer)
  126.  
  127. def repartition_aleatoire_individus(salle,nombre_individu,Pop):
  128. L = salle[0][0]
  129. l=salle[0][1]
  130. T = len(Pop)
  131. for i in range (nombre_individu):
  132. a = random.randint(1,L-1)
  133. o = random.randint(1,l-1)
  134. while [[a,o]] in Pop:
  135. a = random.randint(1,L-1)
  136. o = random.randint(1,l-1)
  137. Pop.append([[a,o]])
  138. personnes_a_supp = [] #individus qui sont sur un obstacle
  139. for i in range (len(Pop)):
  140. for j in range (1, len(salle)):
  141. if (salle[j][0][0]-1) <= Pop[i][0][0] <= (salle[j][0][0] + salle[j][1][0]+1) and salle[j][0][1]-1 <= Pop[i][0][1] <= salle[j][0][1] + salle[j][1][1]+1:
  142. personnes_a_supp.append(Pop[i])
  143. print "personnes_a_supp=",personnes_a_supp
  144. if personnes_a_supp == []:
  145. print "end"
  146. #print Pop
  147. print type(Pop)
  148. return Pop
  149. else:
  150. for e in range (len(personnes_a_supp)):
  151. Pop.remove(personnes_a_supp[e])
  152. nombre_individus_a_replacer = nombre_individu - ((len(Pop)-T))
  153. print "nombre_individus_a_replacer=", nombre_individus_a_replacer
  154. #print Pop
  155. Pop=repartition_aleatoire_individus(salle,nombre_individus_a_replacer,Pop)
  156. return Pop
  157.  
  158. """A chaque individu on n'attribuera pas de numéros, on dira simplement que
  159. l'individu se trouvant à la position 0 sera le perso 0, etc, quand un individu
  160. passe la porte, faut donc pas le supp, sinon ca dérèglera tout, faudra lui
  161. attribuer des caractéristiques spéciale"""
  162.  
  163. """on considère que la vitesse initiale est nulle, et que l'accélération aussi"""
  164.  
  165. """pour la vitesse max, on considère que les jeunes peuvent courir à 7 m/s soit
  166. 25km/h, et les plus âgés à 1.5 m/s, soit 5,4 km/h
  167. de plus tous peuvent atteindre leur vitesse max avec en 3 seconces, on en déduit l'
  168. accélération"""
  169.  
  170. """Les fonctions qui déterminent les vitesses, accélérations, placement dans
  171. quadrillage doivent toujours etre executées dans le meme ordre,
  172. sinon la liste ne sera plus dans le meme ordre et ce sera le bordel!!"""
  173.  
  174. def vitesse_et_acceleration_max(p):
  175. v = (random.randint(15,70))/10. #le point c'est pour travailler avec des décimaux
  176. a = (random.randint(5,20))/10.
  177. p.append(v)
  178. p.append(a)
  179. return p
  180.  
  181. """on peut maintenant definr les caractéristiques de la population à l'instant
  182. t=0, vitesse nulle, acceleration aussi.."""
  183.  
  184. def vitesse_initiale_et_acceleration_initiale_de_la_pop(pop): #pas vraiment initial en fait, plutot pour ajouter la "case" vitesse et acceleration au perso
  185. for i in range (len(pop)):
  186. vitesse_et_acceleration_max(pop[i])
  187. pop[i].append([0,0])
  188. pop[i].append([0,0])
  189. pop[i].append([])#on en profite pour rajouter aussi les cases qui correspondent au champ de vision: persos et obstacles presents
  190. pop[i].append([])
  191. return pop
  192.  
  193.  
  194. #repartition_aleatoire_invdividus(salle1,10)
  195. #vitesse_initiale_et_acceleration_initiale_de_la_pop(Pop)
  196.  
  197.  
  198.  
  199. def placement_dans_quadrillage_d_un_individu(p,quad):
  200. t = quad[2]
  201. i1= p[0][0]//t
  202. i2= p[0][1]//t
  203. p.append([i1,i2])
  204. return p
  205.  
  206. def placement_dans_quadrillage_de_la_pop(pop):
  207. case = quad_salle(salle[0],5)
  208. for i in range (len(pop)):
  209. individu = placement_dans_quadrillage_d_un_individu(pop[i],case)
  210. pop[i] = individu
  211. return pop
  212.  
  213. #placement_dans_quadrillage_de_la_pop(Pop)
  214. #dessin_perso(Pop)
  215.  
  216. """ Il faut maintenant attribuer à chaque perso toute ses caractéristiques,
  217. ce qui engendrera des modifications dans les fonctions précédentes, on écrits
  218. puis on les mettra avant les fonctions de dessins : FAIT"""
  219.  
  220. """je vais mettre un # devant toute les fonctions et toutes les copier ici pour
  221. mettre en évidence l'ordre"""
  222.  
  223. salle1 = carte(25,30,[14,0])
  224. obstacle([10,4],[10,4])
  225. obstacle([15,12],[4,8])
  226. obstacle([4,18],[3,9])
  227. quadrillage_salle_obstacle(salle1)
  228. dessin(salle1)
  229. #Pop= [[[10,26]],[[5,15]]]
  230. #repartition_aleatoire_invdividus(salle1,5)
  231. #vitesse_initiale_et_acceleration_initiale_de_la_pop(Pop)
  232. #placement_dans_quadrillage_de_la_pop(Pop)
  233. Pop=[[[10, 26], 5.7, 1.6, [0, 0], [0, 0], [2, 5], [[[5, 15], 3.2, 1.2, [0, 0], [0, 0], [1, 3], [], [[[10, 4], [10, 4], [[2, 4], [0, 1]]], [[15, 12], [4, 8], [[3, 3], [2, 4]]]]]], [[[15, 12], [4, 8], [[3, 3], [2, 4]]], [[4, 18], [3, 9], [[0, 1], [3, 5]]]]], [[5, 15], 3.2, 1.2, [0, 0], [0, 0], [1, 3], [], [[[10, 4], [10, 4], [[2, 4], [0, 1]]], [[15, 12], [4, 8], [[3, 3], [2, 4]]]]]]
  234. #juste au dessus c'est la pop une fois les fonctions sur les champs de visions effectuées!
  235. dessin_perso(Pop)
  236.  
  237. """je viens de remarquer un bug, parfois, en testant avec 10 individu, il
  238. m'arrive d'en obtenir 11,8,9... Resolu en modifiant la fonction répartition
  239. aléatoire"""
  240.  
  241. """on va maintenant s'attaquer au champ de vision qui va déterminer les
  242. déplacements"""
  243.  
  244. """on commence avec les obstacles pour simuler avec un seul individu"""
  245. """ je sais pas si le quadrillage va vraiment nous servir.."""
  246. """on peut considérer que le champ de vision ne varie pas avec la vitesse,
  247. car la variation de vitesse reste assez faible, si l'on compare avec une
  248. voiture par exemple"""
  249. """on choisit comme champ de vision un triangle isocele, d'angle 100° (bien
  250. que le champ de vision soit en situation normale plus important, on considèrera
  251. qu'avec le stress ca donne ca. en plus, sinon ca fait rapidement des aires énormes)
  252. et de hauteur 15m on a changé, c'est un cercle maintenant!"""
  253. """ ces données que nous définissons et que l'utilisateur du prgm ne peut apriori
  254. pas modifier sont les hypothèses que nous fixons pour nos expériences"""
  255.  
  256. """le centre de l'individu correspond au sommet triangle isocèle ainsi défini,
  257. la hauteur de ce triangle sera confondue avec le vecteur vitesse"""
  258.  
  259. """voir annexe papier sur le champ de vision"""
  260. """ on va definir une matrice de rotation qui permet de découper le cercle en
  261. petites droites, on découpe en dix, soit 11 points, H, 5 à droite, 5 a gauche,
  262. chaque partie a un angle de 10° soit 0,174 rad"""
  263.  
  264. from math import sqrt
  265. from math import cos, sin, tan
  266.  
  267. def champ_de_vision(perso,salle): #on obtient les points caractéristiques à savoir I,J,H
  268. if perso[3]==[0,0]:
  269. vecteur_directeur_du_champ_de_vision = [(salle1[0][2][0]-perso[0][0])/sqrt((salle1[0][2][0]-perso[0][0])**2+(salle1[0][2][1]-perso[0][1])**2),(salle1[0][2][1]-perso[0][1])/sqrt((salle1[0][2][0]-perso[0][0])**2+(salle1[0][2][1]-perso[0][1])**2)]
  270. #print "vecteur directeur",vecteur_directeur_du_champ_de_vision
  271. else:
  272. vecteur_directeur_du_champ_de_vision = perso[3]
  273. Kh = 15/sqrt(vecteur_directeur_du_champ_de_vision[0]**2 + vecteur_directeur_du_champ_de_vision[1]**2)
  274. H = [perso[0][0]+Kh*vecteur_directeur_du_champ_de_vision[0],perso[0][1]+Kh*vecteur_directeur_du_champ_de_vision[1]]
  275. #a = 17.8763 # tan(50°)*15
  276. #Ki = a/(sqrt(vecteur_directeur_du_champ_de_vision[0]**2+vecteur_directeur_du_champ_de_vision[1]**2))
  277. #Kj = - Ki
  278. #I = [H[0]+Ki*(-vecteur_directeur_du_champ_de_vision[1]), H[1] + Ki*vecteur_directeur_du_champ_de_vision[0]]
  279. #J = [H[0]+Kj*(-vecteur_directeur_du_champ_de_vision[1]), H[1] + Kj*vecteur_directeur_du_champ_de_vision[0]]
  280. #print I,J,perso,vecteur_directeur_du_champ_de_vision
  281. #print H
  282. dessin_salle = Image.open("dessin_salle.png")
  283. draw = ImageDraw.Draw(dessin_salle)
  284. #draw.ellipse((H[0]*100-0.5*100,H[1]*100-0.5*100,H[0]*100+0.5*100,H[1]*100+0.5*100), fill=(30,55,62))
  285. #draw.ellipse((perso[0][0]*100-15*100,perso[0][1]*100-15*100,perso[0][0]*100+15*100,perso[0][1]*100+15*100),fill=(25,125,86))
  286. #draw.polygon([(I[0]*100,I[1]*100),(J[0]*100,J[1]*100),(perso[0][0]*100,perso[0][1]*100)], fill=(10, 234, 15))
  287. teta = 1.745
  288. points_caracteristiques = []
  289. point_depart = [perso[0][0] + cos(-teta/2)*(H[0]-perso[0][0]) - sin(-teta/2)*(H[1]-perso[0][1]), perso[0][1] + sin(-teta/2)*(H[0] - perso[0][0]) + cos(-teta/2)*(H[1]-perso[0][1])]
  290. #print point_depart
  291. points_caracteristiques.append(point_depart)
  292. for i in range (1,11):
  293. A = [perso[0][0] + cos(i*teta/10)*(point_depart[0]-perso[0][0]) - sin(i*teta/10)*(point_depart[1]-perso[0][1]) , perso[0][1] + sin(i*teta/10)*(point_depart[0]-perso[0][0]) + cos(i*teta/10)*(point_depart[1]-perso[0][1])]
  294. points_caracteristiques.append(A)
  295. #for i in range (len(points_caracteristiques)):
  296. #draw.ellipse((points_caracteristiques[i][0]*100-0.5*100,points_caracteristiques[i][1]*100-0.5*100,points_caracteristiques[i][0]*100+0.5*100,points_caracteristiques[i][1]*100+0.5*100), fill=(14,200,182))
  297. dessin_salle.save("dessin_salle.png", "PNG")
  298. Im = Image.open("dessin_salle.png")
  299. #Im.show()
  300. return points_caracteristiques
  301.  
  302. """X' = P + R(X-P) """
  303. #champ_de_vision(Pop[0],salle1)
  304. #champ_de_vision(Pop[1],salle1)
  305. #champ_de_vision(Pop[2],salle1)
  306. #champ_de_vision(Pop[3],salle1)
  307. #champ_de_vision(Pop[4],salle1)
  308.  
  309.  
  310. """ on pourra avoir des pb, si python considere les coordonnées comme des entiers"""
  311.  
  312. def test_appartenance_champ_de_vision(point_test,perso,salle):
  313. points = champ_de_vision(perso,salle)
  314. test = True
  315. i=0
  316. #print points,perso
  317. while test==True and i<10:
  318. if ((points[i+1][0]-points[i][0])*(point_test[1]-points[i][1]) - (points[i+1][1]-points[i][1])*(point_test[0]-points[i][0]))*((points[i+1][0]-points[i][0])*(perso[0][1]-points[i][1]) - (points[i+1][1]-points[i][1])*(perso[0][0]-points[i][0])) > 0:
  319. test = True
  320. else:
  321. test = False
  322. i = i+1
  323. if test == True:
  324. if (((points[0][0]-perso[0][0])*(point_test[1]-perso[0][1]) - (points[0][1]-perso[0][1])*(point_test[0]-perso[0][0]))*((points[0][0]-perso[0][0])*(points[10][1]-perso[0][1]) - (points[0][1]-perso[0][1])*(points[10][0]-perso[0][0])) > 0) and (((points[10][0]-perso[0][0])*(point_test[1]-perso[0][1]) - (points[10][1]-perso[0][1])*(point_test[0]-perso[0][0]))*((points[10][0]-perso[0][0])*(points[0][1]-perso[0][1]) - (points[10][1]-perso[0][1])*(points[0][0]-perso[0][0])) > 0) :
  325. test = True
  326. #print "in"
  327. else:
  328. test = False
  329. # print "out"
  330. else:
  331. #print "out"
  332. return test
  333. return test
  334.  
  335. #test_appartenance_champ_de_vision([12,18],Pop[0],salle1)
  336.  
  337.  
  338.  
  339. def test_appartenance_champ_de_vision_pour_obstacle(obstacle,perso,salle):
  340. x=obstacle[0][0] #abscisse du point de plus petite coordonnées
  341. y=obstacle[0][1]
  342. test = False
  343. a = x
  344. b= y
  345. while test == False and a < x + obstacle[1][0]:
  346. test = test_appartenance_champ_de_vision([a,b], perso, salle)
  347. a = a+1
  348. if test == True:
  349. #print "in"
  350. return test
  351. else:
  352. a=x
  353. b=y
  354. while test == False and b < y + obstacle[1][1]:
  355. test = test_appartenance_champ_de_vision([a,b], perso, salle)
  356. b=b+1
  357. #print "coordonnees =", [a,b]
  358. if test == True:
  359. #print "in"
  360. return test
  361. else:
  362. a=x
  363. b=y + obstacle[1][1]
  364. while test == False and a < x + obstacle[1][0]:
  365. test = test_appartenance_champ_de_vision([a,b], perso, salle)
  366. a = a+1
  367. if test == True:
  368. #print "in"
  369. return test
  370. else:
  371. a= x + obstacle[1][0]
  372. b=y
  373. while test == False and b < y + obstacle[1][1]:
  374. test = test_appartenance_champ_de_vision([a,b], perso, salle)
  375. b= b+1
  376. #if test == True:
  377. #print "in"
  378. #else:
  379. #print "out"
  380.  
  381. #test_appartenance_champ_de_vision_pour_obstacle(salle1[2],Pop[0],salle1)
  382.  
  383.  
  384. def liste_des_persos_et_obstacles_appartenant_au_champ_de_vision(perso,salle,Pop):
  385. persos_appartenant_au_champ = [ ]
  386. obstacles_appartenant_au_champ= [ ]
  387. for i in range (len(Pop)):
  388. if test_appartenance_champ_de_vision(Pop[i][0],perso,salle) == True:
  389. persos_appartenant_au_champ.append(Pop[i])
  390. for i in range(1,len(salle)):
  391. if test_appartenance_champ_de_vision_pour_obstacle(salle[i],perso,salle) == True:
  392. obstacles_appartenant_au_champ.append(salle[i])
  393. if perso in persos_appartenant_au_champ:
  394. persos_appartenant_au_champ.remove(perso)
  395. print "persos dans le champ:", persos_appartenant_au_champ, "obstacles dans le champ:",obstacles_appartenant_au_champ
  396. perso[6] = persos_appartenant_au_champ
  397. perso[7] = obstacles_appartenant_au_champ
  398. return persos_appartenant_au_champ, obstacles_appartenant_au_champ
  399.  
  400. def rentrer_cette_liste_dans_la_pop(pop,salle):
  401. for i in range (len(pop)):
  402. L = liste_des_persos_et_obstacles_appartenant_au_champ_de_vision(pop[i],salle)
  403. pop[i][6] = L[0]
  404. pop[i][7] = L[1]
  405.  
  406. #liste_des_persos_et_obstacles_appartenant_au_champ_de_vision(Pop[0],salle1,Pop)[0], liste_des_persos_et_obstacles_appartenant_au_champ_de_vison(Pop[0],salle1,Pop)[1]
  407. #liste_des_persos_et_obstacles_appartenant_au_champ_de_vision(Pop[0],salle1,Pop)
  408. #liste_des_persos_et_obstacles_appartenant_au_champ_de_vision(Pop[1],salle1,Pop)
  409.  
  410. #Im = Image.open("dessin_salle.png") #on met ca là, sinon le dessin s'ouvre 50 fois
  411. #Im.show()
  412.  
  413. """ ca y est, je crois qu'on en a fini avec le champ de vision!, on a tout"""
  414. """maintenant on va s'interesser à comment se dirige un perso tout seul dans
  415. la salle, cad on sa direction, sa vitesse, son accélération"""
  416. """on va réfléchir à tout ca en se basant sur le bonhomme de position [3, 19]
  417. c'est à dire Pop[3]"""
  418. """d'abord le cas le plus simple, si personne ne va gener à la position suivante
  419. ou si un obstacle va gener"""
  420.  
  421. """ Pop[0][6] correspond aux persos présents dans le champ de vision du perso
  422. Pop[0][7] correspond aux obstacles présents dans le champ de vision du perso"""
  423.  
  424.  
  425.  
  426. def rencontre_obstacle(perso,salle):
  427. if perso[7]== []:
  428. L = []
  429. return L
  430. else:
  431. obstacles_du_champ = perso[7]
  432. vitesse = perso[3]
  433. coord = perso[0]
  434. if vitesse == [0,0]:
  435. vitesse = [(salle1[0][2][0]-perso[0][0])/sqrt((salle1[0][2][0]-perso[0][0])**2+(salle1[0][2][1]-perso[0][1])**2),(salle1[0][2][1]-perso[0][1])/sqrt((salle1[0][2][0]-perso[0][0])**2+(salle1[0][2][1]-perso[0][1])**2)]
  436. #print "vitesse", vitesse
  437. L = []
  438. t = 0
  439. test = True
  440. for i in range (len(obstacles_du_champ)):
  441. while sqrt((perso[0][0]-coord[0]+vitesse[0]*t)**2 + (perso[0][1]+vitesse[1]*t-coord[1])**2) < 15 and test == True:
  442. A= sqrt((perso[0][0]-coord[0]+vitesse[0]*t)**2 + (perso[0][1]+vitesse[1]*t-coord[1])**2) #distance à l'obstacle
  443. #print "distance", A
  444. if (obstacles_du_champ[i][0][0] < coord[0]+vitesse[0]*t) and ((obstacles_du_champ[i][0][1] < coord[1]+vitesse[1]*t)) and ((obstacles_du_champ[i][0][0] + obstacles_du_champ[i][1][0] > coord[0]+vitesse[0]*t)) and (obstacles_du_champ[i][0][1] + obstacles_du_champ[i][1][1] > coord[1]+vitesse[1]*t):
  445. #print coord[0]+vitesse[0]*t,coord[1]+vitesse[1]*t, obstacles_du_champ[i]
  446. test = False
  447. a = t
  448. while (obstacles_du_champ[i][0][0] < coord[0]+vitesse[0]*a) and ((obstacles_du_champ[i][0][1] < coord[1]+vitesse[1]*a)) and ((obstacles_du_champ[i][0][0] + obstacles_du_champ[i][1][0] > coord[0]+vitesse[0]*a)) and (obstacles_du_champ[i][0][1] + obstacles_du_champ[i][1][1] > coord[1]+vitesse[1]*a):
  449. a = a + .1
  450. L.append([[coord[0]+vitesse[0]*t,coord[1]+vitesse[1]*t],[coord[0]+vitesse[0]*a,coord[1]+vitesse[1]*a],obstacles_du_champ[i],A])
  451. else:
  452. t = t+.1
  453. #print "t=",t
  454. #print coord[0]+vitesse[0]*t,coord[1]+vitesse[1]*t
  455. min = 0
  456. for i in range (len(L)):
  457. if L[i][2]<min:
  458. del L[min]
  459. min = i
  460. return L
  461.  
  462. """ Ainsi, L contient le point de rencontre avec l'obstacle, les donnees sur l'obstacle en question, le point de "sortie" de l'obstacle
  463. """
  464.  
  465. #rencontre_obstacle(Pop[0],salle1)
  466.  
  467.  
  468. def decision_par_rapport_a_obstacle(perso,salle): #modification de l'acceleration modifie UNIQUEMENT l'orientation du vecteur vitesse et non ca norme
  469. L = rencontre_obstacle(perso,salle)
  470. vitesse = perso[3]
  471. if L == []: #pas d'obstacle en vue
  472. print "on ne modifie rien"
  473. acceleration = [0,0] #pas d'acceleration due à une rotation
  474. else:
  475. obstacle = L[0][2]
  476. distance = L[0][3]
  477. Pr = L[0][0] #point de rencontre entre la trajectoire du perso et l'obstacle
  478. Ps = L[0][1]
  479. print "Pr=",Pr, "Ps=", Ps, "obstacle=", obstacle
  480. Aire_obstacle = obstacle[1][0]*obstacle[1][1]
  481. if (round(Pr[0])==obstacle[0][0]) and (round(Ps[0])==obstacle[0][0]+ obstacle[1][0]):
  482. A = obstacle[1][0]*(obstacle[0][1]+obstacle[1][1]-Pr[1]) + .5*(Ps[1]-Pr[1])*obstacle[1][0]
  483. elif (round(Ps[0])==obstacle[0][0]) and (round(Pr[0])==obstacle[0][0]+ obstacle[1][0]):
  484. A = Aire_obstacle - obstacle[1][0]*(obstacle[0][1]+obstacle[1][1]-Pr[1]) + .5*(Ps[1]-Pr[1])*obstacle[1][0]
  485. elif (round(Pr[1])==obstacle[0][1]) and (round(Ps[1])==obstacle[0][1]+obstacle[1][1]):
  486. A = obstacle[1][1]*(Pr[0]-obstacle[0][0]) + 0.5*(Ps[0]-Pr[0])*obstacle[0][1]
  487. elif (round(Ps[1])==obstacle[0][1]) and (round(Pr[1])==obstacle[0][1]+obstacle[1][1]):
  488. A = Aire_obstacle - (obstacle[1][1]*(Pr[0]-obstacle[0][0]) + 0.5*(Ps[0]-Pr[0])*obstacle[0][1])
  489. elif (round(Pr[1])==obstacle[0][1] or round(Pr[1])==obstacle[0][1]+obstacle[1][1]) and (round(Ps[1])==obstacle[0][1] or round(Ps[1])==obstacle[0][1]+obstacle[1][1]):
  490. A = obstacle[1][1]*(Pr[0]) + .5*(Ps[0]-Pr[0])*obstacle[1][1]
  491. elif (round(Pr[0]) == obstacle[0][0]) and (round(Ps[1]) == obstacle[0][1]):
  492. A= Aire_obstacle-(.5*(Pr[1]-obstacle[0][1])*(Ps[0]-obstacle[0][0]))
  493. elif (round(Ps[0]) == obstacle[0][0]) and (round(Pr[1]) == obstacle[0][1]):
  494. A= .5*(Ps[1]-obstacle[0][1])*(Pr[0]-obstacle[0][0])
  495. elif (round(Pr[0]) == (obstacle[0][0])) and (round(Ps[1]) == (obstacle[0][1]+obstacle[1][1])):
  496. A= .5*(obstacle[0][1]+obstacle[1][1]-Pr[1])*(Ps[0]-obstacle[0][0])
  497. elif (round(Ps[0]) == (obstacle[0][0])) and (round(Pr[1]) == (obstacle[0][1]+obstacle[1][1])):
  498. A= Aire_obstacle-(.5*abs(obstacle[0][1]+obstacle[1][1]-Ps[1])*abs(Pr[0]-obstacle[0][0]))
  499. elif (round(Pr[0]) == (obstacle[0][0]+obstacle[1][0])) and (round(Ps[1]) == (obstacle[0][1]+obstacle[1][1])):
  500. A= Aire_obstacle-(.5*(obstacle[0][1]+obstacle[1][1]-Ps[1])*(obstacle[0][0]+obstacle[1][0]-Pr[0]))
  501. elif (round(Ps[0]) == (obstacle[0][0]+obstacle[1][0])) and (round(Pr[1]) == (obstacle[0][1]+obstacle[1][1])):
  502. A= .5*(obstacle[0][1]+obstacle[1][1]-Pr[1])*(obstacle[0][0]+obstacle[1][0]-Ps[0])
  503. elif (round(Pr[0]) == (obstacle[0][0]+obstacle[1][0])) and (round(Ps[1]) == (obstacle[0][1])):
  504. A= .5*(Pr[1]-obstacle[0][1])*(obstacle[0][0]+obstacle[1][0]-Ps[0])
  505. elif (round(Ps[0]) == (obstacle[0][0]+obstacle[1][0])) and (round(Pr[1]) == (obstacle[0][1])):
  506. A= Aire_obstacle-(.5*abs(Ps[1]-obstacle[0][1])*(obstacle[0][0]+obstacle[1][0]-Pr[0]))
  507. print "Aire=",A, "Aire Obstacle", Aire_obstacle
  508. if A < Aire_obstacle*.5:
  509. print "droite"
  510. decision = True #on va bien à droite
  511. else:
  512. print "gauche"
  513. decision = False #on va à gauche
  514. if distance > 10: #l'obstacle est à plus de 10m on doit tourner un peu, de 15°, (15 * pi) / 180 = 0.2617993877991494
  515. print "on tourne de 10°"
  516. if decision == True:
  517. vitesse = [cos(0.17453292519943295)*(vitesse[0])- sin(0.17453292519943295)*(vitesse[1]) ,sin(0.17453292519943295)*(vitesse[0]) + cos(0.17453292519943295)*(vitesse[1])]
  518. persotest = copie(perso)
  519. persotest[3] = vitesse
  520. if (rencontre_obstacle(persotest,salle)) != (rencontre_obstacle(perso,salle)) :
  521. while (rencontre_obstacle(persotest,salle)) != (rencontre_obstacle(perso,salle)) :
  522. persotest[3]= [cos(-0.08726646259971647)*(vitesse[0])- sin(-0.08726646259971647)*(vitesse[1]) ,sin(-0.08726646259971647)*(vitesse[0]) + cos(-0.08726646259971647)*(vitesse[1])]
  523. vitesse = [cos(0.08726646259971647)*(vitesse[0])- sin(0.08726646259971647)*(vitesse[1]) ,sin(0.08726646259971647)*(vitesse[0]) + cos(0.08726646259971647)*(vitesse[1])]
  524. else:
  525. vitesse= [cos(-0.17453292519943295)*(vitesse[0])- sin(-0.17453292519943295)*(vitesse[1]) ,sin(-0.17453292519943295)*(vitesse[0]) + cos(-0.17453292519943295)*(vitesse[1])]
  526. persotest = copie(perso)
  527. persotest[3] = vitesse
  528. if (rencontre_obstacle(persotest,salle)) != (rencontre_obstacle(perso,salle)) :
  529. while (rencontre_obstacle(persotest,salle)) != (rencontre_obstacle(perso,salle)) :
  530. persotest[3]= [cos(-0.08726646259971647)*(vitesse[0])- sin(-0.08726646259971647)*(vitesse[1]) ,sin(-0.08726646259971647)*(vitesse[0]) + cos(-0.08726646259971647)*(vitesse[1])]
  531. vitesse = [cos(0.08726646259971647)*(vitesse[0])- sin(0.08726646259971647)*(vitesse[1]) ,sin(0.08726646259971647)*(vitesse[0]) + cos(0.08726646259971647)*(vitesse[1])]
  532.  
  533. elif distance >5: #l'obstacle est entre 5 et 10m, on doit tourner un peu plus de 15° 15*pi/180 = 0.2617993877991494
  534. print "on tourne de 15°"
  535. if decision == True:
  536. vitesse = [cos(0.2617993877991494)*(vitesse[0])- sin(0.2617993877991494)*(vitesse[1]) ,sin(0.2617993877991494)*(vitesse[0]) + cos(0.2617993877991494)*(vitesse[1])]
  537. else:
  538. vitesse= [cos(-0.2617993877991494)*(vitesse[0])- sin(-0.2617993877991494)*(vitesse[1]) ,sin(-0.2617993877991494)*(vitesse[0]) + cos(-0.2617993877991494)*(vitesse[1])]
  539. else: #on doit tourner plus! de 20° 20*pi/180 =0.3490658503988659
  540. print "on tourne de 20°"
  541. if decision == True:
  542. vitesse= [cos(0.3490658503988659)*(vitesse[0])- sin(0.3490658503988659)*(vitesse[1]) ,sin(0.3490658503988659)*(vitesse[0]) + cos(0.3490658503988659)*(vitesse[1])]
  543. else:
  544. vitesse= [cos(-0.3490658503988659)*(vitesse[0])- sin(-0.3490658503988659)*(vitesse[1]) ,sin(-0.3490658503988659)*(vitesse[0]) + cos(-0.3490658503988659)*(vitesse[1])]
  545. acceleration = [0,0]
  546. acceleration[0]= vitesse[0] - perso[3][0]
  547. acceleration[1]= vitesse[1] - perso[3][1]
  548. print "acceleration=", acceleration
  549. print "distance=", distance
  550. dessin_salle = Image.open("dessin_salle.png")
  551. draw = ImageDraw.Draw(dessin_salle)
  552. #draw.ellipse(((vitesse[0]+perso[0][0])*100-0.5*100,(vitesse[1]+perso[0][1])*100-0.5*100,(vitesse[0]+perso[0][0])*100+0.5*100,(vitesse[1]+perso[0][1])*100+0.5*100), fill=(145,200,182))
  553. dessin_salle.save("dessin_salle.png", "PNG")
  554. Im = Image.open("dessin_salle.png")
  555. Im.show()
  556. print "modification de l'orientation de la vitesse dans le cas ou il n'y a pas de persos=", vitesse
  557. print "acceleration=", acceleration
  558. return acceleration
  559.  
  560. #decision_par_rapport_a_obstacle(Pop[1],salle1)
  561.  
  562. def determination_acceleration_initiale_par_rapport_aux_obstacles(perso,salle):
  563. vitesse = [((salle[0][2][0]-perso[0][0])/sqrt((salle[0][2][0]-perso[0][0])**2+(salle[0][2][1]-perso[0][1])**2)),((salle[0][2][1]-perso[0][1])/sqrt((salle[0][2][0]-perso[0][0])**2+(salle[0][2][1]-perso[0][1])**2))]
  564. perso[3] = vitesse
  565. acceleration = decision_par_rapport_a_obstacle(perso,salle)
  566. vitesse = [vitesse[0]+acceleration[0]*1,vitesse[1]+acceleration[1]*1] #*1 car on considère que le pas de temps est 1
  567. acceleration = [vitesse[0]*perso[2],vitesse[1]*perso[2]] #acceleration max
  568. perso[3]=[0,0]
  569. perso[4] = acceleration
  570. #print perso
  571. return perso
  572.  
  573.  
  574. """
  575. dessin(salle1)
  576. #Poptest=[[[10,26]]]
  577. #vitesse_initiale_et_acceleration_initiale_de_la_pop(Poptest)
  578. #placement_dans_quadrillage_de_la_pop(Poptest)
  579. #liste_des_persos_et_obstacles_appartenant_au_champ_de_vison(Poptest[0],salle1,Poptest)
  580. #on trouve Poptest= [[[10, 26], 2.1, 0.5, [0, 0], [0, 0], [2, 5], [], [[[15, 12], [4, 8], [[3, 3], [2, 4]]], [[4, 18], [3, 9], [[0, 1], [3, 5]]]]]]
  581. Poptest= [[[10, 26], 2.1, 0.5, [0, 0], [0, 0], [2, 5], [], [[[15, 12], [4, 8], [[3, 3], [2, 4]]], [[4, 18], [3, 9], [[0, 1], [3, 5]]]]]]
  582. dessin_perso(Poptest)
  583. Im = Image.open("dessin_salle.png")
  584. Im.show()
  585. determination_acceleration_initiale_par_rapport_aux_obstacles(Poptest[0],salle1)
  586. def testmouv(perso,salle):
  587. print perso
  588. for i in range (6):
  589. perso[0][0] = perso[0][0]+perso[3][0]*3
  590. perso[0][1] = perso[0][1]+perso[3][1]*3
  591. perso[3][0] = perso[3][0]+perso[4][0]*3
  592. perso[3][1] = perso[3][1]+perso[4][1]*3
  593. acceleration = decision_par_rapport_a_obstacle(perso,salle)
  594. perso[4] = acceleration
  595. liste_des_persos_et_obstacles_appartenant_au_champ_de_vision(Poptest[0],salle1,Poptest)
  596. dessin_perso(Poptest)
  597. print perso
  598. Im = Image.open("dessin_salle.png")
  599. Im.show()
  600.  
  601. testmouv(Poptest[0],salle1)"""
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement