Geometric Enlightenment

Rhombic Dodecahedron

260mmEdge
120°Dihedral
24Edges
14Vertices
12Faces
Rev P2 · 2026-09-29 · CSG-verified · trimesh + manifold3d · OpenSCAD-checked

Concept

The rhombic dodecahedron fills space on its own and is the dual of the cuboctahedron: twelve rhombic faces around a compact, almost spherical body. It has two kinds of corner, six four-way and eight three-way, and one bar design serves all twenty-four edges.

Retention

Mirrors glaze from outside onto seat ledges. One dowel per bar, held by crush ribs, stops a lifting mirror within 0.69 mm with 2 mm of overlap.

Wiring

984 LEDs on one chain, 12 fused injection hubs on 2 supplies, and every wire hidden in slots under the strips and through the hubs.

Verification

Every part is a watertight single solid, and glazing, retention, clearance, wire-fit and SCAD-to-model checks all pass on the placed assembly.

Contents

1 · Overview

This lamp is a rhombic dodecahedron built as a printed edge-and-hub frame that carries twelve rhombic two-way acrylic mirrors and is lit from inside its edges by an addressable LED strip. The rhombic dodecahedron fills space on its own and is the dual of the cuboctahedron: twelve rhombic faces around a compact, almost spherical body. It has two kinds of corner, six four-way and eight three-way, and one bar design serves all twenty-four edges.

The frame is 24 edge bars and 8 three-way and 6 four-way hubs. Each bar ends in an integral Ø7 × 12 mm peg that glues into a bored socket in a solid convex-hull hub, so the frame has 48 glued joints and no screws. Each mirror loads from outside onto seat ledges, and one printed dowel per bar keeps it there. Every wire runs hidden in slots in the bars and hubs, so nothing crosses the mirror cavity.

Assembled and exploded renders
The 24-edge frame assembled (left) and exploded (right): bars, hubs, LED segments, mirrors and dowels.

2 · Geometry

A rhombic dodecahedron has 14 vertices, 24 edges and 12 faces. Every face is a rhombus whose diagonals are in the ratio of the square root of 2 to 1, with 70.5 and 109.5 degree corners; four acute corners meet at each four-way vertex and three obtuse corners at each three-way vertex. All edges share the 120 degree dihedral. With a 260 mm edge the lamp stands 424.6 mm tall on a rhombus face and spans 600.4 mm from corner to opposite corner. The dihedral of 120° sets the bar half-angle β = 30°, the angle between each face and the bar's outward bisector, and every proportion of the bar follows from it.

PropertyValue
Edge length260 mm
Vertices / edges / faces14 / 24 / 12
Vertex valencethree-way (8) and four-way (6)
Dihedral / bar half-angle β120° / 30°
Facerhombus, 260 mm side, 424.6 mm across
Circumradius / midradius / inradius300.2 / 248.9 / 212.3 mm
Height resting on a face424.6 mm

3 · The edge bar

Every edge carries the same flat-facet edge bar, modeled once in a local edge frame (x along the edge, z along the outward bisector of the two faces, y across) and placed on every edge. The section is a 22 mm rail, 16 mm deep. The body runs 212 mm between the hubs and 236 mm overall. Across the section, from the outer facet inward, the bar carries the dowel tunnel, the two mirror seat ledges, a wire T-slot and the LED channel.

At β = 30° the glass plunges 0.58 mm for every millimeter it moves across the bar, so the mirror edge sits deep and the bar must be deep enough to keep the seat above the LED channel. The seat ledges carry a 45° corbel underneath, which lets the bar print inner face down with the glass seats facing up. Three of the 24 bars, B5, B6, and B8, are entry bars: each adds a Ø9 mm harness port 25 mm from the end at its lower hub.

