Création de cartes avec des hexagones
Publié : Lun 3 Juin 2024 20:11
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.
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")