06-04-2011, 01:53 PM
07-04-2011, 03:39 AM
J'ai trouvé mon erreur, pour ceux que ça intéresse :
Par contre, pour le positionnement de la carte j'ai toujours un petit problème : En 0/0/0 tout va bien (quoique la carte n'est pas centré dans le cadre rouge).. Mais dès que je me déplace, la carte se déplace aussi. Ma classe .tile est en position: absolute; et #carte en position: relative; Est ce que je dois calculer le left/top de #carte en fonction de la position du joueur, pour qu'elle s'affiche tout le temps au même endroit ?
07-04-2011, 08:01 AM
posX et posY dépendent de la position du joueur
le centre de ta carte est toujours la position du joueur du coup il faut que tu définisses une position (en pixel) pour la position du joueur. Imaginons $posX0 = 200; $posY0 = 200; et tu rends l'ensemble relatif à la position du joueur : là où tu avais Code : $posX = $y *($hh*(3/4)); tu dois avoir Code : $posX = $posX0 + ($y-$joueurY) *($hh*(3/4)); pas testé mais ça devrait marché
Bonjour, voilà j'ai lu attentivement toute la discution, par contre pour ma part je chercher plutôt le raisonnement qui permette d'arriver au résultat de l'exemple.
A la différence ToraTora, j'aimerai que le résultat ne s'affiche pas en descendant mais qu'il reste bien compacte et droit comme l'exemple. Je n'arrive pas à concevoir le principe pour orienter les axe X/Y. Merci du coup de main. Bon je ne pense pas recevoir de réponse vu l'ancienneté de la conversation x) Mais de toute manière j'ai finalement réussi à optenir le résultat souhaité en manipulant un peu au petit bonheur la chance les formule d'affichage
Salut,
ne levez pas vos boucliers de feu, mais je trouve la méthode assez mauvaise, car on utilise 3 coordonnés pour désigner un point d'un plan qui est en 2D. Il y a donc une coordonnée de trop. De fait, chaque hexagone possède, en pratique, une infinité de coordonnées, ce qui risque de poser de gros soucis pour savoir si deux coordonnées sont égales. Pour ma part, les cartes gagneraient à se présenter sous la forme d'un graphe, dont les noeuds sont les cases et dont les liens représentent les voisinages entre les cases, chaque case étant définie par une forme de base (carré, hexagone, pentagone, etc), une taille (qui peut ne pas être la même selon X et Y), à la limite, un angle de rotation, et par 2 coordonnées qui donnent la position du centre de la case. Dans le cas d'une carte hexagonale, le maillage serait alors similaire à ceci: [image supprimée depuis] Le repère est donc orthogonal, mais ici non orthonormal (la distance entre x,y et x+1,y est différente de celle entre x,y et x,y+1). Chaque case est repérée par deux coordonnées X,Y entières. On se trouve à coup sûr au centre d'un hexagone si la parité de x est égale à celle de y, sinon, on est exactement entre deux hexagones (0,0 est un hexagone, 2,0 aussi, 0,2 aussi, mais 2,1 tombe sur une ligne entre deux hexagones). Le repère étant orthogonal, le calcul de distance est assez aisé (il ne faut pas oublier le facteur d'échelle du à l'étirement selon X ou Y c'est à dire dû au fait que la distance le long de X n'est pas la même que celle le long de Y). Le tracé de ligne est également aisé, puisqu'on a un repère orthogonal 2D classique. Le seul défaut est vraiment la non-orthonormalité, qui transformerait par exemple le cercle de centre 0,0 et de rayon 4 en un ovale lorsqu'on l'affiche... Le repère pourrait être orthonormalisé, puisque la distance entre deux segments vert (sur l'image) est 2*r alors qu'entre deux segments bleus, il y a 3/2*r, avec r le rayon de l'hexagone. Au lieu de -1, 0, 1, ... pour les axes verts, il faudrait alors utiliser les coordonnées -2, 0, 2... (autrement dit, l'axe est de longueur égale à r) et pour les axes bleus, 0, 3, 6, 9... (la longueur de l'axe est alors aussi r), et on a un repère orthonormé usuel. Je ferai une étude plus claire et plus pratique qu'un simple post de forum sur ce type de maps (car le problème va se poser sur ECLERD). Je le laisserai sur la tasklist reinom ( https://reinom.com/tasks ), il sera consultable librement (dans les rapports des tâches réalisés).
20-11-2012, 10:26 PM
(Modification du message : 21-11-2012, 02:11 PM par Thêta Tau Tau.)
Je pige pas pourquoi vous vous emmerdez, deux axes formant un angle de 120° ou 60°, c'est pas sorcier.
Soit i la distance en pixels entre les centres de deux hexagones qui se touchent. Conversion dans un repère orthonormal (l'écran du client) : x' = i*3^0.5/2*x y' = i*(y - x/2) Distance On converti dans le repère orthonormal, puis Pythagore, on développe et : d = i * ( x² + y² - x*y)^0.5 (c'est la distance à vol d'oiseau, pour la distance case par case cf. le post de Roworll). Bonus : On peut représenter les coordonnées dans une matrice (à droite dans mon image), les traits rouges tracés à l'arrache montrent les déplacements possible. Du coup on peut stocker la carte dans une image. PS : j'ai calculé les formules à l'arrache, pas sur que ce soit juste, mais ça a l'air de marcher. Je viens de piger ce que tu comprends pas Xenos : (20-11-2012, 06:21 PM)Xenos a écrit : je trouve la méthode assez mauvaise, car on utilise 3 coordonnés pour désigner un point d'un plan qui est en 2D. Il y a donc une coordonnée de trop. De fait, chaque hexagone possède, en pratique, une infinité de coordonnées, ce qui risque de poser de gros soucis pour savoir si deux coordonnées sont égales. En fait on utilise pas un repère à trois coordonnées mais 3 repères à 2 coordonnées ( x,y y,z et x,z) et on utilise celui qui est le plus pratique selon les situations. Du coup il n'y a bien qu'une coordonnée possible. Mais perso je préfère pas utiliser l'axe Z, sauf pour le calcul de distance "case par case" où il est indispensable. Le reste du temps il ne sert qu'à simplifier les formules.
20-11-2012, 11:37 PM
Dans ton image, sur le plan hexagonal, (0,0) et (2,1) sont à la même hauteur.
Sur la vue "matricielle" classique, 0,0 et 2,1 ne sont plus sur la même ligne... Ok, 3 repères 2D, soit, mais le "et on utilise celui qui est le plus pratique selon les situations", c'est là (je pense) où l'ordinateur va être assez problématique car ce genre de "selon les situations", il aime pas trop... Ou du moins, le code s'alourdit de beaucoup. Enfin, c'est peut-être juste pas ma vision, c'est pour cela que j'vois mal comment on s'en sort avec ca. Après, si vous vous en sortez avec ca, tant mieux
20-11-2012, 11:47 PM
(20-11-2012, 11:37 PM)Xenos a écrit : Sur la vue "matricielle" classique, 0,0 et 2,1 ne sont plus sur la même ligne... Ben oui vu que les axes ne sont pas orthogonaux. Mais on s'en tape, la matrice c'est pour représenter simplement les données. Une matrice carrée représente un losange "visuellement". Si tu stocke une carte dans une image. Si la carte est rectangulaire, elle apparaitra déformée sous la forme d'un parallélépipède sur l'image. Mais quand elle sera affichée elle sera bien rectangulaire.
Merci pour vos réponses.. mais ce que moi je cherchais c'était comment modifier les formules données au début de la conversation pour orienter les axes X/Y selon le modèle... ce que j'ai finalement réussi soit dit en passant
merci quand même
14-04-2016, 10:47 AM
(15-10-2010, 04:49 PM)niahoo a écrit : Hello, merci pour ça c'est très interessant ! Attention gros déterrage. En fait c'est simplement la somme des coordonnées qui fait 0, pas leur soustraction. |
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
A la recherche des bonnes formules pour positionner des hexagones | Sephi-Chan | 12 | 3 624 |
27-02-2020, 09:56 PM Dernier message: Ter Rowan |
|
[Résolu][SVG] Dessiner des motifs pour une carte d'hexagones | Sephi-Chan | 43 | 25 252 |
15-12-2011, 04:25 PM Dernier message: Myrina |
|
[Réglé]Distance entre 2 hexagones | Scha | 31 | 13 249 |
29-07-2007, 09:34 PM Dernier message: denisc |
|
truc surement tout bete mais lourd | max | 12 | 4 638 |
25-01-2007, 08:27 PM Dernier message: NicoMSEvent |
|
truc surement tout bete | max | 7 | 3 250 |
17-09-2006, 09:50 PM Dernier message: max |