Conway-Radin-Sadun Dissection: Three.js Visualization Plan

The Mathematical Story

The problem (Conway, Radin, Sadun 1999): The icosahedron, dodecahedron, and icosidodecahedron are scissors-congruent to a cube — they can be cut into finitely many pieces and reassembled into one. Conway et al. proved this is possible but gave no explicit construction.

No single solid works alone: each has a nonzero Dehn invariant, so it cannot be scissors-congruent to a cube by itself. Only combinations whose Dehn invariants sum to zero are eligible.

Hafner's construction: Route everything through rhombic solids built from golden rhombohedra. Each Archimedean solid can be approximated by a rhombic solid; the difference is a small surplus or deficit of two piece types (P3A and P5). When you combine solids whose surpluses and deficits cancel, the rhombic cores together dissect to a cube.

Why icosahedron + dodecahedron + icosidodecahedron works

Dehn invariants (icosahedral part):

Icosahedron:        +60(3)₅
Dodecahedron:       −30(5)₁
Icosidodecahedron:  −60(3)₅ + 30(5)₁
Sum:                 0  ✓

Piece accounting (Family A):

Solid Deficit Surplus
Icosahedron — 20×P3A
Dodecahedron 12×P5 —
Icosidodecahedron 20×P3A 12×P5

The icosahedron's P3A surplus fills the icosidodecahedron's P3A deficit; the icosidodecahedron's P5 surplus fills the dodecahedron's P5 deficit. Net: zero leftover pieces. The three rhombic cores together dissect to a cube.

The explicit construction (Hafner): dissect the icosahedron into 20 P3A pyramids and place them on the triangular faces of the icosidodecahedron; excavate 12 P5 pentagonal pyramids from the icosidodecahedron and place them on the dodecahedron. This transforms the three original solids into two rhombic solids:

Both dissect to cubes.

All 6 equidecomposable combinations (Dehn invariant = 0)

  1. Truncated icosidodecahedron (alone)
  2. Icosahedron + Truncated dodecahedron
  3. Dodecahedron + Truncated icosahedron
  4. Icosahedron + Dodecahedron + Icosidodecahedron ← this visualization
  5. Icosidodecahedron + Rhombicosidodecahedron
  6. Truncated icosahedron + Truncated dodecahedron + Rhombicosidodecahedron

Geometry Reference

Coordinates (edge length 2 throughout)

Icosahedron — 12 vertices, all permutations of (0, ±1, ±φ):

φ = (1 + √5) / 2 ≈ 1.61803
circumradius = √(2 + φ) ≈ 1.9021

Dodecahedron — 20 vertices: (±1, ±1, ±1) and (0, ±1/φ, ±φ) + cyclic:

circumradius = √3,  edge² = 8 − 4φ = (2/φ)²

Icosidodecahedron — 30 vertices: V[i] + V[j] for each of the 30 icosahedron edges:

circumradius = 2φ,  edge = 2

Zone vectors (generators of the rhombic triacontahedron as a zonohedron):

e1 = (1,  φ,  0),  e2 = (1, −φ,  0)
e3 = (φ,  0,  1),  e4 = (φ,  0, −1)
e5 = (0,  1,  φ),  e6 = (0, −1,  φ)

All have length √(2+φ). Prolate rhombohedron: edge vectors (e1, e3, e5), all pairwise dot products = φ, face angle = arccos(1/φ) ≈ 51.83°.

Piece types

Name Description
P3A Triangular pyramid: apex at origin, base = one icosahedron face. 1/20 of the icosahedron.
P5 Pentagonal pyramid cut from the icosidodecahedron's pentagonal face region.

UI Flow (index.html)

The visualization is a strictly sequential 7-step narrative. Each step must be completed before the next button appears. All steps are reversible: going backward returns to the previous step's completed state (e.g. "Recall P3A" returns to the icosahedron exploded, not assembled). The UI enforces this with visibility gating rather than disabling.

Step 1  ──[Explode icosahedron]──►  Step 2
Step 2  ──[Transfer P3A →]────────►  Step 3   (button appears only when fully exploded)
Step 3  ──[Extract P5 →]──────────►  Step 4   (button appears only when fully transferred)
Step 4  ──[Transfer P5 to dod →]──►  Step 5   (button appears only when fully extracted)
Step 5  ──[Show Rhombic Solids →]──►  transition  (button appears only when fully transferred)
transition ──[Explode RH →]────────►  Step 6   (buttons appear only after transition)
transition ──[Explode RT →]────────►  Step 7

Recall/backward semantics:


Implementation Steps

Step 1 — Three Solids ✅

Show icosahedron, dodecahedron, and icosidodecahedron side by side, normalized to the same circumradius. Color faces by type: triangles blue, pentagons orange.

