Titres Titres
Comment le contrat de 21MMpixels détermine immuablement la position d’une tuile
L’une des caractéristiques du contrat 21MMpixels est que la position de chaque tuile peut être déterminée avec une fonction de vue de contrat, tuileDescriptionTableauou son homologue plus convivial, tuileDescription. Contrairement à la plupart des projets NFT avec des fichiers de métadonnées hébergés, il n’y a aucun moyen de modifier la position d’une tuile dans l’image de 21 millions de pixels, elle est vraiment immuable.
La solution simple à ce problème aurait été que la tuile 1 soit dans le coin supérieur gauche, les numéros de tuiles augmentant séquentiellement par ligne ou colonne. Cette solution semblait trop facile, et pas dans l’esprit de récompenser les premiers acheteurs de dalles de 21 millions de pixels. Nous avons décidé que les tuiles seraient émises dans une séquence diagonale, de sorte que les tuiles les plus à gauche (x-coord = 0) seraient 1, 2, 4, 7, 11…, et les tuiles du haut (y-coord = 0) seraient être 1, 3, 6, 10, 15…

Ce deuxième ensemble de nombres peut être familier à certains, car ils représentent des nombres triangulaires, un décompte du nombre d’objets dans un triangle équilatéral. Malheureusement, avec une image rectangulaire constituée d’une grille de 70 x 120 tuiles, cette séquence n’est valable que pour les 2485 premières tuiles (le 70e nombre triangulaire de la séquence), auquel cas les tuiles supérieures avec une coordonnée y de 0 augmentent en incréments de 70 jusqu’à ce que nous arrivions à un autre ensemble de tuiles avec des propriétés de nombre triangulaire.
À moins que vous ne dessiniez une grille de 70 x 120 tuiles pendant que vous lisez, cela est probablement quelque peu déroutant. J’ai l’impression que le code réel rend cela plus facile à comprendre, donc je vais le couvrir dans les trois segments décrits ci-dessus (plus le cas particulier de Tile 1).
Tuile 1
C’est un cas particulier dans notre logique, situé en X : 0, Y : 0, ligne égal à 0 et colonne est égal à 0.
Tuiles 2–2485
Pour ces tuiles, nous utilisons une boucle while pour trouver un nombre supérieur au numéro de tuile moins 1 (ID temp). Cette boucle modifie deux variables, Indiana et plus grostous deux initialisés à 0. A chaque boucle on incrémente d’abord Indiana par un, puis calculez plus gros comme Indiana plus plus gros (nous calculons les nombres triangulaires moins le numéro de ligne plus un). Nous continuons à boucler pendant que plus gros est inférieur à ID temp.

A ce stade, si plus gros est égal à ID temp nous savons que le ligne est égal à Indiana, et colonne est zéro. Autrement, ligne équivaut à plus gros moins ID temp moins 1, et colonne équivaut à ID temp plus Indiana moins plus gros.
Tuiles 2486–5985
C’est la partie facile, l’artihmétique simple. Nous utilisons la façon dont Solidity fait des calculs entiers pour calculer Indiana comme le (numéro de tuile moins 1 moins 2485) / 70. Dans d’autres langages de programmation, cela équivaudrait à un calcul plancher ou arrondi. On calcule alors plus gros comme 2485 plus Indiana * 70. Si plus gros est égal au numéro de tuile moins 1, ligne a 69 ans, et colonne est égal à Indiana plus 1. Sinon, la colonne est égale au numéro de tuile moins plus gros plus Indianaet ligne égale plus gros plus 69 moins le numéro de tuile moins un.

Tuiles 5486–8400
Nous sommes de retour aux nombres triangulaires. On utilise à nouveau les variables Indiana et plus gros, avec une valeur initiale de 0 et 5985 initialement. Avec notre boucle, nous incrémentons à nouveau Indianapuis calculez plus grand comme plus gros plus (70 — Indiana) tandis que plus gros est inférieur au numéro de tuile moins 1 (ID temp).

Si plus gros est égal à ID tempcolonne égale Indiana plus 51, et ligne est égal à 69. Sinon, la colonne est égale à 120 plus ID temp moins plus groset ligne équivaut à plus gros plus Indiana moins ID temp moins 1.
Tuiles 10 001 à 18 396 (si elles existent)
Nous soustrayons 10 000 du numéro de tuile et utilisons les calculs ci-dessus. Vous remarquerez que les numéros de tuiles 18 397 à 18 400 ne peuvent pas exister, ce que nous couvrirons lorsque nous détaillerons les fonctions de recherche de tuiles adjacentes et de fusion de tuiles.
Tuiles 20 001 à 28 376 (si elles existent)
Nous soustrayons 20 000 du numéro de tuile et utilisons les fonctions pour déterminer la position des tuiles 1 à 8 400. Comme les tuiles 18 397 à 18 400, les numéros de tuile 28 377 et plus ne peuvent pas exister.
Détermination des coordonnées et des dimensions
Pour déterminer les coordonnées (x, y) de la tuile, nous multiplions les lignes et les colonnes par 50. Les tuiles numéros 1 à 8 400 ont des dimensions de 50 x 50 pixels, les tuiles numéros 10 001 à 18 396 ont des dimensions de 100 x 100 pixels et les tuiles les nombres supérieurs à 20 000 ont des dimensions de 200 x 200 pixels.
Remarques finales
Comme vous l’avez probablement remarqué, les boucles dans le tuileDescriptionTableau fonction ne sont pas optimales pour le gaz. Comme ceci n’est utilisé que comme fonction d’affichage, nous avons choisi de garder la logique plus simple dans cette fonction. le _adjacentTiles fonction dans le contrat 21MMpixels est utilisée à la fois dans une fonction de vue, ainsi que dans le mergeTiles et unmergeTiles les fonctions. Bien que la logique pour trouver des tuiles adjacentes soit similaire à la détermination de la position des tuiles, nous avons apporté certaines modifications afin à la fois de minimiser la consommation de gaz et de rendre l’utilisation du gaz plus cohérente sur toute la gamme de numéros de tuiles. Nous couvrirons le _adjacentTiles détermination dans notre prochain article.
Rejoignez Coinmonks Telegram Channel et Youtube Channel pour en savoir plus sur le trading et l’investissement cryptographiques