Geometric Enlightenment

Rhombic Dodecahedron

260mmEdge
120°Dihedral
24Edges
14Vertices
12Faces
Rev H · 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. This build joins its frame with tenons and screws instead of glue, so the lamp can be taken apart for service or transport and closed in any order.

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

1032 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. This build joins its frame with tenons and screws instead of glue, so the lamp can be taken apart for service or transport and closed in any order.

The frame is 24 edge bars and 8 three-way and 6 four-way hubs. Each bar ends in a 15.7 mm tenon that drops into an open mortise in the hub from inside the frame and is held by one M3 × 10 countersunk screw driven through the hub floor from outside, so the frame has 48 screwed joints and no glue and comes apart for service or transport. 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 of the six four-way vertices and three obtuse corners at each of the eight three-way vertices. All twenty-four edges share the 120 degree dihedral, so one bar design serves every edge. 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, 18 mm deep. The body runs 188 mm between the hubs and 219.4 mm overall, 15.7 mm tenon included at each end. 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 × 18 mm deep, 188 mm body
Print envelope219.4 × 28.5 × 18 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

4 · The tenon and screw joint and the hub

Each hub is the convex hull of the bar sections where the tenons end, 20 mm from the vertex, joined to one full-section sleeve per arm that houses the mortise and meets the bar body end to end. The rhombic dodecahedron has two kinds of vertex and so two hub designs: 8 three-way hubs of 29.38 cm³ (61.1 mm envelope) and 6 four-way hubs of 25.84 cm³ (44.6 mm envelope). Each arm has a mortise 12 mm wide, open toward the inside of the lamp under a 6 mm floor, 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 mortise or screw hole.

The tenon is the lower 11.7 mm of the bar section, 11.4 mm wide and 15.7 mm long, with 0.3 mm clearance on each face. It drops radially into its mortise from inside the frame, so the frame closes in any order, and one M3 × 10 countersunk screw, driven through the hub floor from the outer facet, pulls it up against the floor. The countersunk head sits flush with the facet. The screw cuts its own thread in a Ø2.6 mm pilot hole, 5 mm deep in the tenon's roof, which leaves 1 mm of plastic above the wire slot. The LED channel and the wire slot run through the tenon, so the strip and every wire pass the joint unbroken, and each screw stays reachable from outside after the lamp is glazed.

Frame. 24 bars and 14 hubs, 48 screwed tenon joints, no glue 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 1.2 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 43 LEDs (217.2 mm), the longest whole number of LEDs that fits the 220 mm channel with 1 mm left at each end for the solder joint. The lamp has 1032 LEDs on 5.21 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 309.6 W, 61.92 A at 5 V; the margin asks for 74.3 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, 31 A at full white; supply 2: H3, H4, H8, H9, H10, H13, 31 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)309.6 W61.92 A
Supply 1 (1.2 × its 31 A, rounded up)200 W40 A
Supply 2 (1.2 × its 31 A, rounded up)200 W40 A
WLED current limit (protects the supplies)309.5 W61.9 A
Recommended sustained limit (50 %)154.5 W30.9 A

8.2 Power distribution

No single feed point can carry 61.9 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.43 m and 5.16 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.45 × 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.27 V (5.4 %) 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, B586 LEDs, 5.16 Aport 1 → H10.04 m2.4 %
H21B6, B786 LEDs, 5.16 Aport 2 → H20.04 m2.4 %
H32B2, B386 LEDs, 5.16 Aport 3 → H30.04 m2.4 %
H42B4, B986 LEDs, 5.16 Aport 1 → H1 → H40.3 m3.5 %
H51B11, B1586 LEDs, 5.16 Aport 1 → H50.21 m3.1 %
H61B12, B1686 LEDs, 5.16 Aport 2 → H60.21 m3.1 %
H71B13, B1786 LEDs, 5.16 Aport 2 → H2 → H70.3 m3.5 %
H82B8, B1886 LEDs, 5.16 Aport 3 → H80.21 m3.1 %
H92B14, B1986 LEDs, 5.16 Aport 3 → H8 → H90.47 m4.2 %
H102B10, B2086 LEDs, 5.16 Aport 3 → H3 → H4 → H100.56 m4.6 %
H111B21, B2486 LEDs, 5.16 Aport 1 → H5 → H110.47 m4.2 %
H132B22, B2386 LEDs, 5.16 Aport 2 → H6 → H12 → H130.73 m5.4 %

8.3 Data routing