Bar cross-sections
True sections of the bar with both mirrors, the installed dowel and the LED strip. A–A cuts through the dowel at mid-span; B–B is a typical section showing the conductors of the fullest wire slot.
FeatureValue
Rail22 mm wide × 16 mm deep, 212 mm body
Print envelope236 × 28.5 × 16 mm
Seat ledge topz = -9.57 mm, 0.2 mm below the glass
Dowel tunnelz = -6.49 to -2.39 mm, 6.6 mm long, roof 2.4 mm
Wire T-slot5 mm opening, 8 mm wide, 4.2 mm below the channel floor
LED channel9 × 1.5 mm on the inner face
End chamfer4 mm × 45° on the rail corners

4 · The peg and glue joint and the hull hub

Each hub is generated as the convex hull of the bar-end sections that meet at a vertex plus the vertex itself, which gives a solid, watertight node. The rhombic dodecahedron has two kinds of vertex and so two hub designs: 8 three-way hubs of 20.82 cm³ (44.2 mm envelope) and 6 four-way hubs of 13.81 cm³ (30.9 mm envelope). Each arm has a Ø7.6 mm bore, 13 mm deep, for the bar peg and an open wire slot 5 mm wide and 6.2 mm deep on its inner face. The slots of the arms meet in a junction at least 5 mm square, with at least 1 mm of plastic between any slot and any bore.

The joint is a Ø7 mm peg, 12 mm long, set 3 mm above the bar's mid-depth. It slides into its bore with a 0.3 mm radial clearance that takes a thin film of CA or five-minute epoxy. Pegs near the middle of the section stay clear of one another where the bars converge at a corner; tenons on the inner face would collide there.

Frame. 24 bars and 14 hubs, 48 glued peg joints, no screws and no heat-set inserts.

5 · Mirror seat and retaining dowel

Each mirror glazes from outside. It drops onto the seat ledges of its bars, whose top sits 0.2 mm below the glass at rest, so the glass settles onto the ledges after 0.17 mm of travel without being forced. Because every face loads from outside, the last mirror goes in exactly like the first; there is no keystone face.

One retaining dowel per bar then slides across the bar through its tunnel. The dowel is 31.2 × 6 × 3.5 mm and reaches at least 4.6 mm past each side of the rail, over the edges of both adjacent mirrors. Two crush ribs on its underside, 0.75 mm tall, press it against the tunnel roof with 0.15 mm of interference, so it cannot drift out sideways, yet it can be pushed out by hand to service a face.

The dowel length follows from a retention rule rather than a fixed allowance. If a mirror lifts along its own normal, its outer edge must meet the dowel before it can slide past the dowel's tip. With the dowel installed, the glass travels at most 0.69 mm before contact and the dowel then overlaps it by 2 mm. The CSG model confirms both numbers by moving each mirror along its normal until it touches.

Verified. The glass does not touch the frame or the dowels at rest, the dowels stop every mirror within the allowed lift, the rails stop in-plane movement, and the LED strip is clear. Section 12 lists every check and its measured value.

6 · Mirror cut

Each mirror is the full rhombus face scaled to 0.88 about its center, which puts the glass edge 14.7 mm inside the edge line and on the seat ledges. Every corner points at a hub, so each is chamfered to clear it: 18 mm along each side at the three-way corners; 12 mm along each side at the four-way corners. The nearest hub is 3.4 mm away. The result is a 354 × 243.4 mm piece of 2 mm two-way acrylic mirror, twelve identical pieces per lamp, with the mirrored side facing into the lamp.

ParameterValue
Material2 mm two-way acrylic mirror
Size354 × 243.4 mm (fit 0.88 of the 260 mm face)
Corners18 mm along each side at the three-way corners; 12 mm along each side at the four-way corners
Area / mass489.1 cm² / 116 g each
Tolerance± 0.5 mm; deburr the edges
Quantity and files12; mirror_single.dxf and mirrors_12up.dxf (mm)

7 · Optics

A rhombic dodecahedron has six pairs of parallel faces, so six infinity tunnels cross inside it. With twelve faces packed tightly around a small interior, the reflections cross and re-cross into a dense lattice of receding tunnels.

8 · Electronics

A WS2812C-2020 addressable strip at 198 LED/m lines the inner channel of every bar. The strip is cut into one segment per bar of 41 LEDs (207.1 mm), the longest whole number of LEDs that fits the 212 mm channel with 1 mm left at each end for the solder joint. The lamp has 984 LEDs on 4.97 m of strip. The controller is an ESP32 running WLED.