Verify: icosahedron = 20 △, dodecahedron = 12 ⬠, icosidodecahedron = 20 △ + 12 ⬠.


Step 2 — Decompose Icosahedron into P3A Pyramids ✅

Explode the icosahedron into its 20 P3A pyramids along their face normals. Button: Explode icosahedron / Assemble icosahedron (toggle, always visible). Transfer button appears only when fully exploded (animT = 1).

Verify: 20 tetrahedra fill the icosahedron with no gaps.


Step 3 — Transfer P3A to Icosidodecahedron ✅

Fly the 20 P3A pyramids from their exploded positions to the corresponding triangular faces of the icosidodecahedron (apex outward). Button: Transfer P3A → / Recall P3A ←. Recall returns to exploded state. Extract button appears only when fully transferred (transferT = 1).

Verify: Intermediate solid = icosidodecahedron + 20 outward pyramidal caps.


Step 4 — Extract P5 Pyramids from Icosidodecahedron ✅

Excavate 12 pentagonal pyramids (P5) from the icosidodecahedron's pentagonal face regions, revealing the rhombic hexecontahedron cavities. Pyramids float outward. Button: Extract P5 → / Reinsert P5 ←. Appears only when transferT = 1. Transfer P5 button appears only when fully extracted (extractT = 1).


Step 5 — Transfer P5 to Dodecahedron ✅

Fly the 12 P5 pyramids from their extracted positions to the dodecahedron's 12 pentagonal faces. Both solids snap into clean rhombic forms:

Button: Transfer P5 to dod → / Recall P5 ←. Recall returns to extracted state. "Show Rhombic Solids" button appears only when fully transferred (p5T = 1).

This is the key moment — three Archimedean solids reorganised into two rhombic solids with zero leftover pieces.

Stage transition: "Show Rhombic Solids →" slides the two rhombic solids apart (hex left, RT right) with a smooth position animation. "← Back" reverses it. The RH and RT dissection buttons appear only after the transition completes (stageT = 1).


Step 6 — Explode RH into Prolate Rhombohedra ✅

Explode the Rhombic Hexecontahedron into its 20 prolate golden rhombohedra. Button: Explode hexecontahedron → / Assemble ← (independent of Step 7).


Step 7 — Explode RT into Rhombohedra ✅

Explode the Rhombic Triacontahedron into its 10 prolate + 10 oblate golden rhombohedra. Button: Explode triacontahedron → / Assemble ← (independent of Step 6).


Future: RH → Cube

5a — Hexecontahedron → 20 prolate rhombohedra ✅

Already implemented. Each rhombohedron has vertices {O, U, V, W, UV, UW, VW, UVW} where U=icoVerts[ia], V=icoVerts[ib], W=icoVerts[ic] for ico face [ia,ib,ic], and UV=U+V = idoVerts[edge(ia,ib)], etc.

5b — Each prolate rhombohedron → triangular prism (Schöbi, 3 pieces)

Why the user's "each → cube, then combine" idea doesn't directly work: All 20 rhombohedra have equal volume, so each would become an identical small cube. But 20 identical cubes cannot be packed into a single larger cube without cuts, since ∛20 is irrational. The pieces must work collectively.

The Schöbi 2-cut dissection: Frederickson (ch. 20) proves that any Hill tetrahedron of the first type dissects into a triangular prism in 3 pieces via 2 horizontal cuts. The prolate golden rhombohedron is composed of 6 such Hill tetrahedra, and the 2 cut planes for all 6 coincide — so the whole rhombohedron is cut with just 2 planes, yielding 3 pieces that together form a triangular prism (Schöbi 1985, independently Hanegraaf).

Geometry of the cuts — they pass through existing vertices:

Let ê = (U+V+W)/|U+V+W| be the unit long diagonal direction. The heights of all 8 rhombohedron vertices along ê work out to:

O    = 0
U,V,W  = h_D/3    (ico face vertices — exactly 1/3 of the way)
UV,UW,VW = 2h_D/3  (ido vertices for those edges — exactly 2/3 of the way)
UVW  = h_D

Proof: h_U/h_D = (2+3φ)/(6+9φ) = (2+3φ)/(3·(2+3φ)) = 1/3 ✓ h_{UV}/h_D = (4+6φ)/(6+9φ) = 2(2+3φ)/(3·(2+3φ)) = 2/3 ✓

Cut 1: plane through {U, V, W} (perpendicular to ê, at height h_D/3). Cut 2: plane through {UV, UW, VW} (perpendicular to ê, at height 2h_D/3).

Three pieces:

Piece Vertices Shape
P1 {O, U, V, W} equilateral triangular pyramid (apex at O)
P2 {U,V,W; UV,UW,VW} triangular antiprism (60° twist between triangles)
P3 {UV,UW,VW,UVW} equilateral triangular pyramid (apex at UVW)

Both base triangles ({U,V,W} and {UV,UW,VW}) are equilateral with side = ico edge = 2·ICO_IDO_SCALE. P1 and P3 are congruent, both have their apex directly above/below the triangle centroid. All three sections have equal height h_D/3.

Prism assembly (Schöbi): The antiprism P2 has a 60° twist between its top and bottom equilateral triangles. To form a prism: translate P1 horizontally within its level to "fill in" the twist gap on one side of P2, and translate P3 to fill the other side. The result is a right equilateral triangular prism with:

Open question 5b-1: Compute the exact translation vectors for P1 and P3 in the prism assembly. The translation must map the {U,V,W} face of P1 laterally so that it aligns with the opposite rectangular face of the prism (filling in the antiprism's "notch"). This requires working out the 3D geometry in the plane perpendicular to ê.

5c — 20 triangular prisms → cube

Existence guaranteed: Boltyansky (1977) gives an algorithm to dissect any finite collection of prisms into a single cube [Tretja problema Hilberta, pg. 126]. So the question is not whether it's possible, but which implementation is most visualizable.

The algorithm in general works by reducing each prism to a rectangular block via P-slides (Frederickson ch. 20), then combining the blocks into a cube via further P-slides. Applied naively this gives many pieces per prism. For a clean visualization we want a lower piece count.

More direct approach — exploit the specific dimensions:

Our 20 prisms all have identical dimensions (base edge 2·ICO_IDO_SCALE, height ICO_IDO_SCALE·√(6+9φ)). Two prisms placed back-to-back along a rectangular face form a rhomboidal prism (parallelogram cross-section, no cuts needed). 10 rhomboidal prisms → rectangular block (stacking). Rectangular block → cube via 1 P-slide (Hanegraaf, ~6 extra pieces total — Frederickson ch. 20).

Total piece count (upper bound):

Total ≈ 66 pieces — feasible for animation.

Open question 5c-1: Verify that the 10 rhomboidal prisms (2 triangular prisms each) actually tile a rectangular block for our specific φ-based dimensions. The rhombus angle is arccos(−1/φ²) ≈ 116°; check whether 3 rhomboidal prisms laid side-by-side produce a right-angled block, or whether an extra P-slide is needed.

Recommended implementation order:

  1. Implement the 2-cut Schöbi dissection of each rhombohedron (5b).
  2. Animate 3 pieces assembling into a triangular prism.
  3. Animate 20 prisms grouping into the rectangular block (5c).
  4. Animate rectangular block → cube.

Step 6 — Rhombic Triacontahedron → Cube

The triacontahedron (RT) = 10 prolate + 10 oblate golden rhombohedra, all with the same edge length as the hexecontahedron rhombohedra (ICO_R = ICO_IDO_SCALE·√(2+φ)).

6a — RT → 10 prolate + 10 oblate rhombohedra

Reference: Kowalewski (1930), Der Keplersche Körper und andere Bauspiele (later translated). Visualisation at georgehart.com/virtual-polyhedra/dissection-rt.html.

The two piece types (Hart's terminology):

All 20 pieces have identical golden-rhombus faces (diagonals in ratio φ:1) and the same edge length as the hexecontahedron pieces.

Critical geometry — which faces are on the RT surface: Each prolate rhombohedron has two ends: the O-end (acute pole at the shared center O=0) and the UVW-end (acute pole at u+v+w). The 3 outer faces at the UVW-end are on the RT surface. The 3 inner faces at the O-end are interior, shared with oblate pieces.

10 prolates × 3 outer faces = 30 faces = all 30 RT surface faces.

The 10 oblate rhombohedra are entirely interior — none of their faces appear on the RT surface. They fill the gaps between the inner faces of the 10 prolates and each other.

Face accounting (20 rhombohedra × 6 faces = 120 face-slots):

RT vertex types (32 total, RT = dual of ido):

The 10 prolate rhombohedra: Select one ico face from each of the 10 antipodal pairs using centroid sign:

const rtProlatefaces = icoFaces.filter(face => {
    const [ia,ib,ic] = face;
    const c = icoVerts[ia].clone().add(icoVerts[ib]).add(icoVerts[ic]);
    return c.x > 1e-10 || (Math.abs(c.x) < 1e-10 && c.y > 0);
});
// must log exactly 10

Build using the same buildProlateRhombohedra function — no new geometry needed. Explode direction: UVW.normalize() (outward along long diagonal).

The 10 oblate rhombohedra: For each face in rtProlatefaces, the oblate is the prolate reflected through origin:

prolate: {O=0,  u,  v,  w,  u+v,  u+w,  v+w,  u+v+w}
oblate:  {O=0, -u, -v, -w, -u-v, -u-w, -v-w, -(u+v+w)}

The oblate's long diagonal runs from 0 to -(u+v+w), so its explode direction is -(u+v+w).normalize() — exactly opposite the prolate from the same face.

Build with buildOblateRhombohedra(rtProlatefaces, icoVerts) which negates u,v,w.

Note on the decagonal equator (Hart): The RT can be cleanly split into two bowl-shaped halves by a cut perpendicular to a 5-fold symmetry axis. Each half contains 5 prolate + 5 oblate rhombohedra. This is a natural animation split: show the top 5 prolates peeling away, then the bottom 5, etc.

Scale note — RT rhombohedra vs dodGroup visual: The assembled rhombohedra (using icoVerts with ICO_IDO_SCALE) have the same edge length (2·ICO_IDO_SCALE = 2/φ) as the dodecahedron (raw unscaled, edge = 2/φ). Both the rtRhomboGroup and dodGroup are positioned at x=SPACING, so they should coincide when assembled. The RT outer vertices (at UVW positions, magnitude ≈ 2.80) extend beyond the dod circumradius (√3 ≈ 1.73) — this is correct, since the RT = dod + outward P5 caps.

Verification: After assembling all 20 rhombohedra at the rtRhomboGroup origin (= SPACING in world), their union should exactly match the dodGroup visual (dod + P5 pyramids = RT). Key check: the 30 outer prolate faces should lie flush with the RT surface.

6b — Each rhombohedron → triangular prism (Schöbi, 3 pieces)

Same 2-cut Schöbi dissection as Step 5b. Both prolate and oblate golden rhombohedra have the same edge length, so the same cut planes apply:

Each yields 3 pieces → 1 equilateral triangular prism. Total: 20 rhombohedra × 3 pieces = 60 pieces = 20 triangular prisms.

Open question 6b-1: Confirm the Schöbi cut heights for the oblate rhombohedron. The oblate's long diagonal is shorter than the prolate's; verify that the same 1/3 and 2/3 height fractions apply (by symmetry they should, since the oblate is just the prolate reflected — same Hill tetrahedron structure).

6c — 20 prisms → cube

Same Boltyansky algorithm as Step 5c. The 20 prisms from the RT have the same dimensions as those from the hexecontahedron (same edge length), so the same grouping strategy applies: pairs of prisms → rhomboidal prisms → rectangular block → cube.

The RT cube will be a different size from the hexecontahedron cube (different number of rhombohedra: 20 RT vs 20 hex, but same rhombohedra dimensions — so same cube size?).

Open question 6c-1: Do the hex and RT cubes end up the same size? If the RT has 20 rhombohedra of the same dimensions as the hex's 20, their total volumes are equal, so yes — same cube. Verify: hex cube side = RT cube side = (40φ²)^{1/3}·ICO_IDO_SCALE.


Step 7 — Full Pipeline

Single animated sequence with play/pause and step controls:

  1. Three solids appear side by side
  2. Icosahedron → 20 P3A pyramids → fly to icosidodecahedron triangular faces
  3. 12 P5 pyramids excavated → fly to dodecahedron
  4. Hexecontahedron + triacontahedron revealed
  5. Each explodes into rhombohedra → reassembles into a cube

Open Questions

  1. P5 geometry — resolved: P5 apex = ico vertex at the center of the ido pentagon. ✅

  2. Hexecontahedron verification — confirmed by code: 20 prolate rhombohedra with vertices {O, U, V, W, UV, UW, VW, UVW} exactly fill the hexecontahedron. ✅

  3. Schöbi prism assembly (Step 5b-1) — compute the exact 3D translation vectors for pieces P1 and P3 so that {P1-translated, P2, P3-translated} form a right triangular prism. The translation lives in the plane perpendicular to the long diagonal ê. Likely: translate P1 by (UVW/3 - centroid-of-{U,V,W}) + some lateral shift, and P3 by its mirror. Needs explicit calculation or verification against Schöbi/Hanegraaf.

  4. 20 prisms → cube (Step 5c-1) — feasibility confirmed by Boltyansky (1977), pg. 126. Open sub-question: do 10 rhomboidal prisms (= 20 triangular prisms placed back-to-back) tile a rectangular block directly, or is an extra P-slide needed? Verify for our φ-based dimensions. Cube side = (40φ²)^{1/3}·ICO_IDO_SCALE ≈ 2.91·ICO_IDO_SCALE.

  5. Two cube sizes — hexecontahedron and triacontahedron produce cubes of different sizes; decide whether to show at true relative scale.

  6. Oblate rhombohedra — which vertex triples generate each oblate rhombohedron inside the triacontahedron (the 10 oblate pieces complement the 10 prolate ones).