Pixels non carrés et convolution

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous, suite à la mise au point d’un jeu j’aimerais le coder proprement et balancer Alpha Zéro dessus. Le problème c’est que les cases de ce jeu sont triangulaires (ils s’agit de tétraèdre que l’on déplace). J’aimerais donc savoir comment vous représenteriez tout ça ? Sachant que j’ai besoin faire une opération de convolution dessus (pas de problème pour la coder) et qu’il serait pratique que je puisse le faire sous forme de tenseur (numpy, PyTorch ou Tensorflow) afin d’optimiser mes calculs. Pour l’instant, à part une structure en forme d’arbre (qui ne serait alors pas optimisé pour du calcul), je n’ai pas trop d’idée.

Si vous voulez plus de détails (pour les non connaisseurs des tenseurs par exemple), hésitez pas à me poser des questions :)

Salut,

Quel est ton problème en fait ? Ton problème est de trouver une représentation du tableau de jeu ? Une numérotation 1D ne ferait pas bêtement l’affaire ? Quant à pouvoir écrire les opérations sous forme tensorielles, à partir du moment où tes opérations sont linéaires il n’y a aucune raison pour que tu ne puisses pas le faire.

Ca me paraît pas si simple de les mettre en 1 dimension. Je suis obligé de stocker quels sont les voisins de chaque "pixel" ce qui alourdi beaucoup la structure en plus de complètement empêcher les opérations tensorielles efficace. C’est d’ailleurs plus ça qui me gêne puisque sinon effectivement les stocker en 1 dimension est simple.

Sur une ligne, les triangles ressemblent à ça : AVAVAVA

Et sur la ligne suivante, on aura - - - - - - - - - - : VAVAVAV

Sur une ligne donnée, les centres de gravité des A sont plus bas que les centres de gravité des V. La ligne AVAVAVA est en fait quasiment une ligne .V.V.V. suivie d’une ligne A.A.A.A

Partant de là, on va numéroter les triangles :

  • 103 105 107 … : Les V de la 1ère ligne
  • 202 204 206 208 … : Les A de la 1ère ligne (3V et 4A dans mon pseudo dessin de la 1ère ligne tout au début)
  • 302 304 306 308 … : Les V de la 2ème ligne (chaque V de cette ligne est à la verticale d’un A de la ligne précédente, donc les chiffres des unités sont les mêmes)
  • 403 405 407 … : Les A de la 2ème ligne

Donc, si le chiffre des centaines est de la forme 4n ou 4n+1, les cases valides sont les cases impaires. Et si le chiffre des centaines est de la forme 4n+2 ou 4n+3, les cases valides sont les cases paires. Quand le chiffre des centaines est impair, c’est un V (triangle pointe en bas) et quand le chiffre des centaines est pair, c’est un A : triangle pointe en haut.

Et pour recenser les voisins d’un triangle, on teste les 6 directions -101, -100, -99, +99, +100 et +101. 3 de ces directions mènent vers des cases invalides, et les 3 autres directions mènent vers les 3 voisins.

@adri1 En fait je n’ai pas de structure, j’aimerais en trouver une. Mais elegance a bien expliqué je pense.

@elegance Ah c’est sympathique tout ça ! Juste une question, pourquoi stocker tout ça avec de si grands nombre ? Du coup je peux me faire un tableau 2D et selon la dimension que j’explore je dois faire attention au paire/impair pour V ou A. Et du coup je peux faire facilement mes opérations tensorielles. Tu gères, merci beaucoup :)

@adri1 En fait je n’ai pas de structure, j’aimerais en trouver une. Mais elegance a bien expliqué je pense.

C’était la structure du terrain elle même que tu n’avais pas détaillé, ni la définition de voisin. Et quand je vois que la solution d’elegance te convient, je me demamde encore plus quel était le problème avec une numérotation 1D…

J’ai mis des grands nombres pour 2 raisons :

  • potentiellement, tu peux avoir 40 ou 50 'colonnes’, et donc il faut ajouter 80 ou 100 à chaque ligne. Je ne connais pas la taille de ton aire de jeux.
  • pour l’aspect rédactionnel, c’était plus facile de parler de centaines et d’unités… Ca aurait été plus compliqué si la 2ème ligne commençait à 35 ou quelque chose comme ça.

J’ai donc pris 100 comme nombre 'repère’.

Si tu remplaces ce 100 par un nombre plus petit, et si tu le remplaces par le nombre le plus petit possible, méfie toi. Tu risques d’avoir des effets de bord. Tu risques de dire que le triangle le plus à droite de la ligne x a pour voisin un triangle tout à gauche de la ligne x+1.

J’explique dans le cas du damier classique 8x8. Si on numérote les cases de 1 à 64, les voisins d’une case sont les cases n-8, n-1, n+1 et n+8 … sauf que du coup, la case 8 et la case 9 sont considérées comme voisines. Ce qui est faux.

Tu risques d’avoir ce même type d’erreur. C’est un peu galère à gérer.

Dans le cas du damier 8x8 classique, une solution est de numéroter les cases de 1 à 100, et non de 1 à 64. Les cases 1 à 10, 10n, 10n+1 et 91 à 100 sont les cases 'bordures’.

Les voisins d’une case X sont les cases X-10, X-1, X+1 et X+10. A partir d’une case valide, on est sûr de tomber sur un nombre entre 1 et 100 (pas besoin de tester si le nombre obtenu est négatif ou plus grand que le plus grand nombre autorisé). Et si le nombre correspond à une case bordure, c’est que la case de départ n’avait pas 4 voisins, mais seulement 3, voire 2.

Dans le cas des triangles, tu as probablement intérêt à faire pareil : simuler une bordure de triangles autour de ton aire de jeux.

Idem, cas assez classique à partir de triangles, si ta zone est en forme d’hexagone, les lignes n’ont pas toutes le même nombre de triangles, mais pour faciliter la recherche de voisins, tu as intérêt à faire comme si toutes les lignes étaient 'complètes’.

@adri1 Du coup je comprend mieux ta question. En fait j’ai un terrain qui ressemble à ça :

VAVAVAVAVAVAVA
AVAVAVAVAVAVAV
VAVAVAVAVAVAVA
...

Mon problème avec la numérotation 1d c’est que ça me paraissait plus difficile à gérer à cause de cette histoire de nombre de voisin (il n’y a que 3 bords qui touchent).

@elegance Merci, je ne connaissais pas cette astuce de numérotation des cases.

Merci beaucoup à vous deux :)

Si tu le même nombre de triangles sur chaque ligne, tu peux faire une numérotation 2D sans problème. Le fait que le troisième voisin soit au dessus ou en dessous de ton triangle va juste dépendre de la parité de la somme des deux indices de ton triangle, pas besoin de se taper une numérotation discontinue.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte