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

Rayon 2D proie predateur en Java

Rikkel
Rikkel
Niveau 9
25 février 2013 à 17:40:04

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 !

Pseudo supprimé
Pseudo supprimé 25 février 2013 à 18:09:10

Ben calcule la distance de manhattan entre chaque case et celle de ton prédateur, si elle est inférieur ou égale à r c'est qu'elle est dans le champ de vision.

Très simple à calculer : http://fr.wikipedia.org/wiki/Distance_de_Manhattan

Rikkel
Rikkel
Niveau 9
25 février 2013 à 18:32:05

Merci pour l'astuce ! Sauf que les distances sont faussées par le fait que ça soit un monde torique non? Car du coup le calcul de la distance avec les coordonnées prendra le plus court chemin qui passe par le milieu du quadrillage et non en sortant de la grille...

Rikkel
Rikkel
Niveau 9
25 février 2013 à 18:38:48

Par torique j'entends le fait que le champ de vision sera comme cela en bout de carte :
https://image.noelshack.com/fichiers/2013/09/1361813888-rayon-visibilite.jpg

Pseudo supprimé
Pseudo supprimé 25 février 2013 à 18:40:12

Le modulo ne conserve pas ses propriétés sur les calculs ?

Rikkel
Rikkel
Niveau 9
25 février 2013 à 18:46:10

Je sais pas trop, ça permet de sélectionner la bonne case en ayant le bon indice mais du coup la distance change... non?

Pseudo supprimé
Pseudo supprimé 25 février 2013 à 18:55:09

Tu peux faire les calculs directement avec k et l, qui d'après le petit bout de code de ta boucle, et ensuite une fois que tu as déterminé si la case est sélectionnée (ou pas) tu peux calculer les vraies coordonnées de la case.

Du genre :
for ( k = x - r ; k <= x + r ; k++ )
for ( l = y - r ; l <= y + r ; l ++)
if(isVisible(predX, predY, k, l))
colorier((k + dx) % dx, (l + dy) % dy)

Pseudo supprimé
Pseudo supprimé 25 février 2013 à 18:57:16

J'ai sauté un bout de ma phrase. :noel:

Après "qui d'après le petit bout de code de ta boucle", " sont relatifs à la position du prédateur".

Rikkel
Rikkel
Niveau 9
25 février 2013 à 19:17:11

D'accord ! Je te remercie de ton aide :)

Pseudo supprimé
Pseudo supprimé 25 février 2013 à 20:10:18

Tu peux aussi boucler directement en losange au lieu de boucler en carré, et du coup tu peux te passer du test.

Pseudo supprimé
Pseudo supprimé 25 février 2013 à 20:29:37

Tu pourrais également construire une liste des offsets d'indices à tester pour un rayon r que tu réutiliserais à chaque fois. Tu ne ferais le calcul qu'une seule fois pour un rayon, tu n'aurais que la liste (à moduler) à parcourir pour tester l'intégralité des cases de la vision d'un prédateur.

Rikkel
Rikkel
Niveau 9
25 février 2013 à 20:38:20

Pour boucler en losange c'est justement ce que j'essaie de faire, c'est pas aussi intuitif que de boucler en carré dans un tableau à deux dimension.

Pour ta réponse Rasperry, je cherche à construire cette liste mais je ne vois pas trop comment faire pour n'importe quel rayon :/

Pseudo supprimé
Pseudo supprimé 25 février 2013 à 20:52:06

Pour boucler en losange, boucle sur x de -r à r (compris)
puis sur y de -(r - abs(x)) à (r - abs(x)) (compris)

Tiens j'ai fait en JS ce que propose Rasp, juste pour r = 4 :
http://jsbin.com/olaxag/1/edit

Rikkel
Rikkel
Niveau 9
25 février 2013 à 21:36:04

Merci Awesome ça m'a l'air la méthode la plus évidente :-)

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment