Création de cartes avec des hexagones

Où l'on discute de la conception de cartes du monde, de villes, de donjons et autres.
Avatar de l’utilisateur
Troumad
Dracoliche
Messages : 14766
Inscription : Dim 1 Avr 2012 15:38
Localisation : Genas (F-69)
Version de D&D préférée : AD&D2
Univers de D&D préféré : ?
Race : Humain
Classe : Rôdeur
Alignement : Chaotique Bon
Dieu : ?
Mini Feuille de perso : Terres de Leyt - Eterny :
► Afficher le texte
Les Pierres du Destin :
► Afficher le texte
Mystarillia :
► Afficher le texte

Création de cartes avec des hexagones

Message 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")
Dernière édition par Troumad le Lun 1 Déc 2025 15:24, édité 2 fois.
Création de feuilles de perso ADD, ADD2
[Dragonlance] Crépuscule d'automne : RiveBise
Terres de Leyt - Eterny Bondix
La pierre du Mal Alenthir, Aventures Orientales Chûzaemon, Héros d'un âge viking Björnulf Runison, le Sanctuaire de l'angoisse Feydarick, Terreur dans la Jungle Vanille, La dernière chance Go Gogne, Les mystères du Nyrond Lode, Mystarillia Vitavix
Avatar de l’utilisateur
squilnozor
Dracoliche
Messages : 7666
Inscription : Dim 1 Avr 2012 15:30
Localisation : Rueil-Malmaison
Version de D&D préférée : D&D
Univers de D&D préféré : Mystara
Race : ?
Classe : ?
Alignement : ?
Dieu :

Re: Création de cartes avec des hexagones

Message 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.
traductions en ligne : boîte Master, Glantri, Age of Worms 1 à 8, etc.
En relecture / illustration / MEP : AoW 9 & 10
En cours de trad : WotI, AoW 11
ABEANT FURES MURES LEMURES
Avatar de l’utilisateur
Troumad
Dracoliche
Messages : 14766
Inscription : Dim 1 Avr 2012 15:38
Localisation : Genas (F-69)
Version de D&D préférée : AD&D2
Univers de D&D préféré : ?
Race : Humain
Classe : Rôdeur
Alignement : Chaotique Bon
Dieu : ?
Mini Feuille de perso : Terres de Leyt - Eterny :
► Afficher le texte
Les Pierres du Destin :
► Afficher le texte
Mystarillia :
► Afficher le texte

Re: Création de cartes avec des hexagones

Message 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).
Création de feuilles de perso ADD, ADD2
[Dragonlance] Crépuscule d'automne : RiveBise
Terres de Leyt - Eterny Bondix
La pierre du Mal Alenthir, Aventures Orientales Chûzaemon, Héros d'un âge viking Björnulf Runison, le Sanctuaire de l'angoisse Feydarick, Terreur dans la Jungle Vanille, La dernière chance Go Gogne, Les mystères du Nyrond Lode, Mystarillia Vitavix
Avatar de l’utilisateur
Zedafty
Dracoliche
Messages : 2831
Inscription : Mar 29 Sep 2020 15:31
Localisation : Berdusk
Version de D&D préférée : AD&D2.5
Univers de D&D préféré : Royaumes Oubliés
Race : Petites-gens
Classe : Clerc
Alignement : Neutre Bon
Dieu : Cyrrollalee

Re: Création de cartes avec des hexagones

Message 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 :)
« Les Dieux ne jouent pas aux dés. » Elminster
Avatar de l’utilisateur
Troumad
Dracoliche
Messages : 14766
Inscription : Dim 1 Avr 2012 15:38
Localisation : Genas (F-69)
Version de D&D préférée : AD&D2
Univers de D&D préféré : ?
Race : Humain
Classe : Rôdeur
Alignement : Chaotique Bon
Dieu : ?
Mini Feuille de perso : Terres de Leyt - Eterny :
► Afficher le texte
Les Pierres du Destin :
► Afficher le texte
Mystarillia :
► Afficher le texte

Re: Création de cartes avec des hexagones

Message 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.
Création de feuilles de perso ADD, ADD2
[Dragonlance] Crépuscule d'automne : RiveBise
Terres de Leyt - Eterny Bondix
La pierre du Mal Alenthir, Aventures Orientales Chûzaemon, Héros d'un âge viking Björnulf Runison, le Sanctuaire de l'angoisse Feydarick, Terreur dans la Jungle Vanille, La dernière chance Go Gogne, Les mystères du Nyrond Lode, Mystarillia Vitavix
Avatar de l’utilisateur
Wizzer
Dracoliche
Messages : 464
Inscription : Mar 3 Jan 2023 14:08
Localisation : Genève
Version de D&D préférée : AD&D2
Univers de D&D préféré : Planescape
Race : ?
Classe : ?
Alignement : ?
Dieu : ?

Re: Création de cartes avec des hexagones

Message 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.
Avatar de l’utilisateur
Troumad
Dracoliche
Messages : 14766
Inscription : Dim 1 Avr 2012 15:38
Localisation : Genas (F-69)
Version de D&D préférée : AD&D2
Univers de D&D préféré : ?
Race : Humain
Classe : Rôdeur
Alignement : Chaotique Bon
Dieu : ?
Mini Feuille de perso : Terres de Leyt - Eterny :
► Afficher le texte
Les Pierres du Destin :
► Afficher le texte
Mystarillia :
► Afficher le texte

Re: Création de cartes avec des hexagones

Message 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()
Création de feuilles de perso ADD, ADD2
[Dragonlance] Crépuscule d'automne : RiveBise
Terres de Leyt - Eterny Bondix
La pierre du Mal Alenthir, Aventures Orientales Chûzaemon, Héros d'un âge viking Björnulf Runison, le Sanctuaire de l'angoisse Feydarick, Terreur dans la Jungle Vanille, La dernière chance Go Gogne, Les mystères du Nyrond Lode, Mystarillia Vitavix
Avatar de l’utilisateur
ZikDragon
Dragon d'argent
Messages : 66
Inscription : Lun 16 Sep 2024 08:19
Localisation :
Version de D&D préférée : ?
Univers de D&D préféré : ?
Race : ?
Classe : ?
Alignement : ?
Dieu :

Re: Création de cartes avec des hexagones

Message 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 :)
:wizard: Si ça sent le vieux, c'est pas nous, c'est les bouquins de D&D :wizard:
Avatar de l’utilisateur
Troumad
Dracoliche
Messages : 14766
Inscription : Dim 1 Avr 2012 15:38
Localisation : Genas (F-69)
Version de D&D préférée : AD&D2
Univers de D&D préféré : ?
Race : Humain
Classe : Rôdeur
Alignement : Chaotique Bon
Dieu : ?
Mini Feuille de perso : Terres de Leyt - Eterny :
► Afficher le texte
Les Pierres du Destin :
► Afficher le texte
Mystarillia :
► Afficher le texte

Re: Création de cartes avec des hexagones

Message 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
Création de feuilles de perso ADD, ADD2
[Dragonlance] Crépuscule d'automne : RiveBise
Terres de Leyt - Eterny Bondix
La pierre du Mal Alenthir, Aventures Orientales Chûzaemon, Héros d'un âge viking Björnulf Runison, le Sanctuaire de l'angoisse Feydarick, Terreur dans la Jungle Vanille, La dernière chance Go Gogne, Les mystères du Nyrond Lode, Mystarillia Vitavix
Avatar de l’utilisateur
GAYAL
Dracoliche
Messages : 583
Inscription : Dim 18 Sep 2022 16:19
Localisation : MAUREPAS (78)
Version de D&D préférée : AD&D1
Univers de D&D préféré : Greyhawk
Race : Gnome
Classe : Clerc
Alignement : Chaotique Neutre
Dieu : ?

Re: Création de cartes avec des hexagones

Message par GAYAL »

J'y connais rien à rien à vos codes reptiliens mais je trouve que le résultat est bien :D
Image
Répondre

Revenir vers « Cartographie »