8.1 Power budget

The supply is sized for every LED at full white, 0.3 W (60 mA) each, with a 1.2 margin, and rounded up to the next standard size. Full white draws 295.2 W, 59.04 A at 5 V; the margin asks for 70.8 A, more than the largest standard supply (60 A). The lamp therefore uses two 5 V supplies (40 A and 40 A, 400 W in all), each with its own fuse block and its own group of injection hubs (supply 1: H1, H2, H5, H6, H7, H11, 29.5 A at full white; supply 2: H3, H4, H8, H9, H10, H13, 29.5 A at full white). The grounds are common, and no feeder connects two supplies. The strip dissipates about 59 W per meter at full white, more than a printed channel sheds for long, so the firmware also carries a sustained brightness limit.

ConditionPowerCurrent
Full white, all LEDs (design point)295.2 W59.04 A
Supply 1 (1.2 × its 29.5 A, rounded up)200 W40 A
Supply 2 (1.2 × its 29.5 A, rounded up)200 W40 A
WLED current limit (protects the supplies)295 W59 A
Recommended sustained limit (50 %)147.5 W29.5 A

8.2 Power distribution

No single feed point can carry 59 A into a thin strip, so power enters at 12 injection hubs (H1, H2, H3, H4, H5, H6, H7, H8, H9, H10, H11, H13). Each strip segment is fed directly at one of its ends, and each injection hub feeds at most 0.5 m of strip; here every injection hub feeds two segments, 0.41 m and 4.92 A at full white. An integer program finds the smallest set of hubs that meets this rule; on the rhombic dodecahedron it is twelve hubs.

Each injection hub has its own 18 AWG feeder pair from a fused distribution block beside its supply, protected by a 7.5 A blade fuse (1.52 × the largest branch current). The pairs travel as three sleeved harnesses, 0.5 m long and at most 4 pairs each, into ports on B5, B6, and B8 near the base (port 1 on B5: H1, H4, H5, H11 and the data pair; port 2 on B6: H2, H6, H7, H13; port 3 on B8: H3, H8, H9, H10). Inside, each pair splits into the wire slots toward its hub. At each injection hub the feeder lands on one segment's end pads, and short 24 AWG bridges carry power to the other segments it feeds. The worst voltage drop at full white is 0.25 V (5.1 %) at H13.

Power distribution diagram
Power distribution on a Schlegel view through the bottom face, drawn as seen from above. Each bar is tinted by the hub that feeds its segment; colored lines are the feeder pairs in the wire slots.
Injection hubSupplyFeedsFull-white loadFeeder routeLengthDrop
H11B1, B582 LEDs, 4.92 Aport 1 → H10.05 m2.3 %
H21B6, B782 LEDs, 4.92 Aport 2 → H20.05 m2.3 %
H32B2, B382 LEDs, 4.92 Aport 3 → H30.05 m2.3 %
H42B4, B982 LEDs, 4.92 Aport 1 → H1 → H40.31 m3.3 %
H51B11, B1582 LEDs, 4.92 Aport 1 → H50.21 m2.9 %
H61B12, B1682 LEDs, 4.92 Aport 2 → H60.21 m2.9 %
H71B13, B1782 LEDs, 4.92 Aport 2 → H2 → H70.31 m3.3 %
H82B8, B1882 LEDs, 4.92 Aport 3 → H80.21 m2.9 %
H92B14, B1982 LEDs, 4.92 Aport 3 → H8 → H90.47 m4 %
H102B10, B2082 LEDs, 4.92 Aport 3 → H3 → H4 → H100.57 m4.4 %
H111B21, B2482 LEDs, 4.92 Aport 1 → H5 → H110.47 m4 %
H132B22, B2382 LEDs, 4.92 Aport 2 → H6 → H12 → H130.73 m5.1 %

8.3 Data routing

All 984 LEDs form one data chain, one segment per bar. A chain that visits every bar exactly once is an Euler trail, and a graph admits one only when at most two hubs have an odd number of bars. The rhombic dodecahedron has 8 odd hubs. The chain can start and end at two of them, so the other 6 must be joined in pairs, (k − 2) / 2 = 3 extra connections. A connection runs along the bars between its two hubs, and the pairing that uses the fewest bars (a minimum-weight matching) uses 6, so the chain needs 6 data return wires. Each return wire is a single 24 AWG conductor laid in the wire slot of one bar (B18, B8, B15, B11, B13, B14); it carries the signal back along that bar without lighting it. The chain starts at H1, beside port 1, and ends at H6.

Data routing diagram
Data routing. Numbers give each segment's place in the chain and arrows run from DIN to DOUT; dashed lines are return wires.
#BarDIN → DOUTLED index
1B5H1 → H50–40
2B15H5 → H1141–81
B15 (return)H11 → H5data only
3B12H5 → H682–122
4B16H6 → H12123–163
5B21H12 → H11164–204
6B24H11 → H14205–245
7B20H14 → H10246–286
8B11H10 → H5287–327
B11 (return)H5 → H10data only
9B10H10 → H4328–368
10B4H4 → H1369–409
11B1H1 → H2410–450
12B7H2 → H7451–491
13B17H7 → H12492–532
14B22H12 → H13533–573
15B23H13 → H14574–614
16B19H14 → H9615–655
17B9H9 → H4656–696
18B3H4 → H3697–737
19B8H3 → H8738–778
20B18H8 → H13779–819
B18 (return)H13 → H8data only
21B13H8 → H7820–860
B13 (return)H7 → H8data only
22B14H8 → H9861–901
B14 (return)H9 → H8data only
B8 (return)H8 → H3data only
23B2H3 → H2902–942
24B6H2 → H6943–983

Where the chain turns a corner, a single 24 AWG corner jumper runs through the hub slot from one segment's DOUT pad to the next segment's DIN pad (24 in all). Jumpers and return wires carry data only: every segment's ground already returns to a distribution block through its own feeder, so a second ground conductor would add wire without adding a reference. The harness data lead is a DATA and GND pair because it carries the controller's ground.

8.4 Controller and firmware

9 · Bill of materials

ItemQtySpecificationSize / note
A · Printed parts
Edge bar21printed, PETG; edge_bar236 x 28.5 x 16 mm
Edge bar, entry3printed, PETG; edge_bar_entry, Ø9 mm harness porton B5, B6, B8
Hub, three-way8printed, PETG; hub_3way44.2 mm envelope
Hub, four-way6printed, PETG; hub_4way30.9 mm envelope
Retaining dowel24printed, PETG; mirror_dowel, two crush ribs underneath31.17 x 6 x 3.5 mm
Test coupon1printed, PETG; print firsthub + 40 mm stub + dowel
Mirror template1printed, any filament; cutting guide354 x 243.4 x 2 mm
B · Optical
Mirror122 mm two-way acrylic mirror354 x 243.4 mm; 18 mm along each side at the three-way corners; 12 mm along each side at the four-way corners
C · Electrical
LED strip4.97 mWS2812C-2020 addressable strip, 198 LED/m, 5 V41 LEDs per bar x 24; buy 5 m
Power supply 115 V 40 A (200 W), enclosed>= 35.42 A required; feeds H1, H2, H5, H6, H7, H11
Power supply 215 V 40 A (200 W), enclosed>= 35.42 A required; feeds H3, H4, H8, H9, H10, H13
Fuse block 116-way blade fuse holderdistribution
Fuse block 216-way blade fuse holderdistribution
Blade fuse127.5 A, one per feederATO/ATC
Bulk capacitor21000 µF, 10 V electrolyticacross each fuse block input
Controller1ESP32 running WLEDESP32 development board
Level shifter174AHCT125 (3.3 V to 5 V)one channel used
Series resistor1330 Ω, 1/4 Wat the level-shifter output
Feeder wire22.2 m18 AWG silicone, red and black12 pairs incl. 0.5 m lead
Bridge wire2.7 m24 AWG silicone, red and blackhub power bridges
Data wire5.3 m24 AWG siliconelead pair, corner jumpers, return wires
Harness sleeve1.8 mbraided sleeve, 10 mmover each lead
D · Adhesive and miscellaneous
Adhesivea/rCA or 5-minute epoxy48 peg joints
Controller enclosure1ventilated project boxESP32, shifter, fuse blocks
Heat-shrink, solder, fluxa/r

10 · Printing

Print the test coupon first. It holds one hub, a 40 mm bar stub with a seat, tunnel and wire slot, and one dowel, which is enough to tune the peg fit and the dowel's crush ribs before committing to the full queue. PETG (PLA acceptable for a display piece) at 0.2 mm layers, 3 perimeters and 25 % infill suits every part. The lamp parts hold 1969.5 cm³ of solid volume, at most 2501 g of plastic.

FileQtySize (mm)Orientation
test_coupon1122.5 × 48.5 × 23.1each part as listed below
edge_bar21236 × 28.5 × 16inner face on the bed, outer facet up
edge_bar_entry3236 × 28.5 × 16inner face on the bed, outer facet up
hub_3way848.5 × 48.5 × 23.1vertex up
hub_4way643.3 × 43.3 × 26.9vertex up
mirror_dowel246 × 31.2 × 4.3flat, ribs up
mirror_template1354 × 243.4 × 2flat

11 · Assembly

Stand the lamp on a rhombus face. Hubs are numbered H1 to H14 from the bottom up, and hubs at the same height run counterclockwise seen from above. H1 to H4 are the corners of the bottom face and H11 to H14 the corners of the top face. Bars B1 to B24 are numbered the same way by their midpoints. The harnesses enter through ports on B5, B6, and B8, near H1, H2, and H3; port 1 on B5 also carries the data lead. The interactive viewer shows every step.

  1. Frame. Dry-fit all 14 hubs and 24 bars, with each entry bar's port end at its lower hub (B5 at H1, B6 at H2, B8 at H3). Each hub design fits only its own kind of corner; sort the hubs by label before you start. Then glue each peg (48 joints) and check the frame on a flat surface: opposite corners measure 600.4 mm apart.
  2. Harness. Pass the sleeved harnesses through the ports. Route each feeder pair along its bars in the wire slots and through the hub slots to its injection hub, following the table in 8.2.
  3. Strip. Lay the data return wires in B18, B8, B15, B11, B13, B14. Solder each feeder to its landing pads, add the power bridges and corner jumpers, then press the 24 segments into the channels over the slots, observing the DIN arrows in 8.3.
  4. Test. Power the lamp on the bench at low brightness, confirm all 984 LEDs in order, then check each injection hub reads close to 5 V at full white.
  5. Glaze. Drop each mirror onto its seats from outside, mirrored side in.
  6. Retain. Push one dowel through each bar's tunnel until it is centered. To service a face, push out its dowels and lift the mirror.

12 · Verification

Every check below runs on the placed CSG assembly (trimesh with manifold3d booleans) before any document is generated, and the OpenSCAD source is rendered and compared part by part with the Python model.

