You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Manual: gallery Hamiltonian cycle, voronoi hi-res, fix reduce example, IT titles
- Add Hamiltonian Cycle gallery page (contributed by u/Eternally_Monika)
- Bump shell-voronoi examples to 256 resolution with performance note
- Fix reduce example: wrap mesh-union macro in fn for reduce
- IT titles: "Usare Attach con una Mesh" / "con le Facce"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@@ -751,7 +755,7 @@ Both `shell` and `woven-shell` compose with other shape-fns via `->` threading:
751
755
:shell-lattice {:caption"Brick lattice"
752
756
:description"`shell-lattice` creates a grid of openings. `:shift 0.5` offsets alternate rows for a brick pattern."}
753
757
:shell-voronoi {:caption"Voronoi openings"
754
-
:description"`shell-voronoi` creates organic, irregular cell-shaped openings using Voronoi distance."}
758
+
:description"`shell-voronoi` creates organic, irregular cell-shaped openings using Voronoi distance. Best at high resolution (256+) — rendering may take a few seconds."}
755
759
:shell-tapered {:caption"Tapered lattice"
756
760
:description"Shell composes with `tapered` — the lattice narrows toward the end."}
757
761
:woven-diagonal {:caption"Woven diagonal"
@@ -867,7 +871,7 @@ These compose naturally: `(map f (filter pred coll))`. Combined with `for`, they
867
871
{:map-basic {:caption"Map"
868
872
:description"`map` applies a function to each element. Here we scale a list of values to get radii, then create spheres."}
869
873
:reduce-union {:caption"Reduce"
870
-
:description"`reduce` combines elements pairwise. Here we merge multiple boxes into a single mesh with `mesh-union`."}
874
+
:description"`reduce` combines elements pairwise. Here we merge multiple boxes into a single mesh with `mesh-union`. Note: `mesh-union` is a macro, so it must be wrapped in `(fn [a b] ...)` to pass it to `reduce`."}
871
875
:map-indexed {:caption"Map-indexed"
872
876
:description"`map-indexed` pairs each element with its index. Useful for positioning objects along a sequence."}}}
873
877
@@ -1504,6 +1508,31 @@ The text is converted to a 2D shape with `text-shape`, extruded into a thin 3D m
:content"A **random Hamiltonian cycle** on a grid, rendered as a 3D path. Contributed by **u/Eternally_Monika** on Reddit.
1514
+
1515
+
A Hamiltonian cycle visits every node in a grid exactly once, returning to the start. This script generates one algorithmically using the **backbite algorithm**: start with a snake path, then randomly perturb it thousands of times until a valid cycle emerges.
1516
+
1517
+
The result is converted to turtle movements and extruded with a flat rectangle cross-section.
1518
+
1519
+
This example showcases why having a **real programming language** as a modeling base matters: graph theory algorithms, `loop`/`recur`, `assert`, random number generation — all natively available.
1520
+
1521
+
**Features demonstrated:**
1522
+
- Algorithmic geometry — path generated by backbite random walk
1523
+
- `loop`/`recur` for iterative algorithms
1524
+
- `assert` for input validation
1525
+
- `path` with dynamic turtle commands from computed data
1526
+
- `extrude` along a programmatically generated path
1527
+
1528
+
**Try changing:**
1529
+
- `cols` / `rows` for different grid sizes (product must be even)
1530
+
- `cell-size` for spacing
1531
+
- `path-width` / `path-thickness` for the ribbon dimensions
1532
+
- `mixing-steps` for more randomization (higher = more shuffled)"
:content"A cup with **woven canvas texture** on the outside. This is the most complex example in the gallery.
@@ -1891,7 +1920,7 @@ Sia `shell` che `woven-shell` si compongono con altre shape-fn tramite `->`:
1891
1920
:shell-lattice {:caption"Reticolo a mattone"
1892
1921
:description"`shell-lattice` crea una griglia di aperture. `:shift 0.5` sfasa le righe alternate per un effetto mattone."}
1893
1922
:shell-voronoi {:caption"Aperture Voronoi"
1894
-
:description"`shell-voronoi` crea aperture organiche e irregolari a forma di cella usando la distanza di Voronoi."}
1923
+
:description"`shell-voronoi` crea aperture organiche e irregolari a forma di cella usando la distanza di Voronoi. Rende meglio ad alta risoluzione (256+) — il rendering potrebbe richiedere qualche secondo."}
1895
1924
:shell-tapered {:caption"Reticolo rastremato"
1896
1925
:description"Shell si compone con `tapered` — il reticolo si restringe verso la fine."}
1897
1926
:woven-diagonal {:caption"Tessuto diagonale"
@@ -2007,7 +2036,7 @@ Si compongono naturalmente: `(map f (filter pred coll))`. Combinati con `for`, o
2007
2036
{:map-basic {:caption"Map"
2008
2037
:description"`map` applica una funzione a ogni elemento. Qui scaliamo una lista di valori per ottenere raggi, poi creiamo sfere."}
2009
2038
:reduce-union {:caption"Reduce"
2010
-
:description"`reduce` combina elementi a coppie. Qui uniamo più box in una singola mesh con `mesh-union`."}
2039
+
:description"`reduce` combina elementi a coppie. Qui uniamo più box in una singola mesh con `mesh-union`. Nota: `mesh-union` è una macro, quindi va wrappata in `(fn [a b] ...)` per passarla a `reduce`."}
2011
2040
:map-indexed {:caption"Map-indexed"
2012
2041
:description"`map-indexed` accoppia ogni elemento con il suo indice. Utile per posizionare oggetti lungo una sequenza."}}}
2013
2042
@@ -2112,7 +2141,7 @@ Il piano di taglio è orizzontale all'altezza Y corrente della tartaruga (o a un
2112
2141
:description"Lo stesso toroide tagliato su due piani diversi. Il piano di taglio è perpendicolare alla direzione della tartaruga nella sua posizione corrente."}}}
2113
2142
2114
2143
:attach-meshes
2115
-
{:title"Attaccare Mesh"
2144
+
{:title"Usare Attach con una Mesh"
2116
2145
:content"La funzione `attach` trasforma una mesh con movimenti turtle, restituendo una nuova mesh. Usa `attach!` per trasformare una mesh registrata in-place per nome.
2117
2146
2118
2147
```
@@ -2132,7 +2161,7 @@ Il piano di taglio è orizzontale all'altezza Y corrente della tartaruga (o a un
2132
2161
:description"Le copie possono includere rotazioni. Qui `tv` inclina e `tr` ruota la tartaruga prima di posizionare la copia."}}}
2133
2162
2134
2163
:attach-faces
2135
-
{:title"Attaccare alle Facce"
2164
+
{:title"Usare Attach con le Facce"
2136
2165
:content"La funzione `attach-face` attacca geometria a una faccia specifica di una mesh. Usa keyword (`:top`, `:bottom`, `:front`, `:back`, `:left`, `:right`) o indici 0-5.
2137
2166
2138
2167
```
@@ -2644,6 +2673,31 @@ Il testo viene convertito in forma 2D con `text-shape`, estruso in una mesh 3D s
2644
2673
:examples
2645
2674
{:embossed-column-code {:caption"Colonna con Testo in Rilievo"}}}
2646
2675
2676
+
:gallery-hamiltonian-cycle
2677
+
{:title"Ciclo Hamiltoniano"
2678
+
:content"Un **ciclo Hamiltoniano casuale** su una griglia, renderizzato come percorso 3D. Contributo di **u/Eternally_Monika** su Reddit.
2679
+
2680
+
Un ciclo Hamiltoniano visita ogni nodo della griglia esattamente una volta, tornando al punto di partenza. Questo script ne genera uno algoritmicamente usando l'**algoritmo backbite**: si parte da un percorso a serpentina, poi lo si perturba casualmente migliaia di volte fino a ottenere un ciclo valido.
2681
+
2682
+
Il risultato viene convertito in movimenti turtle ed estruso con una sezione rettangolare piatta.
2683
+
2684
+
Questo esempio dimostra perché avere un **vero linguaggio di programmazione** come base di modellazione fa la differenza: algoritmi di teoria dei grafi, `loop`/`recur`, `assert`, generazione di numeri casuali — tutto disponibile nativamente.
2685
+
2686
+
**Funzionalità dimostrate:**
2687
+
- Geometria algoritmica — percorso generato da random walk backbite
2688
+
- `loop`/`recur` per algoritmi iterativi
2689
+
- `assert` per validazione degli input
2690
+
- `path` con comandi turtle dinamici da dati calcolati
2691
+
- `extrude` lungo un percorso generato programmaticamente
2692
+
2693
+
**Prova a cambiare:**
2694
+
- `cols` / `rows` per griglie di dimensioni diverse (il prodotto deve essere pari)
2695
+
- `cell-size` per la spaziatura
2696
+
- `path-width` / `path-thickness` per le dimensioni del nastro
2697
+
- `mixing-steps` per più randomizzazione (più alto = più mescolato)"
0 commit comments