All 1032 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–42
2B15H5 → H1143–85
B15 (return)H11 → H5data only
3B12H5 → H686–128
4B16H6 → H12129–171
5B21H12 → H11172–214
6B24H11 → H14215–257
7B20H14 → H10258–300
8B11H10 → H5301–343
B11 (return)H5 → H10data only
9B10H10 → H4344–386
10B4H4 → H1387–429
11B1H1 → H2430–472
12B7H2 → H7473–515
13B17H7 → H12516–558
14B22H12 → H13559–601
15B23H13 → H14602–644
16B19H14 → H9645–687
17B9H9 → H4688–730
18B3H4 → H3731–773
19B8H3 → H8774–816
20B18H8 → H13817–859
B18 (return)H13 → H8data only
21B13H8 → H7860–902
B13 (return)H7 → H8data only
22B14H8 → H9903–945
B14 (return)H9 → H8data only
B8 (return)H8 → H3data only
23B2H3 → H2946–988
24B6H2 → H6989–1031

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_bar219.4 x 28.5 x 18 mm
Edge bar, entry3printed, PETG; edge_bar_entry, Ø9 mm harness porton B5, B6, B8
Hub, three-way8printed, PETG; hub_3way61.1 mm envelope
Hub, four-way6printed, PETG; hub_4way44.6 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 strip5.21 mWS2812C-2020 addressable strip, 198 LED/m, 5 V43 LEDs per bar x 24; buy 5.5 m
Power supply 115 V 40 A (200 W), enclosed>= 37.15 A required; feeds H1, H2, H5, H6, H7, H11
Power supply 215 V 40 A (200 W), enclosed>= 37.15 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.3 m24 AWG silicone, red and blackhub power bridges
Data wire5.1 m24 AWG siliconelead pair, corner jumpers, return wires
Harness sleeve1.8 mbraided sleeve, 10 mmover each lead
D · Adhesive and miscellaneous
Screw52M3 × 10 countersunk48 tenon joints and 4 spares
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 tenon 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 2169.8 cm³ of solid volume, at most 2756 g of plastic.

FileQtySize (mm)Orientation
test_coupon1145.1 × 67.4 × 29each part as listed below
edge_bar21219.4 × 28.5 × 18inner face on the bed, outer facet up
edge_bar_entry3219.4 × 28.5 × 18inner face on the bed, outer facet up
hub_3way867.4 × 67.4 × 29vertex up
hub_4way651 × 61 × 39.9outer facet of one arm on the bed
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. Join hubs and 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. Drop each tenon into its mortise from inside and drive its M3 × 10 countersunk screw from outside until the head is flush (48 screws). 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 1032 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 (tenons in mortises)0.00 mm3< 0.01pass
framebar-to-bar at any vertex0.00 mm3< 0.01pass
slotswall between wire slot and mortise or screw hole3.45 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 hub1.24 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 tunnel61.20 mm>= 1.0pass

13 · Changes in Rev H

  1. Joint screws moved to the outer facet. Rev G drove each M3 screw from the inner face through the tenon into the hub, which puts a 6.2 mm counterbore where the LED strip and the wire slot run. Each screw now passes through a 3.4 mm hole and a 90 degree countersink in the 6 mm hub floor and self-taps into a 2.6 × 5 mm pilot in the tenon, so its head sits flush on the outside of the hub and the inner face stays clear. The fastener is an M3 × 10 countersunk screw.
  2. Bar deepened from 16 to 18 mm so the tenon keeps 6 mm of plastic above the wire slot for the pilot. The tenon section grows from 8.7 mm to 11.7 mm deep and stays 11.4 mm wide in a 12 mm mortise.
  3. All wiring hidden in the frame. 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.
  4. Data chain joined into one. Rev G wired four separate LED runs. The eight three-way hubs are odd and never adjacent, so six data return wires, each laid along one bar, join all 24 segments into a single Euler trail that starts at the entry hub.
  5. Power system sized for full white. Rev G used one 40 A supply capped in firmware below its 64.8 A full-white estimate. The lamp now draws 61.9 A at full white and is fed from two 5 V 40 A supplies with common grounds, each with its own fuse block serving six injection hubs through individually fused 18 AWG pairs. The worst feeder drop at full white is 0.27 V (5.4 %), at H13.
  6. LED count set by the channel. The channel runs through the tenons, 220 mm per bar, which holds 43 LEDs per bar and 1032 in total; Rev G quoted about 1080.
  7. Bars set back 20 mm from each vertex (Rev G 16 mm) so the four-way wire junction stays clear of the mortises. Each hub is a compact hull at the bar ends with a sleeve around every mortise, and the glass clears every hub by 1.24 mm.
  8. Dowel sized by the retention rule. It is captured in a closed tunnel, 3.5 mm thick and 31.2 mm long, and overlaps the glass by 2.0 mm at the moment of contact, which comes after 0.69 mm of travel. Rev G dowels were trimmed to length after fitting.
  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. Seat formula corrected to divide the glass half-thickness by cos(beta). At beta = 30 degrees the Rev G error stayed within the clearance. The seat now clears the glass by 0.2 mm and supports it after 0.17 mm of travel.
  11. Vertex description corrected. The Rev G design document placed the obtuse face corners at the four-way hubs and the acute corners at the three-way hubs; four acute (70.5 degree) corners meet at each four-way hub and three obtuse (109.5 degree) corners at each three-way hub.
  12. 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.
  13. Seat ledges gained a 45 degree corbel so the bars print inner face down with the glass seat facing up.
  14. 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 ›