• Création de cartes avec des hexagones
Page 1 sur 6

Création de cartes avec des hexagones

Publié : Lun 3 Juin 2024 20:11
par Troumad
Bonjour

dernière version ici

Ce code python, à améliorer, génère un quadrillage hexagonal avec numérotation des cases : le fichier test.png
En modifiant le code, on peut choisir la longueur du côté de l'hexagone, le nombre d'hexagones en hauteur ou en largeur, la police, la couleur des traits...

Avec un peu d'expérience (que je n'ai pas avec python), on peut générer toutes ces modifications à travers d'une interface graphique.

nb : il faut le fichier arial.ttf dans le même répertoire pour que ça marche, à moins de mettre le lien vers le fichier aria.pdf de votre système.

Code : Tout sélectionner

import math
from PIL import ImageFont, Image, ImageDraw

def ligne(x,y,image,i,j) :
        image.line((math.floor(x[0]+3*L*i),math.floor(x[1]+math.sqrt(3)*L*j),math.floor(y[0]+3*L*i),math.floor(y[1]+math.sqrt(3)*L*j)), fill=(100,100,100,255), width=2)

def texte(pt,image,x,y) :
    coordonnees=zero+f'{y}' # si on dépasse 9999, il faudra mettre 3
    coordonnees=chr(ord('A')+x%26)+"-"+coordonnees[dec::]
    xx=x//26
    while (xx>0) :
        coordonnees=chr(ord('A')+xx%26-1)+coordonnees
        xx=xx//26
    image.text((math.floor(pt[0]+3*L*math.floor(x/2))+1,math.floor(pt[1]+math.sqrt(3)*L*y)+1), coordonnees, fill=(0,0,0,255),font=font)
    

L=60 # longueur d'un côté de l'hexagone
# calcul des 7 points du motif qu'on va dupliquer
A=(L/2,math.sqrt(3)*L)
B=(0,math.sqrt(3)*L/2)
C=(L/2,0)
D=(3*L/2,0)
E=(2*L,math.sqrt(3)*L/2)
F=(3*L/2,math.sqrt(3)*L)
G=(3*L,math.sqrt(3)*L/2)

# hauteur et largeur en hexxagone de la carte
w = 3
h = 11

