Pagina Principale
Poliesagoni

L'esagono regolare è il terzo e ultimo poligono regolare che può tassellare il piano, rendendolo un altro candidato naturale per la generalizzazione dei polimini. Poiché l'esagono regolare è scomponibile in sei triangoli equilateri, ogni forma che otteniamo con questa base si può ottenere anche con triangoli equilateri come base, ovvero i poliesagoni sono un sottinsieme dei poliamanti.
L'interesse per i poliesagoni riguarda anche la loro connessione con strutture naturali (alveari) e chimiche (idrocarburi aromatici come il benzene, la cui struttura si basa su anelli esagonali).

def plot_Poliesagono(S): fig, ax = plt.subplots() ax.set_aspect('equal') for (x, y) in S: if y % 2 == 0: x0 = x * np.sqrt(3) y0 = y + y//2 vertices = [ (x0 + np.sqrt(3) / 2, y0 + 1/ 2), (x0, y0 + 1), (x0 - np.sqrt(3) / 2, y0 + 1/ 2), (x0 - np.sqrt(3) / 2, y0 - 1/ 2), (x0, y0 -1), (x0 + np.sqrt(3) / 2, y0 - 1/ 2)] else: x0 = (x-1/2) * np.sqrt(3) y0 = y + y//2 +1/2 vertices = [ (x0 + np.sqrt(3) / 2, y0 + 1/ 2), (x0, y0 + 1), (x0 - np.sqrt(3) / 2, y0 + 1/ 2), (x0 - np.sqrt(3) / 2, y0 - 1/ 2), (x0, y0 -1), (x0 + np.sqrt(3) / 2, y0 - 1/ 2)] triangle = patches.Polygon(vertices, closed=True, facecolor='lightblue',edgecolor='black', linewidth=1) ax.add_patch(triangle) ax.text(x0,y0, f"{x},{y}",horizontalalignment='center') ax.axis('off') ax.set_xlim((min(x for x,_ in S)-1)* np.sqrt(3), max(x for x,_ in S)* np.sqrt(3)+1) ax.set_ylim(min(y+y//2 for _,y in S)-2, max(y+y//2 for _,y in S)+2) # Impostazione tick interi per entrambi gli assi ax.set_xticks(range(min(x for x,_ in S)-1, max(x for x,_y in S)+1)) ax.set_yticks(range(min(y for _,y in S)-1, max(y for _,y in S)+1)) #ax.grid(True) plt.show() plot_Poliesagono({(-1,0),(-1,-1),(0,-1), (0,0),(0,1),(1,1),(2,0),(0,2)})

Per generare insiemi connessi di un dato numero di esagoni regolari, le forme dei poliesagoni, da un esagono iniziale in Python si può procedere nel modo seguente.

def generaPoliesagono(n): S = {(0,0)} B = {(1,0), (1,1), (0,1), (-1,0), (0,-1), (1,-1)} for i in range(n-1): (x,y) = random.choice(tuple(B)) S.add((x,y)) B.remove((x,y)) if y%2 == 0: B = B | {(x+1,y), (x+1,y+1), (x,y+1), (x-1,y), (x,y-1), (x+1,y-1) } - S else: B = B | {(x+1,y), (x,y+1), (x-1,y+1), (x-1,y), (x-1,y-1), (x,y-1)} - S return S, B S, B = generaPoliesagono(30) plot_Poliesagono(S), plot_Poliesagono(B)

Per approfondimenti: