CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Champ de vision en Java

Rikkel
Rikkel
Niveau 9
25 février 2013 à 17:41:22

Bonjour !
Je code actuellement pour un projet d'écosystème et je bloque sur un truc assez trivial.

L'environnement est un monde torique 2D de longueur et largeur paramétrable, où se baladent des agents virtuels. Deux types d'agents, les prédateurs et proies, sont rangés dans une arraylist commune, tous deux héritent d'une classe Agent.

Chacun de mes prédateurs (proies également mais je préfère commencer par les prédateurs) ont un champ de vision, et lorsqu'une proie est à portée de vue, ils se mettent à pourchasser la cible la plus proche.
Bref je ne vais pas m'étaler là dessus en vous déballant tout le projet car ma question est en somme toute triviale.

Voilà à quoi doit ressembler le champ de vision : https://image.noelshack.com/fichiers/2013/09/1361809943-rayon-visibilite.jpg

Mon prédateur a donc une variable r qui est le rayon de ce champ de vision, et à partir de là je veux faire une double boucle for pour parcourir les cases au alentour de ce prédateur pour procéder à une analyse de la liste des proies qui vérifie si elles sont dans ce rayon.

Je fais donc une boucle :
for ( k = x - r ; k <= x + r ; k++ )
for ( l = y - r ; l <= y + r ; l ++)

A partir de là je vérifie toutes les cases en forme de carré de longueur r (je gèrerai les débordement d'indice avec un modulo dx/dy), mais c'est là que je bloque : comment avec un if, sélectionner uniquement les cases qui concordent avec ce rayon décrit par l'image?

Merci d'avant pour votre aide !

Fatalize
Fatalize
Niveau 43
25 février 2013 à 18:11:32

Si tu remplaces la deuxième boucle par ça :

for(l=y-r ; l<= y+r ; l>y?l-=2:l+=2)

Tu devrais normalement parcourir que les cases en rouge sur ton schéma, si je dis pas de conneries

Fatalize
Fatalize
Niveau 43
25 février 2013 à 18:12:42

Euh nan en fait oublie j'ai dit de la merde totale là. J'y réfléchis

Eij_iZ_WanteD
Eij_iZ_WanteD
Niveau 10
25 février 2013 à 18:25:39

Je n'y connais rien en java mais je n'arrive pas à comprendre si ton problème est dans ton algo ou dans la sélection de l'objet.
Mais là avec ta double boucle tu fais un carré de côté 2*r avec une diagonale 2*r*Sqrt(2) et donc un r max de r*Sqrt(2).

Pour corriger ça il faut changer ta deuxième boucle et la faire arrêter pour un l max calculé en fonction de ton x pour que ça réponde à l'équation d'un cercle.

(x-a)²+(y-b)²=r² avec C(a,b) le centre de ton cercle.

L'autre solution, si tu as moins de proies que de carrés à vérifier dans tes boucles, c'est de calculer la distance entre le prédateur et chacune des proies.

Bon je ne sais pas si je t'ai aidé mais ça ne coûte pas grand chose. :gni:

Rikkel
Rikkel
Niveau 9
25 février 2013 à 18:30:02

Pour le fait que ça soit en Java non pas du tout en fait, c'est juste au niveau de l'algo ma question et pas besoin de se servir des objets ^^
Pour la méthode du cercle, est-ce que ça va pas etre problématique car pour un R très grand, c'est pas du tout un cercle qui se dessine mais un losange :/
Et sinon pour la réponse de Blue Koala, tu es sûr que ça marche en gérant le fait que ça soit un monde torique?

Eij_iZ_WanteD
Eij_iZ_WanteD
Niveau 10
26 février 2013 à 22:42:32

Je ne vois pas de quoi tu parles, j'ai fait un essai sous Excel (ça m'évite de dessiner des cases :pacg: ) et avec ce code :

cx = 51
cy = 51
r = 50
For k = cx - r To cx + r Step 1
p = (2 * cy + (4 * cy ^ 2 - 4 * (cy ^ 2 - r ^ 2 + (k - cx) ^ 2)) ^ (1 / 2)) / 2
For l = (2 * cy - (4 * cy ^ 2 - 4 * (cy ^ 2 - r ^ 2 + (k - cx) ^ 2)) ^ (1 / 2)) / 2 To (2 * cy + (4 * cy ^ 2 - 4 * (cy ^ 2 - r ^ 2 + (k - cx) ^ 2)) ^ (1 / 2)) / 2 Step 1
Cells(l, k).Interior.Color = RGB(255, 0, 0)
Next l
Next k
Cells(cy, cx).Interior.Color = RGB(0, 0, 0)

ça donne :

https://image.noelshack.com/fichiers/2013/09/1361914792-equacercle.jpg

Comme tu peux le remarquer en haut il manque une petite case, je pense que le problème vient du fait qu'on ne travaille pas avec le centre des cellules ou un truc dans le genre (la flemme de réfléchir :gni: ).

PS : non le problème ne vient pas du décalage d'une ligne, j'ai décalé d'une ligne et ça n'a rien changé.

Eij_iZ_WanteD
Eij_iZ_WanteD
Niveau 10
26 février 2013 à 22:43:42

Laisse tombé cette ligne :

p = (2 * cy + (4 * cy ^ 2 - 4 * (cy ^ 2 - r ^ 2 + (k - cx) ^ 2)) ^ (1 / 2)) / 2

C'est moi qui l'avait ajouté pour débuguer, j'avais fait une petite erreur et je n'ai pas supprimé ma ligne. :-)))

Sous forums
  • Histoire
  • Environnement & Nature
  • Politique
  • Cours et Devoirs
  • Philosophie
  • Métiers & Orientation
La vidéo du moment