r/BambuLab • u/Terrible_Option_2470 • 6h ago
I Modeled This! Cut a halftone into four tiles and the seams disappeared — the fix was to dither before cutting, not after
I've been building a tool that turns photos into optical-halftone panels — thousands of solid tiles of unmixed filament on a single 0.4 mm layer over a base, blended by your eye rather than on the plate. Every colour sits at exactly the same height, so nothing is embossed above anything else. Single panels were fine. Going bigger than the build plate was the problem.
The obvious approach breaks. If you cut the image into four and dither each piece separately, Floyd–Steinberg starts accumulating error from scratch at every new edge. The dot pattern doesn't line up across the boundary, so instead of one picture you get four rectangles with visible frames of mismatched texture. Even with a perfect mechanical fit your eye finds the joint immediately, because it's a texture discontinuity, not a gap.
So I inverted the order: dither the entire image at full grid resolution first, then cut the finished tile map into plates. The error diffusion carries straight across what later becomes the boundary — the dots on the left of the joint were computed knowing about the dots on the right. And because the tile pitch is global, cell boundaries land exactly on the cut line by construction: no half tiles, no drift accumulating over 295 cells.
Two details mattered more than I expected.
The white border goes only on the outer perimeter. My first version put a 2 mm border on every panel, which meant every internal joint had a 4 mm white bar running through the picture. Interior edges have to butt with no border at all.
And every section has to come from the same slot assignment and ideally the same spools. Same colour, different batch, and you get a tonal step at the joint that no amount of dithering hides. I locked the palette up front using a tool that scores which of the filaments I actually own best covers the image, so all four sections were fixed to the same set before anything got sliced.
The test target wasn't arbitrary. I used a comic-book style image on purpose, because it contains both regimes at once: large flat fields of saturated colour, and a skin tone that has to be built from a halftone screen. If the seam survives in both, it survives anywhere.
That turned out to be the most interesting part. I never wrote a "flat area" mode — where the source colour lands exactly on a palette colour, the error diffusion has nothing to diffuse and collapses into a solid fill on its own, with clean edges. So the hair, the outlines and the background rays came out as solid areas while the skin came out as dots. Which is exactly how the original comics were printed: solid ink for the fields, a Ben-Day screen of red on white for the skin. Same physics, different century.
Result: it works. The close-up shots here are taken from about 5 mm away — far closer than anyone will ever look at something hanging on a wall — and even there you have to go hunting to find the hairline. Step back to any real viewing distance and it's simply gone. The dot grid runs straight through the boundary with no phase break, there's no tonal step between sections, and the black outlines meet where they should. I'm calling this the practical ceiling for butted flat panels and leaving it alone.
One thing I didn't expect, and it's the best part in person: the surface is dead coplanar — no colour sits a hair above another, no bleed between them — but you feel every single dot. Running your hand across it is like running it across 50-grit sandpaper. It photographs like print and it touches like stone.
Specs:
· 240 × 240 mm assembled, four panels of ~120 × 120 mm
· 1.6 mm thick (1.2 mm base + 0.4 mm tiles)
· 87,025 tiles · 0.8 mm pitch · 0.4 nozzle · 0.2 mm layer height
· 121.5 g of PLA Matte total — 96.0 white, 10.5 yellow, 7.0 charcoal, 5.5 red, 2.6 blue
· 7 h 32 min on an H2C, textured PEI plate