w=-((-w)//2) # division entière avecarrondi au supérieur => double signe -
# création d'un nouvel objet image
img = Image.new("RGBA", (math.floor(w*L*3), math.floor(h*math.sqrt(3)*L)),(255,255,255,0))
# RGBA : dernier à 0 pour transparent, à 255 pour visible
font = ImageFont.truetype("arial.ttf", 11)

# pour savoir quel décalage il faut faire pour avoir toujours le même nombre de chiffre, mzi le moins possible
dec=-1
xx=h-1
zero=""
while xx>9 :
    dec=dec-1
    zero=zero+"0" # pas de limite à la taille...
    xx=xx//10

img1 = ImageDraw.Draw(img)
for i in range(0, w):
    for j in range(0,h):
        ligne(A,B,img1,i,j)
        ligne(B,C,img1,i,j)
        ligne(D,C,img1,i,j)
        ligne(D,E,img1,i,j)
        ligne(E,F,img1,i,j)
        ligne(E,G,img1,i,j)
        texte(C,img1,2*i,j)
        texte(E,img1,2*i+1,j)

img.show()
img.save("test.png", "png")

Re: Création de cartes avec des hexagones

Publié : Lun 3 Juin 2024 20:24
par squilnozor
Merci mon Troumad.

Je le répète à chaque fois, même si c'est un peu anachronique, mais si on a juste un crayon, on peut aussi tracer un « mur de briques » qui est parfaitement équivalent aux hexagones.

Re: Création de cartes avec des hexagones

Publié : Lun 3 Juin 2024 20:37
par Troumad
Oui, mais, va faire ça en 3 secondes (maintenant que j'ai passé quelques temps à programmer, ça va vite !) :

https://troumad.org/OOo/hexa100x100.png

(le fond est transparent, pas évident à voir avec certains logiciels).

Re: Création de cartes avec des hexagones

Publié : Lun 3 Juin 2024 20:46
par Zedafty
Oh ! C'est pratique ça ! Les grilles hexagonales sont assez pénibles à réaliser en se servant juste d'un logiciel de retouche d'images :)

Re: Création de cartes avec des hexagones

Publié : Lun 3 Juin 2024 21:49
par Troumad
Soit tu maîtrises le python, soit tu me donnes ton cahier des charges et je peux essayer de faire ce que tu veux.

Re: Création de cartes avec des hexagones

Publié : Mar 4 Juin 2024 09:13
par Wizzer
Merci Troumad pour ce petit programme.
Il faut que je me trouve une carte pour l'essayer...

À l'époque j'avais des feuilles transparentes avec des hexagones dessus à poser sur une carte. De mémoire, il y en avait de deux tailles différentes. Elles venaient d'une boîte TSR de l'époque mais j'ai oublié laquelle.

Re: Création de cartes avec des hexagones

Publié : Lun 5 Août 2024 18:13
par Troumad
Petite amélioration du code :

Code : Tout sélectionner

import math
from PIL import ImageFont, Image, ImageDraw

def ligne(x,y,image,i,j) :
        image.line((math.floor(x[0]+3*L*i),math.floor(x[1]+math.sqrt(3)*L*j),math.floor(y[0]+3*L*i),math.floor(y[1]+math.sqrt(3)*L*j)), fill=(192,192,192,255), width=3)
# couleur GM 192

def texte(pt,image,x,y) :
    coordonnees=zero+f'{y}'
    coordonnees=chr(ord('A')+x%26)+","+coordonnees[dec::] # dec<0 => on ne garde que |dec| terme à droite
    xx=x//26 # il ne faut pas toucher à x => il sert à écrire le texte au bon emplacement
    while (xx>0) :
        coordonnees=chr(ord('A')+xx%26-1)+coordonnees
        xx=xx//26 # division entière
    image.text((math.floor(pt[0]+3*L*math.floor(x/2))+2,math.floor(pt[1]+math.sqrt(3)*L*y)+2), coordonnees, fill=(159,159,159,255),font=font)
# couleur GM 159   

L=input("Longueur du côté de l'hexagone (défaut : 56) :")
try :
    L=int(L)
except ValueError:
    L=56
#L=56 # longueur d'un côté de l'hexagone : GM 56

print("L=",L)

# calcul des 7 points du motif qu'on va dupliquer
A=(L/2,math.sqrt(3)*L)
B=(0,math.sqrt(3)*L/2)
C=(L/2,0)
D=(3*L/2,0)
E=(2*L,math.sqrt(3)*L/2)
F=(3*L/2,math.sqrt(3)*L)
G=(3*L,math.sqrt(3)*L/2)

# hauteur et largeur en hexagone de la carte
w=input("nombre d'hexagones dans la largeur : ")
try :
    w=int(w)
except ValueError:
    w=0
while w<=0 :
    w=input("Erreur d'entrée. Donnez le nombre d'hexagones dans la largeur : ")
    try :
        w=int(w)
    except ValueError:
        w=0

h=input("nombre d'hexagones dans la hauteur : ")
try :
    h=int(h)
except ValueError:
    h=0
while h<=0 :
    h=input("Erreur d'entrée. Donnez le nombre d'hexagones dans la hauteur : ")
    try :
        h=int(h)
    except ValueError:
        h=0

print("dimension de la carte ",w,"hexagones x ",h,"hexagones")

w=-((-w)//2) # division entière avec arrondi au supérieur => double signe -
# création d'un nouvel objet image
img = Image.new("RGBA", (math.floor(w*L*3), math.floor(h*math.sqrt(3)*L)),(255,255,255,0))
# RGBA : dernier à 0 pour transparent, à 255 pour visible
font = ImageFont.truetype("arial.ttf", max(L//5,11))

# pour savoir quel décalage il faut faire pour avoir toujours le même nombre de chiffres, mais le moins possible
dec=-1
xx=h-1
zero=""
while xx>9 :
    dec=dec-1
    zero=zero+"0" # pas de limite à la hauteur...
    xx=xx//10

coord=input("Avec (1) ou sans (0) coordonnées (0 ou 1) : ")
try :
    coord=int(coord)
except ValueError:
    coord=-1
while coord<0 or coord>1 :
    coord=input("Erreur d'entrée. Avec (1) ou sans (0) coordonnées (0 ou 1) :")
    try :
        coord=int(coord)
    except ValueError:
        coord=-1


img1 = ImageDraw.Draw(img)
# duplication du motifs
for i in range(0, w): # ligne
    for j in range(0,h): # colonne
        ligne(A,B,img1,i,j)
        ligne(B,C,img1,i,j)
        ligne(D,C,img1,i,j)
        ligne(D,E,img1,i,j)
        ligne(E,F,img1,i,j)
        ligne(E,G,img1,i,j)
        if coord == 1 :
            texte(C,img1,2*i,j)
            texte(E,img1,2*i+1,j)

nom=input("nom du fichier (sans l'extention \".png\" : ")
img.save(nom+".png", "png")

voir=input("Voulez-vous voir l'image ? (o/n) : ")
if voir=="o" or voir=="O" :
    img.show()

Re: Création de cartes avec des hexagones

Publié : Mer 18 Sep 2024 10:24
par ZikDragon
Merci pour ce partage Troumad , plus qu'à acheter un bloc de feuilles transparentes imprimer tout ça en plusieurs tailles et plus aucune contrées ne sera plus non-hexagonée :)

Re: Création de cartes avec des hexagones

Publié : Mar 11 Fév 2025 21:34
par Troumad
J'ai un peu rajouté des options. On peut par exemple, mettre des coordonnées autour de la grille :
grille.zip
(2.38 Kio) Téléchargé 79 fois
Ça peut donner cette carte :
coord_bord.gif

Re: Création de cartes avec des hexagones

Publié : Mer 12 Fév 2025 00:31
par GAYAL
J'y connais rien à rien à vos codes reptiliens mais je trouve que le résultat est bien :D