Every strand its own equation
A fruit bowl that is mostly holes, 20 cm across, 33 grams of plastic, printed flat on the bed with not one support anywhere. The no-supports part was the constraint, stated first, and everything else in the project is downstream of it.
The argument that produced the rule
The first two days were a slow-motion disagreement about overhangs, and I was wrong
in most of it. I kept asserting a lattice would print, the slicer kept covering it in
supports, and the responses got shorter: there's not a singular support
…
isnt there a rule like >45deg needs support?
… In another chat you were also
like "it's fine" and it was def not fine
… ok I see that your skills in 3D
printing are not that high.
Eventually: so I stopped the other agent bc it was
just making mistake after mistake. you can basically delete everything in this
folder.
The restart came with the constraint in one line — I dont want to deal with
supports so make sure it doesnt need any
— and that is a different instruction from
"turn supports off". It moves the problem out of the slicer and into the generator.
One line of trigonometry
A strut lying on a curved wall is not as steep as the wall. If the wall slopes σ above horizontal and the strut runs at β away from straight up the meridian, the strut's actual inclination is
sin α = cos β · sin σ
which says the thing that settles it: a strut can never be steeper than the wall it lies on. So the wall's slope sets a budget for how far a strand is allowed to lean, and the budget tightens as the wall flattens. Below 44° of wall slope nothing is printable at all, so the bowl is solid there — that is why the floor is a dish and not a net.
The generator then measures α on every strut edge it produces and prints the minimum, the first percentile, the median and the percentage under 36°. The bar is 0.00 %. Support is not disabled in this project; it is geometrically unnecessary, and the build fails loudly if that stops being true.
That 36° is the ordinary overhang rule wearing a disguise. A strut at α steps sideways
by 0.2 / tan α mm per layer; at 36° that is 0.28 mm, less than one line
width, so each layer still lands on the one below. It is the absolute step against the
line width that matters, which is why a very shallow wall does not print no matter how
thick you make it.
The audit lies three times
Having a number is not the same as having a correct number, and this one was confidently wrong three separate ways before it was right.
- It was two-sided. Solid above the boundary versus solid below it is the entire difference between an overhang and a surface retreating out of the way. A strut has two parallel edges, and only one of them is the overhanging one.
- A rounded tip reads as a 0° overhang. The end cap of a strand sweeps through every inclination there is, while the solid it belongs to never advances sideways more than the shaft does. Caps had to be exempted — but only caps at the top, because a cap at the bottom is a genuine problem.
- It cannot see a strut starting in mid-air at all. A hemisphere hanging in space has perfectly steep edges and passes cleanly. That one can only be enforced by construction — strands are allowed to be born on the bed or on a parent strand, and nowhere else.
The tell that something was wrong each time was the shape of the failure: 1,787 flagged vertices that were all fine, and then, after the filters, 2 that were real.
The walls kept coming out boring
With printability solved, the remaining problem was that every new design was the same
object with a different squiggle on it. Not quite making me feel anything.
The walls are still way too symmetric, too much material too little hole… we need
bigger holes, less rhythm, more chaos.
The box turned out to be one unexamined sentence: a strand is a curve over the height of the wall, spanning all of it, whose shape is drawn independently of where it sits. Any parameter you vary under that assumption still gives you a woven net. Breaking it needed a different instruction, and it arrived as one:
Imagine you are giving each line on the wall its own equation, ok? One is a line,
the next is a sinus, the next is a sawtooth — of course never that flat that it's
unprintable, so more of a triangle line.
That is now one of four wall generators, and the useful discovery is that a new pattern comes from a new generator rather than new parameters for an old one. Each breaks a different assumption:
- free — every strand carries its own equation and is placed greedily against the ones already there. thicket is this one.
- flow — strands are integral curves of a single field shared by the whole wall, so the pattern belongs to the place rather than to the strand.
- vein — a growth controller that forks and kills strands to hold a target gap; the number of strands is an output, not a setting.
- mosaic — nodes and short straight struts, with no strands at all.
Printed
FINALLY! now thicket is the winner.
It was sliced for PLA and then converted to
PETG by editing the gcode directly rather than re-slicing — nozzle 245, bed 65, a Z offset
of −1.60 — and it ran for six hours and four minutes.
- size
- 206 × 80 mm
- weight
- 33 g
- wire
- 0.8 mm
- open wall
- ~80 %
- 6 h 4 m, PETG
- supports
- none, by construction
What came back from the print is the part I would not have predicted. The pattern was
not what he liked. I love how little material it used and how flexible it is
— mass
and springiness, which are consequences of thin wire and an open wall, not of the design.
The stringing was waved off. And the direction for everything after it came in three
words: beautiful geometry + imperfection
— where imperfection is a goal, not a
tolerance. A bowl that looks machined has failed even if it prints perfectly.
One strange consequence of a generated object becoming a physical one: thicket is now frozen. Its geometry depends on the exact order the strand placer draws random numbers, so adding, removing or reordering a single call anywhere in that routine silently produces a different bowl from the same seed — and the build still reports 0.00 % under the angle limit either way. The file carries two guards and a note about why.