GroupCheckMeasuredLimitResult
partedge_bar watertight single body1== 1 body, NoErrorpass
partmirror_dowel watertight single body1== 1 body, NoErrorpass
partedge_bar_entry watertight single body1== 1 body, NoErrorpass
parthub_3way watertight single body1== 1 body, NoErrorpass
parthub_4way watertight single body1== 1 body, NoErrorpass
framebars intersect hubs (pegs in bores)0.00 mm3< 0.01pass
framebar-to-bar at any vertex0.00 mm3< 0.01pass
slotswall between wire slot and peg bore1.00 mm>= 0.98pass
slotshub junction passage (side of square)5.00 mm>= 4.0pass
slotsharness fill of the fullest entry port0.48<= 0.60pass
slotswires pack into every bar slot24== 24pass
slotsfullest bar groove (fill)0.54<= 0.60pass
slotsfullest hub junction (fill)0.60<= 0.60pass
glazingglass intersects frame at rest0.00 mm3< 0.01pass
glazingglass intersects dowels at rest0.00 mm3< 0.01pass
glazingclearance glass to nearest hub3.35 mm>= 0.5pass
glazingdowel body intersects bars (installed)0.00 mm3< 0.05pass
glazingcrush-rib interference per dowel4.80 mm3~= 4.80 (designed press fit)pass
glazingthinnest dowel section3.50 mm>= 1.50pass
retentionoutward lift before a dowel stops the glass0.70 mm<= 1.00pass
retentiondowel overlap at the moment of contact2.00 mm>= 2.00pass
retentionin-plane travel before a rail stops the glass1.52 mm<= 2.0pass
retentioninward travel before the seat supports the glass0.17 mm<= 0.5pass
ledstrip stand-in intersects frame0.00 mm3< 0.01pass
ledstrip intersects glass or dowels0.00 mm3< 0.01pass
entryharness port opens into the wire slot1== 1pass
entryport clear of the dowel tunnel73.20 mm>= 1.0pass

13 · Changes in Rev P2

  1. All wiring hidden in the frame. P1 ran a 12 AWG bus ring inside the lamp and three data fly-jumpers across its interior, where every wire repeats in the reflections. A T-slot under every strip and an open slot through every hub now carry the feeders and data wires, so no wire crosses the mirror cavity.
  2. Data fly-jumpers replaced by six data return wires, each laid along one bar. The eight three-way hubs are never adjacent, so each pair is joined along two bars, and the chain is a single Euler trail that starts at the entry hub.
  3. LED count corrected to 41 per bar, 984 in total. P1 quoted 1236 (about 51 per edge), which assumes strip along the full 260 mm edge, but the channel between the hubs is 212 mm long.
  4. Power split across two supplies. At full white the lamp draws 59.0 A, and with the 1.2 margin (70.8 A) it exceeds the largest supply on the ladder (60 A). Two 5 V 40 A supplies with common grounds each feed six injection hubs through their own fuse block and individually fused 18 AWG pairs; each hub feeds two segments (0.41 m of strip). P1 specified at least 88 A (or two 50 A units) on a bus ring.
  5. Glass inset measured perpendicular to each side. The P1 source measured it to the side midpoint, which on a rhombus overstates it, so each glass edge sat 0.89 mm closer to the rail than the source assumed. The seat and dowel are now placed from where the glass edge actually lands.
  6. Peg changed from Ø8 × 12 mm to Ø7 × 12 mm and raised 3 mm above mid-depth. A Ø8 peg leaves no room for the hub wire slot in a 16 mm bar. The glue area falls from 302 to 264 mm² per joint, still above the cube's 220 mm².
  7. Dowel sized by the retention rule. It is captured in a closed tunnel, 3.5 mm thick and 31.2 mm long (P1 4 × 28 mm), and overlaps the glass by 2.0 mm at the moment of contact, which comes after 0.69 mm of travel.
  8. Seat formula corrected to divide the glass half-thickness by cos(beta). At beta = 30 degrees the P1 error stayed within the clearance, so the P1 seat did not touch the glass. The seat now clears it by 0.2 mm and supports it after 0.17 mm of travel.
  9. Crush ribs added to the dowel. Two 0.75 mm ribs under it grip the tunnel floor with 0.15 mm of interference, so a dowel cannot drift out sideways. The dowel is still removable by hand for service.
  10. Entry bars added. Bars B5, B6 and B8 rise from three of the four bottom hubs and carry 9 mm harness ports for four feeder pairs each, with the data pair in B5.
  11. Seat ledges gained a 45 degree corbel so the bars print inner face down with the glass seat facing up.
  12. Mirror DXF files now declare millimeters. The P1 files declared meters, which scales the part by 1000 on import.
  13. Every document is regenerated from one specification, so the drawings, design document, checklist, cut sheet, print list, README, viewer and web page quote the same numbers.

Interactive 3-D assembly

Orbit, explode and step through the build in your browser.

Open the construction viewer ›