Pagina Principale
Sulle forme dei polimini

La bellezza matematica dei polimini risiede nella loro capacità di generare complessità infinita da regole semplici, offrendo un microcosmo dove esplorare i principi fondamentali della forma e della struttura. La classificazione morfologica dei polimini rappresenta un ponte tra matematica pura e applicata. L'analisi di indicatori quantitativi e qualitativi consente di categorizzare queste strutture discrete secondo caratteristiche geometriche fondamentali.

Il rapporto tra perimetro e area di un polimino, il suo numero di elementi $n$, è un indicatore semplice ma informativo per una classificazione morfologica: misura la compattezza della forma, tra un valore minimo $\frac{4\sqrt n}{n}$ per le forme quadrate a $\frac{2n+2}{n}$ per le forme a asta, assumendo valori massimi per forme a "T", "X" o strutture dendritiche.
Altri semplici indicatori sono:

Un indicatore più sofisticato, è il raggio di girazione definito come: \[ R_g = \sqrt{\frac{1}{n} \sum_{i=1}^n \|\mathbf{r}_i - \mathbf{r}_0\|^2} \] dove $\mathbf{r}_0$ è il centro di massa.

def R_g(S): if not S: return 0.0 r = np.array(list(S)) r_0 = np.mean(r, axis=0) # Distanza quadratica media dal centro squared_distances = np.sum((r - r_0) ** 2, axis=1) return np.sqrt(np.mean(squared_distances)) n = 30 S, _ = genera(n) plot_S(S) print(perim(S)/n, R_g(S))
1.2666666666666666 2.6627053911388696
Anche il raggio di girazione, una misura che cattura globalmente la "forma" del polimino, da valori bassi per quelli più compatti, cresce per polimini sempre più allungati.

I precedenti indicatori possono essere valutati in una pagina dinamica interattiva insieme ad altri più complessi come i seguenti:

Infine possiamo considerare il rapporto tra area del polimino e area del suo involucro convesso che indica la convessità del polimino. Il metodo .ConvexHull() della libreria scipy.spatial fornisce le coordinate del poligono involucro (hull) convesso di un insieme di punti.

def Hull_conv(S): # --- 1. Estrarre tutti i vertici unici delle celle --- V = set() for x, y in S: V |= {(x, y),(x + 1, y),(x, y + 1),(x + 1, y + 1)} P = np.array(list(V)) hull = ConvexHull(P) return P[hull.vertices] n = 4 S, _ = genera(n) hull_points = Hull_conv(S) N = len(hull_points) hull_area = 0.5 * abs( sum(hull_points[i][0] * hull_points[(i + 1) % N][1] for i in range(N)) - sum(hull_points[i][1] * hull_points[(i + 1) % N][0] for i in range(N)) ) print(n/hull_area) fig, ax = plt.subplots(figsize=(8, 8)) ax.set_aspect('equal') for (x, y) in S: ax.add_patch(plt.Rectangle((x, y), 1, 1, facecolor='lightblue', edgecolor='black')) ax.plot(np.append(hull_points[:, 0], hull_points[0, 0]), np.append(hull_points[:, 1], hull_points[0, 1]), 'r-', linewidth=2) plt.show()
0.8

Per approfondimenti: