Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3006 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  [Jeu] Calculer la visibilité des unités entre elles....

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Jeu] Calculer la visibilité des unités entre elles....

n°1182777
xterminhat​e
Si vis pacem, para bellum.
Posté le 23-08-2005 à 21:23:57  profilanswer
 

Impossible de trouver un titre pertinent pour ce post !
 
L'application est un jeu.
 
Le besoin est de connaître les entités qui se "voient" (cad, la distance entre deux entités du jeu est inférieure à une valeur arbitraire).
 
Je recherche un algorithme efficace pour obtenir : pour chaque entité, la liste des entités visibles.
 
Soit E l'ensemble des entités du jeu : { e1, e2, e3.... en }.
 
Soit P le prédicat tq P(e1,e2) retourne vrai si les entités e1 et e2 se "voient".
 
Soit V l'ensemble associatif des entités du jeu associées à l'ensemble des entités qui sont en vu { (e1,{ei,ej,ek...}), (e2,{ei,ej,ek...}), .... (en,{ei,ej,ek...}) }.
 
Voila l'algorithme de base [O(n²)]:
 
for ei = e1...en
   for ej = e1...en
      if ei != ej
         if P(ei,ej)
            V[ei].push(ej)
 
 
Vous l'aurez deviné.... j'y connais rien en algo. Cela dit, il y a certainement une ou plusieurs manières d'améliorer mon algo 'pourri'. Pouvez vous m'orienter vers une solution meilleure !?
 
Merci d'avance.  :hello:


Message édité par xterminhate le 23-08-2005 à 21:24:51
mood
Publicité
Posté le 23-08-2005 à 21:23:57  profilanswer
 

n°1182803
matafan
Posté le 23-08-2005 à 22:13:05  profilanswer
 

Si P est symetrique, c'est a dire si P(ei,ej) <=> P(ej,ei) (ce qui est le cas d'apres tes explications), alors tu peux te contenter de faire ta deuxieme boucle de ei+1 a en. Ce qui fait encore une complexite en O(n^2), mais quand meme moitie moins de calculs.

n°1182806
olivthill
Posté le 23-08-2005 à 22:19:41  profilanswer
 

Si la visibilité de l'ensemble des entités est recalculée à chaque fois, il faut bien sûr passer à un algorithme de type "incrémental", dans lequel la visibilité ne sera recalculée que pour les entités concernées par le dernier changement.
Il faut aussi optimiser ce qui ce trouve au coeur des boucles. Cela peut souvent se faire avec des tables précalculées.

n°1182832
xterminhat​e
Si vis pacem, para bellum.
Posté le 23-08-2005 à 22:55:27  profilanswer
 

matafan > Pas con. Si j'ai bien compris ...
 
for ei = e1...en
   for ej = ei+1...en
      if ei != ej
         if P(ei,ej)            
            V[ei].push(ej)  
            V[ej].push(ei)  
 
Olivthill > Exact (toutes les 100ms!). Je n'ai présenté que la partie algorithmie. J'ai prévu une certain nombre de "caches" à différentes étapes du traitement...

n°1182852
matafan
Posté le 23-08-2005 à 23:17:34  profilanswer
 

C'est ca, mais tu peux enlever le test if ei != ej puisque tu n'aura jamais ei == ej. Ca fait n*(n-1)/2 invocations de P.

n°1182863
xterminhat​e
Si vis pacem, para bellum.
Posté le 23-08-2005 à 23:29:44  profilanswer
 

Pour le test, c'est bien sur !
 
Je ne calcul pas vraiment la distance exacte (juste une approx. grossière dans un plan, jeu 2D ;-) ) :
 
| ei.x - ej.x | < d  ET | ei.y - ej.y | < d
 
Ca suffit largement !  
 
Merci à vous deux.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  [Jeu] Calculer la visibilité des unités entre elles....

 

Sujets relatifs
calculer une moyenne en enlevant avant deux données...Optimisation de scripts PHP, comment la calculer.
[HTML] Visibilité imageJeu de cartes - Refresh discret
visibilite menuCalculer le nbre de ligne de code source
calculer le nbr de lignes pour action d'une macro[ALG'EXEC] Jeu du 421
Jeu Client/Serveur A l'aidePascal:unités
Plus de sujets relatifs à : [Jeu] Calculer la visibilité des unités entre elles....


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR